felix@4681: package de.intevation.flys.importer.parsers; felix@4681: felix@4681: import java.util.ArrayList; felix@4681: import java.util.HashMap; felix@4681: import java.util.Map; felix@4681: import java.util.List; felix@4681: import java.util.TreeMap; felix@4681: felix@4681: import java.util.regex.Pattern; felix@4681: import java.util.regex.Matcher; felix@4681: felix@4681: import java.io.File; felix@4681: import java.io.IOException; felix@4681: felix@4681: import org.apache.log4j.Logger; felix@4681: felix@4681: import de.intevation.flys.importer.XY; felix@4681: felix@4681: import de.intevation.artifacts.common.utils.FileTools; felix@4681: felix@4681: felix@4681: /** felix@4681: * To create cross-sections, generate: Map> from files felix@4681: * in da66 format. felix@4681: */ felix@4681: public class DA66Parser extends LineParser felix@4681: { felix@4681: /** Private logger. */ felix@4681: private static Logger logger = Logger.getLogger(DA66Parser.class); felix@4681: felix@4681: // TODO: Most of the Point/y/z group matches are optional! felix@4681: public static final Pattern LINE_PATTERN = felix@4681: Pattern.compile("^([0-9 -]{2})" + // Type felix@4681: "([0-9 -]{5})" + // unset felix@4681: "([0-9 -]{2})" + // id felix@4681: "([0-9 -]{9})" + // station felix@4681: "([0-9 -]{2})" + // running number felix@4681: "([0-9 -]{1})" + // point id felix@4681: /* felix@4681: Would be great if we could express the pattern as this: felix@4681: ([0-9 -]{1})([0-9 -JKMLMNOPQR]{7})([0-9 -]{7})+ felix@4681: */ felix@4681: "([0-9 -JKMLMNOPQR]{7})" + // y felix@4681: "([0-9 -]{7})" + // z felix@4681: "([0-9 -]{1})" + // point id felix@4681: "([0-9 -JKMLMNOPQR]{7})" + // y felix@4681: "([0-9 -]{7})" + // z felix@4681: "([0-9 -]{1})" + // point id felix@4681: "([0-9 -JKMLMNOPQR]{7})" + // y felix@4681: "([0-9 -]{7})" + // z felix@4681: "([0-9 -]{1})" + // point id felix@4681: "([0-9 -JKMLMNOPQR]{7})" + // y felix@4681: "([0-9 -]{7})" // z felix@4681: ); felix@4681: //Pattern.compile("^([0-9 -]{2})"); felix@4681: felix@4681: private static enum Type { felix@4681: DATE ( 0), felix@4681: HEKTOSTONE_LEFT ( 1), //grm. "Standlinie" felix@4681: HEKTOSTONE_RIGHT ( 2), felix@4681: CHANNEL_LEFT ( 3), //grm. "Fahrrinne" felix@4681: CHANNEL_RIGHT ( 4), felix@4681: CHANNEL_2_LEFT ( 5), felix@4681: CHANNEL_2_RIGHT ( 6), felix@4681: GIW_1972 ( 7), felix@4681: GROIN_DIST_LEFT ( 8), //grm. "Buhnenkopfabstand links" felix@4681: GROIN_HEIGHT_LEFT ( 9), felix@4681: GROIN_SLOPE_LEFT (10), felix@4681: GROIN_DIST_RIGHT (11), felix@4681: GROIN_HEIGHT_RIGHT (12), felix@4681: GROIN_SLOPE_RIGHT (13), felix@4681: STRIKE_LEFT (14), //grm. "Streichlinie links" felix@4681: AXIS (15), felix@4681: STRIKE_RIGHT (16), felix@4681: GROIN_BACK_SLOPE_LEFT (17), //grm. "Buhnenrueckenneigung" felix@4681: GROIN_BACK_SLOPE_RIGHT (18), felix@4681: GIW_1932 (19), felix@4681: GIW_1982 (20), felix@4681: STAND_ISLAND_1 (21), felix@4681: STAND_ISLAND_2 (22), felix@4681: STAND_ISLAND_3 (23), felix@4681: STAND_ISLAND_4 (24), felix@4681: UNSPECIFIED_1 (25), felix@4681: UNSPECIFIED_2 (26), felix@4681: HHW (27), felix@4681: OLD_PROFILE_NULL (28), felix@4681: AW_1978 (29), felix@4681: SIGN_LEFT (30), felix@4681: SIGN_RIGHT (31), felix@4681: DIST_SIGNAL_CHANNEL_LEFT (32), felix@4681: DIST_SIGNAL_CHANNEL_RIGHT(33), felix@4681: UNSPECIFIED_3 (34), felix@4681: UNSPECIFIED_4 (35), felix@4681: UNSPECIFIED_5 (36), felix@4681: UNSPECIFIED_6 (37), felix@4681: SHORE_LEFT (38), felix@4681: SHORE_RIGHT (39), felix@4681: UNSPECIFIED_7 (40); felix@4681: felix@4681: private final int id; felix@4681: Type(int id) { felix@4681: this.id = id; felix@4681: } felix@4681: public int getId() { felix@4681: return id; felix@4681: } felix@4681: } felix@4681: felix@4681: /** Available types. */ felix@4681: private static HashMap typeMap; felix@4681: felix@4681: /** Types we can deal with. */ felix@4681: private static List implementedTypes; felix@4681: felix@4681: static { felix@4681: typeMap = new HashMap(); felix@4681: for (Type t: Type.values()) { felix@4681: typeMap.put(new Integer(t.getId()), t); felix@4681: } felix@4681: implementedTypes = new ArrayList(); felix@4681: //implementedTypes.add(..); felix@4681: } felix@4681: felix@4681: public interface Callback { felix@4681: boolean da60Accept(File file); felix@4681: void da60Parsed(DA66Parser parser); felix@4681: } // interface Parser felix@4681: felix@4681: protected Map> data; felix@4681: felix@4681: felix@4681: public DA66Parser() { felix@4681: data = new TreeMap>(); felix@4681: } felix@4681: felix@4681: public Map> getData() { felix@4681: return data; felix@4681: } felix@4681: felix@4681: public void setData(Map> data) { felix@4681: this.data = data; felix@4681: } felix@4681: felix@4681: private static final String removeExtension(String name) { felix@4681: int index = name.lastIndexOf('.'); felix@4681: return index == -1 felix@4681: ? name felix@4681: : name.substring(0, index); felix@4681: } felix@4681: felix@4681: public void reset() { felix@4681: data.clear(); felix@4681: } felix@4681: felix@4681: public void parseDA66s(File root, final Callback callback) { felix@4681: felix@4681: FileTools.walkTree(root, new FileTools.FileVisitor() { felix@4681: @Override felix@4681: public boolean visit(File file) { felix@4681: if (file.isFile() && file.canRead() felix@4681: && file.getName().toLowerCase().endsWith(".d66") felix@4681: && (callback == null || callback.da60Accept(file))) { felix@4681: reset(); felix@4681: try { felix@4681: parse(file); felix@4681: logger.info("parsing done"); felix@4681: if (callback != null) { felix@4681: callback.da60Parsed(DA66Parser.this); felix@4681: } felix@4681: } felix@4681: catch (IOException ioe) { felix@4681: logger.error("IOException while parsing file"); felix@4681: return false; felix@4681: } felix@4681: } felix@4681: return true; felix@4681: } felix@4681: }); felix@4681: } felix@4681: felix@4681: // LineParser felix@4681: @Override felix@4681: protected void finish() {} felix@4681: felix@4681: /** Called for each line. Try to extract info from a da66 line. */ felix@4681: @Override felix@4681: protected void handleLine(int lineNum, String line) { felix@4681: if (line.substring(0,2).equals("00")) { felix@4681: logger.warn("Hit a 00"); felix@4681: } felix@4681: else if (line.substring(0,2).equals("66")) { felix@4681: String station = line.substring(10,18); felix@4681: logger.info(station); felix@4681: Matcher m = LINE_PATTERN.matcher(line); felix@4681: if(m.find()) felix@4681: logger.warn("Group1: " + m.group(1)); felix@4681: else felix@4681: logger.warn("no match in " + line); felix@4681: //logger.warn("Hit a 66"); felix@4681: } felix@4681: else if (line.substring(0,2).equals("88")) felix@4681: logger.warn("Hit a 88"); felix@4681: else felix@4681: logger.error("Do not know how to treat da66 line."); felix@4681: } felix@4681: felix@4681: felix@4681: /** Parses files given as arguments. */ felix@4681: public static void main(String [] args) { felix@4681: felix@4681: DA66Parser parser = new DA66Parser(); felix@4681: felix@4681: logger.warn("Start Parsing files."); felix@4681: for (String arg: args) { felix@4681: parser.parseDA66s(new File(arg), null); felix@4681: logger.warn("Parsing a file."); felix@4681: } felix@4681: logger.error("Stopped Parsing files."); felix@4681: } felix@4681: } felix@4681: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :