From 70c8e4761324ef315a93d899a28abd81a39df641 Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Wed, 28 May 2008 16:28:25 +0800 Subject: [PATCH] --- xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml | 6 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java | 9 + .gitattributes | 1 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java | 22 +++ xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java | 20 +- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java | 2 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java | 20 +- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java | 20 +- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java | 297 ++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 375 insertions(+), 24 deletions(-) diff --git a/.gitattributes b/.gitattributes index 8b69adf..47b69e9 100644 --- a/.gitattributes +++ b/.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/DummyFeatureConvertJobContext.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 diff --git a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml index 0604eb4..be5a288 100644 --- a/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml +++ b/xdgnjobs/ximple-jobcarrier/src/main/resources/quartz_jobs.xml @@ -56,13 +56,17 @@ </entry> <entry> <key>CONVERTFILE</key> - <value>true</value> + <value>false</value> </entry> <entry> <key>CONVERTELEMIN</key> <value>false</value> </entry> <entry> + <key>CREATEDUMMY</key> + <value>true</value> + </entry> + <entry> <key>ELEMLOG</key> <value>true</value> </entry> diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java index ce5453a..3731d86 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompIdDispatchableFilter.java @@ -72,13 +72,8 @@ { try { - StringBuilder sb= new StringBuilder(); - sb.append(getName()); - sb.append("_"); - sb.append(element.getLevelIndex()); - sb.append("_"); - sb.append(element.getWeight()); - FeatureType ftype = createStrategy.createFeatureElement(sb.toString()); + String ftName = getFeatureTypeName(element); + FeatureType ftype = createStrategy.createFeatureElement(ftName); return createStrategy.createFeature(ftype, element); } catch (SchemaException e) { @@ -92,4 +87,15 @@ } return null; } + + public String getFeatureTypeName(Element element) + { + StringBuilder sb= new StringBuilder(); + sb.append(getName()); + sb.append("_"); + sb.append(element.getLevelIndex()); + sb.append("_"); + sb.append(element.getWeight()); + return sb.toString(); + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java index bc9899c..a26c19c 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeCompLevelIdDispatchableFilter.java @@ -82,13 +82,8 @@ { try { - StringBuilder sb= new StringBuilder(); - sb.append(getName()); - sb.append("_"); - sb.append(element.getLevelIndex()); - sb.append("_"); - sb.append(element.getWeight()); - FeatureType ftype = createStrategy.createFeatureElement(sb.toString()); + String ftName = getFeatureTypeName(element); + FeatureType ftype = createStrategy.createFeatureElement(ftName); return createStrategy.createFeature(ftype, element); } catch (SchemaException e) { @@ -99,4 +94,15 @@ } return null; } + + public String getFeatureTypeName(Element element) + { + StringBuilder sb= new StringBuilder(); + sb.append(getName()); + sb.append("_"); + sb.append(element.getLevelIndex()); + sb.append("_"); + sb.append(element.getWeight()); + return sb.toString(); + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java index c99f90e..4a50da9 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/TypeIdDispatchableFilter.java @@ -56,13 +56,8 @@ { try { - StringBuilder sb= new StringBuilder(); - sb.append(getName()); - sb.append("_"); - sb.append(element.getLevelIndex()); - sb.append("_"); - sb.append(element.getWeight()); - FeatureType ftype = createStrategy.createFeatureElement(sb.toString()); + String ftName = getFeatureTypeName(element); + FeatureType ftype = createStrategy.createFeatureElement(ftName); return createStrategy.createFeature(ftype, element); } catch (SchemaException e) { @@ -73,4 +68,15 @@ } return null; } + + public String getFeatureTypeName(Element element) + { + StringBuilder sb= new StringBuilder(); + sb.append(getName()); + sb.append("_"); + sb.append(element.getLevelIndex()); + sb.append("_"); + sb.append(element.getWeight()); + return sb.toString(); + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java index f3f98b9..fff760a 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/AbstractOracleDatabaseJob.java @@ -27,6 +27,7 @@ private static final String CONVERTDB = "CONVERTDB"; private static final String CONVERTFILE = "CONVERTFILE"; private static final String CONVERTELEMIN = "CONVERTELEMIN"; + private static final String CREATEDUMMY = "CREATEDUMMY"; private static final String ELEMLOG = "ELEMLOG"; private static final String ORAHOST = "ORAHOST"; private static final String ORAINST = "ORAINST"; @@ -47,6 +48,7 @@ protected String _convertFile; protected String _convertElementIn; protected String _elementLogging; + protected String _createDummy; protected ArrayList<String> _orgSchema = new ArrayList<String>(); protected boolean _testMode = false; protected int _testCount = -1; @@ -70,6 +72,7 @@ _convertFile = dataMap.getString(CONVERTFILE); _convertElementIn = dataMap.getString(CONVERTELEMIN); _elementLogging = dataMap.getString(ELEMLOG); + _createDummy = dataMap.getString(CREATEDUMMY); Log logger = getLogger(); logger.info("SHPDATA_DIR=" + _dataPath); @@ -293,4 +296,10 @@ return _elementLogging != null && !_elementLogging.equalsIgnoreCase("false") && !_elementLogging.equalsIgnoreCase("no") && !_elementLogging.equalsIgnoreCase("0"); } + + public boolean checkCreateDummy() + { + return _createDummy != null && !_createDummy.equalsIgnoreCase("false") && + !_createDummy.equalsIgnoreCase("no") && !_createDummy.equalsIgnoreCase("0"); + } } diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java new file mode 100644 index 0000000..8c84650 --- /dev/null +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/DummyFeatureConvertJobContext.java @@ -0,0 +1,297 @@ +package com.ximple.eofms.jobs; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.net.URL; +import java.net.MalformedURLException; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.nio.charset.Charset; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.transaction.util.LoggerFacade; +import org.apache.commons.transaction.util.CommonsLoggingLogger; +import org.apache.commons.transaction.memory.PessimisticMapWrapper; +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.xmlrules.DigesterLoader; +import org.geotools.feature.Feature; +import org.geotools.feature.IllegalAttributeException; +import org.geotools.feature.SchemaException; +import org.geotools.feature.FeatureType; +import org.geotools.feature.SimpleFeature; +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.xml.sax.SAXException; + +import com.vividsolutions.jts.geom.GeometryFactory; + +import com.ximple.eofms.filter.ElementDispatcher; +import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; +import com.ximple.eofms.filter.ElementDispatchableFilter; +import com.ximple.eofms.filter.TypeCompIdDispatchableFilter; +import com.ximple.eofms.filter.TypeCompLevelIdDispatchableFilter; +import com.ximple.eofms.filter.TypeIdDispatchableFilter; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.FrammeAttributeData; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.UserAttributeData; + +public class DummyFeatureConvertJobContext extends AbstractDgnFileJobContext +{ + static final Log logger = LogFactory.getLog(DummyFeatureConvertJobContext.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 DummyFeatureConvertJobContext(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() + { + assert elementDispatcher != null; + for (ElementDispatchableFilter filter : elementDispatcher.getRules()) + { + if (filter instanceof TypeCompIdDispatchableFilter) + { + ((TypeCompIdDispatchableFilter) filter).getCreateStrategy(); + } else if (filter instanceof TypeCompLevelIdDispatchableFilter) + { + ((TypeCompIdDispatchableFilter) filter).getCreateStrategy(); + } else if(filter instanceof TypeIdDispatchableFilter) + { + ((TypeCompIdDispatchableFilter) filter).getCreateStrategy(); + } + } + } + + 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; + } +} diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java index 1796bb8..5b730ca 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/FeatureDgnConvertJobContext.java @@ -40,7 +40,7 @@ public class FeatureDgnConvertJobContext extends AbstractDgnFileJobContext { - static final Log logger = LogFactory.getLog(IndexDgnConvertJobContext.class); + static final Log logger = LogFactory.getLog(FeatureDgnConvertJobContext.class); static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); static final GeometryFactory geometryFactory = new GeometryFactory(); static final String SHPOUTPATH = "shpout"; diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java index ab36104..26fd457 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/GeneralDgnConvertJobContext.java @@ -47,7 +47,7 @@ public class GeneralDgnConvertJobContext extends AbstractDgnFileJobContext { - static final Log logger = LogFactory.getLog(IndexDgnConvertJobContext.class); + static final Log logger = LogFactory.getLog(GeneralDgnConvertJobContext.class); static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); static final GeometryFactory geometryFactory = new GeometryFactory(); static final String SHPOUTPATH = "shpout"; diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java index bc01df6..95f104c 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java @@ -140,6 +140,12 @@ logger.info("-- step:convertFeatureDesignFile --"); convertFeatureDesignFile(context); } + + if (checkCreateDummy()) + { + logger.info("-- step:createDummyFeatureFile --"); + createDummyFeatureFile(context); + } } catch (SQLException e) { logger.warn(e.getMessage(), e); @@ -892,4 +898,20 @@ { convertContext.putFeatureCollection(element); } + + private void createDummyFeatureFile(JobExecutionContext context) throws JobExecutionException + { + /* + DummyFeatureConvertJobContext convertContext = new DummyFeatureConvertJobContext(getDataPath(), _filterPath); + try { + convertContext.startTransaction(); + convertContext.commitTransaction(); + convertContext.closeFeatureWriter(); + } catch (IOException e) + { + logger.warn(e.getMessage(), e); + throw new JobExecutionException(e.getMessage(), e); + } + */ + } } -- Gitblit v0.0.0-SNAPSHOT