| | |
| | | import com.ximple.io.dgn7.ArcElement; |
| | | import com.ximple.io.dgn7.ComplexChainElement; |
| | | import com.ximple.io.dgn7.ComplexShapeElement; |
| | | import com.ximple.io.dgn7.Dgn7fileException; |
| | | import com.ximple.io.dgn7.Element; |
| | | import com.ximple.io.dgn7.EllipseElement; |
| | | import com.ximple.io.dgn7.IElementHandler; |
| | | import com.ximple.io.dgn7.LineElement; |
| | | import com.ximple.io.dgn7.LineStringElement; |
| | | import com.ximple.io.dgn7.ShapeElement; |
| | | import com.ximple.io.dgn7.TextElement; |
| | | import com.ximple.io.dgn7.TextNodeElement; |
| | | import com.ximple.io.dgn7.IElementHandler; |
| | | import com.ximple.io.dgn7.Dgn7fileException; |
| | | |
| | | public class OracleElementLogger |
| | | { |
| | | public class OracleElementLogger { |
| | | static Log logger = LogFactory.getLog(OracleElementLogger.class); |
| | | private static final String DEFAULT_ELMOUTPATH = "elmout"; |
| | | private static final String TAB_IGDSSEED = "SD$IGDSSET_SEED"; |
| | |
| | | private String elmOutPath; |
| | | private String prefix = null; |
| | | |
| | | public OracleElementLogger(Connection connection) |
| | | { |
| | | public OracleElementLogger(Connection connection) { |
| | | this.connection = connection; |
| | | elmOutPath = DEFAULT_ELMOUTPATH; |
| | | } |
| | | |
| | | public OracleElementLogger(Connection connection, String elmOutPath) |
| | | { |
| | | public OracleElementLogger(Connection connection, String elmOutPath) { |
| | | this.connection = connection; |
| | | this.elmOutPath = elmOutPath; |
| | | } |
| | | |
| | | public OracleElementLogger(Connection connection, int maxCount) |
| | | { |
| | | public OracleElementLogger(Connection connection, int maxCount) { |
| | | this.connection = connection; |
| | | elmOutPath = DEFAULT_ELMOUTPATH; |
| | | this.maxElmCount = maxCount; |
| | | } |
| | | |
| | | public OracleElementLogger(Connection connection, String elmOutPath, int maxCount) |
| | | { |
| | | public OracleElementLogger(Connection connection, String elmOutPath, int maxCount) { |
| | | this.connection = connection; |
| | | this.elmOutPath = elmOutPath; |
| | | this.maxElmCount = maxCount; |
| | | } |
| | | |
| | | public String getDataOutPath() |
| | | { |
| | | if (dataOut == null) |
| | | { |
| | | |
| | | public String getDataOutPath() { |
| | | if (dataOut == null) { |
| | | File outPath = new File(getDataPath(), elmOutPath); |
| | | if (!outPath.exists()) |
| | | { |
| | | if (!outPath.exists()) { |
| | | outPath.mkdir(); |
| | | } else if (!outPath.isDirectory()) |
| | | { |
| | | } else if (!outPath.isDirectory()) { |
| | | outPath.mkdir(); |
| | | } |
| | | dataOut = outPath.toString(); |
| | |
| | | return dataOut; |
| | | } |
| | | |
| | | public String getDataPath() |
| | | { |
| | | public String getDataPath() { |
| | | return dataPath; |
| | | } |
| | | |
| | | public void setDataPath(String dataPath) |
| | | { |
| | | public void setDataPath(String dataPath) { |
| | | this.dataPath = dataPath; |
| | | } |
| | | |
| | | public void logElement(Element element, String currentSchema) |
| | | { |
| | | public void logElement(Element element, String currentSchema) { |
| | | if ((this.currentSchema == null) || |
| | | (!this.currentSchema.equalsIgnoreCase(currentSchema))) |
| | | { |
| | | (!this.currentSchema.equalsIgnoreCase(currentSchema))) { |
| | | schemaChanged = true; |
| | | this.currentSchema = currentSchema; |
| | | try |
| | | { |
| | | try { |
| | | createNewStream(); |
| | | } catch (IOException e) |
| | | { |
| | | } catch (IOException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | return; |
| | | } catch (SQLException e) |
| | | { |
| | | } catch (SQLException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | return; |
| | | } |
| | | } else |
| | | { |
| | | if (fch == null) |
| | | { |
| | | try |
| | | { |
| | | } else { |
| | | if (fch == null) { |
| | | try { |
| | | createNewStream(); |
| | | } catch (IOException e) |
| | | { |
| | | } catch (IOException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | return; |
| | | } catch (SQLException e) |
| | | { |
| | | } catch (SQLException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | ArrayList<ByteBuffer> subBuffers = new ArrayList<ByteBuffer>(); |
| | | if (fch != null) |
| | | { |
| | | if (fch != null) { |
| | | ByteBuffer buf = null; |
| | | if (element instanceof LineElement) |
| | | { |
| | | if (element instanceof LineElement) { |
| | | int size = LineElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | LineElement.ElementHandler.getInstance().write(buf, element); |
| | | } else if (element instanceof ShapeElement) |
| | | { |
| | | } else if (element instanceof ShapeElement) { |
| | | int size = ShapeElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | ShapeElement.ElementHandler.getInstance().write(buf, element); |
| | | } else if (element instanceof LineStringElement) |
| | | { |
| | | } else if (element instanceof LineStringElement) { |
| | | int size = LineStringElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | LineStringElement.ElementHandler.getInstance().write(buf, element); |
| | | } else if (element instanceof ComplexChainElement) |
| | | { |
| | | } else if (element instanceof ComplexChainElement) { |
| | | int size = ComplexChainElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | ComplexChainElement.ElementHandler.getInstance().write(buf, element); |
| | | ComplexChainElement complexElement = (ComplexChainElement) element; |
| | | ListIterator it = complexElement.listIterator(); |
| | | while (it.hasNext()) |
| | | { |
| | | while (it.hasNext()) { |
| | | Element subElm = (Element) it.next(); |
| | | try |
| | | { |
| | | try { |
| | | IElementHandler handler = subElm.getElementType().getElementHandler(); |
| | | size = handler.getLength(subElm); |
| | | ByteBuffer subBuf = ByteBuffer.allocate(size * 2); |
| | | handler.write(subBuf, subElm); |
| | | subBuffers.add(subBuf); |
| | | } catch (Dgn7fileException e) |
| | | { |
| | | } catch (Dgn7fileException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } else if (element instanceof ComplexShapeElement) |
| | | { |
| | | } else if (element instanceof ComplexShapeElement) { |
| | | int size = ComplexShapeElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | ComplexShapeElement.ElementHandler.getInstance().write(buf, element); |
| | | ComplexShapeElement complexElement = (ComplexShapeElement) element; |
| | | ListIterator it = complexElement.listIterator(); |
| | | while (it.hasNext()) |
| | | { |
| | | while (it.hasNext()) { |
| | | Element subElm = (Element) it.next(); |
| | | try |
| | | { |
| | | try { |
| | | IElementHandler handler = subElm.getElementType().getElementHandler(); |
| | | size = handler.getLength(subElm); |
| | | ByteBuffer subBuf = ByteBuffer.allocate(size * 2); |
| | | handler.write(subBuf, subElm); |
| | | subBuffers.add(subBuf); |
| | | } catch (Dgn7fileException e) |
| | | { |
| | | } catch (Dgn7fileException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } else if (element instanceof ArcElement) |
| | | { |
| | | } else if (element instanceof ArcElement) { |
| | | int size = ArcElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | ArcElement.ElementHandler.getInstance().write(buf, element); |
| | | } else if (element instanceof EllipseElement) |
| | | { |
| | | } else if (element instanceof EllipseElement) { |
| | | int size = EllipseElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | EllipseElement.ElementHandler.getInstance().write(buf, element); |
| | | } else if (element instanceof TextElement) |
| | | { |
| | | } else if (element instanceof TextElement) { |
| | | int size = TextElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | TextElement.ElementHandler.getInstance().write(buf, element); |
| | | } else if (element instanceof TextNodeElement) |
| | | { |
| | | } else if (element instanceof TextNodeElement) { |
| | | int size = TextNodeElement.ElementHandler.getInstance().getLength(element); |
| | | buf = ByteBuffer.allocate(size * 2); |
| | | TextNodeElement.ElementHandler.getInstance().write(buf, element); |
| | | TextNodeElement nodeElement = (TextNodeElement) element; |
| | | ListIterator it = nodeElement.listIterator(); |
| | | while (it.hasNext()) |
| | | { |
| | | while (it.hasNext()) { |
| | | Element subElm = (Element) it.next(); |
| | | try |
| | | { |
| | | try { |
| | | IElementHandler handler = subElm.getElementType().getElementHandler(); |
| | | size = handler.getLength(subElm); |
| | | ByteBuffer subBuf = ByteBuffer.allocate(size * 2); |
| | | handler.write(subBuf, subElm); |
| | | subBuffers.add(subBuf); |
| | | } catch (Dgn7fileException e) |
| | | { |
| | | } catch (Dgn7fileException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if ((buf != null) && (fch != null)) |
| | | { |
| | | try |
| | | { |
| | | if ((buf != null) && (fch != null)) { |
| | | try { |
| | | buf.position(0); |
| | | int size = fch.write(buf); |
| | | if (size != buf.limit()) |
| | | { |
| | | if (size != buf.limit()) { |
| | | long position = fch.position(); |
| | | logger.info("Pos:" + position); |
| | | } |
| | | } catch (IOException e) |
| | | { |
| | | } catch (IOException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | elmCount++; |
| | | if ((subBuffers.size() != 0) && (fch != null)) |
| | | { |
| | | for (ByteBuffer buf : subBuffers) |
| | | { |
| | | try |
| | | { |
| | | if ((subBuffers.size() != 0) && (fch != null)) { |
| | | for (ByteBuffer buf : subBuffers) { |
| | | try { |
| | | buf.position(0); |
| | | int size = fch.write(buf); |
| | | if (size != buf.limit()) |
| | | { |
| | | if (size != buf.limit()) { |
| | | long position = fch.position(); |
| | | logger.info("Pos:" + position); |
| | | } |
| | | } catch (IOException e) |
| | | { |
| | | } catch (IOException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void createNewStream() throws IOException, SQLException |
| | | { |
| | | if (fos != null) |
| | | { |
| | | private void createNewStream() throws IOException, SQLException { |
| | | if (fos != null) { |
| | | putEndOfFileElement(); |
| | | fos.close(); |
| | | fos = null; |
| | |
| | | } |
| | | |
| | | String outLogName = currentSchema + ".dgn"; |
| | | if (prefix != null) |
| | | { |
| | | if (prefix != null) { |
| | | outLogName = prefix + outLogName; |
| | | } |
| | | File logFile = new File(getDataOutPath(), outLogName); |
| | | while (logFile.exists()) |
| | | { |
| | | while (logFile.exists()) { |
| | | outLogName = this.currentSchema + "-" + (++logCount) + ".dgn"; |
| | | if (prefix != null) |
| | | { |
| | | if (prefix != null) { |
| | | outLogName = prefix + outLogName; |
| | | } |
| | | |
| | |
| | | elmCount = 0; |
| | | } |
| | | |
| | | private void putEndOfFileElement() throws IOException |
| | | { |
| | | private void putEndOfFileElement() throws IOException { |
| | | if (fch == null) |
| | | return; |
| | | ByteBuffer bf = ByteBuffer.allocate(4); |
| | |
| | | fch.write(bf); |
| | | } |
| | | |
| | | private void prepareOutputElementStream() throws SQLException, IOException |
| | | { |
| | | if (connection == null) |
| | | { |
| | | private void prepareOutputElementStream() throws SQLException, IOException { |
| | | if (connection == null) { |
| | | logger.warn("connection is null"); |
| | | return; |
| | | } |
| | | |
| | | if (dgnFileHeader != null) |
| | | { |
| | | for (byte[] raw : dgnFileHeader) |
| | | { |
| | | if (dgnFileHeader != null) { |
| | | for (byte[] raw : dgnFileHeader) { |
| | | putElementIntoStream(raw); |
| | | } |
| | | return; |
| | |
| | | ResultSet rsSrc = stmtSrc.executeQuery(fetchSrcStmt); |
| | | int igdsMetaType = rsSrc.getMetaData().getColumnType(1); |
| | | |
| | | while (rsSrc.next()) |
| | | { |
| | | while (rsSrc.next()) { |
| | | byte[] raw; |
| | | |
| | | if (igdsMetaType == Types.BLOB) |
| | | { |
| | | if (igdsMetaType == Types.BLOB) { |
| | | BLOB blob = (BLOB) rsSrc.getBlob(1); |
| | | |
| | | raw = getBytesFromBLOB(blob); |
| | | blob.close(); |
| | | } else |
| | | { |
| | | // blob.close(); |
| | | } else { |
| | | raw = rsSrc.getBytes(1); |
| | | } |
| | | |
| | | if (raw != null) |
| | | { |
| | | if (raw != null) { |
| | | dgnFileHeader.add(raw); |
| | | putElementIntoStream(raw); |
| | | } |
| | |
| | | stmtSrc.close(); |
| | | } |
| | | |
| | | private void putElementIntoStream(byte[] raw) throws IOException |
| | | { |
| | | private void putElementIntoStream(byte[] raw) throws IOException { |
| | | if (fch != null) |
| | | fch.write(ByteBuffer.wrap(raw)); |
| | | } |
| | | |
| | | protected static byte[] getBytesFromBLOB(BLOB blob) throws SQLException |
| | | { |
| | | protected byte[] getBytesFromBLOB(BLOB blob) throws SQLException { |
| | | byte[] raw = null; |
| | | |
| | | int optimalSize = blob.getChunkSize(); |
| | |
| | | ByteBuffer buffer = null; // ByteBuffer.allocate(optimalSize); |
| | | int len; |
| | | |
| | | try |
| | | { |
| | | while ((len = (is.read(chunk))) != -1) |
| | | { |
| | | if (buffer != null) |
| | | { |
| | | try { |
| | | while ((len = (is.read(chunk))) != -1) { |
| | | if (buffer != null) { |
| | | buffer.limit(buffer.limit() + len); |
| | | } else |
| | | { |
| | | } else { |
| | | buffer = ByteBuffer.allocate(len); |
| | | } |
| | | |
| | | buffer.put(chunk); |
| | | } |
| | | |
| | | is.close(); |
| | | assert buffer != null; |
| | | buffer.position(0); |
| | | raw = buffer.array(); |
| | | } catch (IOException e) |
| | | { |
| | | } catch (IOException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | Assert.shouldNeverReachHere(); |
| | | } finally { |
| | | try { |
| | | is.close(); |
| | | } catch (IOException e) { |
| | | logger.warn("InputStream cannot close", e); |
| | | } |
| | | ; |
| | | } |
| | | return raw; |
| | | } |
| | | |
| | | public void flashLogging() |
| | | { |
| | | if ((useElementCount) && (elmCount < maxElmCount)) |
| | | { |
| | | public void flashLogging() { |
| | | if ((useElementCount) && (elmCount < maxElmCount)) { |
| | | return; |
| | | } |
| | | |
| | | if (fos != null) |
| | | { |
| | | try |
| | | { |
| | | if (fos != null) { |
| | | try { |
| | | putEndOfFileElement(); |
| | | fos.close(); |
| | | } catch (IOException e) |
| | | { |
| | | } catch (IOException e) { |
| | | logger.warn(e.getMessage(), e); |
| | | } |
| | | fos = null; |
| | |
| | | } |
| | | } |
| | | |
| | | public boolean isSchemaChanged() |
| | | { |
| | | public boolean isSchemaChanged() { |
| | | return schemaChanged; |
| | | } |
| | | |
| | | public boolean isUseElementCount() |
| | | { |
| | | public boolean isUseElementCount() { |
| | | return useElementCount; |
| | | } |
| | | |
| | | public void setUseElementCount(boolean useElementCount) |
| | | { |
| | | public void setUseElementCount(boolean useElementCount) { |
| | | this.useElementCount = useElementCount; |
| | | } |
| | | |
| | | public int getElmCount() |
| | | { |
| | | public int getElmCount() { |
| | | return elmCount; |
| | | } |
| | | |
| | | public int getMaxElmCount() |
| | | { |
| | | public int getMaxElmCount() { |
| | | return maxElmCount; |
| | | } |
| | | |
| | | public void setMaxElmCount(int maxElmCount) |
| | | { |
| | | public void setMaxElmCount(int maxElmCount) { |
| | | this.maxElmCount = maxElmCount; |
| | | } |
| | | |
| | | public String getLogPrefix() |
| | | { |
| | | public String getLogPrefix() { |
| | | return prefix; |
| | | } |
| | | |
| | | public void setLogPrefix(String prefix) |
| | | { |
| | | public void setLogPrefix(String prefix) { |
| | | this.prefix = prefix; |
| | | } |
| | | } |