From 4bd6ace2604281c1412545283b17fddc6b1fc684 Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Fri, 14 Mar 2008 14:22:41 +0800 Subject: [PATCH] update for EOFM-16 --- ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java | 251 +++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 217 insertions(+), 34 deletions(-) diff --git a/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java b/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java index 3bed880..5dc43b3 100644 --- a/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java +++ b/ximple-spatialjob/src/main/java/com/ximple/eofms/jobs/OracleConvertDgn2ShpJob.java @@ -1,19 +1,26 @@ package com.ximple.eofms.jobs; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; -import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -import java.util.TimeZone; +import org.apache.commons.collections.OrderedMap; +import org.apache.commons.collections.OrderedMapIterator; +import org.apache.commons.collections.map.LinkedMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.geotools.feature.Feature; +import org.geotools.feature.FeatureCollection; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; + +import com.vividsolutions.jts.geom.GeometryFactory; import oracle.jdbc.OracleConnection; import oracle.jdbc.OracleResultSet; @@ -22,6 +29,11 @@ import com.ximple.eofms.util.BinConverter; import com.ximple.eofms.util.ByteArrayCompressor; +import com.ximple.io.dgn7.ComplexElement; +import com.ximple.io.dgn7.Dgn7fileException; +import com.ximple.io.dgn7.Element; +import com.ximple.io.dgn7.ElementType; +import com.ximple.io.dgn7.IElementHandler; import com.ximple.util.PrintfFormat; /** @@ -33,6 +45,19 @@ private static final int FETCHSIZE = 30; private static final int BATCHSIZE = 25; + private static final int COMMITSIZE = 20; + + class Pair + { + Object first; + Object second; + + public Pair(Object first, Object second) + { + this.first = first; + this.second = second; + } + } public void execute(JobExecutionContext context) throws JobExecutionException { @@ -63,37 +88,116 @@ private void exetcuteConvert(OracleConvertJobContext jobContext, String querySchema, String dataPath) throws SQLException { - // verify igdsset_seed - String srcTable = "IGSET_1"; - String destTable = OracleConvertJobContext.TABLE_PREFIX + "ELMSET_1"; - long startTime = System.currentTimeMillis(); - ArrayList srcElms = queryIgsetElement(jobContext, querySchema, srcTable); - long currentTime = System.currentTimeMillis(); - SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSS"); + int order = 0; + OrderedMap map = getBlobStorageList(jobContext.getOracleConnection(), querySchema, "SD$SPACENODES" + , null); - dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + for (OrderedMapIterator it = map.orderedMapIterator(); it.hasNext();) + { + it.next(); - long elapsed = currentTime - startTime; + Pair pair = (Pair) it.getValue(); - System.out.println("Old Format:" + dateFormat.format(new Date(elapsed))); - logger.info("query source element complete."); - startTime = System.currentTimeMillis(); + String tableSrc = (String) pair.first; - ArrayList dstElms = queryRawElement(jobContext, querySchema, destTable); + queryIgsetElement(jobContext, querySchema, tableSrc); - currentTime = System.currentTimeMillis(); - dateFormat = new SimpleDateFormat("HH:mm:ss:SSS"); - dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); - elapsed = currentTime - startTime; - System.out.println("New Format:" + dateFormat.format(new Date(elapsed))); - logger.info("query dest element complete."); - // Assert.isTrue(srcElms.size() == dstElms.size(), "src[" + srcElms.size() + "] != dest[" + dstElms.size() + "]"); + order++; + + if ((order % COMMITSIZE) == 0) + { + // OracleConnection connection = jobContext.getOracleConnection(); + // connection.commit(); + System.gc(); + } + } + + System.gc(); } - private ArrayList queryIgsetElement(OracleConvertJobContext jobContext, - String srcschema, String srctable) throws SQLException + private OrderedMap getBlobStorageList(OracleConnection connection, String schemaSrc, String tableSrc, + OrderedMap orderedMap) throws SQLException { - ArrayList result = new ArrayList(); + if (orderedMap == null) + orderedMap = new LinkedMap(99); + String fetchStmtFmt = "SELECT SNID, SPACETABLE FROM \"%s\".\"%s\""; + PrintfFormat spf = new PrintfFormat(fetchStmtFmt); + String fetchStmt = spf.sprintf(new Object[]{schemaSrc, tableSrc}); + Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + + stmt.setFetchSize(FETCHSIZE); + + ResultSet rs = stmt.executeQuery(fetchStmt); + + while (rs.next()) + { + int size = rs.getMetaData().getColumnCount(); + Object[] values = new Object[size]; + + for (int i = 0; i < size; i++) + { + values[i] = rs.getObject(i + 1); + } + + Integer key = new Integer(((BigDecimal) values[0]).intValue()); + String name = (String) values[1]; + + Pair pair = (Pair) orderedMap.get(key); + if (pair == null) + orderedMap.put(key, new Pair(name, null)); + else + pair.first = name; + } + + rs.close(); + stmt.close(); + + return orderedMap; + } + + private OrderedMap getRawFormatStorageList(OracleConnection connection, String schemaSrc, String tableSrc, + OrderedMap orderedMap) throws SQLException + { + if (orderedMap == null) + orderedMap = new LinkedMap(99); + String fetchStmtFmt = "SELECT RNID, SPACETABLE FROM \"%s\".\"%s\""; + PrintfFormat spf = new PrintfFormat(fetchStmtFmt); + String fetchStmt = spf.sprintf(new Object[]{schemaSrc, tableSrc}); + Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + + stmt.setFetchSize(FETCHSIZE); + + ResultSet rs = stmt.executeQuery(fetchStmt); + + while (rs.next()) + { + int size = rs.getMetaData().getColumnCount(); + Object[] values = new Object[size]; + + for (int i = 0; i < size; i++) + { + values[i] = rs.getObject(i + 1); + } + + Integer key = new Integer(((BigDecimal) values[0]).intValue()); + String name = (String) values[1]; + + Pair pair = (Pair) orderedMap.get(key); + if (pair == null) + orderedMap.put(key, new Pair(null, name)); + else + pair.second = name; + } + + rs.close(); + stmt.close(); + + return orderedMap; + } + + private void queryIgsetElement(OracleConvertJobContext jobContext, + String srcschema, String srctable) throws SQLException + { OracleConnection connection = jobContext.getOracleConnection(); String fetchSrcStmtFmt = "SELECT IGDSELM FROM \"%s\".\"%s\" ORDER BY ROWID"; PrintfFormat spf = new PrintfFormat(fetchSrcStmtFmt); @@ -119,16 +223,19 @@ raw = rsSrc.getBytes(1); } - result.add(raw); + try + { + onBinaryElement(raw); + } catch (Dgn7fileException e) + { + logger.warn("Dgn7Exception", e); + } } - - return result; } - private ArrayList queryRawElement(OracleConvertJobContext jobContext, - String srcschema, String srctable) throws SQLException + private void queryRawElement(OracleConvertJobContext jobContext, + String srcschema, String srctable) throws SQLException { - ArrayList result = new ArrayList(); OracleConnection connection = jobContext.getOracleConnection(); String fetchDestStmtFmt = "SELECT ELEMENT FROM \"%s\".\"%s\" ORDER BY ROWID"; PrintfFormat spf = new PrintfFormat(fetchDestStmtFmt); @@ -158,10 +265,81 @@ byte[] rawDest = ByteArrayCompressor.decompressByteArray(comparessedValue); - result.add(rawDest); + + try + { + onBinaryElement(rawDest); + } catch (Dgn7fileException e) + { + logger.warn("Dgn7Exception", e); + } + } + } + + private void onBinaryElement(byte[] raws) throws Dgn7fileException + { + ByteBuffer buffer = ByteBuffer.wrap(raws); + buffer.order(ByteOrder.LITTLE_ENDIAN); + short signature = buffer.getShort(); + + // byte type = (byte) (buffer.get() & 0x7f); + byte type = (byte) ((signature >>> 8) & 0x007f); + + // silly Bentley say contentLength is in 2-byte words + // and ByteByffer uses raws. + // track the record location + int elementLength = (buffer.getShort() * 2) + 4; + ElementType recordType = ElementType.forID(type); + IElementHandler handler = null; + + handler = recordType.getElementHandler(); + + Element dgnElement = (Element) handler.read(buffer, signature, elementLength); + if (recordType.isComplexElement() && (elementLength < raws.length)) + { + int offset = elementLength; + while (offset < (raws.length - 4)) + { + buffer.position(offset); + signature = buffer.getShort(); + type = (byte) ((signature >>> 8) & 0x007f); + elementLength = (buffer.getShort() * 2) + 4; + if (raws.length < (offset + elementLength)) + { + System.out.println("Length not match:" + offset + ":" + buffer.position() + ":" + buffer.limit()); + break; + } + recordType = ElementType.forID(type); + handler = recordType.getElementHandler(); + if (handler != null) + { + Element subElement = (Element) handler.read(buffer, signature, elementLength); + ((ComplexElement) dgnElement).add(subElement); + offset += elementLength; + } else + { + byte[] remain = new byte[buffer.remaining()]; + System.arraycopy(raws, offset, remain, 0, buffer.remaining()); + for (int i = 0; i < remain.length; i++) + { + if (remain[i] != 0) + { + logger.info("fetch element has some error. index=" + (offset + i) + ":value=" + remain[i]); + System.out.println("fetch element has some error. index=" + (offset + i) + ":value=" + remain[i]); + } + } + break; + } + } } - return result; + Feature feature = convertElementToFeature(dgnElement); + } + + private Feature convertElementToFeature(Element dgnElement) + { + GeometryFactory geomFactory = new GeometryFactory(); + return null; } private boolean equalRawData(byte[] rawSrc, byte[] rawDest) @@ -181,4 +359,9 @@ return true; } + + public FeatureCollection loopupFeatureCollection(String name) + { + return null; + } } -- Gitblit v0.0.0-SNAPSHOT