[Suiviobsmer-commits] r582 - in trunk: . wao-business wao-business/src/main/java/fr/ifremer/wao/io/kml wao-business/src/main/java/fr/ifremer/wao/service
Author: fdesbois Date: 2010-06-30 14:05:41 +0000 (Wed, 30 Jun 2010) New Revision: 582 Log: Evo #2352 : Cartography for contacts : - Add KmlReader using Xpp3 (doesn't work yet) + Factory Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java Modified: trunk/pom.xml trunk/wao-business/pom.xml trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictSchemaData.java trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-06-30 10:54:53 UTC (rev 581) +++ trunk/pom.xml 2010-06-30 14:05:41 UTC (rev 582) @@ -62,7 +62,7 @@ <artifactId>nuiton-tapestry-extra</artifactId> <version>${nuitonweb.version}</version> </dependency> - <!-- ToPIA --> + <!-- ToPIA --> <dependency> <groupId>org.nuiton.topia</groupId> <artifactId>topia-persistence</artifactId> @@ -146,6 +146,11 @@ <artifactId>xpp3</artifactId> <version>1.1.4c</version> </dependency> + <dependency> + <groupId>xpp3</groupId> + <artifactId>xpp3_xpath</artifactId> + <version>1.1.4c</version> + </dependency> <!-- Csv import/export --> <dependency> <groupId>net.sourceforge.javacsv</groupId> Modified: trunk/wao-business/pom.xml =================================================================== --- trunk/wao-business/pom.xml 2010-06-30 10:54:53 UTC (rev 581) +++ trunk/wao-business/pom.xml 2010-06-30 14:05:41 UTC (rev 582) @@ -62,6 +62,10 @@ <groupId>xpp3</groupId> <artifactId>xpp3</artifactId> </dependency> + <dependency> + <groupId>xpp3</groupId> + <artifactId>xpp3_xpath</artifactId> + </dependency> <!-- ToPIA --> <dependency> <groupId>org.nuiton.topia</groupId> Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java 2010-06-30 10:54:53 UTC (rev 581) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReader.java 2010-06-30 14:05:41 UTC (rev 582) @@ -19,5 +19,5 @@ BoatDistrictData readNext(); - void close(); + void close() throws IOException; } Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderFactory.java 2010-06-30 14:05:41 UTC (rev 582) @@ -0,0 +1,29 @@ +package fr.ifremer.wao.io.kml; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Created: 30 juin 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public class BoatDistrictKmlReaderFactory { + + public static BoatDistrictKmlReader newReaderJak(InputStream input) + throws IOException { + BoatDistrictKmlReader reader = new BoatDistrictKmlReaderJak(); + reader.init(input); + return reader; + } + + + public static BoatDistrictKmlReader newReaderXpp3(InputStream input) + throws IOException { + BoatDistrictKmlReader reader = new BoatDistrictKmlReaderXpp3(); + reader.init(input); + return reader; + } + +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java 2010-06-30 10:54:53 UTC (rev 581) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderJak.java 2010-06-30 14:05:41 UTC (rev 582) @@ -65,28 +65,10 @@ for (SimpleData data : schemaData.getSimpleData()) { - BoatDistrictSchemaData type = + BoatDistrictSchemaData districtSchemaData = BoatDistrictSchemaData.valueOfLabel(data.getName()); - String value = data.getValue(); - switch (type) { - case NAME: - district.setName(value); break; - case DESCRIPTION: - district.setDescription(value); break; - case OBJECTID: - district.setObjectid(value); break; - case LIEU_COD: - district.setLieuCod(value); break; - case LIEU_LIB: - district.setLieuLib(value); break; - case TLIEU_COD: - district.setTlieuCod(value); break; - case L_OCEAN: - district.setLOcean(value); break; - case L_PAYS: - district.setLPays(value); - } + districtSchemaData.setPropertyValue(district, data.getValue()); } // Retrieve coordinate Added: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java (rev 0) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictKmlReaderXpp3.java 2010-06-30 14:05:41 UTC (rev 582) @@ -0,0 +1,133 @@ +package fr.ifremer.wao.io.kml; + +import fr.ifremer.wao.io.BoatDistrictData; +import fr.ifremer.wao.io.BoatDistrictDataImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xmlpull.v1.builder.XmlCharacters; +import org.xmlpull.v1.builder.XmlDocument; +import org.xmlpull.v1.builder.XmlElement; +import org.xmlpull.v1.builder.XmlInfosetBuilder; +import org.xmlpull.v1.builder.xpath.Xb1XPath; +import org.xmlpull.v1.builder.xpath.jaxen.XPath; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.util.Iterator; +import java.util.List; + +/** + * Created: 30 juin 2010 + * + * @author fdesbois <fdesbois at codelutin.com> + * @version $Id$ + */ +public class BoatDistrictKmlReaderXpp3 implements BoatDistrictKmlReader { + + private static final Logger logger = LoggerFactory.getLogger(BoatDistrictKmlReaderXpp3.class); + + private static final String PATH_PLACEMARK = "/kml/Document/Folder/Placemark"; + + private static final String PATH_SIMPLE_DATA = "ExtendedData/SchemaData/SimpleData"; + + private static final String PATH_COORDINATES = "Point/coordinates"; + + private static final String ATTRIBUTE_SCHEMA_DATA_NAME = "name"; + + Iterator<XmlElement> iterator; + + InputStreamReader reader; + + @Override + public void init(InputStream stream) throws IOException { + + if (logger.isDebugEnabled()) { + logger.debug("Read stream Kml"); + } + + reader = new InputStreamReader(stream); + + XPath xpath = new Xb1XPath(PATH_PLACEMARK); + + XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance(); + + XmlDocument doc = builder.parseReader(reader); + + if (logger.isDebugEnabled()) { + Iterator it = doc.children().iterator(); + while (it.hasNext()) { + logger.debug("onInit :: element : " + ((XmlElement)it.next()).getName()); + } + } + + List results = xpath.selectNodes(doc); + + if (logger.isDebugEnabled()) { + for (Object element : results) { + logger.debug("onInit :: element : " + ((XmlElement)element).getName()); + } + } + + iterator = results.iterator(); + } + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public BoatDistrictData readNext() { + + BoatDistrictData district = new BoatDistrictDataImpl(); + + XmlElement element = iterator.next(); + + if (logger.isDebugEnabled()) { + logger.debug("element : " + element.getName()); + } + + readSchemaData(element, district); + + readCoordinates(element, district); + + return district; + } + + protected void readSchemaData(XmlElement element, BoatDistrictData district) { + XPath xpath = new Xb1XPath(PATH_SIMPLE_DATA); + List<XmlElement> results = xpath.selectNodes(element); + for (XmlElement data : results) { + + String dataLabel = data.getAttributeValue(null, ATTRIBUTE_SCHEMA_DATA_NAME); + + if (logger.isDebugEnabled()) { + logger.debug("data : " + data.getName() + " _ label = " + dataLabel); + } + + BoatDistrictSchemaData schemaData = + BoatDistrictSchemaData.valueOfLabel(dataLabel); + + XmlCharacters chars = (XmlCharacters) data.children().next(); + + schemaData.setPropertyValue(district, chars.getText()); + } + } + + protected void readCoordinates(XmlElement element, BoatDistrictData district) { + XPath xpath = new Xb1XPath(PATH_COORDINATES); + XmlElement coordinatesElement = (XmlElement) xpath.selectSingleNode(element); + XmlCharacters chars = (XmlCharacters) coordinatesElement.children().next(); + String[] coordinates = chars.getText().split(","); + + district.setLongitude(Double.valueOf(coordinates[0])); + district.setLatitude(Double.valueOf(coordinates[1])); + } + + @Override + public void close() throws IOException { + reader.close(); + } +} Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictSchemaData.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictSchemaData.java 2010-06-30 10:54:53 UTC (rev 581) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/io/kml/BoatDistrictSchemaData.java 2010-06-30 14:05:41 UTC (rev 582) @@ -1,5 +1,7 @@ package fr.ifremer.wao.io.kml; +import fr.ifremer.wao.io.BoatDistrictData; + /** * Created: 29 juin 2010 * @@ -40,4 +42,26 @@ return null; } + public void setPropertyValue(BoatDistrictData data, + String value) { + switch (this) { + case NAME: + data.setName(value); break; + case DESCRIPTION: + data.setDescription(value); break; + case OBJECTID: + data.setObjectid(value); break; + case LIEU_COD: + data.setLieuCod(value); break; + case LIEU_LIB: + data.setLieuLib(value); break; + case TLIEU_COD: + data.setTlieuCod(value); break; + case L_OCEAN: + data.setLOcean(value); break; + case L_PAYS: + data.setLPays(value); + } + } + } Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java 2010-06-30 10:54:53 UTC (rev 581) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceCartographyImpl.java 2010-06-30 14:05:41 UTC (rev 582) @@ -1,20 +1,11 @@ package fr.ifremer.wao.service; -import de.micromata.opengis.kml.v_2_2_0.Coordinate; -import de.micromata.opengis.kml.v_2_2_0.Document; -import de.micromata.opengis.kml.v_2_2_0.Folder; -import de.micromata.opengis.kml.v_2_2_0.Kml; -import de.micromata.opengis.kml.v_2_2_0.Placemark; -import de.micromata.opengis.kml.v_2_2_0.Point; -import de.micromata.opengis.kml.v_2_2_0.SchemaData; -import de.micromata.opengis.kml.v_2_2_0.SimpleData; import fr.ifremer.wao.WaoContext; import fr.ifremer.wao.WaoDAOHelper; import fr.ifremer.wao.WaoException; import fr.ifremer.wao.io.BoatDistrictData; import fr.ifremer.wao.io.kml.BoatDistrictKmlReader; -import fr.ifremer.wao.io.kml.BoatDistrictKmlReaderJak; -import fr.ifremer.wao.io.kml.BoatDistrictSchemaData; +import fr.ifremer.wao.io.kml.BoatDistrictKmlReaderFactory; import fr.ifremer.wao.io.ImportResults; import fr.ifremer.wao.io.ImportResultsImpl; import fr.ifremer.wao.entity.BoatDistrict; @@ -69,8 +60,8 @@ BoatDistrictDAO dao = WaoDAOHelper.getBoatDistrictDAO(transaction); - BoatDistrictKmlReader reader = new BoatDistrictKmlReaderJak(); - reader.init(input); + BoatDistrictKmlReader reader = + BoatDistrictKmlReaderFactory.newReaderJak(input); int i = 0; while (reader.hasNext()) { @@ -112,66 +103,6 @@ reader.close(); transaction.commitTransaction(); -// Kml kml = Kml.unmarshal(input); -// -// Document document = (Document) kml.getFeature(); -// Folder folder = (Folder) document.getFeature().get(0); -// -// int size = folder.getFeature().size(); -// for (int i = 0; i < size; i++) { -// Placemark placemark = (Placemark) folder.getFeature().get(i); -// -// SchemaData schemaData = placemark.getExtendedData().getSchemaData().get(0); -// -// String districtName = null, districtCode = null; -// -// for (SimpleData data : schemaData.getSimpleData()) { -// -// BoatDistrictSchemaData type = -// BoatDistrictSchemaData.valueOfLabel(data.getName()); -// -// switch (type) { -// case DESCRIPTION: -// districtName = data.getValue(); -// break; -// case OBJECTID: -// districtCode = data.getValue(); -// } -// } -// -// if (logger.isDebugEnabled()) { -// logger.debug("District : code = " + districtCode + -// " _ name = " + districtName); -// } -// -// if (districtCode != null) { -// -// BoatDistrict district = dao.findByCode(districtCode); -// -// if (district != null) { -// -// // Retrieve coordinate -// Point point = (Point) placemark.getGeometry(); -// Coordinate coordinate = point.getCoordinates().get(0); -// -// // Update data -// district.setLatitude(coordinate.getLatitude()); -// district.setLongitude(coordinate.getLongitude()); -// district.setName(districtName); -// -// dao.update(district); -// -// results.incNbImported(); -// } else { -// // Reject -// results.incNbRefused(); -// results.addError(i, "Code quartier inconnu : " + districtCode); -// } -// } -// } -// -// transaction.commitTransaction(); - return results; } }
participants (1)
-
fdesbois@users.labs.libre-entreprise.org