package com.ximple.io.dgn7; import com.vividsolutions.jts.geom.CoordinateList; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiLineString; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.geotools.TestData; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; /** * Created by IntelliJ IDEA. * User: Ulysses * Date: 2010/4/21 */ public class ElementFactoryTest { private final static Logger logger = Logger.getLogger(Dgn7fileReaderTest.class); // private final static String testFilePath = "test-data\\testHV.dgn"; private final static String testFilePath = "testHV.dgn"; private static GeometryFactory factory = new GeometryFactory(); private FileInputStream _fs; private LineStringElement _testLineString = null; private ComplexChainElement _testComplexChain = null; @BeforeTest public void setUp() throws IOException, Dgn7fileException { File dataFile = TestData.file(this, testFilePath); if (!dataFile.exists()) { return; } _fs = new FileInputStream(dataFile); fetchTestElement(_fs); _fs.close(); } private void fetchTestElement(FileInputStream fs) throws Dgn7fileException, IOException { FileChannel fc = _fs.getChannel(); Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock()); int count = 0; Element lastComplex = null; while (reader.hasNext()) { Element.FileRecord record = reader.nextElement(); if (record.element() != null) { Element element = (Element) record.element(); ElementType type = element.getElementType(); boolean completed = false; if ((!type.isComplexElement()) && (!element.isComponentElement())) { if (lastComplex != null) { // @todo add process in here if (!processCompleteElement(lastComplex)) break; lastComplex = null; } // @todo add process in here if (!processCompleteElement(element)) break; } else if (element.isComponentElement()) { if (lastComplex != null) { ((ComplexElement) lastComplex).add(element); } else { logger.warn("wong." + element.toString()); Assert.fail("Component Element cannot found parent."); } } else if (type.isComplexElement()) { if (lastComplex != null) { // @todo add process in here if (!processCompleteElement(lastComplex)) break; } lastComplex = element; } } count++; } } private boolean processCompleteElement(Element element) throws IOException { if (element instanceof LineStringElement) { _testLineString = (LineStringElement) element; } if (element instanceof ComplexChainElement) { _testComplexChain = (ComplexChainElement) element; } if ((_testLineString != null) && (_testComplexChain != null)) return false; return true; } @Test public void testCreateLineString() throws IOException, Dgn7fileException { Assert.assertNotNull(_testLineString); LineStringElement originElement = _testLineString; LineString geometry = (LineString) originElement.toGeometry(factory); Element cloneElement = ElementFactory.createLineString(geometry); Assert.assertTrue(cloneElement instanceof LineStringElement); cloneElement.setLevelIndex(originElement.getLevelIndex()); cloneElement.setColorIndex(originElement.getColorIndex()); cloneElement.setWeight(originElement.getWeight()); cloneElement.setLineStyle(originElement.getLineStyle()); cloneElement.setRange(geometry.getEnvelopeInternal()); int len = originElement.raw.length; int lenClone = cloneElement.raw.length; // Assert.assertEquals(lenClone, len - originElement.getUserAttributeDataOffset() + 1); if (originElement.hasUserAttributeData()) { Assert.assertEquals(lenClone, originElement.getUserAttributeDataOffset()); } System.out.println("origin size=(" + len + ")-:- Clone size=(" + lenClone + ")"); int headerSize = ElementFactory.MINIMAL_ELEMLENGTH / 2; for (int i = 0; i <= headerSize; i++) { if (originElement.raw[i] != cloneElement.raw[i]) { System.out.print("different index=" + i + ":"); System.out.println("origin[" + Integer.toHexString(originElement.raw[i]) + "]-clone:[" + Integer.toHexString(cloneElement.raw[i]) + "]"); } } } @Test public void testCreateComplexChain() throws IOException, Dgn7fileException { Assert.assertNotNull(_testComplexChain); ComplexChainElement originElement = _testComplexChain; System.out.print("len=" + originElement.raw.length); for (Element elm : originElement) { System.out.print(":" + elm.raw.length); } System.out.println(); MultiLineString geometries = (MultiLineString) originElement.toGeometry(factory); LineString geometry = factory.createLineString(geometries.getCoordinates()); ComplexChainElement cloneElement = (ComplexChainElement) ElementFactory.createComplexChain(geometry); Assert.assertTrue(cloneElement instanceof ComplexChainElement); cloneElement.setLevelIndex(originElement.getLevelIndex()); cloneElement.setColorIndex(originElement.getColorIndex()); cloneElement.setWeight(originElement.getWeight()); cloneElement.setLineStyle(originElement.getLineStyle()); cloneElement.setRange(geometry.getEnvelopeInternal()); int len = originElement.raw.length; int lenClone = cloneElement.raw.length; // Assert.assertEquals(lenClone, len - originElement.getUserAttributeDataOffset() + 1); System.out.print("clonelen=" + cloneElement.raw.length); for (Element elm : cloneElement) { System.out.print(":" + elm.raw.length); } System.out.println(); if (originElement.hasUserAttributeData()) { Assert.assertEquals(lenClone, originElement.getUserAttributeDataOffset() + 4); } System.out.println("origin size=(" + len + ")-:- Clone size=(" + lenClone + ")"); int headerSize = ElementFactory.MINIMAL_ELEMLENGTH / 2 + 6; for (int i = 0; i < headerSize; i++) { if (originElement.raw[i] != cloneElement.raw[i]) { System.out.print("different index=" + i + ":"); System.out.println("origin[" + Integer.toHexString(originElement.raw[i]) + "]-clone:[" + Integer.toHexString(cloneElement.raw[i]) + "]"); } } } }