/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2008 - 2009, 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.sml.xml;
import java.util.ArrayList;
import java.util.List;
import org.geotoolkit.sml.xml.v100.AbstractProcessType;
import org.geotoolkit.sml.xml.v100.Capabilities;
import org.geotoolkit.sml.xml.v100.Characteristics;
import org.geotoolkit.sml.xml.v100.Classification;
import org.geotoolkit.sml.xml.v100.ComponentType;
import org.geotoolkit.sml.xml.v100.Contact;
import org.geotoolkit.sml.xml.v100.DataSourceType;
import org.geotoolkit.sml.xml.v100.Documentation;
import org.geotoolkit.sml.xml.v100.History;
import org.geotoolkit.sml.xml.v100.Identification;
import org.geotoolkit.sml.xml.v100.Keywords;
import org.geotoolkit.sml.xml.v100.LegalConstraint;
import org.geotoolkit.sml.xml.v100.Member;
import org.geotoolkit.sml.xml.v100.ProcessChainType;
import org.geotoolkit.sml.xml.v100.ProcessModelType;
import org.geotoolkit.sml.xml.v100.SystemType;
import org.geotoolkit.swe.xml.Position;
import org.geotoolkit.swe.xml.Quantity;
import org.geotoolkit.swe.xml.SimpleDataRecord;
/**
* An object factory allowing to create SensorML object from different version.
*
* @author Guilhem Legal (Geomatys)
* @module
*/
public class SmlFactory {
/**
* The current SensorML version of the factory.
*/
private String version;
/**
* build a new factory to build SensorML object from the specified version.
*
* @param version The sensorML version.
*/
public SmlFactory(final String version) {
this.version = version;
}
/**
* Build a IoComponent in the factory version.
*
* @param name
* @param quantity
* @return
*/
public IoComponent createIoComponent(final String name, final Quantity quantity) {
if ("1.0.0".equals(version)) {
if (quantity != null && !(quantity instanceof org.geotoolkit.swe.xml.v100.QuantityType)) {
throw new IllegalArgumentException("Unexpected SWE version for quantity object.");
}
return new org.geotoolkit.sml.xml.v100.IoComponentPropertyType(name,
(org.geotoolkit.swe.xml.v100.QuantityType)quantity);
} else if ("1.0.1".equals(version)) {
if (quantity != null && !(quantity instanceof org.geotoolkit.swe.xml.v101.QuantityType)) {
throw new IllegalArgumentException("Unexpected SWE version for quantity object.");
}
return new org.geotoolkit.sml.xml.v101.IoComponentPropertyType(name,
(org.geotoolkit.swe.xml.v101.QuantityType)quantity);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a IoComponent in the factory version.
*
* @param name
* @param quantity
* @return
*/
public IoComponent createIoComponent(final String name, final SimpleDataRecord record) {
if ("1.0.0".equals(version)) {
if (record != null && !(record instanceof org.geotoolkit.swe.xml.v100.SimpleDataRecordType)) {
throw new IllegalArgumentException("Unexpected SWE version for record object.");
}
return new org.geotoolkit.sml.xml.v100.IoComponentPropertyType(name,
(org.geotoolkit.swe.xml.v100.SimpleDataRecordType)record);
} else if ("1.0.1".equals(version)) {
if (record != null && !(record instanceof org.geotoolkit.swe.xml.v101.SimpleDataRecordType)) {
throw new IllegalArgumentException("Unexpected SWE version for record object.");
}
return new org.geotoolkit.sml.xml.v101.IoComponentPropertyType(name,
(org.geotoolkit.swe.xml.v101.SimpleDataRecordType)record);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a Inputs in the factory version.
*
* @param name
* @param quantity
* @return
*/
public AbstractInputs createInputs(final List<? extends IoComponent> inputList) {
if ("1.0.0".equals(version)) {
if (inputList == null) {
throw new IllegalArgumentException("Unexpected SWE version for inputList object.");
}
return new org.geotoolkit.sml.xml.v100.Inputs((List<org.geotoolkit.sml.xml.v100.IoComponentPropertyType>)inputList);
} else if ("1.0.1".equals(version)) {
if (inputList == null) {
throw new IllegalArgumentException("Unexpected SWE version for imputList object.");
}
return new org.geotoolkit.sml.xml.v101.Inputs((List<org.geotoolkit.sml.xml.v101.IoComponentPropertyType>)inputList);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a Inputs in the factory version.
*
* @param name
* @param quantity
* @return
*/
public AbstractOutputs createOutputs(final List<? extends IoComponent> outputList) {
if ("1.0.0".equals(version)) {
if (outputList == null) {
throw new IllegalArgumentException("Unexpected SWE version for outputList object.");
}
return new org.geotoolkit.sml.xml.v100.Outputs((List<org.geotoolkit.sml.xml.v100.IoComponentPropertyType>)outputList);
} else if ("1.0.1".equals(version)) {
if (outputList == null) {
throw new IllegalArgumentException("Unexpected SWE version for outputList object.");
}
return new org.geotoolkit.sml.xml.v101.Outputs((List<org.geotoolkit.sml.xml.v101.IoComponentPropertyType>)outputList);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a Inputs in the factory version.
*
* @param name
* @param quantity
* @return
*/
public AbstractPosition createPosition(final String name, final Position position) {
if ("1.0.0".equals(version)) {
if (position != null && !(position instanceof org.geotoolkit.swe.xml.v100.PositionType)) {
throw new IllegalArgumentException("Unexpected SWE version for position object.");
}
return new org.geotoolkit.sml.xml.v100.Position(name, (org.geotoolkit.swe.xml.v100.PositionType) position);
} else if ("1.0.1".equals(version)) {
if (position != null && !(position instanceof org.geotoolkit.swe.xml.v101.PositionType)) {
throw new IllegalArgumentException("Unexpected SWE version for position object.");
}
return new org.geotoolkit.sml.xml.v101.Position(name, (org.geotoolkit.swe.xml.v101.PositionType) position);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a Inputs in the factory version.
*
* @param name
* @param quantity
* @return
*/
public AbstractPositions createPositions(final String id , final List<? extends AbstractPosition> positions) {
if ("1.0.0".equals(version)) {
return new org.geotoolkit.sml.xml.v100.Positions(id, (List<org.geotoolkit.sml.xml.v100.Position>) positions);
} else if ("1.0.1".equals(version)) {
return new org.geotoolkit.sml.xml.v101.Positions(id, (List<org.geotoolkit.sml.xml.v101.Position>) positions);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a ValidTime in the factory version.
*
*/
public AbstractValidTime createValidTime(final String begin, final String end) {
if ("1.0.0".equals(version)) {
return new org.geotoolkit.sml.xml.v100.ValidTime(begin, end);
} else if ("1.0.1".equals(version)) {
return new org.geotoolkit.sml.xml.v101.ValidTime(begin, end);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a ValidTime in the factory version.
*
*/
public ComponentProperty createComponentProperty(final String href) {
if ("1.0.0".equals(version)) {
return new org.geotoolkit.sml.xml.v100.ComponentPropertyType(href);
} else if ("1.0.1".equals(version)) {
return new org.geotoolkit.sml.xml.v101.ComponentPropertyType(href);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
/**
* Build a Inputs in the factory version.
*
* @param name
* @param quantity
* @return
*/
public AbstractComponents createComponents(final List<? extends ComponentProperty> components) {
if ("1.0.0".equals(version)) {
return new org.geotoolkit.sml.xml.v100.Components((List<org.geotoolkit.sml.xml.v100.ComponentPropertyType>) components);
} else if ("1.0.1".equals(version)) {
return new org.geotoolkit.sml.xml.v101.Components((List<org.geotoolkit.sml.xml.v101.ComponentPropertyType>) components);
} else {
throw new IllegalArgumentException("Unexpected SML version:" + version);
}
}
public static org.geotoolkit.sml.xml.v101.SensorML convertTo101(final org.geotoolkit.sml.xml.v100.SensorML sensor) {
List<org.geotoolkit.sml.xml.v101.SensorML.Member> newMembers = new ArrayList<org.geotoolkit.sml.xml.v101.SensorML.Member>();
for (Member oldMember : sensor.getMember()) {
final org.geotoolkit.sml.xml.v101.AbstractProcessType newProcess;
if (oldMember.getRealProcess() instanceof System) {
newProcess = new org.geotoolkit.sml.xml.v101.SystemType();
} else if (oldMember.getRealProcess() instanceof Component) {
newProcess = new org.geotoolkit.sml.xml.v101.ComponentType();
} else if (oldMember.getRealProcess() instanceof AbstractDataSource) {
newProcess = new org.geotoolkit.sml.xml.v101.DataSourceType();
} else if (oldMember.getRealProcess() instanceof AbstractProcessModel) {
newProcess = new org.geotoolkit.sml.xml.v101.ProcessModelType();
} else if (oldMember.getRealProcess() instanceof ComponentArray) {
newProcess = new org.geotoolkit.sml.xml.v101.ComponentArrayType();
} else {
throw new IllegalArgumentException("Other sensor type than system, component, processModel, processChain, componentArray or datasource are not yet convertible");
}
AbstractProcessType oldProcess = (AbstractProcessType) oldMember.getRealProcess();
// id
newProcess.setId(oldProcess.getId());
final String oldProcName = (oldProcess.getName() != null) ? oldProcess.getName().getCode() : "";
// name
newProcess.setName(oldProcName);
// srsName
newProcess.setSrsName(oldProcess.getSrsName());
// description
newProcess.setDescription(oldProcess.getDescription());
//boundedBy
newProcess.setBoundedBy(oldProcess.getBoundedBy());
//capabilities
List<org.geotoolkit.sml.xml.v101.Capabilities> newCapabilities = new ArrayList<org.geotoolkit.sml.xml.v101.Capabilities>();
for (Capabilities oldCapa : oldProcess.getCapabilities()) {
newCapabilities.add(new org.geotoolkit.sml.xml.v101.Capabilities(oldCapa));
}
newProcess.setCapabilities(newCapabilities);
// characteristics
List<org.geotoolkit.sml.xml.v101.Characteristics> newCharacteristics = new ArrayList<org.geotoolkit.sml.xml.v101.Characteristics>();
for (Characteristics oldChar : oldProcess.getCharacteristics()) {
newCharacteristics.add(new org.geotoolkit.sml.xml.v101.Characteristics(oldChar));
}
newProcess.setCharacteristics(newCharacteristics);
// Classification
List<org.geotoolkit.sml.xml.v101.Classification> newClassification = new ArrayList<org.geotoolkit.sml.xml.v101.Classification>();
for (Classification oldClass : oldProcess.getClassification()) {
newClassification.add(new org.geotoolkit.sml.xml.v101.Classification(oldClass));
}
newProcess.setClassification(newClassification);
// Contact
List<org.geotoolkit.sml.xml.v101.Contact> newContact = new ArrayList<org.geotoolkit.sml.xml.v101.Contact>();
for (Contact oldContact : oldProcess.getContact()) {
newContact.add(new org.geotoolkit.sml.xml.v101.Contact(oldContact));
}
newProcess.setContact(newContact);
// Contact
List<org.geotoolkit.sml.xml.v101.Documentation> newDocumentation = new ArrayList<org.geotoolkit.sml.xml.v101.Documentation>();
for (Documentation oldDoc : oldProcess.getDocumentation()) {
newDocumentation.add(new org.geotoolkit.sml.xml.v101.Documentation(oldDoc));
}
newProcess.setDocumentation(newDocumentation);
// History
List<org.geotoolkit.sml.xml.v101.History> newHistory = new ArrayList<org.geotoolkit.sml.xml.v101.History>();
for (History oldhist : oldProcess.getHistory()) {
newHistory.add(new org.geotoolkit.sml.xml.v101.History(oldhist));
}
newProcess.setHistory(newHistory);
// Identification
List<org.geotoolkit.sml.xml.v101.Identification> newIdentification = new ArrayList<org.geotoolkit.sml.xml.v101.Identification>();
for (Identification oldIdent : oldProcess.getIdentification()) {
newIdentification.add(new org.geotoolkit.sml.xml.v101.Identification(oldIdent));
}
newProcess.setIdentification(newIdentification);
// keywords
List<org.geotoolkit.sml.xml.v101.Keywords> newKeywords = new ArrayList<org.geotoolkit.sml.xml.v101.Keywords>();
for (Keywords oldKeyw : oldProcess.getKeywords()) {
newKeywords.add(new org.geotoolkit.sml.xml.v101.Keywords(oldKeyw));
}
newProcess.setKeywords(newKeywords);
// legal constraint
List<org.geotoolkit.sml.xml.v101.LegalConstraint> newLegalConstraints = new ArrayList<org.geotoolkit.sml.xml.v101.LegalConstraint>();
for (LegalConstraint oldcons : oldProcess.getLegalConstraint()) {
newLegalConstraints.add(new org.geotoolkit.sml.xml.v101.LegalConstraint(oldcons));
}
newProcess.setLegalConstraint(newLegalConstraints);
// security constraint
if (oldProcess.getSecurityConstraint() != null) {
newProcess.setSecurityConstraint(new org.geotoolkit.sml.xml.v101.SecurityConstraint(oldProcess.getSecurityConstraint()));
}
// validTime
if (oldProcess.getValidTime() != null) {
newProcess.setValidTime(oldProcess.getValidTime());
}
if (oldProcess instanceof AbstractComponent) {
AbstractComponent newAbsComponent = (AbstractComponent) newProcess;
AbstractComponent oldAbsComponent = (AbstractComponent) oldProcess;
//Inputs
if (oldAbsComponent.getInputs() != null) {
newAbsComponent.setInputs(oldAbsComponent.getInputs());
}
// outputs
if (oldAbsComponent.getOutputs() != null) {
newAbsComponent.setOutputs(oldAbsComponent.getOutputs());
}
// parameters
if (oldAbsComponent.getParameters() != null) {
newAbsComponent.setParameters(oldAbsComponent.getParameters());
}
}
if (oldProcess instanceof AbstractDerivableComponent) {
org.geotoolkit.sml.xml.v101.AbstractDerivableComponentType newDerComponent = (org.geotoolkit.sml.xml.v101.AbstractDerivableComponentType) newProcess;
AbstractDerivableComponent oldDerComponent = (AbstractDerivableComponent) oldProcess;
// Position
if (oldDerComponent.getPosition() != null) {
newDerComponent.setPosition(oldDerComponent.getPosition());
}
if (oldDerComponent.getSMLLocation() != null) {
newDerComponent.setSMLLocation(oldDerComponent.getSMLLocation());
}
if (oldDerComponent.getInterfaces() != null) {
newDerComponent.setInterfaces(new org.geotoolkit.sml.xml.v101.Interfaces(oldDerComponent.getInterfaces()));
}
if (oldDerComponent.getSpatialReferenceFrame() != null) {
newDerComponent.setSpatialReferenceFrame(new org.geotoolkit.sml.xml.v101.SpatialReferenceFrame(oldDerComponent.getSpatialReferenceFrame()));
}
if (oldDerComponent.getTemporalReferenceFrame() != null) {
newDerComponent.setTemporalReferenceFrame(new org.geotoolkit.sml.xml.v101.TemporalReferenceFrame(oldDerComponent.getTemporalReferenceFrame()));
}
if (oldDerComponent.getTimePosition() != null) {
newDerComponent.setTimePosition(new org.geotoolkit.sml.xml.v101.TimePosition(oldDerComponent.getTimePosition()));
}
}
if (oldProcess instanceof AbstractPureProcess) {
org.geotoolkit.sml.xml.v101.AbstractPureProcessType newAbsPuProc = (org.geotoolkit.sml.xml.v101.AbstractPureProcessType) newProcess;
AbstractPureProcess oldAbsPuProc = (AbstractPureProcess) oldProcess;
//Inputs
if (oldAbsPuProc.getInputs() != null) {
newAbsPuProc.setInputs(new org.geotoolkit.sml.xml.v101.Inputs(oldAbsPuProc.getInputs()));
}
// outputs
if (oldAbsPuProc.getOutputs() != null) {
newAbsPuProc.setOutputs(new org.geotoolkit.sml.xml.v101.Outputs(oldAbsPuProc.getOutputs()));
}
// parameters
if (oldAbsPuProc.getParameters() != null) {
newAbsPuProc.setParameters(new org.geotoolkit.sml.xml.v101.Parameters(oldAbsPuProc.getParameters()));
}
}
if (oldMember.getRealProcess() instanceof System) {
SystemType oldSystem = (SystemType) oldMember.getRealProcess();
org.geotoolkit.sml.xml.v101.SystemType newSystem = (org.geotoolkit.sml.xml.v101.SystemType) newProcess;
// components
if (oldSystem.getComponents() != null) {
newSystem.setComponents(new org.geotoolkit.sml.xml.v101.Components(oldSystem.getComponents()));
}
// positions
if (oldSystem.getPositions() != null) {
newSystem.setPositions(new org.geotoolkit.sml.xml.v101.Positions(oldSystem.getPositions()));
}
// connections
if (oldSystem.getConnections() != null) {
newSystem.setConnections(new org.geotoolkit.sml.xml.v101.Connections(oldSystem.getConnections()));
}
} else if (oldMember.getRealProcess() instanceof Component) {
ComponentType oldComponent = (ComponentType) oldMember.getRealProcess();
org.geotoolkit.sml.xml.v101.ComponentType newCompo = (org.geotoolkit.sml.xml.v101.ComponentType) newProcess;
// method
if (oldComponent.getMethod() != null) {
newCompo.setMethod(new org.geotoolkit.sml.xml.v101.MethodPropertyType(oldComponent.getMethod()));
}
} else if (oldMember.getRealProcess() instanceof AbstractDataSource) {
DataSourceType oldDataSource = (DataSourceType) oldMember.getRealProcess();
org.geotoolkit.sml.xml.v101.DataSourceType newDataSource = (org.geotoolkit.sml.xml.v101.DataSourceType) newProcess;
if (oldDataSource.getDataDefinition() != null) {
newDataSource.setDataDefinition(new org.geotoolkit.sml.xml.v101.DataDefinition(oldDataSource.getDataDefinition()));
}
if (oldDataSource.getValues() != null) {
newDataSource.setValues(new org.geotoolkit.sml.xml.v101.Values(oldDataSource.getValues()));
}
if (oldDataSource.getObservationReference() != null) {
newDataSource.setObservationReference(new org.geotoolkit.sml.xml.v101.ObservationReference(oldDataSource.getObservationReference()));
}
} else if (oldMember.getRealProcess() instanceof AbstractProcessModel) {
ProcessModelType oldProcessModel = (ProcessModelType) oldMember.getRealProcess();
org.geotoolkit.sml.xml.v101.ProcessModelType newProcessModel = (org.geotoolkit.sml.xml.v101.ProcessModelType) newProcess;
if (oldProcessModel.getMethod() != null) {
newProcessModel.setMethod(new org.geotoolkit.sml.xml.v101.MethodPropertyType(oldProcessModel.getMethod()));
}
} else if (oldMember.getRealProcess() instanceof AbstractProcessChain) {
ProcessChainType oldProcessChain = (ProcessChainType) oldMember.getRealProcess();
org.geotoolkit.sml.xml.v101.ProcessChainType newProcessChain = (org.geotoolkit.sml.xml.v101.ProcessChainType) newProcess;
// components
if (oldProcessChain.getComponents() != null) {
newProcessChain.setComponents(new org.geotoolkit.sml.xml.v101.Components(oldProcessChain.getComponents()));
}
// connections
if (oldProcessChain.getConnections() != null) {
newProcessChain.setConnections(new org.geotoolkit.sml.xml.v101.Connections(oldProcessChain.getConnections()));
}
} else if (oldMember.getRealProcess() instanceof ComponentArray) {
// nothing to do
} else {
throw new IllegalArgumentException("Other sensor type than system ,component, processModel, processChain, componentArray or datasource are not yet convertible");
}
newMembers.add(new org.geotoolkit.sml.xml.v101.SensorML.Member(newProcess));
}
org.geotoolkit.sml.xml.v101.SensorML result = new org.geotoolkit.sml.xml.v101.SensorML("1.0.1", newMembers);
return result;
}
}