List of usage examples for java.util.zip ZipFile getEntry
public ZipEntry getEntry(String name)
From source file:sh.isaac.convert.rxnorm.standard.RxNormMojo.java
/** * Returns the date portion of the file name - so from 'RxNorm_full_09022014.zip' it returns 09022014 * * @return the string// w w w. ja va 2 s.c o m * @throws Exception the exception */ private String loadDatabase() throws Exception { // Set up the DB for loading the temp data String toReturn = null; // Read the RRF file directly from the source zip file - need to find the zip first, to get the date out of the file name. ZipFile zf = null; for (final File f : this.inputFileLocation.listFiles()) { if (f.getName().toLowerCase().startsWith("rxnorm_full_") && f.getName().toLowerCase().endsWith(".zip")) { zf = new ZipFile(f); toReturn = f.getName().substring("rxnorm_full_".length()); toReturn = toReturn.substring(0, toReturn.length() - 4); break; } } if (zf == null) { throw new MojoExecutionException("Can't find source zip file"); } this.db = new RRFDatabaseHandle(); final File dbFile = new File(this.outputDirectory, "rrfDB.h2.db"); final boolean createdNew = this.db.createOrOpenDatabase(new File(this.outputDirectory, "rrfDB")); if (!createdNew) { ConsoleUtil.println("Using existing database. To load from scratch, delete the file '" + dbFile.getAbsolutePath() + ".*'"); } else { // RxNorm doesn't give us the UMLS tables that define the table definitions, so I put them into an XML file. final List<TableDefinition> tables = this.db.loadTableDefinitionsFromXML( RxNormMojo.class.getResourceAsStream("/RxNormTableDefinitions.xml")); for (final TableDefinition td : tables) { final ZipEntry ze = zf.getEntry("rrf/" + td.getTableName() + ".RRF"); if (ze == null) { throw new MojoExecutionException( "Can't find the file 'rrf/" + td.getTableName() + ".RRF' in the zip file"); } try (UMLSFileReader umlsReader = new UMLSFileReader( new BufferedReader(new InputStreamReader(zf.getInputStream(ze), "UTF-8")))) { this.db.loadDataIntoTable(td, umlsReader, null); } } zf.close(); try ( // Build some indexes to support the queries we will run Statement s = this.db.getConnection().createStatement()) { ConsoleUtil.println("Creating indexes"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX conso_rxcui_index ON RXNCONSO (RXCUI)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX conso_rxaui_index ON RXNCONSO (RXAUI)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX sat_rxcui_aui_index ON RXNSAT (RXCUI, RXAUI)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX sat_aui_index ON RXNSAT (RXAUI)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX sty_rxcui_index ON RXNSTY (RXCUI)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX sty_tui_index ON RXNSTY (TUI)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX rel_rxcui2_index ON RXNREL (RXCUI2, RXAUI2)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX rel_rxaui2_index ON RXNREL (RXCUI1, RXAUI1)"); ConsoleUtil.showProgress(); s.execute("CREATE INDEX rel_rela_rel_index ON RXNREL (RELA, REL)"); // helps with rel metadata ConsoleUtil.showProgress(); s.execute("CREATE INDEX rel_sab_index ON RXNREL (SAB)"); // helps with rel metadata } ConsoleUtil.println("DB Setup complete"); } return toReturn; }
From source file:net.sf.zekr.common.config.ApplicationConfig.java
public TranslationData loadTranslationData(File transZipFile) throws IOException, ConfigurationException { TranslationData td = null;//ww w .jav a 2 s. c o m ZipFile zipFile = null; try { zipFile = new ZipFile(transZipFile); InputStream is = zipFile.getInputStream(new ZipEntry(ApplicationPath.TRANSLATION_DESC)); if (is == null) { logger.warn("Will ignore invalid translation archive \"" + zipFile.getName() + "\"."); return null; } Reader reader = new InputStreamReader(is, "UTF-8"); PropertiesConfiguration pc = new PropertiesConfiguration(); pc.load(reader); reader.close(); is.close(); td = new TranslationData(); td.version = pc.getString(VERSION_ATTR); td.id = pc.getString(ID_ATTR); td.locale = new Locale(pc.getString(LANG_ATTR, "en"), pc.getString(COUNTRY_ATTR, "US")); td.encoding = pc.getString(ENCODING_ATTR, "ISO-8859-1"); td.direction = pc.getString(DIRECTION_ATTR, "ltr"); td.file = pc.getString(FILE_ATTR); td.name = pc.getString(NAME_ATTR); td.localizedName = pc.getString(LOCALIZED_NAME_ATTR, td.name); td.archiveFile = transZipFile; td.delimiter = pc.getString(LINE_DELIMITER_ATTR, "\n"); String sig = pc.getString(SIGNATURE_ATTR); td.signature = sig == null ? null : Base64.decodeBase64(sig.getBytes("US-ASCII")); //create a LocalizedInstance for this translation. // <patch> LocalizedResource localizedResource = new LocalizedResource(); localizedResource.loadLocalizedNames(pc, NAME_ATTR); localizedResource.setLanguage(td.locale.getLanguage()); td.setLocalizedResource(localizedResource); td.setFile(transZipFile); // </patch> if (StringUtils.isBlank(td.id) || StringUtils.isBlank(td.name) || StringUtils.isBlank(td.file) || StringUtils.isBlank(td.version)) { logger.warn("Invalid translation: \"" + td + "\"."); return null; } if (zipFile.getEntry(td.file) == null) { logger.warn("Invalid translation format. File not exists in the archive: " + td.file); return null; } } finally { if (zipFile != null) { ZipUtils.closeQuietly(zipFile); } } return td; }
From source file:com.pari.pcb.zip.ZIPProcessor.java
private void processVersionFile(String fileName, FileInfo fileInfo, ZipEntry entry, ZipFile inZip) { String hostName = fileInfo.hostName; String osType = fileInfo.ostype; String version = fileInfo.version; ZIPFileResult fileResult = new ZIPFileResult(fileName); fileResult.hostName = fileInfo.hostName; fileResult.osType = fileInfo.ostype; fileResult.fileType = fileInfo.fileType; if (hostName == null) { fileResult.msg = "Unable to parse hostname"; fileResultMap.put(fileName, fileResult); return;/* w w w. j a v a 2s . c o m*/ } else { if (hostName.contains("=")) { fileResult.msg = "Illegal hostname. Should not contain '='"; fileResult.hostName = hostName; fileResultMap.put(fileName, fileResult); return; } } String currOsType = osTypeMap.get(hostName); if ((currOsType != null) && (!currOsType.equals(osType))) { // TODO: // Different OS types from different files. Handle this later } osTypeMap.put(hostName, osType); if (showVerMap.containsKey(hostName)) { logger.debug("\tDuplicate version for : " + hostName); fileResult.msg = "Duplicate version for: " + hostName; // HostName already exists. Duplicate hostname. String oldFileName = showVerFileMap.get(hostName); HashSet<String> hs = dupVersionsFileMap.get(hostName); if (hs == null) { hs = new HashSet<String>(); dupVersionsFileMap.put(hostName, hs); } hs.add(oldFileName); hs.add(fileName); showVerFileMap.remove(hostName); showVerMap.remove(hostName); } else { // Host name does not exist in show versions list. Check if it exists in the duplicates. HashSet<String> hs = dupVersionsFileMap.get(hostName); if ((hs != null) && !hs.isEmpty()) { fileResult.msg = "Duplicate version for: " + hostName; logger.debug("\tDuplicate version for : " + hostName); hs.add(fileName); } else { // It does not exist in the duplicates either. try { if (entry == null && fileInfo.entryName != null) { entry = inZip.getEntry(fileInfo.entryName); } addShowVersion(hostName, entry, inZip); showVerFileMap.put(hostName, fileName); if (version != null) { versionNumberMap.put(hostName, version); } } catch (Exception ex) { logger.error("Exception while saving version for " + hostName, ex); } } } fileResultMap.put(fileName, fileResult); }
From source file:com.flexive.core.storage.GenericDivisionImporter.java
/** * Import data from a zip archive to a database table * * @param stmt statement to use * @param zip zip archive containing the zip entry * @param ze zip entry within the archive * @param xpath xpath containing the entries to import * @param table name of the table * @param executeInsertPhase execute the insert phase? * @param executeUpdatePhase execute the update phase? * @param updateColumns columns that should be set to <code>null</code> in a first pass (insert) * and updated to the provided values in a second pass (update), * columns that should be used in the where clause have to be prefixed * with "KEY:", to assign a default value use the expression "columnname:default value", * if the default value is "@", it will be a negative counter starting at 0, decreasing. * If the default value starts with "%", it will be set to the column following the "%" * character in the first pass * @throws Exception on errors//from ww w . j a v a2 s . c om */ protected void importTable(Statement stmt, final ZipFile zip, final ZipEntry ze, final String xpath, final String table, final boolean executeInsertPhase, final boolean executeUpdatePhase, final String... updateColumns) throws Exception { //analyze the table final ResultSet rs = stmt.executeQuery("SELECT * FROM " + table + " WHERE 1=2"); StringBuilder sbInsert = new StringBuilder(500); StringBuilder sbUpdate = updateColumns.length > 0 ? new StringBuilder(500) : null; if (rs == null) throw new IllegalArgumentException("Can not analyze table [" + table + "]!"); sbInsert.append("INSERT INTO ").append(table).append(" ("); final ResultSetMetaData md = rs.getMetaData(); final Map<String, ColumnInfo> updateClauseColumns = updateColumns.length > 0 ? new HashMap<String, ColumnInfo>(md.getColumnCount()) : null; final Map<String, ColumnInfo> updateSetColumns = updateColumns.length > 0 ? new LinkedHashMap<String, ColumnInfo>(md.getColumnCount()) : null; final Map<String, String> presetColumns = updateColumns.length > 0 ? new HashMap<String, String>(10) : null; //preset to a referenced column (%column syntax) final Map<String, String> presetRefColumns = updateColumns.length > 0 ? new HashMap<String, String>(10) : null; final Map<String, Integer> counters = updateColumns.length > 0 ? new HashMap<String, Integer>(10) : null; final Map<String, ColumnInfo> insertColumns = new HashMap<String, ColumnInfo>( md.getColumnCount() + (counters != null ? counters.size() : 0)); int insertIndex = 1; int updateSetIndex = 1; int updateClauseIndex = 1; boolean first = true; for (int i = 0; i < md.getColumnCount(); i++) { final String currCol = md.getColumnName(i + 1).toLowerCase(); if (updateColumns.length > 0) { boolean abort = false; for (String col : updateColumns) { if (col.indexOf(':') > 0 && !col.startsWith("KEY:")) { String value = col.substring(col.indexOf(':') + 1); col = col.substring(0, col.indexOf(':')); if ("@".equals(value)) { if (currCol.equalsIgnoreCase(col)) { counters.put(col, 0); insertColumns.put(col, new ColumnInfo(md.getColumnType(i + 1), insertIndex++)); sbInsert.append(',').append(currCol); } } else if (value.startsWith("%")) { if (currCol.equalsIgnoreCase(col)) { presetRefColumns.put(col, value.substring(1)); insertColumns.put(col, new ColumnInfo(md.getColumnType(i + 1), insertIndex++)); sbInsert.append(',').append(currCol); // System.out.println("==> adding presetRefColumn "+col+" with value of "+value.substring(1)); } } else if (!presetColumns.containsKey(col)) presetColumns.put(col, value); } if (currCol.equalsIgnoreCase(col)) { abort = true; updateSetColumns.put(currCol, new ColumnInfo(md.getColumnType(i + 1), updateSetIndex++)); break; } } if (abort) continue; } if (first) { first = false; } else sbInsert.append(','); sbInsert.append(currCol); insertColumns.put(currCol, new ColumnInfo(md.getColumnType(i + 1), insertIndex++)); } if (updateColumns.length > 0 && executeUpdatePhase) { sbUpdate.append("UPDATE ").append(table).append(" SET "); int counter = 0; for (String updateColumn : updateSetColumns.keySet()) { if (counter++ > 0) sbUpdate.append(','); sbUpdate.append(updateColumn).append("=?"); } sbUpdate.append(" WHERE "); boolean hasKeyColumn = false; for (String col : updateColumns) { if (!col.startsWith("KEY:")) continue; hasKeyColumn = true; String keyCol = col.substring(4); for (int i = 0; i < md.getColumnCount(); i++) { if (!md.getColumnName(i + 1).equalsIgnoreCase(keyCol)) continue; updateClauseColumns.put(keyCol, new ColumnInfo(md.getColumnType(i + 1), updateClauseIndex++)); sbUpdate.append(keyCol).append("=? AND "); break; } } if (!hasKeyColumn) throw new IllegalArgumentException("Update columns require a KEY!"); sbUpdate.delete(sbUpdate.length() - 5, sbUpdate.length()); //remove trailing " AND " //"shift" clause indices for (String col : updateClauseColumns.keySet()) { GenericDivisionImporter.ColumnInfo ci = updateClauseColumns.get(col); ci.index += (updateSetIndex - 1); } } if (presetColumns != null) { for (String key : presetColumns.keySet()) sbInsert.append(',').append(key); } sbInsert.append(")VALUES("); for (int i = 0; i < insertColumns.size(); i++) { if (i > 0) sbInsert.append(','); sbInsert.append('?'); } if (presetColumns != null) { for (String key : presetColumns.keySet()) sbInsert.append(',').append(presetColumns.get(key)); } sbInsert.append(')'); if (DBG) { LOG.info("Insert statement:\n" + sbInsert.toString()); if (updateColumns.length > 0) LOG.info("Update statement:\n" + sbUpdate.toString()); } //build a map containing all nodes that require attributes //this allows for matching simple xpath queries like "flatstorages/storage[@name='FX_FLAT_STORAGE']/data" final Map<String, List<String>> queryAttributes = new HashMap<String, List<String>>(5); for (String pElem : xpath.split("/")) { if (!(pElem.indexOf('@') > 0 && pElem.indexOf('[') > 0)) continue; List<String> att = new ArrayList<String>(5); for (String pAtt : pElem.split("@")) { if (!(pAtt.indexOf('=') > 0)) continue; att.add(pAtt.substring(0, pAtt.indexOf('='))); } queryAttributes.put(pElem.substring(0, pElem.indexOf('[')), att); } final PreparedStatement psInsert = stmt.getConnection().prepareStatement(sbInsert.toString()); final PreparedStatement psUpdate = updateColumns.length > 0 && executeUpdatePhase ? stmt.getConnection().prepareStatement(sbUpdate.toString()) : null; try { final SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); final DefaultHandler handler = new DefaultHandler() { private String currentElement = null; private Map<String, String> data = new HashMap<String, String>(10); private StringBuilder sbData = new StringBuilder(10000); boolean inTag = false; boolean inElement = false; int counter; List<String> path = new ArrayList<String>(10); StringBuilder currPath = new StringBuilder(100); boolean insertMode = true; /** * {@inheritDoc} */ @Override public void startDocument() throws SAXException { counter = 0; inTag = false; inElement = false; path.clear(); currPath.setLength(0); sbData.setLength(0); data.clear(); currentElement = null; } /** * {@inheritDoc} */ @Override public void processingInstruction(String target, String data) throws SAXException { if (target != null && target.startsWith("fx_")) { if (target.equals("fx_mode")) insertMode = "insert".equals(data); } else super.processingInstruction(target, data); } /** * {@inheritDoc} */ @Override public void endDocument() throws SAXException { if (insertMode) LOG.info("Imported [" + counter + "] entries into [" + table + "] for xpath [" + xpath + "]"); else LOG.info("Updated [" + counter + "] entries in [" + table + "] for xpath [" + xpath + "]"); } /** * {@inheritDoc} */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { pushPath(qName, attributes); if (currPath.toString().equals(xpath)) { inTag = true; data.clear(); for (int i = 0; i < attributes.getLength(); i++) { String name = attributes.getLocalName(i); if (StringUtils.isEmpty(name)) name = attributes.getQName(i); data.put(name, attributes.getValue(i)); } } else { currentElement = qName; } inElement = true; sbData.setLength(0); } /** * Push a path element from the stack * * @param qName element name to push * @param att attributes */ private void pushPath(String qName, Attributes att) { if (att.getLength() > 0 && queryAttributes.containsKey(qName)) { String curr = qName + "["; boolean first = true; final List<String> attList = queryAttributes.get(qName); for (int i = 0; i < att.getLength(); i++) { if (!attList.contains(att.getQName(i))) continue; if (first) first = false; else curr += ','; curr += "@" + att.getQName(i) + "='" + att.getValue(i) + "'"; } curr += ']'; path.add(curr); } else path.add(qName); buildPath(); } /** * Pop the top path element from the stack */ private void popPath() { path.remove(path.size() - 1); buildPath(); } /** * Rebuild the current path */ private synchronized void buildPath() { currPath.setLength(0); for (String s : path) currPath.append(s).append('/'); if (currPath.length() > 1) currPath.delete(currPath.length() - 1, currPath.length()); // System.out.println("currPath: " + currPath); } /** * {@inheritDoc} */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (currPath.toString().equals(xpath)) { if (DBG) LOG.info("Insert [" + xpath + "]: [" + data + "]"); inTag = false; try { if (insertMode) { if (executeInsertPhase) { processColumnSet(insertColumns, psInsert); counter += psInsert.executeUpdate(); } } else { if (executeUpdatePhase) { if (processColumnSet(updateSetColumns, psUpdate)) { processColumnSet(updateClauseColumns, psUpdate); counter += psUpdate.executeUpdate(); } } } } catch (SQLException e) { throw new SAXException(e); } catch (ParseException e) { throw new SAXException(e); } } else { if (inTag) { data.put(currentElement, sbData.toString()); } currentElement = null; } popPath(); inElement = false; sbData.setLength(0); } /** * Process a column set * * @param columns the columns to process * @param ps prepared statement to use * @return if data other than <code>null</code> has been set * @throws SQLException on errors * @throws ParseException on date/time conversion errors */ private boolean processColumnSet(Map<String, ColumnInfo> columns, PreparedStatement ps) throws SQLException, ParseException { boolean dataSet = false; for (String col : columns.keySet()) { ColumnInfo ci = columns.get(col); String value = data.get(col); if (insertMode && counters != null && counters.get(col) != null) { final int newVal = counters.get(col) - 1; value = String.valueOf(newVal); counters.put(col, newVal); // System.out.println("new value for " + col + ": " + newVal); } if (insertMode && presetRefColumns != null && presetRefColumns.get(col) != null) { value = data.get(presetRefColumns.get(col)); // System.out.println("Set presetRefColumn for "+col+" to ["+value+"] from column ["+presetRefColumns.get(col)+"]"); } if (value == null) ps.setNull(ci.index, ci.columnType); else { dataSet = true; switch (ci.columnType) { case Types.BIGINT: case Types.NUMERIC: if (DBG) LOG.info("BigInt " + ci.index + "->" + new BigDecimal(value)); ps.setBigDecimal(ci.index, new BigDecimal(value)); break; case java.sql.Types.DOUBLE: if (DBG) LOG.info("Double " + ci.index + "->" + Double.parseDouble(value)); ps.setDouble(ci.index, Double.parseDouble(value)); break; case java.sql.Types.FLOAT: case java.sql.Types.REAL: if (DBG) LOG.info("Float " + ci.index + "->" + Float.parseFloat(value)); ps.setFloat(ci.index, Float.parseFloat(value)); break; case java.sql.Types.TIMESTAMP: case java.sql.Types.DATE: if (DBG) LOG.info("Timestamp/Date " + ci.index + "->" + FxFormatUtils.getDateTimeFormat().parse(value)); ps.setTimestamp(ci.index, new Timestamp(FxFormatUtils.getDateTimeFormat().parse(value).getTime())); break; case Types.TINYINT: case Types.SMALLINT: if (DBG) LOG.info("Integer " + ci.index + "->" + Integer.valueOf(value)); ps.setInt(ci.index, Integer.valueOf(value)); break; case Types.INTEGER: case Types.DECIMAL: try { if (DBG) LOG.info("Long " + ci.index + "->" + Long.valueOf(value)); ps.setLong(ci.index, Long.valueOf(value)); } catch (NumberFormatException e) { //Fallback (temporary) for H2 if the reported long is a big decimal (tree...) ps.setBigDecimal(ci.index, new BigDecimal(value)); } break; case Types.BIT: case Types.CHAR: case Types.BOOLEAN: if (DBG) LOG.info("Boolean " + ci.index + "->" + value); if ("1".equals(value) || "true".equals(value)) ps.setBoolean(ci.index, true); else ps.setBoolean(ci.index, false); break; case Types.LONGVARBINARY: case Types.VARBINARY: case Types.BLOB: case Types.BINARY: ZipEntry bin = zip.getEntry(value); if (bin == null) { LOG.error("Failed to lookup binary [" + value + "]!"); ps.setNull(ci.index, ci.columnType); break; } try { ps.setBinaryStream(ci.index, zip.getInputStream(bin), (int) bin.getSize()); } catch (IOException e) { LOG.error("IOException importing binary [" + value + "]: " + e.getMessage(), e); } break; case Types.CLOB: case Types.LONGVARCHAR: case Types.VARCHAR: case SQL_LONGNVARCHAR: case SQL_NCHAR: case SQL_NCLOB: case SQL_NVARCHAR: if (DBG) LOG.info("String " + ci.index + "->" + value); ps.setString(ci.index, value); break; default: LOG.warn("Unhandled type [" + ci.columnType + "] for column [" + col + "]"); } } } return dataSet; } /** * {@inheritDoc} */ @Override public void characters(char[] ch, int start, int length) throws SAXException { if (inElement) sbData.append(ch, start, length); } }; handler.processingInstruction("fx_mode", "insert"); parser.parse(zip.getInputStream(ze), handler); if (updateColumns.length > 0 && executeUpdatePhase) { handler.processingInstruction("fx_mode", "update"); parser.parse(zip.getInputStream(ze), handler); } } finally { Database.closeObjects(GenericDivisionImporter.class, psInsert, psUpdate); } }