/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.wps.converters;
import java.util.*;
import java.util.logging.Logger;
import javax.measure.Unit;
import org.geotoolkit.feature.util.converter.StringToDateConverter;
import org.geotoolkit.ows.xml.BoundingBox;
import org.geotoolkit.processing.util.converter.StringToCRSConverter;
import org.geotoolkit.processing.util.converter.StringToFilterConverter;
import org.geotoolkit.processing.util.converter.StringToNumberRangeConverter;
import org.geotoolkit.processing.util.converter.StringToSortByConverter;
import org.apache.sis.util.ArgumentChecks;
import org.apache.sis.util.UnconvertibleObjectException;
import org.apache.sis.util.logging.Logging;
import org.geotoolkit.wps.converters.inputs.complex.*;
import org.geotoolkit.wps.converters.inputs.literal.*;
import org.geotoolkit.wps.converters.inputs.references.*;
import org.geotoolkit.wps.converters.outputs.complex.*;
import org.geotoolkit.wps.converters.outputs.literal.*;
import org.geotoolkit.wps.converters.outputs.references.*;
import org.geotoolkit.wps.xml.ComplexDataType;
import org.apache.sis.util.ObjectConverters;
import org.geotoolkit.wps.xml.Reference;
/**
* Registry that register all WPS converters used.
*
* @author Quentin Boileau (Geomatys).
*/
public class WPSConverterRegistry {
private static final Logger LOGGER = Logging.getLogger("org.geotoolkit.wps.converters");
private final List<WPSObjectConverter> converters;
private static WPSConverterRegistry INSTANCE;
private WPSConverterRegistry() {
final List<WPSObjectConverter> list = new LinkedList<>();
converters = Collections.synchronizedList(list);
//ComplexDataType -> Object converters
register(ComplexToAffineTransformConverter .getInstance());
register(ComplexToFeatureArrayConverter .getInstance());
register(ComplexToFeatureCollectionArrayConverter .getInstance());
register(ComplexToFeatureCollectionConverter .getInstance());
register(ComplexToFeatureConverter .getInstance());
register(ComplexToFeatureTypeConverter .getInstance());
register(ComplexToGeometryArrayConverter .getInstance());
register(ComplexToGeometryConverter .getInstance());
register(ComplexToRendredImageConverter .getInstance());
register(ComplexToCoverageConverter .getInstance());
register(ComplexToFileConverter .getInstance());
//ReferenceType -> Object Converters
register(ReferenceToAffineTransformConverter .getInstance());
register(ReferenceToFeatureCollectionConverter .getInstance());
register(ReferenceToFeatureConverter .getInstance());
register(ReferenceToFeatureTypeConverter .getInstance());
register(ReferenceToFileConverter .getInstance());
register(ReferenceToGeometryConverter .getInstance());
register(ReferenceToGridCoverage2DConverter .getInstance());
register(ReferenceToGridCoverageReaderConverter .getInstance());
register(ReferenceToRenderedImageConverter .getInstance());
register(ReferenceToStringConverter .getInstance());
register(ReferenceToGeometryArrayConverter .getInstance());
register(ReferenceToUrlConverter .getInstance());
register(ReferenceToUrlConnectionConverter .getInstance());
//Object -> ComplexDataType converters
register(FeatureCollectionToComplexConverter .getInstance());
register(FeatureToComplexConverter .getInstance());
register(FeatureTypeToComplexConverter .getInstance());
register(GeometryArrayToComplexConverter .getInstance());
register(GeometryToComplexConverter .getInstance());
register(RenderedImageToComplexConverter .getInstance());
register(CoverageToComplexConverter .getInstance());
register(FileToComplexConverter .getInstance());
//Object -> ReferenceType converters
register(CoverageToReferenceConverter .getInstance());
register(FeatureToReferenceConverter .getInstance());
register(FeatureCollectionToReferenceConverter .getInstance());
register(FeatureTypeToReferenceConverter .getInstance());
register(GeometryToReferenceConverter .getInstance());
register(RenderedImageToReferenceConverter .getInstance());
register(StringToReferenceConverter .getInstance());
register(NumberToReferenceConverter .getInstance());
register(BooleanToReferenceConverter .getInstance());
register(FileToReferenceConverter .getInstance());
register(GeometryArrayToReferenceConverter .getInstance());
register(StyledLayerDescriptorToReferenceConverter .getInstance());
register(UrlToReferenceConverter .getInstance());
register(UrlConnectionToReferenceConverter .getInstance());
//String -> Object converters
register(new WPSObjectConverterAdapter(ObjectConverters.find(String.class, Unit.class)));
register(new WPSObjectConverterAdapter(new StringToCRSConverter()));
register(new WPSObjectConverterAdapter(new StringToFilterConverter()));
register(new WPSObjectConverterAdapter(StringToSortByConverter.getInstance()));
register(new WPSObjectConverterAdapter(StringToNumberRangeConverter.getInstance()));
register(new WPSObjectConverterAdapter(new StringToDateConverter()));
register(new WPSObjectConverterAdapter(new StringToDoubleArrayConverter()));
register(new WPSObjectConverterAdapter(new StringToFloatArrayConverter()));
register(new WPSObjectConverterAdapter(new StringToIntegerArrayConverter()));
register(new WPSObjectConverterAdapter(new StringToDoubleWArrayConverter()));
register(new WPSObjectConverterAdapter(new StringToFloatWArrayConverter()));
register(new WPSObjectConverterAdapter(new StringToIntegerWArrayConverter()));
register(new WPSObjectConverterAdapter(new StringToMapConverter()));
// Object -> String converters
register(new WPSObjectConverterAdapter(new DoubleArrayToStringConverter()));
register(new WPSObjectConverterAdapter(new IntegerArrayToStringConverter()));
register(new WPSObjectConverterAdapter(new FloatArrayToStringConverter()));
register(new WPSObjectConverterAdapter(new DoubleWArrayToStringConverter()));
register(new WPSObjectConverterAdapter(new IntegerWArrayToStringConverter()));
register(new WPSObjectConverterAdapter(new FloatWArrayToStringConverter()));
register(new WPSObjectConverterAdapter(new MapToStringConverter()));
}
public static synchronized WPSConverterRegistry getInstance(){
if (INSTANCE == null) {
INSTANCE = new WPSConverterRegistry();
}
return INSTANCE;
}
private void register(final WPSObjectConverter converter) {
if (converter != null) {
converters.add(converter);
}
}
/**
* Search the most suitable converter registered with a source and target class.
*
* @param source
* @param target
* @return
* @throws UnconvertibleObjectException in case of no converter found.
*/
public WPSObjectConverter getConverter(final Class source, final Class target) throws UnconvertibleObjectException {
ArgumentChecks.ensureNonNull("source", source);
ArgumentChecks.ensureNonNull("target", target);
for (final WPSObjectConverter converter : converters) {
if (converter.getSourceClass().isAssignableFrom(source) && converter.getTargetClass().isAssignableFrom(target)) {
return converter;
}
}
throw new UnconvertibleObjectException("No converter found.");
}
/**
* Return all converter that match a possible target class used by WPS INPUT.
* e.g. : {@link BoundingBox}, {@link ComplexDataType}, {@link ReferenceType}, {@link String}
*
* @param target
* @return all input converter for the source class.
*/
public List<WPSObjectConverter> getInputConvertersFoTargetClass (final Class target) {
final List<WPSObjectConverter> inputConverters = new ArrayList<>();
for (final WPSObjectConverter converter : converters) {
if (converter.getTargetClass().isAssignableFrom(target)) {
final Class sourceClass = converter.getSourceClass();
if (BoundingBox.class.isAssignableFrom(sourceClass) || ComplexDataType.class.isAssignableFrom(sourceClass)
|| Reference.class.isAssignableFrom(sourceClass) || String.class.isAssignableFrom(sourceClass)) {
inputConverters.add(converter);
}
}
}
return inputConverters;
}
/**
* Return all converter that match a possible source class used by WPS OUPTUT.
* e.g. : {@link BoundingBox}, {@link ComplexDataType}, {@link Reference}, {@link String}
*
* @param source
* @return all input converter for the source class.
*/
public List<WPSObjectConverter> getOutputConvertersForSourceClass (final Class source) {
final List<WPSObjectConverter> inputConverters = new ArrayList<>();
for (final WPSObjectConverter converter : converters) {
if (converter.getSourceClass().isAssignableFrom(source)) {
final Class targetClass = converter.getTargetClass();
if (BoundingBox.class.isAssignableFrom(targetClass) || ComplexDataType.class.isAssignableFrom(targetClass)
|| Reference.class.isAssignableFrom(targetClass) || String.class.isAssignableFrom(targetClass)) {
inputConverters.add(converter);
}
}
}
return inputConverters;
}
}