/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.kml.builder;
import java.util.List;
import org.geoserver.kml.KmlEncodingContext;
import org.geoserver.kml.decorator.KmlDecoratorFactory.KmlDecorator;
import org.geoserver.kml.sequence.PlainFolderSequenceFactory;
import org.geoserver.kml.sequence.SequenceFactory;
import org.geoserver.kml.sequence.SequenceList;
import org.geoserver.platform.ServiceException;
import de.micromata.opengis.kml.v_2_2_0.Document;
import de.micromata.opengis.kml.v_2_2_0.Feature;
import de.micromata.opengis.kml.v_2_2_0.Kml;
/**
* Builds a lazily evaluated KML document given a encoding context
*
* @author Andrea Aime - GeoSolutions
*/
public class StreamingKMLBuilder {
/**
* Builds a lazily evaluated KML document given a encoding context
*
* @param context
*
*/
public Kml buildKMLDocument(KmlEncodingContext context) {
// prepare kml, document and folder
Kml kml = new Kml();
Document document = kml.createAndSetDocument();
String kmltitle = (String) context.getRequest().getFormatOptions().get("kmltitle");
document.setName(kmltitle);
// get the callbacks for the document and let them loose
List<KmlDecorator> decorators = context.getDecoratorsForClass(Document.class);
for (KmlDecorator decorator : decorators) {
document = (Document) decorator.decorate(document, context);
if (document == null) {
throw new ServiceException("Coding error in decorator " + decorator
+ ", document objects cannot be set to null");
}
}
// create a generator that will generate a folder and feature dumps/ground overlays for each
// layer
SequenceFactory<Feature> generatorFactory = new PlainFolderSequenceFactory(context);
SequenceList<Feature> folders = new SequenceList<Feature>(generatorFactory);
context.addFeatures(document, folders);
return kml;
}
}