.gitattributes
@@ -64,6 +64,7 @@ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractDgnFileJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/IndexDgnConvertJobContext.java svneol=native#text/plain xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java svneol=native#text/plain xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml
@@ -20,6 +20,12 @@ <key>SHPDATA_DIR</key> <value>g:\temp\data</value> </entry> <!-- <entry> <key>SHPFILTER_CONF</key> <value></value> </entry> --> <entry> <key>ORAHOST</key> <value>192.168.11.200</value> @@ -53,6 +59,10 @@ <value>true</value> </entry> <entry> <key>CONVERTELEMIN</key> <value>false</value> </entry> <entry> <key>ELEMLOG</key> <value>true</value> </entry> xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateLineStringStrategy.java
@@ -22,6 +22,7 @@ import com.ximple.io.dgn7.LineElement; import com.ximple.io.dgn7.LineStringElement; import com.ximple.io.dgn7.UserAttributeData; import com.ximple.io.dgn7.ArcElement; public class CreateLineStringStrategy implements CreateFeatureTypeStrategy { @@ -121,7 +122,24 @@ lineElement.getLineStyle() }); return feature; } else if (element instanceof ArcElement) { ArcElement lineStringElement = (ArcElement) element; convertDecorator.setConverter(lineStringElement); Feature feature = featureType.create(new Object[]{ convertDecorator.toGeometry(geometryFactory), (int) fLinkage.getFsc(), (long) fLinkage.getUfid(), (int) fLinkage.getComponentID(), 0, lineStringElement.getLevelIndex(), colorTable.getColorCode(lineStringElement.getColorIndex()), lineStringElement.getWeight(), lineStringElement.getLineStyle() }); return feature; } return null; } } xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java
@@ -26,6 +26,7 @@ private static final String SPATAILSCHEMA = "ORGSCHEMA"; private static final String CONVERTDB = "CONVERTDB"; private static final String CONVERTFILE = "CONVERTFILE"; private static final String CONVERTELEMIN = "CONVERTELEMIN"; private static final String ELEMLOG = "ELEMLOG"; private static final String ORAHOST = "ORAHOST"; private static final String ORAINST = "ORAINST"; @@ -44,6 +45,7 @@ protected String _password; protected String _convertDB; protected String _convertFile; protected String _convertElementIn; protected String _elementLogging; protected ArrayList<String> _orgSchema = new ArrayList<String>(); protected boolean _testMode = false; @@ -66,6 +68,7 @@ _password = dataMap.getString(ORAPASS); _convertDB = dataMap.getString(CONVERTDB); _convertFile = dataMap.getString(CONVERTFILE); _convertElementIn = dataMap.getString(CONVERTELEMIN); _elementLogging = dataMap.getString(ELEMLOG); Log logger = getLogger(); @@ -78,6 +81,7 @@ logger.info("ORAPASS=" + _password); logger.info("CONVERTDB=" + _convertDB); logger.info("CONVERTFILE=" + _convertFile); logger.info("CONVERTELEMIN=" + _convertElementIn); logger.info("ELEMLOG=" + _elementLogging); String strSchema = dataMap.getString(SPATAILSCHEMA); @@ -246,6 +250,16 @@ _convertFile = convertFile; } public String getConvertElementIn() { return _convertElementIn; } public void setConvertElementIn(String convertElementIn) { _convertElementIn = convertElementIn; } public boolean checkConvertDB() { return _convertDB != null && !_convertDB.equalsIgnoreCase("false") && @@ -258,6 +272,12 @@ !_convertFile.equalsIgnoreCase("no") && !_convertFile.equalsIgnoreCase("0"); } public boolean checkConvertElementIn() { return _convertElementIn != null && !_convertElementIn.equalsIgnoreCase("false") && !_convertElementIn.equalsIgnoreCase("no") && !_convertElementIn.equalsIgnoreCase("0"); } public String getElementLogging() { return _elementLogging; xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java
New file @@ -0,0 +1,280 @@ package com.ximple.eofms.jobs; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.apache.commons.digester.Digester; import org.apache.commons.digester.xmlrules.DigesterLoader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.transaction.memory.PessimisticMapWrapper; import org.apache.commons.transaction.util.CommonsLoggingLogger; import org.apache.commons.transaction.util.LoggerFacade; import org.geotools.data.FeatureWriter; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.indexed.IndexedShapefileDataStore; import org.geotools.feature.Feature; import org.geotools.feature.FeatureType; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.SchemaException; import org.geotools.feature.SimpleFeature; import org.xml.sax.SAXException; import com.vividsolutions.jts.geom.GeometryFactory; import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; import com.ximple.eofms.filter.ElementDispatcher; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.UserAttributeData; import com.ximple.io.dgn7.ComplexElement; public class FeatureDgnConvertJobContext extends AbstractDgnFileJobContext { static final Log logger = LogFactory.getLog(IndexDgnConvertJobContext.class); static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); static final GeometryFactory geometryFactory = new GeometryFactory(); static final String SHPOUTPATH = "shpout"; private String dataOut = null; private HashMap<String, ArrayList<Feature>> featuresContext = new HashMap<String, ArrayList<Feature>>(); private HashMap<String, FeatureWriter> featuresWriterContext = new HashMap<String, FeatureWriter>(); private PessimisticMapWrapper txFeaturesContext; private ElementDispatcher elementDispatcher; private String _filterConfig; public FeatureDgnConvertJobContext(String dataPath, String filterConfig) { super(dataPath); txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); _filterConfig = filterConfig; elementDispatcher = createElementDispatcher(); } private ElementDispatcher createElementDispatcher() { try { URL rulesURL = ElementDispatcher.class.getResource("ElementDispatcherRules.xml"); assert rulesURL != null; Digester digester = DigesterLoader.createDigester(rulesURL); URL filterURL = null; if (_filterConfig != null) { File config = new File(_filterConfig); if (config.exists()) { filterURL = config.toURI().toURL(); } } if (filterURL == null) { // config = new File("conf/DefaultConvertShpFilter.xml"); filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml"); // filterURL = this.getClass().getResource("/conf/ConvertShpFilterForLevel.xml"); } assert filterURL != null; return (ElementDispatcher) digester.parse(filterURL); } catch (UnsupportedEncodingException e) { logger.info(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } catch (MalformedURLException e) { logger.info(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } catch (IOException e) { logger.info(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } catch (SAXException e) { logger.info(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } } public void putFeatureCollection(Element element) throws IllegalAttributeException, SchemaException { assert elementDispatcher != null; if (element == null) { logger.warn("Unknown Element:" + null); return; } // §PÂ_¬O§_²Å©M±ø¥ó Feature feature = elementDispatcher.execute(element); if (feature == null) { FrammeAttributeData linkage = AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); logger.warn("Unknown Element:" + element.getElementType().toString() + ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); if (element instanceof ComplexElement) { ComplexElement complex = (ComplexElement) element; logger.warn("----Complex Element size=" + complex.size()); } return; } if (!txFeaturesContext.containsKey(feature.getFeatureType())) { txFeaturesContext.put(feature.getFeatureType(), new ArrayList()); } ArrayList arrayList = (ArrayList) txFeaturesContext.get(feature.getFeatureType()); arrayList.add(feature); } public void startTransaction() { } public void commitTransaction() { if (!txFeaturesContext.isEmpty()) { logger.debug("Transaction size = " + txFeaturesContext.size()); //txFeaturesContext.commitTransaction(); } else { logger.debug("Transaction is empty."); } if (!featuresContext.isEmpty()) { updateDataStore(); } } public void rollbackTransaction() { //txFeaturesContext.rollbackTransaction(); if (!featuresContext.isEmpty()) { updateDataStore(); } } private void updateDataStore() { Iterator it = featuresContext.keySet().iterator(); try { while (it.hasNext()) { FeatureType featureType = (FeatureType) it.next(); File sfile = new File(getDataOutPath() + File.separator + featureType.getTypeName()); logger.debug("Begin Save shapefile:" + sfile.toURI()); FeatureWriter writer; if (featuresWriterContext.containsKey(featureType.getTypeName())) { writer = featuresWriterContext.get(featureType.getTypeName()); } else { // ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); /* ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), true, Charset.forName("UTF-8")); */ if (!sfile.exists()) { ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); } else { ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } featuresWriterContext.put(featureType.getTypeName(), writer); } ArrayList<Feature> features = featuresContext.get(featureType); Iterator itFeature = features.iterator(); while (itFeature.hasNext()) { Feature feature = (Feature) itFeature.next(); ((SimpleFeature) writer.next()).setAttributes(feature.getAttributes(null)); } //writer.close(); logger.debug("End Save shapefile:" + sfile.toURI()); } featuresContext.clear(); } catch (MalformedURLException e) { logger.error(e.getMessage(), e); } catch (IllegalAttributeException e) { logger.error(e.getMessage(), e); } catch (IOException e) { logger.error(e.getMessage(), e); } } public String getDataOutPath() { if (dataOut == null) { File outPath = new File(getDataPath(), SHPOUTPATH); if (!outPath.exists()) { outPath.mkdir(); } else if (!outPath.isDirectory()) { outPath.mkdir(); } dataOut = outPath.toString(); } return dataOut; } public void closeFeatureWriter() throws IOException { for (FeatureWriter featureWriter : this.featuresWriterContext.values()) { featureWriter.close(); } this.featuresWriterContext.clear(); } protected FrammeAttributeData getFeatureLinkage(Element element) { if (!element.hasUserAttributeData()) return null; List<UserAttributeData> usrDatas = element.getUserAttributeData(); for (UserAttributeData anUsrData : usrDatas) { if (anUsrData instanceof FrammeAttributeData) { return (FrammeAttributeData) anUsrData; } } return null; } } xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java
@@ -165,10 +165,19 @@ ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), true, Charset.forName("UTF-8")); */ if (!sfile.exists()) { ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); } else { ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } featuresWriterContext.put(featureType.getTypeName(), writer); } xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java
@@ -110,6 +110,7 @@ jobContext.setShapeData(_dataPath); jobContext.setConvertDB(_convertDB); jobContext.setConvertFile(_convertFile); jobContext.setConvertElementIn(_convertElementIn); jobContext.setElementLogging(checkElementLogging()); jobContext.setExecutionContext(context); @@ -132,6 +133,12 @@ convertIndexDesignFile(context); logger.info("-- step:convertOtherDesignFile --"); convertOtherDesignFile(context); } if (checkConvertElementIn()) { logger.info("-- step:convertFeatureDesignFile --"); convertFeatureDesignFile(context); } } catch (SQLException e) { @@ -462,6 +469,7 @@ * °õ¦æÂà´«¯Á¤Þ¹ÏÀɪº¤u§@ * * @param context ¤u§@°õ¦æÀô¹Ò * @throws org.quartz.JobExecutionException exception */ private void convertIndexDesignFile(JobExecutionContext context) throws JobExecutionException { @@ -589,20 +597,21 @@ /** * °õ¦æÂà´«¨ä¥L³]p¹ÏÀɪº¤u§@ * * @param context * @param context jobContext * @throws org.quartz.JobExecutionException exception */ private void convertOtherDesignFile(JobExecutionContext context) throws JobExecutionException { File otherDir = new File(getDataPath(), "other"); if (!otherDir.exists()) { logger.info("index dir=" + otherDir + " not exist."); logger.info("other dir=" + otherDir + " not exist."); return; } if (!otherDir.isDirectory()) { logger.info("index dir=" + otherDir + " is not a directory."); logger.info("other dir=" + otherDir + " is not a directory."); } File[] dgnFiles = otherDir.listFiles(new FilenameFilter() @@ -705,7 +714,8 @@ logger.debug("ElementRecord Count=" + count); } private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException private void processOtherElement(Element element, GeneralDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException { convertContext.putFeatureCollection(element); } @@ -762,4 +772,124 @@ } } } private void convertFeatureDesignFile(JobExecutionContext context) throws JobExecutionException { File elminDir = new File(getDataPath(), "elmin"); if (!elminDir.exists()) { logger.info("elmin dir=" + elminDir + " not exist."); return; } if (!elminDir.isDirectory()) { logger.info("elmin dir=" + elminDir + " is not a directory."); } File[] dgnFiles = elminDir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".dgn"); } }); for (File dgnFile : dgnFiles) { FeatureDgnConvertJobContext convertContext = new FeatureDgnConvertJobContext(getDataPath(), _filterPath); logger.info("--- start dgnfile-" + dgnFile.toString() + " ---"); try { convertContext.setExecutionContext(context); String dgnPaths[] = StringUtils.splitToArray(dgnFile.toString(), File.separator); convertContext.setFilename(dgnPaths[dgnPaths.length - 1]); FileInputStream fs = new FileInputStream(dgnFile); FileChannel fc = fs.getChannel(); Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); convertContext.setReader(reader); scanFeatureDgnElement(convertContext); convertContext.commitTransaction(); convertContext.closeFeatureWriter(); System.gc(); } catch (FileNotFoundException e) { convertContext.rollbackTransaction(); logger.warn(e.getMessage(), e); throw new JobExecutionException(e.getMessage(), e); } catch (Dgn7fileException e) { convertContext.rollbackTransaction(); logger.warn(e.getMessage(), e); throw new JobExecutionException(e.getMessage(), e); } catch (IOException e) { convertContext.rollbackTransaction(); logger.warn(e.getMessage(), e); throw new JobExecutionException(e.getMessage(), e); } catch (IllegalAttributeException e) { convertContext.rollbackTransaction(); logger.warn(e.getMessage(), e); throw new JobExecutionException(e.getMessage(), e); } catch (SchemaException e) { convertContext.rollbackTransaction(); logger.warn(e.getMessage(), e); throw new JobExecutionException(e.getMessage(), e); } } } public void scanFeatureDgnElement(FeatureDgnConvertJobContext convertContext) throws Dgn7fileException, IOException, IllegalAttributeException, SchemaException { Dgn7fileReader reader = convertContext.getReader(); int count = 0; Element lastComplex = null; while (reader.hasNext()) { Dgn7fileReader.Record record = reader.nextElement(); if (record.element() != null) { Element element = (Element) record.element(); ElementType type = element.getElementType(); if ((!type.isComplexElement()) && (!element.isComponentElement())) { lastComplex = null; processFeatureElement(element, convertContext); } else if (element.isComponentElement()) { if (lastComplex != null) { ((ComplexElement) lastComplex).add(element); } } else if (type.isComplexElement()) { if (lastComplex == null) { lastComplex = element; } else { processFeatureElement(element, convertContext); lastComplex = element; } } } count++; } logger.debug("ElementRecord Count=" + count); } private void processFeatureElement(Element element, FeatureDgnConvertJobContext convertContext) throws IllegalAttributeException, SchemaException { convertContext.putFeatureCollection(element); } } xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertJobContext.java
@@ -37,6 +37,7 @@ import com.ximple.eofms.filter.ElementDispatcher; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.ComplexElement; public class OracleConvertJobContext extends AbstractOracleJobContext @@ -74,6 +75,7 @@ private String _convertFile = null; private String currentSchema = null; private boolean schemaChanged = false; private String _convertElementIn = null; public OracleConvertJobContext(String filterConfig) { @@ -133,14 +135,25 @@ Feature feature = elementDispatcher.execute(element); if (feature == null) { boolean isEmptySize = false; FrammeAttributeData linkage = AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); logger.warn("Unknown Element:" + element.getElementType().toString() + ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); if (getElementLogging()) if (element instanceof ComplexElement) { ComplexElement complex = (ComplexElement) element; logger.warn("----Complex Element size=" + complex.size() + ":" + (linkage == null ? "NULL" : (linkage.getUfid()))); isEmptySize = true; } if (getElementLogging() && (!isEmptySize)) { getElementLogger().logElement(element, getCurrentSchema()); } return; } @@ -208,10 +221,19 @@ ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL(), true, Charset.forName("UTF-8")); */ if (!sfile.exists()) { ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); shapefileDataStore.createSchema(featureType); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); } else { ShapefileDataStore shapefileDataStore = new IndexedShapefileDataStore(sfile.toURI().toURL(), null, true, true, IndexedShapefileDataStore.TREE_QIX, Charset.forName("UTF-8")); writer = shapefileDataStore.getFeatureWriterAppend(featureType.getTypeName(), Transaction.AUTO_COMMIT); } featuresWriterContext.put(featureType.getTypeName(), writer); } @@ -317,4 +339,9 @@ this.currentSchema = querySchema; this.schemaChanged = true; } public void setConvertElementIn(String convertElementIn) { _convertElementIn = convertElementIn; } } xdgnjobs/ximple-spatialjob/src/main/resources/conf/DefaultConvertShpFilter.xml
@@ -283,6 +283,7 @@ <description>¹q±ì¤ô¥¤ä½u</description> <elementCriterion> <elementType>4</elementType> <elementType>17</elementType> </elementCriterion> <LineTextCreateStrategy/> </TypeCompFilter> @@ -1196,6 +1197,7 @@ <description>ºÞ¸ô</description> <elementCriterion> <elementType>12</elementType> <elementType>16</elementType> </elementCriterion> <LineCreateStrategy/> </TypeCompFilter>