/*
* Licensed to Prodevelop SL under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The Prodevelop SL licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* For more information, contact:
*
* Prodevelop, S.L.
* Pza. Don Juan de Villarrasa, 14 - 5
* 46001 Valencia
* Spain
*
* +34 963 510 612
* +34 963 510 968
* prode@prodevelop.es
* http://www.prodevelop.es
*
* @author Alberto Romeu Carrasco http://www.albertoromeu.com
*/
package es.alrocar.jpe.parser.kml;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import org.geotools.kml.v22.KML;
import org.geotools.kml.v22.KMLConfiguration;
import org.geotools.xml.StreamingParser;
import org.opengis.feature.simple.SimpleFeature;
import org.xml.sax.SAXException;
import com.vividsolutions.jts.geom.Geometry;
import es.alrocar.jpe.parser.DefaultJPEParser;
import es.alrocar.jpe.parser.JPEParserFormatEnum;
import es.alrocar.poiproxy.configuration.DescribeService;
import es.alrocar.poiproxy.proxy.LocalFilter;
import es.prodevelop.gvsig.mini.geom.impl.base.Point;
import es.prodevelop.gvsig.mini.geom.impl.jts.JTSFeature;
public class KMLParser extends DefaultJPEParser {
@SuppressWarnings({ "deprecation" })
@Override
public ArrayList<JTSFeature> parse(String contentFile,
DescribeService service, LocalFilter filter) {
InputStream inputStream = new ByteArrayInputStream(
contentFile.getBytes());
fc = (ArrayList<JTSFeature>) contentHandler.startFeatureCollection();
this.setCurrentFeatureType(service);
JTSFeature feature;
Point point;
StreamingParser parser;
try {
KMLConfiguration configuration = new KMLConfiguration();
parser = new StreamingParser(configuration, inputStream,
KML.Placemark);
@SuppressWarnings("unused")
SimpleFeature f = null;
boolean hasPassedFilter = false;
String element;
while ((f = (SimpleFeature) parser.parse()) != null) {
hasPassedFilter = false;
feature = (JTSFeature) contentHandler.startFeature();
point = (Point) contentHandler.startPoint();
for (String destProp : this.currentFeatureType.getElements()
.keySet()) {
element = this.currentFeatureType.getElements()
.get(destProp).getInput();
String attribute = (String) f.getAttribute(element);
if (attribute == null) {
Set<Entry<Object, Object>> data = f.getUserData()
.entrySet();
Iterator<Entry<Object, Object>> it = data.iterator();
while (it.hasNext()) {
try {
Entry<Object, Object> extendedData = it.next();
if (extendedData.getKey().equals(element)) {
attribute = extendedData.getValue()
.toString();
break;
} else {
String[] parts = extendedData.getValue()
.toString().split(",");
for (String part : parts) {
String[] aa = part.trim().split("=");
if (aa != null && aa.length == 2) {
if (aa[0].trim().indexOf(element) != -1) {
attribute = aa[1].trim();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
if (attribute != null) {
try {
if (filter == null) {
hasPassedFilter = true;
} else {
hasPassedFilter = hasPassedFilter
|| filter.apply(attribute);
}
addAttribute(attribute, feature, destProp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Geometry geom = (Geometry) f.getDefaultGeometry();
try {
this.setLatitude(geom.getCentroid().getY(), point);
this.setLongitude(geom.getCentroid().getX(), point);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
contentHandler.addPointToFeature(feature, contentHandler
.endPoint(point, service.getSRS(),
DescribeService.DEFAULT_SRS));
if (hasPassedFilter) {
fillCategories(feature, service);
fillService(feature, service);
contentHandler.addFeatureToCollection(fc, feature);
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (ArrayList) fc;
}
@Override
public String getFormat() {
return JPEParserFormatEnum.KML.format;
}
}