| | |
| | | package com.ximple.eofms.jobs; |
| | | |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | | import java.io.FileNotFoundException; |
| | | import java.io.IOException; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.net.MalformedURLException; |
| | | import java.net.URL; |
| | |
| | | import java.util.Iterator; |
| | | import java.util.Properties; |
| | | |
| | | 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.apache.commons.digester.Digester; |
| | | import org.apache.commons.digester.xmlrules.DigesterLoader; |
| | | import org.geotools.data.FeatureWriter; |
| | | import org.geotools.data.Transaction; |
| | | import org.geotools.data.shapefile.ShapefileDataStore; |
| | |
| | | import org.geotools.feature.FeatureType; |
| | | import org.geotools.feature.IllegalAttributeException; |
| | | import org.geotools.feature.SimpleFeature; |
| | | import org.geotools.TestData; |
| | | import org.xml.sax.SAXException; |
| | | |
| | | import com.vividsolutions.jts.util.Assert; |
| | | |
| | | import oracle.jdbc.OracleConnection; |
| | | |
| | | import com.ximple.eofms.filter.CreateLineStringStrategy; |
| | | import com.ximple.eofms.filter.ElementDispatcher; |
| | | import com.ximple.eofms.filter.TypeCompIdDispatchableFilter; |
| | | import com.ximple.eofms.filter.AbstractFLinkageDispatchableFilter; |
| | | import com.ximple.eofms.filter.ElementDispatcher; |
| | | import com.ximple.io.dgn7.Element; |
| | | import com.ximple.io.dgn7.FrammeAttributeData; |
| | | |
| | | public class OracleConvertJobContext |
| | | public class OracleConvertJobContext extends AbstractOracleJobContext |
| | | { |
| | | static Log logger = LogFactory.getLog(OracleConvertJobContext.class); |
| | | static final LoggerFacade sLogger = new CommonsLoggingLogger(logger); |
| | | |
| | | private static final String ORACLE_URL = "jdbc:oracle:thin:@"; |
| | | private static final String PROPUsrKey = "user"; |
| | | private static final String PROPPassKey = "password"; |
| | | |
| | | /** |
| | | * Table Prefiex |
| | | */ |
| | | protected static final String TABLE_PREFIX = "GEO$"; |
| | | protected static final String UDT_SCHEMA = "SPATIALDB"; |
| | | |
| | | /** |
| | | * User Types |
| | | */ |
| | | protected static final String UDT_RAWS = "CREATE OR REPLACE TYPE \"" + UDT_SCHEMA + "\".\"RAWS\" AS VARRAY (1048576) OF NUMBER(38)"; |
| | | protected static final String UDT_OFMID = "CREATE OR REPLACE TYPE \"" + UDT_SCHEMA + "\".\"OFMID\" AS OBJECT (" |
| | | + "\"CLSID\" NUMBER(5), \"OID\" NUMBER(10), \"STATUS\" NUMBER(5), \"COMPID\" NUMBER(3), " |
| | | + "\"RULEID\" NUMBER(3), \"OCCID\" NUMBER(3))"; |
| | | |
| | | protected static final String UDT_RAWSNAME = "RAWS"; |
| | | protected static final String UDT_OFMIDNAME = "OFMID"; |
| | | |
| | | /** |
| | | * Utility SQL |
| | | */ |
| | | protected static final String TAB_DROP = "DROP TABLE %s.%s CASCADE CONSTRAINTS"; |
| | | |
| | | protected static final String TAB_DELETE = "DELETE FROM %s.%s"; |
| | | |
| | | /** |
| | | * Table Schema |
| | | */ |
| | | protected static final String TAB_RANGENODEINDEX_1 = "CREATE TABLE \"%s\".\"%s\"\n" |
| | | + " ( \"RNID\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"RPID\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"RNG_LOWX\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"RNG_LOWY\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"RNG_HIGHX\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"RNG_HIGHY\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"EXTENTS\" MDSYS.SDO_GEOMETRY,\n" |
| | | + " \"RNDESCR\" VARCHAR2(255), \n" |
| | | + " PRIMARY KEY ( \"RNID\" ) ENABLE )"; |
| | | |
| | | protected static final String TAB_RANGENODEINDEX = "CREATE TABLE \"%s\".\"%s\"\n" |
| | | + " ( \"RNID\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"RPID\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"RNG_LOWX\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"RNG_LOWY\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"RNG_HIGHX\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"RNG_HIGHY\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"RNDESCR\" VARCHAR2(255), \n" |
| | | + " PRIMARY KEY ( \"RNID\" ) ENABLE )"; |
| | | |
| | | protected static final String TAB_RANGENODESTORAGE = "CREATE TABLE \"%s\".\"%s\"\n" |
| | | + " ( \"RNID\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"LAYERID\" NUMBER(5,0) NOT NULL ENABLE,\n" |
| | | + " \"LASTUPDATE\" DATE NOT NULL ENABLE,\n" |
| | | + " \"SPACETABLE\" VARCHAR2(255)\n" + " )"; |
| | | |
| | | protected static final String TAB_ELEMENTINDEX_1 = "CREATE TABLE %s.%s (\n" |
| | | + " \"ELMNO\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"TYPE\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"XLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"YLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"ZLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"XHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"YHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"ZHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" |
| | | + " \"TAG_LUFID\" NUMBER(10) NOT NULL ENABLE,\n" |
| | | + " \"TAG_SFSC\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"TAG_SSTAT\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"TAG_BCOMPID\" NUMBER(3) NOT NULL ENABLE,\n" |
| | | + " \"TAG_BRULENO\" NUMBER(3) NOT NULL ENABLE,\n" |
| | | + " \"TAG_SOCCID\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"SPACENAME\" VARCHAR2(255) NOT NULL ENABLE,\n" |
| | | + " PRIMARY KEY (\"ELMNO\") ENABLE\n" |
| | | + " )"; |
| | | |
| | | protected static final String TAB_ELEMENTINDEX = "CREATE TABLE %s.%s (\n" |
| | | + " \"ELMNO\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"TYPE\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"XLOW\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"YLOW\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"ZLOW\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"XHIGH\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"YHIGH\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"ZHIGH\" FLOAT NOT NULL ENABLE,\n" |
| | | + " \"TAG_LUFID\" NUMBER(10) NOT NULL ENABLE,\n" |
| | | + " \"TAG_SFSC\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"TAG_SSTAT\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"TAG_BCOMPID\" NUMBER(3) NOT NULL ENABLE,\n" |
| | | + " \"TAG_BRULENO\" NUMBER(3) NOT NULL ENABLE,\n" |
| | | + " \"TAG_SOCCID\" NUMBER(5) NOT NULL ENABLE,\n" |
| | | + " \"SPACENAME\" VARCHAR2(255) NOT NULL ENABLE,\n" |
| | | + " PRIMARY KEY (\"ELMNO\") ENABLE\n" |
| | | + " )"; |
| | | |
| | | protected static final String TAB_IGDSSEED = "CREATE TABLE %s.%s (\n" |
| | | + " \"ELMNO\" INTEGER NOT NULL ENABLE,\n" |
| | | + " \"SEEDELM\" \"" + UDT_SCHEMA |
| | | + "\".\"RAWS\" NOT NULL ENABLE\n" + " )"; |
| | | |
| | | protected static final String TAB_STORAGE_1 = "CREATE TABLE %s.%s (\n" + |
| | | " \"ELMNO\" INTEGER NOT NULL ENABLE,\n" + |
| | | " \"XLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"YLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"XHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"YHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"EXTENTS\" MDSYS.SDO_GEOMETRY, \n" + |
| | | " \"PROPS\" INTEGER NOT NULL ENABLE,\n" + |
| | | " \"TAG_LUFID\" NUMBER(10) NOT NULL ENABLE,\n" + |
| | | " \"TAG_SFSC\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"TAG_SSTAT\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"TAG_BCOMPID\" NUMBER(3) NOT NULL ENABLE,\n" + |
| | | " \"TAG_BRULENO\" NUMBER(3) NOT NULL ENABLE,\n" + |
| | | " \"TAG_SOCCID\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"LAYERID\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"ELEMENT\" \"" + UDT_SCHEMA + "\".\"RAWS\" NOT NULL ENABLE, \n" + |
| | | " \"GEOM\" MDSYS.SDO_GEOMETRY \n" + |
| | | " )"; |
| | | |
| | | protected static final String TAB_STORAGE = "CREATE TABLE %s.%s (\n" + |
| | | " \"ELMNO\" INTEGER NOT NULL ENABLE,\n" + |
| | | " \"XLOW\" FLOAT NOT NULL ENABLE,\n" + |
| | | " \"YLOW\" FLOAT NOT NULL ENABLE,\n" + |
| | | " \"XHIGH\" FLOAT NOT NULL ENABLE,\n" + |
| | | " \"YHIGH\" FLOAT NOT NULL ENABLE,\n" + |
| | | " \"PROPS\" INTEGER NOT NULL ENABLE,\n" + |
| | | " \"TAG_LUFID\" NUMBER(10) NOT NULL ENABLE,\n" + |
| | | " \"TAG_SFSC\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"TAG_SSTAT\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"TAG_BCOMPID\" NUMBER(3) NOT NULL ENABLE,\n" + |
| | | " \"TAG_BRULENO\" NUMBER(3) NOT NULL ENABLE,\n" + |
| | | " \"TAG_SOCCID\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"LAYERID\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"ELEMENT\" \"" + UDT_SCHEMA + "\".\"RAWS\" NOT NULL ENABLE \n" + |
| | | " )"; |
| | | |
| | | protected static final String TAB_STORAGE2 = "CREATE TABLE %s.%s (\n" + |
| | | " \"ELMNO\" INTEGER NOT NULL ENABLE,\n" + |
| | | " \"XLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"YLOW\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"XHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"YHIGH\" BINARY_DOUBLE NOT NULL ENABLE,\n" + |
| | | " \"EXTENTS\" MDSYS.SDO_GEOMETRY, \n" + |
| | | " \"PROPS\" INTEGER NOT NULL ENABLE,\n" + |
| | | " \"ID\" " + UDT_SCHEMA + ".OFMID NOT NULL ENABLE,\n" + |
| | | " \"LAYERID\" NUMBER(5) NOT NULL ENABLE,\n" + |
| | | " \"ELEMENT\" \"" + UDT_SCHEMA + "\".\"RAWS\" NOT NULL ENABLE \n" + |
| | | " )"; |
| | | /** |
| | | * Trigger |
| | | */ |
| | | protected static final String TRG_SPACENODE = "CREATE OR REPLACE TRIGGER \"%s\".\"%s\"\n" |
| | | + " AFTER DELETE OR INSERT OR UPDATE ON \"%s\".\"%s\"\n" + " BEGIN\n" |
| | | + " UPDATE SPACENODES SET LASTUPDATE = SYSDATE\n" + " WHERE SNID = \"%d\";\n" |
| | | + " END;"; |
| | | |
| | | protected static final String TRG_ELMINDEX = |
| | | "CREATE OR REPLACE TRIGGER \"%s\".\"%s\"\n" |
| | | + " AFTER INSERT OR UPDATE OR DELETE ON \"%s\".\"%s\"\n" |
| | | + " REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW\n" |
| | | + " BEGIN\n" |
| | | + " IF INSERTING THEN\n" |
| | | + " INSERT INTO \"%s\".\"%s\" (ELMNO, TYPE, XLOW, YLOW, XHIGH, YHIGH,\n" |
| | | + " UFID, FSC, COMPID, OCCID, SPACENAME)\n" |
| | | + " VALUES (SD$ELEMENTNUMBER_SEQ.NEXTVAL, :new.ELMTYPE, :new.XLOW, :new.YLOW, :new.XHIGH, :new.YHIGH,\n" |
| | | + " :new.UFID, :new.FSC, :new.COMPID, :new.OCCID, '%s');\n" |
| | | + " ELSIF DELETING THEN\n" |
| | | + " DELETE FROM \"%s\".\"%s\"\n" |
| | | + " WHERE \"%s\".UFID = :old.UFID AND\n" |
| | | + " \"%s\".FSC = :old.FSC AND\n" |
| | | + " \"%s\".COMPID = :old.COMPID AND\n" |
| | | + " \"%s\".OCCID = :old.OCCID;\n" |
| | | + " ELSE\n" + " UPDATE \"%s\"\n" |
| | | + " SET XLOW = :new.XLOW, YLOW = :new.YLOW, XHIGH = :new.XHIGH, YHIGH = :new.YHIGH\n" |
| | | + " WHERE FSC = :new.FSC AND UFID = :new.UFID AND COMPID = :new.COMPID AND OCCID = :new.OCCID;\n" |
| | | + " END IF;\n" + " END;"; |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | protected static final String TAB_ELEMENTSET_PREFIX = "ELMSET_"; |
| | | |
| | | protected static final String STMT_CLEARCYCLEBIN = "PURGE RECYCLEBIN"; |
| | | |
| | | protected static final String SMTM_GRANTOBJECTTYPE = "GRANT EXECUTE ANY TYPE TO \"" + UDT_SCHEMA + "\""; |
| | | |
| | | protected static final long TIMEOUT = Long.MAX_VALUE; |
| | | |
| | | /** |
| | | * Encoding of URL path. |
| | | */ |
| | | private static final String ENCODING = "UTF-8"; |
| | | |
| | | static |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | public static String getCurrentURL(String oracleHost, String oraclePort, String oracleInstance) |
| | | { |
| | | StringBuilder builder = new StringBuilder(); |
| | | |
| | | builder.append(ORACLE_URL); |
| | | builder.append(oracleHost); |
| | | builder.append(":"); |
| | | builder.append(oraclePort); |
| | | builder.append(":"); |
| | | builder.append(oracleInstance); |
| | | |
| | | return builder.toString(); |
| | | } |
| | | |
| | | private String _oracleHost; |
| | | private String _filterConfig; |
| | | private String _oracleInstance; |
| | | private String _oraclePort; |
| | | private String _dataPath; |
| | | |
| | | private OracleConnection oracleConnection = null; |
| | | private Properties properties; |
| | | |
| | | private ElementDispatcher elementDispatcher; |
| | | |
| | |
| | | _filterConfig = filterConfig; |
| | | elementDispatcher = createElementDispatcher(); |
| | | txFeaturesContext = new PessimisticMapWrapper(featuresContext, sLogger); |
| | | |
| | | } |
| | | |
| | | private ElementDispatcher createElementDispatcher() |
| | | { |
| | | URL rulesURL = getClass().getResource("ElementDispatcherRules.xml"); |
| | | |
| | | File rulesFile = null; |
| | | try |
| | | { |
| | | rulesFile = new File(URLDecoder.decode(rulesURL.getPath(), ENCODING)); |
| | | if (!rulesFile.exists()) { |
| | | throw new FileNotFoundException("Could not locate test-data: " + rulesFile); |
| | | } |
| | | Digester digester = DigesterLoader.createDigester(rulesFile.toURI().toURL()); |
| | | File config = new File(_filterConfig); |
| | | if (!config.exists()) |
| | | URL rulesURL = ElementDispatcher.class.getResource("ElementDispatcherRules.xml"); |
| | | assert rulesURL != null; |
| | | Digester digester = DigesterLoader.createDigester(rulesURL); |
| | | URL filterURL = null; |
| | | if (_filterConfig != null) |
| | | { |
| | | config = new File("conf\\DefaultConvertShpFilter.xml"); |
| | | File config = new File(_filterConfig); |
| | | if (config.exists()) |
| | | { |
| | | filterURL = config.toURI().toURL(); |
| | | } |
| | | } |
| | | ElementDispatcher dispatcher = (ElementDispatcher) digester.parse(config); |
| | | return dispatcher; |
| | | if (filterURL == null) |
| | | { |
| | | // config = new File("conf/DefaultConvertShpFilter.xml"); |
| | | filterURL = this.getClass().getResource("/conf/DefaultConvertShpFilter.xml"); |
| | | } |
| | | assert filterURL != null; |
| | | return (ElementDispatcher) digester.parse(filterURL); |
| | | } catch (UnsupportedEncodingException e) |
| | | { |
| | | logger.info(e.getMessage(), e); |
| | |
| | | } |
| | | } |
| | | |
| | | public void setLogin(String userName, String password) |
| | | { |
| | | properties.put(PROPUsrKey, userName); |
| | | properties.put(PROPPassKey, password); |
| | | } |
| | | |
| | | public void setShapeData(String dataPath) |
| | | { |
| | | _dataPath = dataPath; |
| | | } |
| | | |
| | | public OracleConnection getOracleConnection() |
| | | { |
| | | try |
| | | { |
| | | if (oracleConnection == null) |
| | | { |
| | | oracleConnection = (OracleConnection) DriverManager.getConnection( |
| | | getCurrentURL(_oracleHost, _oraclePort, _oracleInstance), |
| | | properties); |
| | | } |
| | | |
| | | return oracleConnection; |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | |
| | | oracleConnection = null; |
| | | |
| | | return null; |
| | | } |
| | | |
| | | public void closeConnection() |
| | | { |
| | | try |
| | | { |
| | | if (oracleConnection != null) |
| | | { |
| | | oracleConnection.close(); |
| | | oracleConnection = null; |
| | | } |
| | | } catch (SQLException e) |
| | | { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | public void setConnectionInfo(String oracleHost, String oraclePort, String oracleInstance) |
| | | { |
| | | _oracleHost = oracleHost; |
| | | _oracleInstance = oracleInstance; |
| | | _oraclePort = oraclePort; |
| | | } |
| | | |
| | | public void putFeatureCollection(Element element) |
| | | { |
| | | Feature feature = elementDispatcher.execute(element); |
| | |
| | | FrammeAttributeData linkage = |
| | | AbstractFLinkageDispatchableFilter.getFeatureLinkage(element); |
| | | logger.debug("Unknown Element:" + element.getElementType().toString() + |
| | | ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + |
| | | (linkage == null ? "NULL" : (linkage.getFsc() + "|" +linkage.getComponentID()))); |
| | | ":type=" + element.getType() + ":lv=" + element.getLevelIndex() + ":id=" + |
| | | (linkage == null ? "NULL" : (linkage.getFsc() + "|" + linkage.getComponentID()))); |
| | | |
| | | return; |
| | | } |
| | |
| | | txFeaturesContext.commitTransaction(); |
| | | } else |
| | | logger.debug("Transaction is empty."); |
| | | |
| | | |
| | | if (!featuresContext.isEmpty()) |
| | | { |
| | | updateDataStore(); |
| | |
| | | File sfile = new File(_dataPath + "\\" + featureType.getTypeName()); |
| | | logger.debug("Begin Save shapefile:" + sfile.toURI()); |
| | | |
| | | ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURL()); |
| | | ShapefileDataStore shapefileDataStore = new ShapefileDataStore(sfile.toURI().toURL()); |
| | | shapefileDataStore.createSchema(featureType); |
| | | FeatureWriter writer = shapefileDataStore.getFeatureWriter(featureType.getTypeName(), Transaction.AUTO_COMMIT); |
| | | ArrayList features = (ArrayList) featuresContext.get(featureType); |