/* * Copyright (c) 2015 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.io.wfs.file; import java.io.IOException; import java.util.HashSet; import java.util.Set; import javax.xml.stream.XMLStreamException; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; import com.vividsolutions.jts.geom.Geometry; import eu.esdihumboldt.hale.common.core.io.IOProviderConfigurationException; import eu.esdihumboldt.hale.common.core.io.ProgressIndicator; import eu.esdihumboldt.hale.common.core.io.Value; import eu.esdihumboldt.hale.common.core.io.report.IOReport; import eu.esdihumboldt.hale.common.core.io.report.IOReporter; import eu.esdihumboldt.hale.common.instance.model.Instance; import eu.esdihumboldt.hale.common.schema.geometry.CRSDefinition; import eu.esdihumboldt.hale.common.schema.model.TypeDefinition; import eu.esdihumboldt.hale.io.gml.writer.InspireDatasetFeedWriter; import eu.esdihumboldt.hale.io.gml.writer.InspireInstanceWriter; import eu.esdihumboldt.hale.io.wfs.WFSVersion; import eu.esdihumboldt.util.Pair; /** * Concrete class for writing a WFS 2.0 FeatureCollection. Needed so HALE can * determine without setting a parameter if an appropriate container can be * found. * * @author Simon Templer */ public class WFS2FCWriter extends WFSFeatureCollectionWriter { private final Set<TypeDefinition> types = new HashSet<>(); private final Multiset<CRSDefinition> crss = HashMultiset.create(); /** * Constructor. */ public WFS2FCWriter() { super(); setWFSVersion(WFSVersion.V2_0_0); addSupportedParameter(InspireInstanceWriter.PARAM_SPATIAL_DATA_SET_CREATE_FEED); for (String param : InspireDatasetFeedWriter.getAdditionalParams()) { addSupportedParameter(param); } } @SuppressWarnings("restriction") @Override protected IOReport execute(ProgressIndicator progress, IOReporter reporter) throws IOProviderConfigurationException, IOException { super.execute(progress, reporter); // run feed writer if applicable if (getParameter(InspireInstanceWriter.PARAM_SPATIAL_DATA_SET_CREATE_FEED).as( Boolean.class, false)) { InspireDatasetFeedWriter feedWriter = new InspireDatasetFeedWriter(); for (String copyParam : InspireDatasetFeedWriter.getAdditionalParams()) { feedWriter.setParameter(copyParam, getParameter(copyParam)); } feedWriter.setOccurringTypes(types); feedWriter.setOccurringCRSs(crss); feedWriter.setParameter(PARAM_TARGET, Value.of(InspireInstanceWriter .getDatasetFeedTarget(getTarget().getLocation()).toString())); reporter.importMessages(feedWriter.execute(progress)); // Ignore success of feedWriter-report, since main success criteria // is successfully writing the data. } return reporter; } @SuppressWarnings("restriction") @Override protected void writeMember(Instance instance, TypeDefinition type, IOReporter report) throws XMLStreamException { // collect written types in case a dataset feed will be written types.add(type); super.writeMember(instance, type, report); } @Override protected Pair<Geometry, CRSDefinition> extractGeometry(Object value, boolean allowConvert, IOReporter report) { // collect used CRS definitions Pair<Geometry, CRSDefinition> result = super.extractGeometry(value, allowConvert, report); if (result != null) { crss.add(result.getSecond()); } return result; } }