sascha@177: package de.intevation.flys.importer; sascha@177: sascha@765: import de.intevation.artifacts.common.utils.XMLUtils; sascha@765: felix@5027: import de.intevation.flys.importer.parsers.AnnotationClassifier; felix@5027: import de.intevation.flys.importer.parsers.BundesWasserStrassenParser; sascha@1211: import de.intevation.flys.importer.parsers.InfoGewParser; sascha@1211: sascha@177: import java.io.File; sascha@177: import java.io.IOException; sascha@177: felix@5027: import java.util.HashMap; sascha@180: import java.util.List; felix@5027: import java.util.Map; sascha@180: sascha@188: import java.sql.SQLException; sascha@188: sascha@177: import org.apache.log4j.Logger; sascha@177: sascha@180: import org.hibernate.Transaction; sascha@188: import org.hibernate.HibernateException; sascha@180: sascha@765: import org.w3c.dom.Document; sascha@765: felix@5027: import de.intevation.flys.utils.StringUtil; felix@4707: felix@5016: /** Data Importer. Further processing happens per-river. */ sascha@177: public class Importer sascha@177: { felix@5016: /** Private logger. */ sascha@177: private static Logger log = Logger.getLogger(Importer.class); sascha@177: felix@5027: private static String BWASTR_ID_CSV_FILE = "BWASTR_ID.csv"; felix@5027: sascha@180: protected List rivers; sascha@180: sascha@180: public Importer() { sascha@180: } sascha@180: sascha@180: public Importer(List rivers) { sascha@180: this.rivers = rivers; sascha@180: } sascha@180: sascha@180: public List getRivers() { sascha@180: return rivers; sascha@180: } sascha@180: sascha@180: public void setRivers(List rivers) { sascha@180: this.rivers = rivers; sascha@180: } sascha@180: felix@5027: /** Write rivers and their dependencies/dependants to db. */ sascha@180: public void writeRivers() { sascha@182: log.debug("write rivers started"); sascha@188: sascha@188: for (ImportRiver river: rivers) { sascha@188: log.debug("writing river '" + river.getName() + "'"); sascha@190: river.storeDependencies(); sascha@497: ImporterSession.getInstance().getDatabaseSession().flush(); sascha@180: } sascha@188: sascha@182: log.debug("write rivers finished"); sascha@180: } sascha@180: sascha@180: public void writeToDatabase() { sascha@183: sascha@180: Transaction tx = null; sascha@180: sascha@180: try { sascha@497: tx = ImporterSession.getInstance() sascha@497: .getDatabaseSession().beginTransaction(); sascha@180: sascha@188: try { sascha@188: writeRivers(); sascha@188: } sascha@188: catch (HibernateException he) { sascha@188: Throwable t = he.getCause(); sascha@188: while (t instanceof SQLException) { felix@5238: SQLException sqle = (SQLException) t; sascha@188: log.error("SQL exeception chain:", sqle); sascha@188: t = sqle.getNextException(); sascha@188: } sascha@188: throw he; sascha@188: } sascha@180: sascha@180: tx.commit(); sascha@180: } sascha@180: catch (RuntimeException re) { sascha@180: if (tx != null) { sascha@180: tx.rollback(); sascha@180: } sascha@180: throw re; sascha@180: } sascha@180: } sascha@180: sascha@765: public static AnnotationClassifier getAnnotationClassifier() { sascha@1223: String annotationTypes = Config.INSTANCE.getAnnotationTypes(); sascha@765: sascha@765: if (annotationTypes == null) { sascha@766: log.info("no annotation types file configured."); sascha@765: return null; sascha@765: } sascha@765: sascha@765: File file = new File(annotationTypes); sascha@765: sascha@766: log.info("use annotation types file '" + file + "'"); sascha@766: sascha@765: if (!(file.isFile() && file.canRead())) { sascha@765: log.warn("annotation type file '" + file + "' is not readable."); sascha@765: return null; sascha@765: } sascha@765: sascha@765: Document rules = XMLUtils.parseDocument(file); sascha@765: sascha@765: if (rules == null) { sascha@765: log.warn("cannot parse annotation types file."); sascha@765: return null; sascha@765: } sascha@765: sascha@765: return new AnnotationClassifier(rules); sascha@765: } sascha@765: felix@4707: felix@4707: /** Starting point for importing river data. */ sascha@177: public static void main(String [] args) { sascha@177: sascha@765: InfoGewParser infoGewParser = new InfoGewParser( sascha@765: getAnnotationClassifier()); sascha@177: ingo@2806: log.info("Start parsing rivers..."); ingo@2806: felix@5027: File bwastrFile = null; felix@5027: sascha@177: for (String gew: args) { sascha@177: log.info("parsing info gew file: " + gew); felix@5027: File gewFile = new File(gew); felix@5027: if (bwastrFile == null) { felix@5027: bwastrFile = new File(gewFile.getParentFile(), BWASTR_ID_CSV_FILE); felix@5027: } sascha@177: try { felix@5027: infoGewParser.parse(gewFile); sascha@177: } sascha@177: catch (IOException ioe) { aheinecke@5106: log.error("error while parsing gew: " + gew, ioe); aheinecke@5106: System.exit(1); sascha@177: } sascha@177: } sascha@180: ingo@2804: String gew = Config.INSTANCE.getInfoGewFile(); ingo@2804: if (gew != null && gew.length() > 0) { ingo@2804: log.info("parsing info gew file: " + gew); felix@5027: File gewFile = new File(gew); felix@5027: if (bwastrFile == null) { felix@5027: bwastrFile = new File(gewFile.getParentFile(), BWASTR_ID_CSV_FILE); felix@5027: } ingo@2804: try { felix@5027: infoGewParser.parse(gewFile); ingo@2804: } ingo@2804: catch (IOException ioe) { aheinecke@5106: log.error("error while parsing gew: " + gew, ioe); aheinecke@5106: System.exit(1); ingo@2804: } ingo@2804: } ingo@2804: felix@5027: // Look for official numbers. felix@5027: BundesWasserStrassenParser bwastrIdParser = felix@5027: new BundesWasserStrassenParser(); felix@5027: felix@5027: // Read bwastFile (river-dir + BWASTR_ID_CSV_FILE). felix@5027: if (!Config.INSTANCE.skipBWASTR()) { felix@5027: try{ felix@5027: bwastrIdParser.parse(bwastrFile); felix@5027: HashMap map = bwastrIdParser.getMap(); felix@5027: felix@5027: // Now link rivers with official numbers. felix@5027: for(ImportRiver river: infoGewParser.getRivers()) { felix@5027: for(Map.Entry entry: map.entrySet()) { felix@5027: if (StringUtil.containsIgnoreCase(entry.getKey(), river.getName())) { felix@5027: river.setOfficialNumber(entry.getValue()); felix@5027: log.debug(river.getName() + " is mapped to bwastr " + entry.getValue()); felix@5027: } felix@5027: } felix@5027: } felix@5027: } catch (IOException ioe) { felix@5027: log.warn("BWASTR-file could not be loaded."); felix@5027: } felix@5027: } felix@5027: else { felix@5027: log.debug("skip reading BWASTR_ID.csv"); felix@5027: } felix@5027: sascha@1223: if (!Config.INSTANCE.dryRun()) { sascha@199: new Importer(infoGewParser.getRivers()).writeToDatabase(); sascha@199: } felix@4708: else { felix@4708: log.info("Dry run, not writing to database."); felix@4708: } sascha@177: } sascha@177: } sascha@177: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :