diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..94afd65cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/wpsg-xml/target/ +/52n-wps-io/target/ +/52n-wps-server/target/ +/52n-wps-webapp/target/ \ No newline at end of file diff --git a/52n-wps-ags/.gitignore b/52n-wps-ags/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-ags/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-ags/.settings/org.eclipse.core.resources.prefs b/52n-wps-ags/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-ags/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-ags/.settings/org.eclipse.jdt.core.prefs b/52n-wps-ags/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-ags/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-ags/.settings/org.eclipse.m2e.core.prefs b/52n-wps-ags/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-ags/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-ags/.settings/org.eclipse.wst.common.component b/52n-wps-ags/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..0d230fe79 --- /dev/null +++ b/52n-wps-ags/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-ags/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-ags/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-ags/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-ags/.settings/org.eclipse.wst.validation.prefs b/52n-wps-ags/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-ags/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-ags/pom.xml b/52n-wps-ags/pom.xml index 4a42cf237..a4158945a 100644 --- a/52n-wps-ags/pom.xml +++ b/52n-wps-ags/pom.xml @@ -61,6 +61,16 @@ org.n52.wps 52n-wps-server ${project.version} + + + servlet-api + javax.servlet + + + servlet-api-2.5 + org.mortbay.jetty + + diff --git a/52n-wps-client-lib/.gitignore b/52n-wps-client-lib/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-client-lib/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-client-lib/.settings/org.eclipse.core.resources.prefs b/52n-wps-client-lib/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-client-lib/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-client-lib/.settings/org.eclipse.jdt.core.prefs b/52n-wps-client-lib/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..60105c1b9 --- /dev/null +++ b/52n-wps-client-lib/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-client-lib/.settings/org.eclipse.m2e.core.prefs b/52n-wps-client-lib/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-client-lib/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-client-lib/pom.xml b/52n-wps-client-lib/pom.xml index 8838b5942..64cc90e50 100644 --- a/52n-wps-client-lib/pom.xml +++ b/52n-wps-client-lib/pom.xml @@ -41,7 +41,7 @@ be.spacebel.wps wpsg-xml - 1.0.0 + 2.0.3 diff --git a/52n-wps-commons/.gitignore b/52n-wps-commons/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-commons/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-commons/.settings/org.eclipse.core.resources.prefs b/52n-wps-commons/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-commons/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-commons/.settings/org.eclipse.jdt.core.prefs b/52n-wps-commons/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-commons/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-commons/.settings/org.eclipse.m2e.core.prefs b/52n-wps-commons/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-commons/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-commons/.settings/org.eclipse.wst.common.component b/52n-wps-commons/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..ee871acab --- /dev/null +++ b/52n-wps-commons/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-commons/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-commons/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-commons/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-commons/.settings/org.eclipse.wst.validation.prefs b/52n-wps-commons/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-commons/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-grass/.gitignore b/52n-wps-grass/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-grass/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-grass/.settings/org.eclipse.core.resources.prefs b/52n-wps-grass/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-grass/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-grass/.settings/org.eclipse.jdt.core.prefs b/52n-wps-grass/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-grass/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-grass/.settings/org.eclipse.m2e.core.prefs b/52n-wps-grass/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-grass/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-grass/.settings/org.eclipse.wst.common.component b/52n-wps-grass/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..49125cf5c --- /dev/null +++ b/52n-wps-grass/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-grass/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-grass/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-grass/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-grass/.settings/org.eclipse.wst.validation.prefs b/52n-wps-grass/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-grass/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-grass/pom.xml b/52n-wps-grass/pom.xml index bdd6ff1fb..45156e27e 100644 --- a/52n-wps-grass/pom.xml +++ b/52n-wps-grass/pom.xml @@ -57,7 +57,7 @@ be.spacebel.wps wpsg-xml - 1.0.0 + 2.0.3 tomcat @@ -100,45 +100,6 @@ axiom-api 1.2.8 - - org.apache.rampart - rampart-policy - 1.4 - - - xmlbeans - xbean - - - org.apache.ant - ant-nodeps - - - opensaml - opensaml - - - - - org.apache.rampart - rampart-core - 1.4 - - - xmlbeans - xbean - - - opensaml - opensaml - - - org.apache.ant - ant-nodeps - - - - xerces xercesImpl diff --git a/52n-wps-gridgain/pom.xml b/52n-wps-gridgain/pom.xml deleted file mode 100644 index b0cea9673..000000000 --- a/52n-wps-gridgain/pom.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - org.n52.wps - 52n-wps-parent - 2.0-RC8-SNAPSHOT - - 4.0.0 - 52n-wps-gridgain - 52north 52n-wps-gridgain - The project 52 north 52n-wps-grid does something with - JAVA. - - - gridgain-site - http://www.gridgainsystems.com/maven2 - - - - - - - - - ${project.groupId} - 52n-wps-commons - - - ${project.groupId} - 52n-wps-io - - - ${project.groupId} - 52n-wps-server - - - ${project.groupId} - 52n-wps-unicore - ${project.version} - - - be.spacebel.wps - wpsg-xml - 1.0.0 - - - - - - org.gridgain - gridgain - 2.1.1 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - \ No newline at end of file diff --git a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/AbstractGridGainAlgorithm.java b/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/AbstractGridGainAlgorithm.java deleted file mode 100644 index 601baaf12..000000000 --- a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/AbstractGridGainAlgorithm.java +++ /dev/null @@ -1,83 +0,0 @@ - -package org.n52.wps.gridgain; - -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; -import org.gridgain.grid.Grid; -import org.gridgain.grid.GridException; -import org.gridgain.grid.GridFactory; -import org.gridgain.grid.GridTaskFuture; -import org.n52.wps.gridgain.client.GridGainTask; -import org.n52.wps.io.data.IData; -import org.n52.wps.server.AbstractObservableAlgorithm; -import org.n52.wps.server.IAlgorithm; -import org.n52.wps.unicore.UnicoreAlgorithmInput; -import org.n52.wps.unicore.UnicoreAlgorithmOutput; - -public abstract class AbstractGridGainAlgorithm extends AbstractObservableAlgorithm implements IGridGainAlgorithm -{ - private static Logger LOGGER = Logger.getLogger(AbstractGridGainAlgorithm.class); - - protected IAlgorithm embeddedAlgorithm; - - public IAlgorithm getEmbeddedAlgorithm() - { - return embeddedAlgorithm; - } - - public AbstractGridGainAlgorithm(IAlgorithm pEmbeddedAlgorithm) - { - super(); - this.embeddedAlgorithm = pEmbeddedAlgorithm; - } - - public AbstractGridGainAlgorithm(String wellKnownName, IAlgorithm pEmbeddedAlgorithm) - { - super(wellKnownName); - this.embeddedAlgorithm = pEmbeddedAlgorithm; - } - - public List getErrors() - { - return embeddedAlgorithm.getErrors(); - } - - public Class getInputDataType(String id) - { - return embeddedAlgorithm.getInputDataType(id); - } - - public Class getOutputDataType(String id) - { - return embeddedAlgorithm.getOutputDataType(id); - } - - public Map run(Map> pInputData) - { - UnicoreAlgorithmOutput algorithmOutput; - - try - { - UnicoreAlgorithmInput algorithmInput = new UnicoreAlgorithmInput(pInputData, embeddedAlgorithm.getDescription().getIdentifier().getStringValue()); - - GridFactory.start(); - Grid grid = GridFactory.getGrid(); - GridTaskFuture future = grid.execute(GridGainTask.class, algorithmInput); - - algorithmOutput = future.get(); - } - catch (GridException e) - { - LOGGER.error(e); - throw new RuntimeException(e); - } - finally - { - GridFactory.stop(true); - } - - return algorithmOutput.getData(); - } -} diff --git a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/GridGainAlgorithmRepository.java b/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/GridGainAlgorithmRepository.java deleted file mode 100644 index f12a841ca..000000000 --- a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/GridGainAlgorithmRepository.java +++ /dev/null @@ -1,272 +0,0 @@ - -package org.n52.wps.gridgain; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.opengis.wps.x100.ProcessDescriptionType; - -import org.apache.log4j.Logger; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.IAlgorithm; -import org.n52.wps.server.repository.IAlgorithmRepository; -import org.n52.wps.server.request.ExecuteRequest; -import org.n52.wps.unicore.IUnicoreAlgorithm; -import org.n52.wps.unicore.UnicoreAlgorithmRepository; - -public class GridGainAlgorithmRepository implements IAlgorithmRepository -{ - private static Logger LOGGER = Logger.getLogger(GridGainAlgorithmRepository.class); - -// public static String CFG_REGISTRY = "Registry"; -// public static String CFG_KEYSTORE = "Keystore"; -// public static String CFG_ALIAS = "Alias"; -// public static String CFG_PASSWORD = "Password"; -// public static String CFG_TYPE = "Type"; -// -// public static String CFG_OVERWRITE = "OverwriteRemoteFile"; -// public static String CFG_COMPRESSION = "CompressInputData"; - - private static GridGainAlgorithmRepository instance; - - private Map processDescriptionMap; -// private Properties unicoreProperties; - - public GridGainAlgorithmRepository() - { - processDescriptionMap = new HashMap(); - - if(WPSConfig.getInstance().isRepositoryActive(this.getClass().getCanonicalName())){ - Property[] propertyArray = WPSConfig.getInstance().getPropertiesForRepositoryClass(this.getClass().getCanonicalName()); - for(Property property : propertyArray){ - if(property.getName().equalsIgnoreCase("Algorithm") && property.getActive()){ - addAlgorithm(property.getStringValue()); - } - } - } else { - LOGGER.debug("Local Algorithm Repository is inactive."); - } - } - - public GridGainAlgorithmRepository(String wpsConfigPath) - { - processDescriptionMap = new HashMap(); - - Property[] propertyArray = WPSConfig.getInstance(wpsConfigPath).getPropertiesForRepositoryClass(this.getClass().getCanonicalName()); - -// unicoreProperties = createUnicoreProperties(propertyArray); - - for (Property property : propertyArray) - { - if (property.getName().equalsIgnoreCase("Algorithm")) - { - addAlgorithm(property.getStringValue()); - } - } - } - -// private Properties createUnicoreProperties(Property[] propertyArray) -// { -// Properties result = new Properties(); -// -// for (Property property : propertyArray) -// { -// if (property.getName().equalsIgnoreCase(CFG_REGISTRY)) -// { -// result.setProperty(CFG_REGISTRY, property.getStringValue()); -// } -// else if (property.getName().equalsIgnoreCase(CFG_KEYSTORE)) -// { -// result.setProperty(CFG_KEYSTORE, property.getStringValue()); -// } -// else if (property.getName().equalsIgnoreCase(CFG_ALIAS)) -// { -// result.setProperty(CFG_ALIAS, property.getStringValue()); -// } -// else if (property.getName().equalsIgnoreCase(CFG_PASSWORD)) -// { -// result.setProperty(CFG_PASSWORD, property.getStringValue()); -// } -// else if (property.getName().equalsIgnoreCase(CFG_TYPE)) -// { -// result.setProperty(CFG_TYPE, property.getStringValue()); -// } -// else if (property.getName().equalsIgnoreCase(CFG_OVERWRITE)) -// { -// result.setProperty(CFG_OVERWRITE, property.getStringValue()); -// } -// else if (property.getName().equalsIgnoreCase(CFG_COMPRESSION)) -// { -// result.setProperty(CFG_COMPRESSION, property.getStringValue()); -// } -// else -// { -// LOGGER.warn("Unsupported configuration paramter '" + property.getName() + "'."); -// } -// } -// -// return result; -// } - - public static GridGainAlgorithmRepository getInstance() - { - if (instance == null) - { - instance = new GridGainAlgorithmRepository(); - } - return instance; - } - - public static GridGainAlgorithmRepository getInstance(String wpsConfigPath) - { - if (instance == null) - { - instance = new GridGainAlgorithmRepository(wpsConfigPath); - } - return instance; - } - -// public Properties getUnicoreProperties() -// { -// return unicoreProperties; -// } - - public boolean addAlgorithm(Object processID) - { - if (!(processID instanceof String)) - { - return false; - } - - String algorithmClassName = (String) processID; - - try - { - IGridGainAlgorithm algorithm = (IGridGainAlgorithm) GridGainAlgorithmRepository.class.getClassLoader().loadClass(algorithmClassName).newInstance(); - - if (!algorithm.processDescriptionIsValid()) - { - LOGGER.warn("Algorithm description is not valid: " + algorithmClassName); - return false; - } - - processDescriptionMap.put(algorithmClassName, algorithm.getDescription()); - LOGGER.info("Algorithm class registered: " + algorithmClassName); - - if (algorithm.getWellKnownName().length() != 0) - { - processDescriptionMap.put(algorithm.getWellKnownName(), algorithm.getDescription()); - } - } - catch (ClassNotFoundException e) - { - LOGGER.warn("Could not find algorithm class: " + algorithmClassName, e); - return false; - } - catch (IllegalAccessException e) - { - LOGGER.warn("Access error occured while registering algorithm: " + algorithmClassName); - return false; - } - catch (InstantiationException e) - { - LOGGER.warn("Could not instantiate algorithm: " + algorithmClassName); - return false; - } - return true; - } - - public boolean containsAlgorithm(String processID) - { - return processDescriptionMap.containsKey(processID); - } - - public IAlgorithm getAlgorithm(String processID, ExecuteRequest executeRequest) - { - try - { - IGridGainAlgorithm algorithm = (IGridGainAlgorithm) GridGainAlgorithmRepository.class.getClassLoader().loadClass(processID).newInstance(); - - return algorithm; - } - catch (ClassNotFoundException e) - { - LOGGER.warn("Could not find algorithm class: " + processID, e); - throw new RuntimeException(e); - } - catch (IllegalAccessException e) - { - LOGGER.warn("Access error occured while registering algorithm: " + processID); - throw new RuntimeException(e); - } - catch (InstantiationException e) - { - LOGGER.warn("Could not instantiate algorithm: " + processID); - throw new RuntimeException(e); - } - - } - - public Collection getAlgorithmNames() - { - return processDescriptionMap.keySet(); - } - - public Collection getAlgorithms() - { - - List algorithmList = new ArrayList(); - for(String algorithmName : getAlgorithmNames()){ - try - { - IGridGainAlgorithm algorithm = (IGridGainAlgorithm) GridGainAlgorithmRepository.class.getClassLoader().loadClass(algorithmName).newInstance(); - - algorithmList.add(algorithm); - } - catch (ClassNotFoundException e) - { - LOGGER.warn("Could not find algorithm class: " + algorithmName, e); - throw new RuntimeException(e); - } - catch (IllegalAccessException e) - { - LOGGER.warn("Access error occured while registering algorithm: " + algorithmName); - throw new RuntimeException(e); - } - catch (InstantiationException e) - { - LOGGER.warn("Could not instantiate algorithm: " + algorithmName); - throw new RuntimeException(e); - } - } - return algorithmList; - } - - public boolean removeAlgorithm(Object processID) - { - if (!(processID instanceof String)) - { - return false; - } - String className = (String) processID; - if (processDescriptionMap.containsKey(className)) - { - processDescriptionMap.remove(className); - return true; - } - return false; - } - - public ProcessDescriptionType getProcessDescription(String processID) { - if(!processDescriptionMap.containsKey(processID)){ - processDescriptionMap.put(processID, getAlgorithm(processID, null).getDescription()); - } - return processDescriptionMap.get(processID); - } - - -} diff --git a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/IGridGainAlgorithm.java b/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/IGridGainAlgorithm.java deleted file mode 100644 index d65003992..000000000 --- a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/IGridGainAlgorithm.java +++ /dev/null @@ -1,15 +0,0 @@ - -package org.n52.wps.gridgain; - -import java.util.List; -import java.util.Map; - -import org.n52.wps.io.data.IData; -import org.n52.wps.server.IAlgorithm; - -public interface IGridGainAlgorithm extends IAlgorithm -{ - List>> split(Map> inputData); - - Map merge(List> outputData); -} diff --git a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/algorithm/GridGainSimpleBufferAlgorithm.java b/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/algorithm/GridGainSimpleBufferAlgorithm.java deleted file mode 100644 index e7014fe7a..000000000 --- a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/algorithm/GridGainSimpleBufferAlgorithm.java +++ /dev/null @@ -1,81 +0,0 @@ - -package org.n52.wps.gridgain.algorithm; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.geotools.feature.DefaultFeatureCollections; -import org.geotools.feature.FeatureCollection; -import org.n52.wps.gridgain.AbstractGridGainAlgorithm; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; - -public class GridGainSimpleBufferAlgorithm extends AbstractGridGainAlgorithm -{ - public GridGainSimpleBufferAlgorithm() - { - super(new org.n52.wps.server.algorithm.SimpleBufferAlgorithm()); - } - - public List>> split(Map> pInputData) - { - List>> result = new ArrayList>>(); - FeatureCollection featureCollection = ((GTVectorDataBinding) pInputData.get("data").get(0)).getPayload(); - FeatureCollection[] featureCollectionList = splitFeatureCollection(featureCollection, getNumberOfChunks(pInputData)); - for (FeatureCollection fc : featureCollectionList) - { - Map> chunk = new HashMap>(); - chunk.put("width", pInputData.get("width")); - List data = new ArrayList(); - data.add(new GTVectorDataBinding(fc)); - chunk.put("data", data); - result.add(chunk); - } - return result; - } - - public Map merge(List> outputData) - { - Map result = new HashMap(); - - FeatureCollection mergedFeatureCollection = DefaultFeatureCollections.newCollection(); - for (Map data : outputData) - { - FeatureCollection singleFeatureCollection = (FeatureCollection) data.get("result").getPayload(); - mergedFeatureCollection.addAll(singleFeatureCollection); - } - result.put("result", new GTVectorDataBinding(mergedFeatureCollection)); - - return result; - } - - protected int getNumberOfChunks(Map> pInputData) - { - return 3; - } - - protected FeatureCollection[] splitFeatureCollection(FeatureCollection pFeatureCollection, int pNumberOfChucks) - { - FeatureCollection[] result = new FeatureCollection[pNumberOfChucks]; - int chunkSize = (int) Math.floor((double) pFeatureCollection.size() - / (double) pNumberOfChucks); - int currentFeatureCollection = -1; - Iterator iterator = pFeatureCollection.iterator(); - for (int i = 0; i < pFeatureCollection.size(); i++) - { - if (i % chunkSize == 0 && currentFeatureCollection < (pNumberOfChucks - 1)) - { - currentFeatureCollection++; - result[currentFeatureCollection] = DefaultFeatureCollections.newCollection(); - } - result[currentFeatureCollection].add((SimpleFeature) iterator.next()); - } - return result; - } - -} diff --git a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/client/GridGainTask.java b/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/client/GridGainTask.java deleted file mode 100644 index 665574cf3..000000000 --- a/52n-wps-gridgain/src/main/java/org/n52/wps/gridgain/client/GridGainTask.java +++ /dev/null @@ -1,78 +0,0 @@ - -package org.n52.wps.gridgain.client; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.gridgain.grid.GridException; -import org.gridgain.grid.GridJob; -import org.gridgain.grid.GridJobAdapter; -import org.gridgain.grid.GridJobResult; -import org.gridgain.grid.GridTaskSplitAdapter; -import org.n52.wps.gridgain.algorithm.GridGainSimpleBufferAlgorithm; -import org.n52.wps.io.data.IData; -import org.n52.wps.unicore.UnicoreAlgorithmInput; -import org.n52.wps.unicore.UnicoreAlgorithmOutput; - -public class GridGainTask extends GridTaskSplitAdapter -{ - - @Override - protected Collection split(int gridSize, UnicoreAlgorithmInput algorithmInput) throws GridException - { - // split the input data - GridGainSimpleBufferAlgorithm algorithm = new GridGainSimpleBufferAlgorithm(); - List>> inputDataList = algorithm.split(algorithmInput.getData()); - - // convert data structure - List inputData = new ArrayList(); - for (int i = 0; i < inputDataList.size(); i++) - { - inputData.add(new UnicoreAlgorithmInput(inputDataList.get(0), algorithmInput.getEmbeddedAlgorithm())); - } - - List jobs = new ArrayList(inputData.size()); - for (UnicoreAlgorithmInput input : inputData) - { - jobs.add(new GridJobAdapter(input) - { - public Serializable execute() - { - - UnicoreAlgorithmInput input = getArgument(); - GridGainSimpleBufferAlgorithm algorithm = new GridGainSimpleBufferAlgorithm(); - Map result = algorithm.getEmbeddedAlgorithm().run(input.getData()); - UnicoreAlgorithmOutput output = new UnicoreAlgorithmOutput(result); - return output; - } - }); - - } - return jobs; - - } - - public UnicoreAlgorithmOutput reduce(List resultList) throws GridException - { - // convert data structure - List> outputData = new ArrayList>(); - - for (GridJobResult result : resultList) - { - UnicoreAlgorithmOutput output = result.getData(); - outputData.add(output.getData()); - - } - - // merge the output data - GridGainSimpleBufferAlgorithm algorithm = new GridGainSimpleBufferAlgorithm(); - UnicoreAlgorithmOutput result = new UnicoreAlgorithmOutput(algorithm.merge(outputData)); - - return result; - - } - -} diff --git a/52n-wps-gridgain/src/main/resources/org/n52/wps/gridgain/ExecuteDocument.xml b/52n-wps-gridgain/src/main/resources/org/n52/wps/gridgain/ExecuteDocument.xml deleted file mode 100644 index 4c97f1fee..000000000 --- a/52n-wps-gridgain/src/main/resources/org/n52/wps/gridgain/ExecuteDocument.xml +++ /dev/null @@ -1,22 +0,0 @@ - - org.n52.wps.gridgain.algorithm.GridGainSimpleBufferAlgorithm - - - data - - - - width - - 0.1 - - - - - - result - - - \ No newline at end of file diff --git a/52n-wps-gridgain/src/main/resources/org/n52/wps/gridgain/algorithm/GridGainSimpleBufferAlgorithm.xml b/52n-wps-gridgain/src/main/resources/org/n52/wps/gridgain/algorithm/GridGainSimpleBufferAlgorithm.xml deleted file mode 100644 index 2cc8e0ae7..000000000 --- a/52n-wps-gridgain/src/main/resources/org/n52/wps/gridgain/algorithm/GridGainSimpleBufferAlgorithm.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - org.n52.wps.gridgain.algorithm.GridGainSimpleBufferAlgorithm - Create a buffer around a polygon. - Create a buffer around a single polygon. Accepts the polygon as GML and provides GML output for the buffered feature. - - - - - - - data - Polygon to be buffered - The Geometries to buffer - - - - text/XML - http://geoserver.itc.nl:8080/wps/schemas/gml/2.1.2/gmlpacket.xsd - - - - - text/XML - http://schemas.opengis.net/gml/2.1.2/feature.xsd - - - - - - - width - Buffer Distance - URI to a GML resource file - - - - - - - - - - - result - Buffered Polygon - GML stream describing the buffered polygon feature. - - - - - text/XML - http://geoserver.itc.nl:8080/wps/schemas/gml/2.1.2/gmlpacket.xsd - - - - - text/XML - http://schemas.opengis.net/gml/2.1.2/feature.xsd - - - - - - - diff --git a/52n-wps-gridgain/src/test/java/org/n52/wps/gridgain/ExecuteTest.java b/52n-wps-gridgain/src/test/java/org/n52/wps/gridgain/ExecuteTest.java deleted file mode 100644 index 9fb43d24f..000000000 --- a/52n-wps-gridgain/src/test/java/org/n52/wps/gridgain/ExecuteTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2008 - * by 52 North Initiative for Geospatial Open Source Software GmbH - * - * Contact: Andreas Wytzisk - * 52 North Initiative for Geospatial Open Source Software GmbH - * Martin-Luther-King-Weg 24 - * 48155 Muenster, Germany - * info@52north.org - * - * This program is free software; you can redistribute and/or modify it under - * the terms of the GNU General Public License version 2 as published by the - * Free Software Foundation. - * - * This program is distributed WITHOUT ANY WARRANTY; even without the implied - * WARRANTY OF MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * this program (see gnu-gpl v2.txt). If not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA or - * visit the Free Software Foundation web page, http://www.fsf.org. - * - * Author: Bastian Baranski (Bastian.Baranski@uni-muenster.de) - * Created: 03.09.2008 - * Modified: 03.09.2008 - * - ******************************************************************************/ - -package org.n52.wps.gridgain; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -public class ExecuteTest -{ - public static void main(String[] args) throws MalformedURLException, IOException - { - String sUrl = "http://localhost:8761/wps/WebProcessingService"; - String sXml = "ExecuteDocument.xml"; - - new ExecuteTest().exampleRequest(sUrl, sXml); - } - - private void exampleRequest(String sUrl, String sXml) throws MalformedURLException, IOException - { - URL url = new URL(sUrl); - - URLConnection connection = url.openConnection(); - - connection.setDoInput(true); - connection.setDoOutput(true); - - OutputStream os = connection.getOutputStream(); - - InputStream is = ExecuteTest.class.getResourceAsStream(sXml); - byte[] buffer = new byte[1024]; - int c = is.read(buffer); - while (c > 0) - { - System.out.print(new String(buffer, 0, c)); - os.write(buffer, 0, c); - c = is.read(buffer); - } - os.close(); - System.out.println(); - - StringBuffer result = new StringBuffer(); - is = connection.getInputStream(); - buffer = new byte[1]; - c = is.read(buffer); - while (c > 0) - { - result.append(new String(buffer, 0, c)); - c = is.read(buffer); - } - System.out.println(result.toString()); - } -} diff --git a/52n-wps-io/.settings/org.eclipse.core.resources.prefs b/52n-wps-io/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-io/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-io/.settings/org.eclipse.jdt.core.prefs b/52n-wps-io/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-io/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-io/.settings/org.eclipse.m2e.core.prefs b/52n-wps-io/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-io/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-io/.settings/org.eclipse.wst.common.component b/52n-wps-io/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..ecc1f16c2 --- /dev/null +++ b/52n-wps-io/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-io/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-io/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-io/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-io/.settings/org.eclipse.wst.validation.prefs b/52n-wps-io/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-io/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-io/pom.xml b/52n-wps-io/pom.xml index 78ac23eed..14d51650a 100644 --- a/52n-wps-io/pom.xml +++ b/52n-wps-io/pom.xml @@ -11,43 +11,7 @@ jar 52north 52n-wps-io The project 52 north 52n-wps-io does something with JAVA. - - - - true - - - false - - ifgi.releases - Ifgi - Maven releases - http://ifgi-redundance.uni-muenster.de/mvn-repository/releases/ - - - - false - - - true - - ifgi.snapshots - Ifgi - Maven snapshots - http://ifgi-redundance.uni-muenster.de/mvn-repository/snapshots/ - - - osgeo - Open Source Geospatial Foundation Repository - http://download.osgeo.org/webdav/geotools/ - - - - true - - opengeo - OpenGeo Maven Repository - http://repo.opengeo.org - - + @@ -58,6 +22,11 @@ 1.0.4 compile + + be.spacebel.wps + wpsg-xml + 2.0.3 + com.vividsolutions jts @@ -129,7 +98,7 @@ commons-io commons-io - 1.3.1 + 2.4 javax.media diff --git a/52n-wps-io/src/main/java/be/vito/ese/wps/io/GenericXMLDataBinding.java b/52n-wps-io/src/main/java/be/vito/ese/wps/io/GenericXMLDataBinding.java new file mode 100644 index 000000000..2620d82a0 --- /dev/null +++ b/52n-wps-io/src/main/java/be/vito/ese/wps/io/GenericXMLDataBinding.java @@ -0,0 +1,26 @@ +package be.vito.ese.wps.io; + +import org.n52.wps.io.data.IComplexData; +import org.w3c.dom.Document; + +public class GenericXMLDataBinding implements IComplexData{ + + private static final long serialVersionUID = -5326483198974935610L; + + private Document document; + + public GenericXMLDataBinding(Document document){ + this.document = document; + } + + @Override + public Document getPayload(){ + return document; + } + + @Override + public Class getSupportedClass(){ + return Document.class; + } + +} \ No newline at end of file diff --git a/52n-wps-io/src/main/java/be/vito/ese/wps/io/GenericXMLParser.java b/52n-wps-io/src/main/java/be/vito/ese/wps/io/GenericXMLParser.java new file mode 100644 index 000000000..4bcab2bc2 --- /dev/null +++ b/52n-wps-io/src/main/java/be/vito/ese/wps/io/GenericXMLParser.java @@ -0,0 +1,91 @@ +package be.vito.ese.wps.io; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.n52.wps.io.data.IData; +import org.n52.wps.io.datahandler.xml.AbstractXMLParser; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +public class GenericXMLParser extends AbstractXMLParser{ + + @Override + public Class[] getSupportedInternalOutputDataType(){ + return new Class [] {GenericXMLDataBinding.class}; + } + + @Override + public IData parseXML(InputStream stream){ + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + // documentBuilderFactory.setNamespaceAware(true); + + try{ + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(stream); + return new GenericXMLDataBinding(document); + } + catch (SAXException | IOException | ParserConfigurationException ex) { + throw new RuntimeException("Error while parsing XML: " + ex.getMessage(), ex); + } + + } + + @Override + public IData parse(InputStream input, String mimeType){ + return parseXML(input); + } + + @Override + public IData parseXML(String xml){ + + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + FileOutputStream tmpFos = null; + File tmpFile = null; + // documentBuilderFactory.setNamespaceAware(true); + + try{ + + tmpFile = File.createTempFile("input", "xml"); + tmpFos = new FileOutputStream(tmpFile); + + StringReader xmlReader = new StringReader(xml); + int i = xmlReader.read(); + while(i != -1){ + tmpFos.write(i); + i = xmlReader.read(); + } + tmpFos.close(); + + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(tmpFile); + return new GenericXMLDataBinding(document); + } + catch (SAXException | IOException | ParserConfigurationException ex) { + throw new RuntimeException("Error while parsing XML: " + ex.getMessage(), ex); + } + finally{ + if(tmpFile != null){ + tmpFile.delete(); + } + if(tmpFos != null){ + try{ + tmpFos.close(); + } + catch(IOException ex){ + // ignore + } + } + } + + } + +} \ No newline at end of file diff --git a/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesDataBinding.java b/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesDataBinding.java new file mode 100644 index 000000000..17f7c9b15 --- /dev/null +++ b/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesDataBinding.java @@ -0,0 +1,37 @@ +package be.vito.ese.wps.io; + +import java.util.Date; +import java.util.List; + +import org.n52.wps.io.data.IComplexData; + +public class TimeSeriesDataBinding implements IComplexData{ + + private static final long serialVersionUID = 6945469444347550464L; + + private String coverageId; + private List averages; + private List dates; + + public TimeSeriesDataBinding(String coverageId, + List averages, + List dates){ + + this.coverageId = coverageId; + this.averages = averages; + this.dates = dates; + + } + + @Override + public TimeSeriesDocument getPayload(){ + return new TimeSeriesDocument(coverageId, + averages, dates); + } + + @Override + public Class getSupportedClass(){ + return TimeSeriesDocument.class; + } + +} \ No newline at end of file diff --git a/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesDocument.java b/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesDocument.java new file mode 100644 index 000000000..840a36b9b --- /dev/null +++ b/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesDocument.java @@ -0,0 +1,83 @@ +package be.vito.ese.wps.io; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +public class TimeSeriesDocument{ + + private String coverageId; + private List averages; + private List dates; + + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + public TimeSeriesDocument(String coverageId, + List averages, + List dates){ + + this.coverageId = coverageId; + this.averages = averages; + this.dates = dates; + + if(averages.size() != dates.size()){ + throw new IllegalArgumentException("Date and average sizes must be equal"); + } + + } + + public Node getDomNode(){ + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + + DocumentBuilder documentBuilder = null; + Document document = null; + Element rootElement = null; + + try{ + + documentBuilder = factory.newDocumentBuilder(); + document = documentBuilder.newDocument(); + + rootElement = document.createElementNS("http://vito.be/ese/timeseries", "ts:timeseries"); + + rootElement.setAttribute("coverageId", coverageId); + document.appendChild(rootElement); + + int i = 0; + for(Double average : averages){ + + Element entryElement = document.createElementNS("http://vito.be/ese/timeseries", "ts:entry"); + rootElement.appendChild(entryElement); + + Element averageElement = document.createElementNS("http://vito.be/ese/timeseries", "ts:average"); + averageElement.appendChild(document.createTextNode(average.toString())); + entryElement.appendChild(averageElement); + + Element dateElement = document.createElementNS("http://vito.be/ese/timeseries", "ts:date"); + dateElement.appendChild(document.createTextNode(DATE_FORMAT.format(dates.get(i)))); + entryElement.appendChild(dateElement); + + i++; + + } + + } + catch(ParserConfigurationException ex){ + ex.printStackTrace(); + } + + return rootElement; + } + +} diff --git a/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesGenerator.java b/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesGenerator.java new file mode 100644 index 000000000..be5bc1825 --- /dev/null +++ b/52n-wps-io/src/main/java/be/vito/ese/wps/io/TimeSeriesGenerator.java @@ -0,0 +1,34 @@ +package be.vito.ese.wps.io; + +import java.io.OutputStream; + +import org.n52.wps.io.data.IData; +import org.n52.wps.io.datahandler.binary.LargeBufferStream; +import org.n52.wps.io.datahandler.xml.AbstractXMLGenerator; +import org.w3c.dom.Node; + +public class TimeSeriesGenerator extends AbstractXMLGenerator{ + + @Override + public OutputStream generate(IData coll){ + + LargeBufferStream lbos = new LargeBufferStream(); + // this.writeToStream(coll, lbos); + return lbos; + + } + + @Override + public Class[] getSupportedInternalInputDataType(){ + + Class [] supportedClasses = {TimeSeriesDataBinding.class}; + return supportedClasses; + + } + + @Override + public Node generateXML(IData coll, String schema){ + return ((TimeSeriesDataBinding)coll).getPayload().getDomNode(); + } + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/data/SimpleBBoxBinding.java b/52n-wps-io/src/main/java/org/n52/wps/io/data/SimpleBBoxBinding.java new file mode 100644 index 000000000..5bb7f4942 --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/data/SimpleBBoxBinding.java @@ -0,0 +1,39 @@ +package org.n52.wps.io.data; + +import net.opengis.ows.x11.BoundingBoxType; + +/** Simplified class for demo purpose + * */ +public class SimpleBBoxBinding implements IData { + + /** + * + */ + private static final long serialVersionUID = 1L; + private BoundingBoxType bbox; + + public SimpleBBoxBinding(BoundingBoxType bbox) { + this.bbox = bbox; + } + + @Override + public Object getPayload() { + // TODO Auto-generated method stub + return this.bbox; + } + + @Override + public Class getSupportedClass() { + // TODO Auto-generated method stub + return null; + } + + public BoundingBoxType getBbox() { + return bbox; + } + + public void setBbox(BoundingBoxType bbox) { + this.bbox = bbox; + } + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/DataListDataBinding.java b/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/DataListDataBinding.java new file mode 100644 index 000000000..a0769c10d --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/DataListDataBinding.java @@ -0,0 +1,34 @@ +package org.n52.wps.io.data.binding.complex; + +import org.n52.wps.io.data.IComplexData; + +import xint.esa.ese.wps.format.dataList.DataListDocument; +import xint.esa.ese.wps.format.urlList.URLListDocument; + + + +public class DataListDataBinding implements IComplexData{ + + /** + * + */ + private static final long serialVersionUID = 1L; + protected transient DataListDocument urlDom; + + public DataListDataBinding(DataListDocument payload) { + this.urlDom = payload; + } + + public Class getSupportedClass() { + return DataListDocument.class; + } + + public DataListDocument getPayload() { + return urlDom; + } + + + + + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/EODataCacheDataBinding.java b/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/EODataCacheDataBinding.java new file mode 100644 index 000000000..f744cab74 --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/EODataCacheDataBinding.java @@ -0,0 +1,34 @@ +package org.n52.wps.io.data.binding.complex; + +import org.n52.wps.io.data.IComplexData; + +import xint.esa.ese.wps.format.eoDataCache.EODataCacheDocument; +import xint.esa.ese.wps.format.urlList.URLListDocument; + + + +public class EODataCacheDataBinding implements IComplexData{ + + /** + * + */ + private static final long serialVersionUID = 1L; + protected transient EODataCacheDocument urlDom; + + public EODataCacheDataBinding(EODataCacheDocument payload) { + this.urlDom = payload; + } + + public Class getSupportedClass() { + return EODataCacheDocument.class; + } + + public EODataCacheDocument getPayload() { + return urlDom; + } + + + + + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/URLListDataBinding.java b/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/URLListDataBinding.java index b7d295149..ad6caa14f 100644 --- a/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/URLListDataBinding.java +++ b/52n-wps-io/src/main/java/org/n52/wps/io/data/binding/complex/URLListDataBinding.java @@ -1,31 +1,33 @@ -package org.n52.wps.io.data.binding.complex; - -import org.n52.wps.io.data.IComplexData; - -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; - -public class URLListDataBinding implements IComplexData{ - - /** - * - */ - private static final long serialVersionUID = 1L; - protected transient URLListDocument urlDom; - - public URLListDataBinding(URLListDocument payload) { - this.urlDom = payload; - } - - public Class getSupportedClass() { - return URLListDocument.class; - } - - public URLListDocument getPayload() { - return urlDom; - } - - - - - -} +package org.n52.wps.io.data.binding.complex; + +import org.n52.wps.io.data.IComplexData; + +import xint.esa.ese.wps.format.urlList.URLListDocument; + + + +public class URLListDataBinding implements IComplexData{ + + /** + * + */ + private static final long serialVersionUID = 1L; + protected transient URLListDocument urlDom; + + public URLListDataBinding(URLListDocument payload) { + this.urlDom = payload; + } + + public Class getSupportedClass() { + return URLListDocument.class; + } + + public URLListDocument getPayload() { + return urlDom; + } + + + + + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/DataListGenerator.java b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/DataListGenerator.java new file mode 100644 index 000000000..3c9a04d03 --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/DataListGenerator.java @@ -0,0 +1,87 @@ +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. It is compliant +to the WPS version 0.4.0 (OGC 05-007r4). + + Copyright (C) 2006 by con terra GmbH + + Authors: + Theodor Foerster, ITC, Enschede, the Netherlands + Carsten Priess, Institute for geoinformatics, University of +Muenster, Germany + + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + Created on: 13.06.2006 + ***************************************************************/ +package org.n52.wps.io.datahandler.xml; + +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import org.n52.wps.io.IStreamableGenerator; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.DataListDataBinding; +import org.n52.wps.io.datahandler.binary.LargeBufferStream; +import org.w3c.dom.Node; + +public class DataListGenerator extends AbstractXMLGenerator implements IStreamableGenerator { + + + public DataListGenerator() + { + super(); + } + + public DataListGenerator(boolean pReadWPSConfig) + { + super(pReadWPSConfig); + } + + @Override + public OutputStream generate(IData coll) { + // TODO Auto-generated method stub + LargeBufferStream baos = new LargeBufferStream(); + this.writeToStream(coll, baos); + return baos; + } + + @Override + public Class[] getSupportedInternalInputDataType() { + Class[] supportedClasses = {DataListDataBinding.class}; + return supportedClasses; + + } + + @Override + public void writeToStream(IData data, OutputStream os) { + OutputStreamWriter w = new OutputStreamWriter(os); + //write(data, w); + //TODO + } + + @Override + public Node generateXML(IData coll, String schema) { + // TODO Auto-generated method stub + return ((DataListDataBinding)coll).getPayload().getDomNode(); + + } + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/DataListParser.java b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/DataListParser.java new file mode 100644 index 000000000..d00a9784c --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/DataListParser.java @@ -0,0 +1,120 @@ +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. It is compliant +to the WPS version 0.4.0 (OGC 05-007r4). + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Sch�ffer, IfGI + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + Created on: 13.06.2006 + ***************************************************************/ +package org.n52.wps.io.datahandler.xml; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlException; +import org.n52.wps.io.IStreamableParser; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.DataListDataBinding; +import xint.esa.ese.wps.format.dataList.DataListDocument; + + +/** + * This parser handles xml files compliant to gmlpacket.xsd + * @author schaeffer + * + */ +public class DataListParser extends AbstractXMLParser implements IStreamableParser { + private static Logger LOGGER = Logger.getLogger(DataListParser.class); + + + public DataListParser() { + super(); + LOGGER.info("DataListParser"); + + } + + public DataListParser(boolean pReadWPSConfig) { + super(pReadWPSConfig); + LOGGER.info("URLListParser2"); + } + + + + + @Override + public DataListDataBinding parseXML(String urllist) { + LOGGER.info("URLListParser"); + LOGGER.info(urllist); + DataListDocument urlDom = null; + try { + urlDom = DataListDocument.Factory.parse(urllist); + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new DataListDataBinding(urlDom); + } + + @Override + public DataListDataBinding parseXML(InputStream stream) { + DataListDocument urlDom = null; + try { + urlDom = DataListDocument.Factory.parse(stream); + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new DataListDataBinding(urlDom); + } + + @Override + public IData parse(InputStream input, String mimeType) { + LOGGER.info("URLListParser6"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Class[] getSupportedInternalOutputDataType() { + Class[] supportedClasses = {DataListDataBinding.class}; + return supportedClasses; + } + + @Override + public Object parseXML(URI uri) { + // TODO Auto-generated method stub + return null; + } + + + + + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/EODataListGenerator.java b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/EODataListGenerator.java new file mode 100644 index 000000000..21cf37b82 --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/EODataListGenerator.java @@ -0,0 +1,89 @@ +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. It is compliant +to the WPS version 0.4.0 (OGC 05-007r4). + + Copyright (C) 2006 by con terra GmbH + + Authors: + Theodor Foerster, ITC, Enschede, the Netherlands + Carsten Priess, Institute for geoinformatics, University of +Muenster, Germany + + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + Created on: 13.06.2006 + ***************************************************************/ +package org.n52.wps.io.datahandler.xml; + +import java.io.OutputStream; +import java.io.OutputStreamWriter; + +import org.n52.wps.io.IStreamableGenerator; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.EODataCacheDataBinding; +import org.n52.wps.io.data.binding.complex.URLListDataBinding; +import org.n52.wps.io.datahandler.binary.LargeBufferStream; +import org.w3c.dom.Node; + +public class EODataListGenerator extends AbstractXMLGenerator implements IStreamableGenerator { + + + public EODataListGenerator() + { + super(); + } + + public EODataListGenerator(boolean pReadWPSConfig) + { + super(pReadWPSConfig); + } + + @Override + public OutputStream generate(IData coll) { + // TODO Auto-generated method stub + LargeBufferStream baos = new LargeBufferStream(); + this.writeToStream(coll, baos); + return baos; + } + + @Override + public Class[] getSupportedInternalInputDataType() { + Class[] supportedClasses = {EODataCacheDataBinding.class}; + return supportedClasses; + + } + + @Override + public void writeToStream(IData data, OutputStream os) { + OutputStreamWriter w = new OutputStreamWriter(os); + //write(data, w); + //TODO + } + + @Override + public Node generateXML(IData coll, String schema) { + // TODO Auto-generated method stub + return ((EODataCacheDataBinding)coll).getPayload().getDomNode(); + + } + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/EODataListParser.java b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/EODataListParser.java new file mode 100644 index 000000000..726206a6e --- /dev/null +++ b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/EODataListParser.java @@ -0,0 +1,166 @@ +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. It is compliant +to the WPS version 0.4.0 (OGC 05-007r4). + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Sch�ffer, IfGI + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + Created on: 13.06.2006 + ***************************************************************/ +package org.n52.wps.io.datahandler.xml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + + + + + +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlException; +import org.geotools.feature.DefaultFeatureCollections; +import org.geotools.feature.FeatureCollection; +import org.geotools.feature.GeometryAttributeImpl; +import org.geotools.feature.type.GeometryDescriptorImpl; +import org.geotools.feature.type.GeometryTypeImpl; +import org.geotools.filter.identity.GmlObjectIdImpl; +import org.geotools.gml3.ApplicationSchemaConfiguration; +import org.geotools.gml3.GMLConfiguration; +import org.geotools.xml.Configuration; +import org.geotools.xml.Parser; +import org.n52.wps.commons.context.ExecutionContext; +import org.n52.wps.commons.context.ExecutionContextFactory; +import org.n52.wps.io.IStreamableParser; +import org.n52.wps.io.SchemaRepository; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.EODataCacheDataBinding; +import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; +import org.opengis.feature.GeometryAttribute; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.type.GeometryDescriptor; +import org.opengis.feature.type.GeometryType; +import org.opengis.filter.identity.Identifier; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import xint.esa.ese.wps.format.eoDataCache.EODataCacheDocument; + +import com.vividsolutions.jts.geom.Geometry; + + +/** + * This parser handles xml files compliant to gmlpacket.xsd + * @author schaeffer + * + */ +public class EODataListParser extends AbstractXMLParser implements IStreamableParser { + private static Logger LOGGER = Logger.getLogger(EODataListParser.class); + + + public EODataListParser() { + super(); + LOGGER.info("URLListParser"); + + } + + public EODataListParser(boolean pReadWPSConfig) { + super(pReadWPSConfig); + LOGGER.info("URLListParser2"); + } + + + + + @Override + public EODataCacheDataBinding parseXML(String urllist) { + LOGGER.info("URLListParser"); + LOGGER.info(urllist); + EODataCacheDocument urlDom = null; + try { + urlDom = EODataCacheDocument.Factory.parse(urllist); + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new EODataCacheDataBinding(urlDom); + } + + @Override + public EODataCacheDataBinding parseXML(InputStream stream) { + EODataCacheDocument urlDom = null; + try { + urlDom = EODataCacheDocument.Factory.parse(stream); + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new EODataCacheDataBinding(urlDom); + } + + @Override + public IData parse(InputStream input, String mimeType) { + LOGGER.info("URLListParser6"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Class[] getSupportedInternalOutputDataType() { + Class[] supportedClasses = {EODataCacheDataBinding.class}; + return supportedClasses; + } + + @Override + public Object parseXML(URI uri) { + // TODO Auto-generated method stub + return null; + } + + + + + +} diff --git a/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/URLListParser.java b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/URLListParser.java index e1c6e0f2f..431b6be47 100644 --- a/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/URLListParser.java +++ b/52n-wps-io/src/main/java/org/n52/wps/io/datahandler/xml/URLListParser.java @@ -1,163 +1,164 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. It is compliant -to the WPS version 0.4.0 (OGC 05-007r4). - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Sch�ffer, IfGI - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - Created on: 13.06.2006 - ***************************************************************/ -package org.n52.wps.io.datahandler.xml; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - -import javax.xml.XMLConstants; -import javax.xml.namespace.QName; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; - - -import org.apache.log4j.Logger; -import org.apache.xmlbeans.XmlException; -import org.geotools.feature.DefaultFeatureCollections; -import org.geotools.feature.FeatureCollection; -import org.geotools.feature.GeometryAttributeImpl; -import org.geotools.feature.type.GeometryDescriptorImpl; -import org.geotools.feature.type.GeometryTypeImpl; -import org.geotools.filter.identity.GmlObjectIdImpl; -import org.geotools.gml3.ApplicationSchemaConfiguration; -import org.geotools.gml3.GMLConfiguration; -import org.geotools.xml.Configuration; -import org.geotools.xml.Parser; -import org.n52.wps.commons.context.ExecutionContext; -import org.n52.wps.commons.context.ExecutionContextFactory; -import org.n52.wps.io.IStreamableParser; -import org.n52.wps.io.SchemaRepository; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.opengis.feature.GeometryAttribute; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.type.GeometryDescriptor; -import org.opengis.feature.type.GeometryType; -import org.opengis.filter.identity.Identifier; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; - -import com.vividsolutions.jts.geom.Geometry; - - -/** - * This parser handles xml files compliant to gmlpacket.xsd - * @author schaeffer - * - */ -public class URLListParser extends AbstractXMLParser implements IStreamableParser { - private static Logger LOGGER = Logger.getLogger(URLListParser.class); - - - public URLListParser() { - super(); - LOGGER.info("URLListParser"); - - } - - public URLListParser(boolean pReadWPSConfig) { - super(pReadWPSConfig); - LOGGER.info("URLListParser2"); - } - - - - - @Override - public URLListDataBinding parseXML(String urllist) { - LOGGER.info("URLListParser"); - LOGGER.info(urllist); - URLListDocument urlDom = null; - try { - urlDom = URLListDocument.Factory.parse(urllist); - } catch (XmlException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return new URLListDataBinding(urlDom); - } - - @Override - public URLListDataBinding parseXML(InputStream stream) { - URLListDocument urlDom = null; - try { - urlDom = URLListDocument.Factory.parse(stream); - } catch (XmlException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return new URLListDataBinding(urlDom); - } - - @Override - public IData parse(InputStream input, String mimeType) { - LOGGER.info("URLListParser6"); - // TODO Auto-generated method stub - return null; - } - - @Override - public Class[] getSupportedInternalOutputDataType() { - Class[] supportedClasses = {URLListDataBinding.class}; - return supportedClasses; - } - - @Override - public Object parseXML(URI uri) { - // TODO Auto-generated method stub - return null; - } - - - - - -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. It is compliant +to the WPS version 0.4.0 (OGC 05-007r4). + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Sch�ffer, IfGI + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + Created on: 13.06.2006 + ***************************************************************/ +package org.n52.wps.io.datahandler.xml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import javax.xml.XMLConstants; +import javax.xml.namespace.QName; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + + + +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlException; +import org.geotools.feature.DefaultFeatureCollections; +import org.geotools.feature.FeatureCollection; +import org.geotools.feature.GeometryAttributeImpl; +import org.geotools.feature.type.GeometryDescriptorImpl; +import org.geotools.feature.type.GeometryTypeImpl; +import org.geotools.filter.identity.GmlObjectIdImpl; +import org.geotools.gml3.ApplicationSchemaConfiguration; +import org.geotools.gml3.GMLConfiguration; +import org.geotools.xml.Configuration; +import org.geotools.xml.Parser; +import org.n52.wps.commons.context.ExecutionContext; +import org.n52.wps.commons.context.ExecutionContextFactory; +import org.n52.wps.io.IStreamableParser; +import org.n52.wps.io.SchemaRepository; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; +import org.n52.wps.io.data.binding.complex.URLListDataBinding; +import org.opengis.feature.GeometryAttribute; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.type.GeometryDescriptor; +import org.opengis.feature.type.GeometryType; +import org.opengis.filter.identity.Identifier; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import xint.esa.ese.wps.format.urlList.URLListDocument; + +import com.vividsolutions.jts.geom.Geometry; + + +/** + * This parser handles xml files compliant to gmlpacket.xsd + * @author schaeffer + * + */ +public class URLListParser extends AbstractXMLParser implements IStreamableParser { + private static Logger LOGGER = Logger.getLogger(URLListParser.class); + + + public URLListParser() { + super(); + LOGGER.info("URLListParser"); + + } + + public URLListParser(boolean pReadWPSConfig) { + super(pReadWPSConfig); + LOGGER.info("URLListParser2"); + } + + + + + @Override + public URLListDataBinding parseXML(String urllist) { + LOGGER.info("URLListParser"); + LOGGER.info(urllist); + URLListDocument urlDom = null; + try { + urlDom = URLListDocument.Factory.parse(urllist); + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new URLListDataBinding(urlDom); + } + + @Override + public URLListDataBinding parseXML(InputStream stream) { + URLListDocument urlDom = null; + try { + urlDom = URLListDocument.Factory.parse(stream); + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return new URLListDataBinding(urlDom); + } + + @Override + public IData parse(InputStream input, String mimeType) { + LOGGER.info("URLListParser6"); + // TODO Auto-generated method stub + return null; + } + + @Override + public Class[] getSupportedInternalOutputDataType() { + Class[] supportedClasses = {URLListDataBinding.class}; + return supportedClasses; + } + + @Override + public Object parseXML(URI uri) { + // TODO Auto-generated method stub + return null; + } + + + + + +} diff --git a/52n-wps-python/.gitignore b/52n-wps-python/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-python/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-python/.settings/org.eclipse.core.resources.prefs b/52n-wps-python/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-python/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-python/.settings/org.eclipse.jdt.core.prefs b/52n-wps-python/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-python/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-python/.settings/org.eclipse.m2e.core.prefs b/52n-wps-python/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-python/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-python/.settings/org.eclipse.wst.common.component b/52n-wps-python/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..9a8834cfa --- /dev/null +++ b/52n-wps-python/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-python/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-python/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-python/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-python/.settings/org.eclipse.wst.validation.prefs b/52n-wps-python/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-python/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-server/.settings/org.eclipse.core.resources.prefs b/52n-wps-server/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-server/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-server/.settings/org.eclipse.jdt.core.prefs b/52n-wps-server/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-server/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-server/.settings/org.eclipse.m2e.core.prefs b/52n-wps-server/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-server/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-server/.settings/org.eclipse.wst.common.component b/52n-wps-server/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..4aa812e64 --- /dev/null +++ b/52n-wps-server/.settings/org.eclipse.wst.common.component @@ -0,0 +1,6 @@ + + + + + + diff --git a/52n-wps-server/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-server/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-server/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-server/.settings/org.eclipse.wst.validation.prefs b/52n-wps-server/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-server/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-server/pom.xml b/52n-wps-server/pom.xml index ef3afc0b3..2a7092568 100644 --- a/52n-wps-server/pom.xml +++ b/52n-wps-server/pom.xml @@ -42,12 +42,12 @@ be.spacebel.wps wpsg-xml - 1.0.0 + 2.0.3 - tomcat - servlet-api - 5.5.15 + org.apache.tomcat + tomcat-servlet-api + 7.0.30 provided @@ -70,6 +70,7 @@ axis2 1.5 + commons-net commons-net @@ -83,38 +84,41 @@ org.apache.ws.commons.axiom axiom-impl - 1.2.8 + 1.2.12 org.apache.ws.commons.axiom axiom-dom - 1.2.8 + 1.2.12 org.apache.ws.commons.axiom axiom-api - 1.2.8 - - - org.apache.rampart - rampart-core - 1.4 - - - xmlbeans - xbean - - - opensaml - opensaml - - - org.apache.ant - ant-nodeps - - - + 1.2.12 + + net.sf.wsag4j.types + wsag4j-addressing-types + 2.0.0 + + + org.apache.axis2 + axis2-saaj + 1.6.2 + + + org.apache.ws.security + wss4j + 1.6.1 + + + + org.apache.ant + ant + 1.8.2 + + + xerces xercesImpl @@ -127,6 +131,38 @@ 2.0 compile - + + org.apache.oozie + oozie-client + 4.0.0-cdh5.1.0 + + + org.apache.hadoop + hadoop-client + 2.3.0-cdh5.1.0 + compile + + + + org.apache.hadoop + hadoop-auth + 2.3.0-cdh5.1.0 + compile + + + + + + cloudera-repo-releases + https://repository.cloudera.com/artifactory/repo/ + + + cloudera-repo-releases2 + https://repository.cloudera.com/cloudera/cloudera-repos/ + + + + + diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/AbstractCancellableAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/AbstractCancellableAlgorithm.java new file mode 100644 index 000000000..0c3f90161 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/AbstractCancellableAlgorithm.java @@ -0,0 +1,135 @@ +package org.n52.wps.server; + +import net.opengis.wps.x100.InputDescriptionType; +import net.opengis.wps.x100.OutputDescriptionType; + +import org.n52.wps.io.data.binding.complex.DataListDataBinding; +import org.n52.wps.io.data.binding.complex.EODataCacheDataBinding; +import org.n52.wps.io.data.binding.complex.GenericFileDataBinding; +import org.n52.wps.io.data.binding.complex.URLListDataBinding; +import org.n52.wps.io.data.binding.literal.LiteralBooleanBinding; +import org.n52.wps.io.data.binding.literal.LiteralDoubleBinding; +import org.n52.wps.io.data.binding.literal.LiteralIntBinding; +import org.n52.wps.io.data.binding.literal.LiteralLongBinding; +import org.n52.wps.io.data.binding.literal.LiteralStringBinding; + +public abstract class AbstractCancellableAlgorithm extends AbstractAlgorithm implements ICancelAlgorithm{ + + + private String instanceId; + + public String getInstanceId() { + return this.instanceId; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + /** In the case of the AbstractCancellableAlgorith, it was chosen to + * give a default getInput/Output Data Type implementation in order + * to facilitate later implementation . + * Off course, this should rather be defined in a specialization class */ + + public Class getInputDataType(String id) { + InputDescriptionType[] inputs = this.getDescription().getDataInputs() + .getInputArray(); + for (InputDescriptionType input : inputs) { + if (input.getIdentifier().getStringValue().equals(id)) { + if (input.isSetLiteralData()) { + String datatype = input.getLiteralData().getDataType() + .getStringValue(); + if (datatype.contains("tring")) { + return LiteralStringBinding.class; + } + if (datatype.contains("ong")) { + return LiteralLongBinding.class; + } + if (datatype.contains("ollean")) { + return LiteralBooleanBinding.class; + } + if (datatype.contains("loat") || datatype.contains("ouble")) { + return LiteralDoubleBinding.class; + } + if (datatype.contains("nt")) { + return LiteralIntBinding.class; + } + } + if (input.isSetComplexData()) { + String mimeType = input.getComplexData().getDefault() + .getFormat().getMimeType(); + if (mimeType.contains("xml") || (mimeType.contains("XML"))) { + return URLListDataBinding.class; + } else { + return URLListDataBinding.class; + } + } + } + } + throw new RuntimeException("Could not determie internal inputDataType"); + } + + public Class getOutputDataType(String id) { + OutputDescriptionType[] outputs = this.getDescription() + .getProcessOutputs().getOutputArray(); + + for (OutputDescriptionType output : outputs) { + if (output.getIdentifier().getStringValue().equals(id)) { + + if (output.isSetLiteralOutput()) { + // Missing case when dataType is not present + if (output.getLiteralOutput().getDataType() == null) { + return LiteralStringBinding.class; + } + String datatype = output.getLiteralOutput().getDataType() + .getStringValue(); + if (datatype.contains("tring")) { + return LiteralStringBinding.class; + } + if (datatype.contains("ollean")) { + return LiteralBooleanBinding.class; + } + if (datatype.contains("ong")) { + return LiteralLongBinding.class; + } + if (datatype.contains("loat") || datatype.contains("ouble")) { + return LiteralDoubleBinding.class; + } + if (datatype.contains("nt")) { + return LiteralIntBinding.class; + } + } + if (output.isSetComplexOutput()) { + String mimeType = output.getComplexOutput().getDefault() + .getFormat().getMimeType(); + if (mimeType.contains("xml") || (mimeType.contains("XML"))) { + if (output.getComplexOutput().getDefault().getFormat() + .getSchema().contains("URLList")) { + return URLListDataBinding.class; + + } + else if (output.getComplexOutput().getDefault().getFormat() + .getSchema().contains("DataList")) { + return DataListDataBinding.class; + + } + else if (output.getComplexOutput().getDefault().getFormat() + .getSchema().contains("EODataCache")) { + return EODataCacheDataBinding.class; + + } + else { + return GenericFileDataBinding.class; + } + + } else { + return GenericFileDataBinding.class; + } + } + } + } + throw new RuntimeException("Could not determie internal inputDataType"); + } + + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/AbstractSelfDescribingAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/AbstractSelfDescribingAlgorithm.java index b63af7c55..7060ecf03 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/AbstractSelfDescribingAlgorithm.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/AbstractSelfDescribingAlgorithm.java @@ -1,349 +1,348 @@ -package org.n52.wps.server; - -import java.lang.reflect.Constructor; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import net.opengis.ows.x11.DomainMetadataType; -import net.opengis.wps.x100.ComplexDataCombinationType; -import net.opengis.wps.x100.ComplexDataCombinationsType; -import net.opengis.wps.x100.ComplexDataDescriptionType; -import net.opengis.wps.x100.InputDescriptionType; -import net.opengis.wps.x100.LiteralInputType; -import net.opengis.wps.x100.LiteralOutputType; -import net.opengis.wps.x100.OutputDescriptionType; -import net.opengis.wps.x100.ProcessDescriptionType; -import net.opengis.wps.x100.ProcessDescriptionType.DataInputs; -import net.opengis.wps.x100.ProcessDescriptionType.ProcessOutputs; -import net.opengis.wps.x100.ProcessDescriptionsDocument; -import net.opengis.wps.x100.ProcessDescriptionsDocument.ProcessDescriptions; -import net.opengis.wps.x100.SupportedComplexDataInputType; -import net.opengis.wps.x100.SupportedComplexDataType; - -import org.apache.log4j.Logger; -import org.n52.wps.io.GeneratorFactory; -import org.n52.wps.io.IGenerator; -import org.n52.wps.io.IParser; -import org.n52.wps.io.ParserFactory; -import org.n52.wps.io.data.IComplexData; -import org.n52.wps.io.data.ILiteralData; -import org.n52.wps.server.observerpattern.IObserver; -import org.n52.wps.server.observerpattern.ISubject; -import org.n52.wps.server.profiles.JavaSaga.JavaSagaDeploymentProfile; - - -public abstract class AbstractSelfDescribingAlgorithm extends AbstractAlgorithm implements ISubject{ - - private static Logger LOGGER = Logger.getLogger(AbstractSelfDescribingAlgorithm.class); - @Override - protected ProcessDescriptionType initializeDescription() { - ProcessDescriptionsDocument document = ProcessDescriptionsDocument.Factory.newInstance(); - ProcessDescriptions processDescriptions = document.addNewProcessDescriptions(); - ProcessDescriptionType processDescription = processDescriptions.addNewProcessDescription(); - processDescription.setStatusSupported(true); - processDescription.setStoreSupported(true); - processDescription.setProcessVersion("1.0.0"); - - //1. Identifer - processDescription.addNewIdentifier().setStringValue(this.getClass().getName()); - processDescription.addNewTitle().setStringValue(this.getClass().getCanonicalName()); - //2. Inputs - - - List identifiers = this.getInputIdentifiers(); - DataInputs dataInputs = null; - if(identifiers.size()>0){ - dataInputs = processDescription.addNewDataInputs(); - } - - for(String identifier : identifiers){ - InputDescriptionType dataInput = dataInputs.addNewInput(); - dataInput.setMinOccurs(getMinOccurs(identifier)); - dataInput.setMaxOccurs(getMaxOccurs(identifier)); - dataInput.addNewIdentifier().setStringValue(identifier); - dataInput.addNewTitle().setStringValue(identifier); - - Class inputDataTypeClass = this.getInputDataType(identifier); - Class[] interfaces = inputDataTypeClass.getInterfaces(); - - for(Class implementedInterface : interfaces){ - if(implementedInterface.equals(ILiteralData.class)){ - LiteralInputType literalData = dataInput.addNewLiteralData(); - String inputClassType = ""; - - Constructor[] constructors = inputDataTypeClass.getConstructors(); - for(Constructor constructor : constructors){ - Class[] parameters = constructor.getParameterTypes(); - if(parameters.length==1){ - inputClassType = parameters[0].getSimpleName(); - } - } - - if(inputClassType.length()>0){ - DomainMetadataType datatype = literalData.addNewDataType(); - datatype.setReference("xs:"+inputClassType.toLowerCase()); - literalData.addNewAnyValue(); - } - - }else if(implementedInterface.equals(IComplexData.class)){ - SupportedComplexDataInputType complexData = dataInput.addNewComplexData(); - ComplexDataCombinationType defaultInputFormat = complexData.addNewDefault(); - ComplexDataCombinationsType supportedtInputFormat = complexData.addNewSupported(); - List parsers = ParserFactory.getInstance().getAllParsers(); - List foundParsers = new ArrayList(); - for(IParser parser : parsers) { - Class[] supportedClasses = parser.getSupportedInternalOutputDataType(); - for(Class clazz : supportedClasses){ - if(clazz.equals(inputDataTypeClass)){ - foundParsers.add(parser); - } - - } - } - - for(int i = 0; i0){ - ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtInputFormat.addNewFormat(); - supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); - supportedCreatedFormatAdditional.setMimeType(supportedFormat); - supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); - } - } - -// if(supportedFormats.length==1 && supportedEncodings.length==1){ -// String supportedFormat = supportedFormats[j]; -// ComplexDataDescriptionType supportedCreatedFormat = supportedtInputFormat.addNewFormat(); -// supportedCreatedFormat.setMimeType(supportedFormat); -// supportedCreatedFormat.setEncoding(supportedEncodings[k]); -// for(int t = 0; t0){ -// ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtInputFormat.addNewFormat(); -// supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); -// supportedCreatedFormatAdditional.setMimeType(supportedFormat); -// supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); -// } -// } -// } - } - } - } - } - } - } - - //3. Outputs - ProcessOutputs dataOutputs = processDescription.addNewProcessOutputs(); - List outputIdentifiers = this.getOutputIdentifiers(); - for(String identifier : outputIdentifiers){ - OutputDescriptionType dataOutput = dataOutputs.addNewOutput(); - - - dataOutput.addNewIdentifier().setStringValue(identifier); - dataOutput.addNewTitle().setStringValue(identifier); - dataOutput.addNewAbstract().setStringValue(identifier); - - Class outputDataTypeClass = this.getOutputDataType(identifier); - Class[] interfaces = outputDataTypeClass.getInterfaces(); - - for(Class implementedInterface : interfaces){ - - - if(implementedInterface.equals(ILiteralData.class)){ - LiteralOutputType literalData = dataOutput.addNewLiteralOutput(); - String outputClassType = ""; - - Constructor[] constructors = outputDataTypeClass.getConstructors(); - for(Constructor constructor : constructors){ - Class[] parameters = constructor.getParameterTypes(); - if(parameters.length==1){ - outputClassType = parameters[0].getSimpleName(); - } - } - - if(outputClassType.length()>0){ - literalData.addNewDataType().setReference("xs:"+outputClassType.toLowerCase()); - } - - - }else if(implementedInterface.equals(IComplexData.class)){ - - SupportedComplexDataType complexData = dataOutput.addNewComplexOutput(); - ComplexDataCombinationType defaultInputFormat = complexData.addNewDefault(); - ComplexDataCombinationsType supportedtOutputFormat = complexData.addNewSupported(); - - List generators = GeneratorFactory.getInstance().getAllGenerators(); - List foundGenerators = new ArrayList(); - for(IGenerator generator : generators) { - Class[] supportedClasses = generator.getSupportedInternalInputDataType(); - for(Class clazz : supportedClasses){ - if(clazz.equals(outputDataTypeClass)){ - foundGenerators.add(generator); - } - - } - } - - for(int i = 0; i0){ - ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtOutputFormat.addNewFormat(); - supportedCreatedFormatAdditional.setMimeType(supportedFormat); - supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); - supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); - } - } - } -// if(supportedFormats.length==1 && supportedEncodings.length==1){ -// String supportedFormat = supportedFormats[j]; -// ComplexDataDescriptionType supportedCreatedFormat = supportedtOutputFormat.addNewFormat(); -// supportedCreatedFormat.setMimeType(supportedFormat); -// supportedCreatedFormat.setEncoding(supportedEncodings[k]); -// for(int t = 0; t0){ -// ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtOutputFormat.addNewFormat(); -// supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); -// supportedCreatedFormatAdditional.setMimeType(supportedFormat); -// supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); -// } -// } -// } - } - } - } - } - } - } - LOGGER.info(document.toString()); - return document.getProcessDescriptions().getProcessDescriptionArray(0); - } - - public BigInteger getMinOccurs(String identifier){ - return new BigInteger("1"); - } - public BigInteger getMaxOccurs(String identifier){ - return new BigInteger("1"); - } - - public abstract List getInputIdentifiers(); - public abstract List getOutputIdentifiers(); - - - - private List observers = new ArrayList(); - - private Object state = null; - - public Object getState() { - return state; - } - - public void update(Object state) { - if(Thread.currentThread().isInterrupted()){ - return; - } - this.state = state; - notifyObservers(); - } - - public void addObserver(IObserver o) { - observers.add(o); - } - - public void removeObserver(IObserver o) { - observers.remove(o); - } - - public void notifyObservers() { - Iterator i = observers.iterator(); - while (i.hasNext()) { - IObserver o = (IObserver) i.next(); - o.update(this); - } - } - - @Override - public List getErrors() { - List errors = new ArrayList(); - return errors; - } -} +package org.n52.wps.server; + +import java.lang.reflect.Constructor; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.opengis.ows.x11.DomainMetadataType; +import net.opengis.wps.x100.ComplexDataCombinationType; +import net.opengis.wps.x100.ComplexDataCombinationsType; +import net.opengis.wps.x100.ComplexDataDescriptionType; +import net.opengis.wps.x100.InputDescriptionType; +import net.opengis.wps.x100.LiteralInputType; +import net.opengis.wps.x100.LiteralOutputType; +import net.opengis.wps.x100.OutputDescriptionType; +import net.opengis.wps.x100.ProcessDescriptionType; +import net.opengis.wps.x100.ProcessDescriptionType.DataInputs; +import net.opengis.wps.x100.ProcessDescriptionType.ProcessOutputs; +import net.opengis.wps.x100.ProcessDescriptionsDocument; +import net.opengis.wps.x100.ProcessDescriptionsDocument.ProcessDescriptions; +import net.opengis.wps.x100.SupportedComplexDataInputType; +import net.opengis.wps.x100.SupportedComplexDataType; + +import org.apache.log4j.Logger; +import org.n52.wps.io.GeneratorFactory; +import org.n52.wps.io.IGenerator; +import org.n52.wps.io.IParser; +import org.n52.wps.io.ParserFactory; +import org.n52.wps.io.data.IComplexData; +import org.n52.wps.io.data.ILiteralData; +import org.n52.wps.server.observerpattern.IObserver; +import org.n52.wps.server.observerpattern.ISubject; + + +public abstract class AbstractSelfDescribingAlgorithm extends AbstractAlgorithm implements ISubject{ + + private static Logger LOGGER = Logger.getLogger(AbstractSelfDescribingAlgorithm.class); + @Override + protected ProcessDescriptionType initializeDescription() { + ProcessDescriptionsDocument document = ProcessDescriptionsDocument.Factory.newInstance(); + ProcessDescriptions processDescriptions = document.addNewProcessDescriptions(); + ProcessDescriptionType processDescription = processDescriptions.addNewProcessDescription(); + processDescription.setStatusSupported(true); + processDescription.setStoreSupported(true); + processDescription.setProcessVersion("1.0.0"); + + //1. Identifer + processDescription.addNewIdentifier().setStringValue(this.getClass().getName()); + processDescription.addNewTitle().setStringValue(this.getClass().getCanonicalName()); + //2. Inputs + + + List identifiers = this.getInputIdentifiers(); + DataInputs dataInputs = null; + if(identifiers.size()>0){ + dataInputs = processDescription.addNewDataInputs(); + } + + for(String identifier : identifiers){ + InputDescriptionType dataInput = dataInputs.addNewInput(); + dataInput.setMinOccurs(getMinOccurs(identifier)); + dataInput.setMaxOccurs(getMaxOccurs(identifier)); + dataInput.addNewIdentifier().setStringValue(identifier); + dataInput.addNewTitle().setStringValue(identifier); + + Class inputDataTypeClass = this.getInputDataType(identifier); + Class[] interfaces = inputDataTypeClass.getInterfaces(); + + for(Class implementedInterface : interfaces){ + if(implementedInterface.equals(ILiteralData.class)){ + LiteralInputType literalData = dataInput.addNewLiteralData(); + String inputClassType = ""; + + Constructor[] constructors = inputDataTypeClass.getConstructors(); + for(Constructor constructor : constructors){ + Class[] parameters = constructor.getParameterTypes(); + if(parameters.length==1){ + inputClassType = parameters[0].getSimpleName(); + } + } + + if(inputClassType.length()>0){ + DomainMetadataType datatype = literalData.addNewDataType(); + datatype.setReference("xs:"+inputClassType.toLowerCase()); + literalData.addNewAnyValue(); + } + + }else if(implementedInterface.equals(IComplexData.class)){ + SupportedComplexDataInputType complexData = dataInput.addNewComplexData(); + ComplexDataCombinationType defaultInputFormat = complexData.addNewDefault(); + ComplexDataCombinationsType supportedtInputFormat = complexData.addNewSupported(); + List parsers = ParserFactory.getInstance().getAllParsers(); + List foundParsers = new ArrayList(); + for(IParser parser : parsers) { + Class[] supportedClasses = parser.getSupportedInternalOutputDataType(); + for(Class clazz : supportedClasses){ + if(clazz.equals(inputDataTypeClass)){ + foundParsers.add(parser); + } + + } + } + + for(int i = 0; i0){ + ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtInputFormat.addNewFormat(); + supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); + supportedCreatedFormatAdditional.setMimeType(supportedFormat); + supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); + } + } + +// if(supportedFormats.length==1 && supportedEncodings.length==1){ +// String supportedFormat = supportedFormats[j]; +// ComplexDataDescriptionType supportedCreatedFormat = supportedtInputFormat.addNewFormat(); +// supportedCreatedFormat.setMimeType(supportedFormat); +// supportedCreatedFormat.setEncoding(supportedEncodings[k]); +// for(int t = 0; t0){ +// ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtInputFormat.addNewFormat(); +// supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); +// supportedCreatedFormatAdditional.setMimeType(supportedFormat); +// supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); +// } +// } +// } + } + } + } + } + } + } + + //3. Outputs + ProcessOutputs dataOutputs = processDescription.addNewProcessOutputs(); + List outputIdentifiers = this.getOutputIdentifiers(); + for(String identifier : outputIdentifiers){ + OutputDescriptionType dataOutput = dataOutputs.addNewOutput(); + + + dataOutput.addNewIdentifier().setStringValue(identifier); + dataOutput.addNewTitle().setStringValue(identifier); + dataOutput.addNewAbstract().setStringValue(identifier); + + Class outputDataTypeClass = this.getOutputDataType(identifier); + Class[] interfaces = outputDataTypeClass.getInterfaces(); + + for(Class implementedInterface : interfaces){ + + + if(implementedInterface.equals(ILiteralData.class)){ + LiteralOutputType literalData = dataOutput.addNewLiteralOutput(); + String outputClassType = ""; + + Constructor[] constructors = outputDataTypeClass.getConstructors(); + for(Constructor constructor : constructors){ + Class[] parameters = constructor.getParameterTypes(); + if(parameters.length==1){ + outputClassType = parameters[0].getSimpleName(); + } + } + + if(outputClassType.length()>0){ + literalData.addNewDataType().setReference("xs:"+outputClassType.toLowerCase()); + } + + + }else if(implementedInterface.equals(IComplexData.class)){ + + SupportedComplexDataType complexData = dataOutput.addNewComplexOutput(); + ComplexDataCombinationType defaultInputFormat = complexData.addNewDefault(); + ComplexDataCombinationsType supportedtOutputFormat = complexData.addNewSupported(); + + List generators = GeneratorFactory.getInstance().getAllGenerators(); + List foundGenerators = new ArrayList(); + for(IGenerator generator : generators) { + Class[] supportedClasses = generator.getSupportedInternalInputDataType(); + for(Class clazz : supportedClasses){ + if(clazz.equals(outputDataTypeClass)){ + foundGenerators.add(generator); + } + + } + } + + for(int i = 0; i0){ + ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtOutputFormat.addNewFormat(); + supportedCreatedFormatAdditional.setMimeType(supportedFormat); + supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); + supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); + } + } + } +// if(supportedFormats.length==1 && supportedEncodings.length==1){ +// String supportedFormat = supportedFormats[j]; +// ComplexDataDescriptionType supportedCreatedFormat = supportedtOutputFormat.addNewFormat(); +// supportedCreatedFormat.setMimeType(supportedFormat); +// supportedCreatedFormat.setEncoding(supportedEncodings[k]); +// for(int t = 0; t0){ +// ComplexDataDescriptionType supportedCreatedFormatAdditional = supportedtOutputFormat.addNewFormat(); +// supportedCreatedFormatAdditional.setEncoding(supportedEncodings[k]); +// supportedCreatedFormatAdditional.setMimeType(supportedFormat); +// supportedCreatedFormatAdditional.setSchema(supportedSchemas[t]); +// } +// } +// } + } + } + } + } + } + } + LOGGER.info(document.toString()); + return document.getProcessDescriptions().getProcessDescriptionArray(0); + } + + public BigInteger getMinOccurs(String identifier){ + return new BigInteger("1"); + } + public BigInteger getMaxOccurs(String identifier){ + return new BigInteger("1"); + } + + public abstract List getInputIdentifiers(); + public abstract List getOutputIdentifiers(); + + + + private List observers = new ArrayList(); + + private Object state = null; + + public Object getState() { + return state; + } + + public void update(Object state) { + if(Thread.currentThread().isInterrupted()){ + return; + } + this.state = state; + notifyObservers(); + } + + public void addObserver(IObserver o) { + observers.add(o); + } + + public void removeObserver(IObserver o) { + observers.remove(o); + } + + public void notifyObservers() { + Iterator i = observers.iterator(); + while (i.hasNext()) { + IObserver o = (IObserver) i.next(); + o.update(this); + } + } + + @Override + public List getErrors() { + List errors = new ArrayList(); + return errors; + } +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/AbstractTransactionalAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/AbstractTransactionalAlgorithm.java index 94b353577..8367ceb69 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/AbstractTransactionalAlgorithm.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/AbstractTransactionalAlgorithm.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; +import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; @@ -11,9 +12,11 @@ import org.apache.log4j.Logger; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlOptions; +import org.n52.wps.io.data.IData; import org.n52.wps.server.repository.DefaultTransactionalProcessRepository; import org.n52.wps.server.request.ExecuteRequest; import org.n52.wps.util.XMLUtils; + import net.opengis.wps.x100.AuditTraceType; import net.opengis.wps.x100.ExecuteResponseDocument; import net.opengis.wps.x100.ProcessDescriptionDocument; @@ -23,7 +26,7 @@ public abstract class AbstractTransactionalAlgorithm implements IAlgorithm { protected String algorithmID; private static Logger LOGGER = Logger - .getLogger(DefaultTransactionalProcessRepository.class); + .getLogger(AbstractTransactionalAlgorithm.class); public AbstractTransactionalAlgorithm(String algorithmID) { this.algorithmID = algorithmID; @@ -34,7 +37,7 @@ public String getAlgorithmID() { return algorithmID; } - public abstract HashMap run(ExecuteRequest document) + public abstract Map run(ExecuteRequest document) throws ExceptionReport; /** call the backend to cancel the task */ @@ -150,6 +153,7 @@ public static void storeAuditDocument(String instanceId, String path = subPath + "WEB-INF/AuditDocuments/" + instanceId + ".xml"; try { // TODO handling when exception occurs ... + LOGGER.debug("auditTraceType save in "+path); auditTraceType.save(new File(path)); // XMLUtils.writeXmlFile((Document)auditTraceType.getDomNode(), // path); diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/CapabilitiesConfiguration.java b/52n-wps-server/src/main/java/org/n52/wps/server/CapabilitiesConfiguration.java index cc10a45d8..47a4767c1 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/CapabilitiesConfiguration.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/CapabilitiesConfiguration.java @@ -139,8 +139,10 @@ private static void initSkeleton() throws XmlException, IOException { process.setProcessVersion(processVersion); process.setTitle(title); } - DataOfferings datas = capsSkeleton.getCapabilities().addNewDataOfferings(); + DataOfferings datas = null; for(String dataName : RepositoryManager.getInstance().getDatas()) { + if(datas==null) { datas=capsSkeleton.getCapabilities().addNewDataOfferings(); + } DataDescriptionType description = RepositoryManager.getInstance().getDataDescription(dataName); if(description==null){ continue; diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/ICancelAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/ICancelAlgorithm.java new file mode 100644 index 000000000..974311379 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/ICancelAlgorithm.java @@ -0,0 +1,7 @@ +package org.n52.wps.server; + +public interface ICancelAlgorithm { + + public void cancel(); + public String getInstanceId(); +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/ITransactionalAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/ITransactionalAlgorithm.java new file mode 100644 index 000000000..b6c20ee83 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/ITransactionalAlgorithm.java @@ -0,0 +1,15 @@ +package org.n52.wps.server; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.n52.wps.io.data.IData; + +public interface ITransactionalAlgorithm { + + public void cancel(); + Map run(Map> inputData) throws InterruptedException; + public String getAudit(); + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/importgrid/ImportData.java b/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/importgrid/ImportData.java deleted file mode 100644 index 66a93d338..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/importgrid/ImportData.java +++ /dev/null @@ -1,421 +0,0 @@ -package org.n52.wps.server.algorithm.importgrid; - -import java.io.File; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.apache.log4j.Logger; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.DataStagingType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDescriptionType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobIdentificationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.impl.CreationFlagEnumerationImpl; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.FileNameType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralStringBinding; -import org.n52.wps.server.AbstractSelfDescribingAlgorithm; -import org.n52.wps.server.profiles.JavaSaga.SagaCallbackManager; - -import org.ogf.saga.context.Context; -import org.ogf.saga.context.ContextFactory; -import org.ogf.saga.error.BadParameterException; -import org.ogf.saga.error.NoSuccessException; -import org.ogf.saga.job.Job; -import org.ogf.saga.monitoring.Metric; -import org.ogf.saga.monitoring.Monitorable; -import org.ogf.saga.session.Session; -import org.ogf.saga.session.SessionFactory; -import org.ogf.saga.url.URLFactory; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument.URLList; - -import com.terradue.ogf.saga.impl.job.JobDescription; -import com.terradue.ogf.saga.impl.job.JobFactory; -import com.terradue.ogf.saga.impl.job.JobImpl; -import com.terradue.ogf.saga.impl.job.JobServiceImpl; -import com.terradue.ogf.schema.jsdl.JSDLFactory; -import com.terradue.ssegrid.sagaext.JobServiceAssistant; -import com.terradue.ssegrid.sagaext.MyProxyClient; -import com.terradue.ssegrid.sagaext.ProcessingRegistry; - -public class ImportData extends AbstractSelfDescribingAlgorithm { - - private static Logger LOGGER = Logger.getLogger(ImportData.class); - - private static String GridFilesDir; - private static String SagaLibDir; - private static org.ogf.saga.url.URL GridmapGLUE; - private ProcessingRegistry processingRegistry = null; - private String WPSPublicationPrefix; - private String DeployProcessDir; - - private String myProxyURL; - private String myProxyUser; - private String myProxyPassword; - - - public List getInputIdentifiers() { - List list = new ArrayList(); - list.add("sourceList"); - list.add("rootDir"); - return list; - } - - public Class getInputDataType(String identifier) { - if (identifier.equalsIgnoreCase("sourceList")) { - return URLListDataBinding.class; - } - if (identifier.equalsIgnoreCase("rootDir")) { - return LiteralStringBinding.class; - } - return null; - } - - public List getOutputIdentifiers() { - List list = new ArrayList(); - list.add("importedList"); - return list; - } - - public Class getOutputDataType(String identifier) { - if (identifier.equalsIgnoreCase("importedList")) { - return URLListDataBinding.class; - } - return null; - } - - public Map run(Map> inputData) { - // create unique process instance id - - HashMap result = new HashMap(); - try { - String pii = UUID.randomUUID().toString(); - // get JavaSaga Repository properties - getSagaRepositoryProperties(); - // wps MAP - // Initialize WPS Map - String processID = "org.n52.wps.server.algorithm.importgrid.ImportData"; - HashMap WPSmap = new HashMap(); - WPSmap.put("WPS_DEPLOY_PROCESS_DIR", GridFilesDir - + "deploy/process/"); - WPSmap.put("WPS_DEPLOY_AUXDATA_DIR", GridFilesDir - + "deploy/auxdata/"); - WPSmap.put("WPS_JOB_INPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/inputs"); - WPSmap.put("WPS_JOB_OUTPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/outputs"); - WPSmap.put("WPS_JOB_AUDITS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/audits"); - WPSmap.put("WPS_JOB_RESULTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/results"); - WPSmap.put("WPS_JOB_RESULTS_URL", WPSPublicationPrefix + processID - + "/" + pii + "/${GAI_JOB_UID}/results"); - LOGGER.info("pii:" + pii); - // load registry - processingRegistry = new ProcessingRegistry(false); - // Read inputs - List sourceListData = inputData.get("sourceList"); - if (sourceListData == null || sourceListData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - List rootDirData = inputData.get("rootDir"); - if (rootDirData == null || rootDirData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - String rootDir = (String) rootDirData - .get(0).getPayload(); - if(!rootDir.endsWith(File.separator)) { - rootDir = rootDir + File.separator; - } - URLListDocument sourceListDoc = (URLListDocument) sourceListData - .get(0).getPayload(); - // Retrieve this algorithm directory path - String thisPath = this.getClass().getProtectionDomain() - .getCodeSource().getLocation().toString(); - thisPath = thisPath.replaceFirst("file:", ""); - thisPath = thisPath.substring(0, thisPath.indexOf("WEB-INF")) - + "WEB-INF"; - String thisDir = thisPath + File.separator + "TempJSDL"; - LOGGER.info("thisDir: " + thisDir); - (new File(thisDir)).mkdirs(); - String dummyDir = GridFilesDir + "deploy/process/Copy/"; - String dummyPath = dummyDir + "copy.sh"; - (new File(dummyDir)).mkdirs(); - LOGGER.info("dummyPath: " + dummyPath); - (new File(dummyPath)).createNewFile(); - - // Construct the JSDL - - JobDefinitionDocument jsdlDoc = JobDefinitionDocument.Factory - .newInstance(); - JobDescriptionType jsdlDec = jsdlDoc.addNewJobDefinition() - .addNewJobDescription(); - JobIdentificationType jobId = jsdlDec.addNewJobIdentification(); - jobId.setJobName("ImportedData_${GAI_JOB_UID}"); - jobId.setDescription("Transfers a file (or a directory of files) from one Grid to another"); - jobId.addJobProject("SSEGrid"); - ApplicationType jobApp = jsdlDec.addNewApplication(); - POSIXApplicationDocument posix = POSIXApplicationDocument.Factory - .newInstance(); - - POSIXApplicationType posixApp = posix.addNewPOSIXApplication(); - FileNameType echo = FileNameType.Factory.newInstance(); - echo.setStringValue("copy.sh"); - posixApp.setExecutable(echo); - // FileNameType stdin = FileNameType.Factory.newInstance(); - // stdin.setStringValue("stdin"); - // posixApp.setInput(stdin); - FileNameType stdout = FileNameType.Factory.newInstance(); - stdout.setStringValue("stdout"); - posixApp.setOutput(stdout); - FileNameType error = FileNameType.Factory.newInstance(); - error.setStringValue("stderr"); - posixApp.setError(error); - org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType working = org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType.Factory - .newInstance(); - working.setStringValue("${GAI_JOB_WORKING_DIR}"); - //posixApp.setWorkingDirectory(working); - jobApp.set(posix); - jobApp.setApplicationName("ImportedData"); - DataStagingType dummyStage = jsdlDec.addNewDataStaging(); - dummyStage.setFileName("${GAI_JOB_WORKING_DIR}/copy.sh"); - dummyStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - dummyStage.addNewSource().setURI( - "${WPS_DEPLOY_PROCESS_DIR}Copy/copy.sh"); - - DataStagingType exitStage = jsdlDec.addNewDataStaging(); - exitStage.setFileName("${GAI_JOB_WORKING_DIR}/exitMessage"); - exitStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - exitStage.addNewTarget().setURI( - "${WPS_JOB_OUTPUTS_DIR}/exitMessage"); - - DataStagingType outStage = jsdlDec.addNewDataStaging(); - outStage.setFileName("${GAI_JOB_WORKING_DIR}/stdout"); - outStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - outStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stdout"); - - DataStagingType errStage = jsdlDec.addNewDataStaging(); - errStage.setFileName("${GAI_JOB_WORKING_DIR}/stderr"); - errStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - errStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stderr"); - - // Modify jsdlDoc - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - //String subURL = sourceURL.substring(sourceURL.lastIndexOf(File.separator)+1); - String subURL = sourceURL.substring(rootDir.length()); - String destinationURL = subURL; - DataStagingType staging = jsdlDoc.getJobDefinition() - .getJobDescription().addNewDataStaging(); - staging.setFileName(destinationURL); - staging.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging.setDeleteOnTermination(false); - staging.addNewSource().setURI(sourceURL); - //DataStagingType staging2 = jsdlDoc.getJobDefinition() - //.getJobDescription().addNewDataStaging(); - /** - staging2.setFileName(subURL); - staging2.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging2.setDeleteOnTermination(true); - staging2.addNewTarget().setURI(destinationURL); - */ - } - LOGGER.info("jsdl: " + jsdlDoc.toString()); - File jsdlModifiedFile = new File(thisDir + File.separator + "jsdl_" - + pii + ".xml"); - jsdlDoc.save(jsdlModifiedFile); - LOGGER.info("written modified file: " + jsdlModifiedFile.getPath()); - - Session session = SessionFactory.createSession(false); - Context context = ContextFactory.createContext("globus"); - context.setAttribute(Context.USERPROXY, GridFilesDir + "proxy"); - session.addContext(context); - // Get delegation to that user proxy and set propoerly context - MyProxyClient.delegateProxyFromMyProxyServer(myProxyURL, 7512, - myProxyUser, myProxyPassword, 604800, context); - JobServiceImpl js = JobFactory.createJobService(session/* - * , - * gridmapGLUE - */); - JobServiceAssistant jsa = new JobServiceAssistant(js); - jsa.addSubstitutionVariables(WPSmap); - JobDescription jd = (JobDescription) JobFactory - .createJobDescription(JSDLFactory - .createJSDLDocument(jsdlModifiedFile)); - // jsa.substituteSimpleInputs(jd, (Map)(new - // HashMap())); - JobImpl jobs = null; - jobs = (JobImpl) ((JobServiceImpl) js).createJob(jd); - // create now the job execute dirs - String inputsDir = jobs - .getSubstitutedVariable("WPS_JOB_INPUTS_DIR"); - String outputsDir = jobs - .getSubstitutedVariable("WPS_JOB_OUTPUTS_DIR"); - String auditsDir = jobs - .getSubstitutedVariable("WPS_JOB_AUDITS_DIR"); - String resultsDir = jobs - .getSubstitutedVariable("WPS_JOB_RESULTS_DIR"); - - (new File(inputsDir)).mkdirs(); - (new File(outputsDir)).mkdirs(); - (new File(auditsDir)).mkdirs(); - (new File(resultsDir)).mkdirs(); - (new File(resultsDir)).setWritable(true, false); - // Create all destination directories and create output URL list - - jobs.addCallback(Job.JOB_STATE, new SagaCallbackManager()); - jobs.addCallback(Job.JOB_STATEDETAIL, new SagaCallbackManager()); - LOGGER.info("run"); - jobs.run(); - LOGGER.info("wait..."); - jobs.waitFor(); - LOGGER.info("done"); - String importedDir = "/EODATA/RESULTS_DIRS/"+jobs.getId(); - LOGGER.info("importeddir:"+importedDir); - URLListDocument importedDataDoc = URLListDocument.Factory.newInstance(); - URLList urlList = importedDataDoc.addNewURLList(); - urlList.setCount(sourceListDoc.getURLList().getCount()); - - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - String subURL = sourceURL.substring(rootDir.length()); - //sourceURL.substring(sourceURL.lastIndexOf(File.separator)+1); - String destinationURL = resultsDir+File.separator+subURL; - File destinationFile= new File(destinationURL); - destinationFile.mkdirs(); - destinationFile.setWritable(true,false); - urlList.addUrl(importedDir+File.separator+subURL); - } - boolean exitFault = false; - String[][] exitMessages; - exitMessages = jsa.readExitMessages(jobs); - for (String[] exitMessage : exitMessages) { - if (!exitMessage[0].trim().equals("0")) { - exitFault = true; - break; - } - } - result.put("importedList", new URLListDataBinding(importedDataDoc)); - } catch (Exception e) { - e.printStackTrace(); - LOGGER.info("Exception: " + e.getMessage()); - throw new RuntimeException(e); - } - return result; - - } - - private void getSagaRepositoryProperties() throws BadParameterException, - NoSuccessException { - Property[] properties = WPSConfig.getInstance() - .getPropertiesForRepositoryName("JavaSagaRepository"); - Property WPSSaga = WPSConfig.getInstance().getPropertyForKey( - properties, "GridFilesDir"); - if (WPSSaga == null) { - throw new RuntimeException( - "Error. Could not find the required GridFilesDir property in wps_config.xml"); - } - GridFilesDir = WPSSaga.getStringValue(); - Property sagaLibProp = WPSConfig.getInstance().getPropertyForKey( - properties, "SagaLibDir"); - if (sagaLibProp == null) { - throw new RuntimeException( - "Error. Could not find the required SagaLibDir property in wps_config.xml"); - } - SagaLibDir = (sagaLibProp.getStringValue()); - Property wpsPublicRoot = WPSConfig.getInstance().getPropertyForKey( - properties, "WPSPublicationPrefix"); - if (wpsPublicRoot == null) { - throw new RuntimeException( - "Error. Could not find WPSPublicationPrefix"); - } - WPSPublicationPrefix = wpsPublicRoot.getStringValue(); - - // Set the deployement process directory - DeployProcessDir = (GridFilesDir + "deploy/process/"); - Property gridmap = WPSConfig.getInstance().getPropertyForKey( - properties, "GridGlue"); - if (gridmap == null) { - throw new RuntimeException( - "Error. Could not find the required GridGlue property in wps_config.xml"); - } - // Saga.location must be loaded before the following line - GridmapGLUE = URLFactory.createURL(gridmap.getStringValue()); - // Note system properties must already be set by a previous run - Property myProxyURLProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyURL"); - if (myProxyURLProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyURL = myProxyURLProp.getStringValue(); - - Property myProxyUserProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyUser"); - if (myProxyUserProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyUser = myProxyUserProp.getStringValue(); - - Property myProxyPasswordProp = WPSConfig.getInstance() - .getPropertyForKey(properties, "MyProxyPassword"); - if (myProxyPasswordProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyPassword = myProxyPasswordProp.getStringValue(); - - } - - // Callback monitors job. - public boolean cb(Monitorable m, Metric metric, Context ctxt) { - try { - String value = metric.getAttribute(Metric.VALUE); - String name = metric.getAttribute(Metric.NAME); - System.out.println("Callback called for metric " + name - + ", value = " + value); - } catch (Throwable e) { - System.err.println("error" + e); - e.printStackTrace(System.err); - } - // Keep the callback. - return true; - } - - public void setMyProxyURL(String myProxyURL) { - this.myProxyURL = myProxyURL; - } - - public String getMyProxyURL() { - return myProxyURL; - } - - public void setMyProxyUser(String myProxyUser) { - this.myProxyUser = myProxyUser; - } - - public String getMyProxyUser() { - return myProxyUser; - } - - public void setMyProxyPassword(String myProxyPassword) { - this.myProxyPassword = myProxyPassword; - } - - public String getMyProxyPassword() { - return myProxyPassword; - } -} \ No newline at end of file diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/importgrid/ImportData2.java b/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/importgrid/ImportData2.java deleted file mode 100644 index c28390315..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/importgrid/ImportData2.java +++ /dev/null @@ -1,407 +0,0 @@ -package org.n52.wps.server.algorithm.importgrid; - -import java.io.File; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.apache.log4j.Logger; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.DataStagingType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDescriptionType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobIdentificationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.impl.CreationFlagEnumerationImpl; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.FileNameType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralStringBinding; -import org.n52.wps.server.AbstractSelfDescribingAlgorithm; -import org.n52.wps.server.profiles.JavaSaga.SagaCallbackManager; - -import org.ogf.saga.context.Context; -import org.ogf.saga.context.ContextFactory; -import org.ogf.saga.error.BadParameterException; -import org.ogf.saga.error.NoSuccessException; -import org.ogf.saga.job.Job; -import org.ogf.saga.monitoring.Metric; -import org.ogf.saga.monitoring.Monitorable; -import org.ogf.saga.session.Session; -import org.ogf.saga.session.SessionFactory; -import org.ogf.saga.url.URLFactory; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument.URLList; - -import com.terradue.ogf.saga.impl.job.JobDescription; -import com.terradue.ogf.saga.impl.job.JobFactory; -import com.terradue.ogf.saga.impl.job.JobImpl; -import com.terradue.ogf.saga.impl.job.JobServiceImpl; -import com.terradue.ogf.schema.jsdl.JSDLFactory; -import com.terradue.ssegrid.sagaext.JobServiceAssistant; -import com.terradue.ssegrid.sagaext.MyProxyClient; -import com.terradue.ssegrid.sagaext.ProcessingRegistry; - -public class ImportData2 extends AbstractSelfDescribingAlgorithm { - - private static Logger LOGGER = Logger.getLogger(ImportData2.class); - - private static String GridFilesDir; - private static String SagaLibDir; - private static org.ogf.saga.url.URL GridmapGLUE; - private ProcessingRegistry processingRegistry = null; - private String WPSPublicationPrefix; - private String DeployProcessDir; - - private String myProxyURL; - private String myProxyUser; - private String myProxyPassword; - - - public List getInputIdentifiers() { - List list = new ArrayList(); - list.add("sourceList"); - return list; - } - - public Class getInputDataType(String identifier) { - if (identifier.equalsIgnoreCase("sourceList")) { - return URLListDataBinding.class; - } - return null; - } - - public List getOutputIdentifiers() { - List list = new ArrayList(); - list.add("importedList"); - return list; - } - - public Class getOutputDataType(String identifier) { - if (identifier.equalsIgnoreCase("importedList")) { - return URLListDataBinding.class; - } - return null; - } - - public Map run(Map> inputData) { - // create unique process instance id - - HashMap result = new HashMap(); - try { - String pii = UUID.randomUUID().toString(); - // get JavaSaga Repository properties - getSagaRepositoryProperties(); - // wps MAP - // Initialize WPS Map - String processID = "org.n52.wps.server.algorithm.importgrid.ImportData2"; - HashMap WPSmap = new HashMap(); - WPSmap.put("WPS_DEPLOY_PROCESS_DIR", GridFilesDir - + "deploy/process/"); - WPSmap.put("WPS_DEPLOY_AUXDATA_DIR", GridFilesDir - + "deploy/auxdata/"); - WPSmap.put("WPS_JOB_INPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/inputs"); - WPSmap.put("WPS_JOB_OUTPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/outputs"); - WPSmap.put("WPS_JOB_AUDITS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/audits"); - WPSmap.put("WPS_JOB_RESULTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/results"); - WPSmap.put("WPS_JOB_RESULTS_URL", WPSPublicationPrefix + processID - + "/" + pii + "/${GAI_JOB_UID}/results"); - LOGGER.info("pii:" + pii); - // load registry - processingRegistry = new ProcessingRegistry(false); - // Read inputs - List sourceListData = inputData.get("sourceList"); - if (sourceListData == null || sourceListData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - - URLListDocument sourceListDoc = (URLListDocument) sourceListData - .get(0).getPayload(); - // Retrieve this algorithm directory path - String thisPath = this.getClass().getProtectionDomain() - .getCodeSource().getLocation().toString(); - thisPath = thisPath.replaceFirst("file:", ""); - thisPath = thisPath.substring(0, thisPath.indexOf("WEB-INF")) - + "WEB-INF"; - String thisDir = thisPath + File.separator + "TempJSDL"; - LOGGER.info("thisDir: " + thisDir); - (new File(thisDir)).mkdirs(); - String dummyDir = GridFilesDir + "deploy/process/Copy/"; - String dummyPath = dummyDir + "copy.sh"; - (new File(dummyDir)).mkdirs(); - LOGGER.info("dummyPath: " + dummyPath); - (new File(dummyPath)).createNewFile(); - - // Construct the JSDL - - JobDefinitionDocument jsdlDoc = JobDefinitionDocument.Factory - .newInstance(); - JobDescriptionType jsdlDec = jsdlDoc.addNewJobDefinition() - .addNewJobDescription(); - JobIdentificationType jobId = jsdlDec.addNewJobIdentification(); - jobId.setJobName("ImportedData_${GAI_JOB_UID}"); - jobId.setDescription("Transfers a file (or a directory of files) from one Grid to another"); - jobId.addJobProject("SSEGrid"); - ApplicationType jobApp = jsdlDec.addNewApplication(); - POSIXApplicationDocument posix = POSIXApplicationDocument.Factory - .newInstance(); - - POSIXApplicationType posixApp = posix.addNewPOSIXApplication(); - FileNameType echo = FileNameType.Factory.newInstance(); - echo.setStringValue("copy.sh"); - posixApp.setExecutable(echo); - // FileNameType stdin = FileNameType.Factory.newInstance(); - // stdin.setStringValue("stdin"); - // posixApp.setInput(stdin); - FileNameType stdout = FileNameType.Factory.newInstance(); - stdout.setStringValue("stdout"); - posixApp.setOutput(stdout); - FileNameType error = FileNameType.Factory.newInstance(); - error.setStringValue("stderr"); - posixApp.setError(error); - org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType working = org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType.Factory - .newInstance(); - working.setStringValue("${GAI_JOB_WORKING_DIR}"); - //posixApp.setWorkingDirectory(working); - jobApp.set(posix); - jobApp.setApplicationName("ImportedData"); - DataStagingType dummyStage = jsdlDec.addNewDataStaging(); - dummyStage.setFileName("${GAI_JOB_WORKING_DIR}/copy.sh"); - dummyStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - dummyStage.addNewSource().setURI( - "${WPS_DEPLOY_PROCESS_DIR}Copy/copy.sh"); - - DataStagingType exitStage = jsdlDec.addNewDataStaging(); - exitStage.setFileName("${GAI_JOB_WORKING_DIR}/exitMessage"); - exitStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - exitStage.addNewTarget().setURI( - "${WPS_JOB_OUTPUTS_DIR}/exitMessage"); - - DataStagingType outStage = jsdlDec.addNewDataStaging(); - outStage.setFileName("${GAI_JOB_WORKING_DIR}/stdout"); - outStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - outStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stdout"); - - DataStagingType errStage = jsdlDec.addNewDataStaging(); - errStage.setFileName("${GAI_JOB_WORKING_DIR}/stderr"); - errStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - errStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stderr"); - - // Modify jsdlDoc - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - String subURL = sourceURL.substring(sourceURL.lastIndexOf(File.separator)+1); - - String destinationURL = "${GAI_JOB_RESULTS_DIR}/"+subURL; - DataStagingType staging = jsdlDoc.getJobDefinition() - .getJobDescription().addNewDataStaging(); - staging.setFileName(subURL); - staging.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging.setDeleteOnTermination(false); - staging.addNewSource().setURI(sourceURL); - //DataStagingType staging2 = jsdlDoc.getJobDefinition() - //.getJobDescription().addNewDataStaging(); - /** - staging2.setFileName(subURL); - staging2.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging2.setDeleteOnTermination(true); - staging2.addNewTarget().setURI(destinationURL); - */ - } - LOGGER.info("jsdl: " + jsdlDoc.toString()); - File jsdlModifiedFile = new File(thisDir + File.separator + "jsdl_" - + pii + ".xml"); - jsdlDoc.save(jsdlModifiedFile); - LOGGER.info("written modified file: " + jsdlModifiedFile.getPath()); - - Session session = SessionFactory.createSession(false); - Context context = ContextFactory.createContext("globus"); - context.setAttribute(Context.USERPROXY, GridFilesDir + "proxy"); - session.addContext(context); - // Get delegation to that user proxy and set propoerly context - MyProxyClient.delegateProxyFromMyProxyServer(myProxyURL, 7512, - myProxyUser, myProxyPassword, 604800, context); - JobServiceImpl js = JobFactory.createJobService(session/* - * , - * gridmapGLUE - */); - JobServiceAssistant jsa = new JobServiceAssistant(js); - jsa.addSubstitutionVariables(WPSmap); - JobDescription jd = (JobDescription) JobFactory - .createJobDescription(JSDLFactory - .createJSDLDocument(jsdlModifiedFile)); - // jsa.substituteSimpleInputs(jd, (Map)(new - // HashMap())); - JobImpl jobs = null; - jobs = (JobImpl) ((JobServiceImpl) js).createJob(jd); - // create now the job execute dirs - String inputsDir = jobs - .getSubstitutedVariable("WPS_JOB_INPUTS_DIR"); - String outputsDir = jobs - .getSubstitutedVariable("WPS_JOB_OUTPUTS_DIR"); - String auditsDir = jobs - .getSubstitutedVariable("WPS_JOB_AUDITS_DIR"); - String resultsDir = jobs - .getSubstitutedVariable("WPS_JOB_RESULTS_DIR"); - - (new File(inputsDir)).mkdirs(); - (new File(outputsDir)).mkdirs(); - (new File(auditsDir)).mkdirs(); - (new File(resultsDir)).mkdirs(); - (new File(resultsDir)).setWritable(true, false); - // Create all destination directories and create output URL list - - jobs.addCallback(Job.JOB_STATE, new SagaCallbackManager()); - jobs.addCallback(Job.JOB_STATEDETAIL, new SagaCallbackManager()); - LOGGER.info("run"); - jobs.run(); - LOGGER.info("wait..."); - jobs.waitFor(); - LOGGER.info("done"); - String importedDir = "/EODATA/RESULTS_DIRS/"+jobs.getId(); - LOGGER.info("importeddir:"+importedDir); - URLListDocument importedDataDoc = URLListDocument.Factory.newInstance(); - URLList urlList = importedDataDoc.addNewURLList(); - urlList.setCount(sourceListDoc.getURLList().getCount()); - - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - String subURL = sourceURL.substring(sourceURL.lastIndexOf(File.separator)+1); - String destinationURL = resultsDir+File.separator+subURL; - File destinationFile= new File(destinationURL); - destinationFile.mkdirs(); - destinationFile.setWritable(true,false); - urlList.addUrl(importedDir+File.separator+subURL); - } - boolean exitFault = false; - String[][] exitMessages; - exitMessages = jsa.readExitMessages(jobs); - for (String[] exitMessage : exitMessages) { - if (!exitMessage[0].trim().equals("0")) { - exitFault = true; - break; - } - } - result.put("importedList", new URLListDataBinding(importedDataDoc)); - } catch (Exception e) { - e.printStackTrace(); - LOGGER.info("Exception: " + e.getMessage()); - throw new RuntimeException(e); - } - return result; - - } - - private void getSagaRepositoryProperties() throws BadParameterException, - NoSuccessException { - Property[] properties = WPSConfig.getInstance() - .getPropertiesForRepositoryName("JavaSagaRepository"); - Property WPSSaga = WPSConfig.getInstance().getPropertyForKey( - properties, "GridFilesDir"); - if (WPSSaga == null) { - throw new RuntimeException( - "Error. Could not find the required GridFilesDir property in wps_config.xml"); - } - GridFilesDir = WPSSaga.getStringValue(); - Property sagaLibProp = WPSConfig.getInstance().getPropertyForKey( - properties, "SagaLibDir"); - if (sagaLibProp == null) { - throw new RuntimeException( - "Error. Could not find the required SagaLibDir property in wps_config.xml"); - } - SagaLibDir = (sagaLibProp.getStringValue()); - Property wpsPublicRoot = WPSConfig.getInstance().getPropertyForKey( - properties, "WPSPublicationPrefix"); - if (wpsPublicRoot == null) { - throw new RuntimeException( - "Error. Could not find WPSPublicationPrefix"); - } - WPSPublicationPrefix = wpsPublicRoot.getStringValue(); - - // Set the deployement process directory - DeployProcessDir = (GridFilesDir + "deploy/process/"); - Property gridmap = WPSConfig.getInstance().getPropertyForKey( - properties, "GridGlue"); - if (gridmap == null) { - throw new RuntimeException( - "Error. Could not find the required GridGlue property in wps_config.xml"); - } - // Saga.location must be loaded before the following line - GridmapGLUE = URLFactory.createURL(gridmap.getStringValue()); - // Note system properties must already be set by a previous run - Property myProxyURLProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyURL"); - if (myProxyURLProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyURL = myProxyURLProp.getStringValue(); - - Property myProxyUserProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyUser"); - if (myProxyUserProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyUser = myProxyUserProp.getStringValue(); - - Property myProxyPasswordProp = WPSConfig.getInstance() - .getPropertyForKey(properties, "MyProxyPassword"); - if (myProxyPasswordProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyPassword = myProxyPasswordProp.getStringValue(); - - } - - // Callback monitors job. - public boolean cb(Monitorable m, Metric metric, Context ctxt) { - try { - String value = metric.getAttribute(Metric.VALUE); - String name = metric.getAttribute(Metric.NAME); - System.out.println("Callback called for metric " + name - + ", value = " + value); - } catch (Throwable e) { - System.err.println("error" + e); - e.printStackTrace(System.err); - } - // Keep the callback. - return true; - } - - public void setMyProxyURL(String myProxyURL) { - this.myProxyURL = myProxyURL; - } - - public String getMyProxyURL() { - return myProxyURL; - } - - public void setMyProxyUser(String myProxyUser) { - this.myProxyUser = myProxyUser; - } - - public String getMyProxyUser() { - return myProxyUser; - } - - public void setMyProxyPassword(String myProxyPassword) { - this.myProxyPassword = myProxyPassword; - } - - public String getMyProxyPassword() { - return myProxyPassword; - } -} \ No newline at end of file diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/GridDataTransfer.java b/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/GridDataTransfer.java deleted file mode 100644 index d401e5138..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/GridDataTransfer.java +++ /dev/null @@ -1,391 +0,0 @@ -package org.n52.wps.server.algorithm.intergrid; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; - -import org.apache.log4j.Logger; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.DataStagingType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDescriptionType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobIdentificationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.impl.CreationFlagEnumerationImpl; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.FileNameType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralStringBinding; -import org.n52.wps.server.AbstractSelfDescribingAlgorithm; -import org.n52.wps.server.profiles.JavaSaga.SagaCallbackManager; - -import org.ogf.saga.context.Context; -import org.ogf.saga.context.ContextFactory; -import org.ogf.saga.error.BadParameterException; -import org.ogf.saga.error.NoSuccessException; -import org.ogf.saga.job.Job; -import org.ogf.saga.monitoring.Metric; -import org.ogf.saga.monitoring.Monitorable; -import org.ogf.saga.session.Session; -import org.ogf.saga.session.SessionFactory; -import org.ogf.saga.url.URLFactory; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; - -import com.terradue.ogf.saga.impl.job.JobDescription; -import com.terradue.ogf.saga.impl.job.JobFactory; -import com.terradue.ogf.saga.impl.job.JobImpl; -import com.terradue.ogf.saga.impl.job.JobServiceImpl; -import com.terradue.ogf.schema.jsdl.JSDLFactory; -import com.terradue.ssegrid.sagaext.JobServiceAssistant; -import com.terradue.ssegrid.sagaext.MyProxyClient; -import com.terradue.ssegrid.sagaext.ProcessingRegistry; - -public class GridDataTransfer extends AbstractSelfDescribingAlgorithm { - - private static Logger LOGGER = Logger.getLogger(GridDataTransfer.class); - - private static String GridFilesDir; - private static String SagaLibDir; - private static org.ogf.saga.url.URL GridmapGLUE; - private ProcessingRegistry processingRegistry = null; - private String WPSPublicationPrefix; - private String DeployProcessDir; - - private String myProxyURL; - private String myProxyUser; - private String myProxyPassword; - - - public List getInputIdentifiers() { - List list = new ArrayList(); - list.add("sourceList"); - list.add("destinationList"); - return list; - } - - public Class getInputDataType(String identifier) { - if (identifier.equalsIgnoreCase("sourceList") - || identifier.equalsIgnoreCase("destinationList")) { - return URLListDataBinding.class; - } - return null; - } - - public List getOutputIdentifiers() { - List list = new ArrayList(); - list.add("output"); - return list; - } - - public Class getOutputDataType(String identifier) { - if (identifier.equalsIgnoreCase("output")) { - return LiteralStringBinding.class; - } - return null; - } - - public Map run(Map> inputData) { - // create unique process instance id - - HashMap result = new HashMap(); - try { - String pii = UUID.randomUUID().toString(); - // get JavaSaga Repository properties - getSagaRepositoryProperties(); - // wps MAP - // Initialize WPS Map - String processID = "GridDataTransfer"; - HashMap WPSmap = new HashMap(); - WPSmap.put("WPS_DEPLOY_PROCESS_DIR", GridFilesDir - + "deploy/process/"); - WPSmap.put("WPS_DEPLOY_AUXDATA_DIR", GridFilesDir - + "deploy/auxdata/"); - WPSmap.put("WPS_JOB_INPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/inputs"); - WPSmap.put("WPS_JOB_OUTPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/outputs"); - WPSmap.put("WPS_JOB_AUDITS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/audits"); - WPSmap.put("WPS_JOB_RESULTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/results"); - WPSmap.put("WPS_JOB_RESULTS_URL", WPSPublicationPrefix + processID - + "/" + pii + "/${GAI_JOB_UID}/results"); - LOGGER.info("pii:" + pii); - // load registry - processingRegistry = new ProcessingRegistry(false); - // Read inputs - List sourceListData = inputData.get("sourceList"); - if (sourceListData == null || sourceListData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - List destinationListData = inputData.get("destinationList"); - if (destinationListData == null || destinationListData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - URLListDocument sourceListDoc = (URLListDocument) sourceListData - .get(0).getPayload(); - URLListDocument destinationListDoc = (URLListDocument) destinationListData - .get(0).getPayload(); - // Retrieve this algorithm directory path - String thisPath = this.getClass().getProtectionDomain() - .getCodeSource().getLocation().toString(); - thisPath = thisPath.replaceFirst("file:", ""); - thisPath = thisPath.substring(0, thisPath.indexOf("WEB-INF")) - + "WEB-INF"; - String thisDir = thisPath + File.separator + "TempJSDL"; - LOGGER.info("thisDir: " + thisDir); - (new File(thisDir)).mkdirs(); - String dummyDir = GridFilesDir + "deploy/process/Dummy/"; - String dummyPath = dummyDir + "dummy.sh"; - (new File(dummyDir)).mkdirs(); - LOGGER.info("dummyPath: " + dummyPath); - (new File(dummyPath)).createNewFile(); - - // Construct the JSDL - - JobDefinitionDocument jsdlDoc = JobDefinitionDocument.Factory - .newInstance(); - JobDescriptionType jsdlDec = jsdlDoc.addNewJobDefinition() - .addNewJobDescription(); - JobIdentificationType jobId = jsdlDec.addNewJobIdentification(); - jobId.setJobName("GridDataTransfer_${GAI_JOB_UID}"); - jobId.setDescription("Transfers a file (or a directory of files) from one Grid to another"); - jobId.addJobProject("SSEGrid"); - ApplicationType jobApp = jsdlDec.addNewApplication(); - POSIXApplicationDocument posix = POSIXApplicationDocument.Factory - .newInstance(); - - POSIXApplicationType posixApp = posix.addNewPOSIXApplication(); - FileNameType echo = FileNameType.Factory.newInstance(); - echo.setStringValue("dummy.sh"); - posixApp.setExecutable(echo); - // FileNameType stdin = FileNameType.Factory.newInstance(); - // stdin.setStringValue("stdin"); - // posixApp.setInput(stdin); - FileNameType stdout = FileNameType.Factory.newInstance(); - stdout.setStringValue("stdout"); - posixApp.setOutput(stdout); - FileNameType error = FileNameType.Factory.newInstance(); - error.setStringValue("stderr"); - posixApp.setError(error); - org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType working = org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType.Factory - .newInstance(); - working.setStringValue("${GAI_JOB_WORKING_DIR}"); - //posixApp.setWorkingDirectory(working); - jobApp.set(posix); - jobApp.setApplicationName("GridDataTransfer"); - DataStagingType dummyStage = jsdlDec.addNewDataStaging(); - dummyStage.setFileName("${GAI_JOB_WORKING_DIR}/dummy.sh"); - dummyStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - dummyStage.addNewSource().setURI( - "${WPS_DEPLOY_PROCESS_DIR}Dummy/dummy.sh"); - - DataStagingType exitStage = jsdlDec.addNewDataStaging(); - exitStage.setFileName("exitMessage"); - exitStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - exitStage.addNewTarget().setURI( - "${WPS_JOB_OUTPUTS_DIR}/exitMessage"); - - DataStagingType outStage = jsdlDec.addNewDataStaging(); - outStage.setFileName("stdout"); - outStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - outStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stdout"); - - DataStagingType errStage = jsdlDec.addNewDataStaging(); - errStage.setFileName("stderr"); - errStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - errStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stderr"); - - // Modify jsdlDoc - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - String destinationURL = destinationListDoc.getURLList() - .getUrlArray(i); - DataStagingType staging = jsdlDoc.getJobDefinition() - .getJobDescription().addNewDataStaging(); - staging.setFileName(sourceURL.substring(sourceURL.lastIndexOf(File.separator)+1)); - staging.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging.setDeleteOnTermination(true); - staging.addNewSource().setURI(sourceURL); - DataStagingType staging2 = jsdlDoc.getJobDefinition() - .getJobDescription().addNewDataStaging(); - staging2.setFileName(sourceURL.substring(sourceURL.lastIndexOf(File.separator)+1)); - staging2.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging2.setDeleteOnTermination(true); - staging2.addNewTarget().setURI(destinationURL); - } - LOGGER.info("jsdl: " + jsdlDoc.toString()); - File jsdlModifiedFile = new File(thisDir + File.separator + "jsdl_" - + pii + ".xml"); - jsdlDoc.save(jsdlModifiedFile); - LOGGER.info("written modified file: " + jsdlModifiedFile.getPath()); - - Session session = SessionFactory.createSession(false); - Context context = ContextFactory.createContext("globus"); - context.setAttribute(Context.USERPROXY, GridFilesDir + "proxy"); - session.addContext(context); - // Get delegation to that user proxy and set propoerly context - MyProxyClient.delegateProxyFromMyProxyServer(myProxyURL, 7512, - myProxyUser, myProxyPassword, 604800, context); - JobServiceImpl js = JobFactory.createJobService(session/* - * , - * gridmapGLUE - */); - JobServiceAssistant jsa = new JobServiceAssistant(js); - jsa.addSubstitutionVariables(WPSmap); - JobDescription jd = (JobDescription) JobFactory - .createJobDescription(JSDLFactory - .createJSDLDocument(jsdlModifiedFile)); - // jsa.substituteSimpleInputs(jd, (Map)(new - // HashMap())); - JobImpl jobs = null; - jobs = (JobImpl) ((JobServiceImpl) js).createJob(jd); - // create now the job execute dirs - String inputsDir = jobs - .getSubstitutedVariable("WPS_JOB_INPUTS_DIR"); - String outputsDir = jobs - .getSubstitutedVariable("WPS_JOB_OUTPUTS_DIR"); - String auditsDir = jobs - .getSubstitutedVariable("WPS_JOB_AUDITS_DIR"); - String resultsDir = jobs - .getSubstitutedVariable("WPS_JOB_RESULTS_DIR"); - (new File(inputsDir)).mkdirs(); - (new File(outputsDir)).mkdirs(); - (new File(auditsDir)).mkdirs(); - (new File(resultsDir)).mkdirs(); - (new File(resultsDir)).setWritable(true, false); - jobs.addCallback(Job.JOB_STATE, new SagaCallbackManager()); - jobs.addCallback(Job.JOB_STATEDETAIL, new SagaCallbackManager()); - jobs.run(); - jobs.waitFor(); - boolean exitFault = false; - String[][] exitMessages; - exitMessages = jsa.readExitMessages(jobs); - for (String[] exitMessage : exitMessages) { - if (!exitMessage[0].trim().equals("0")) { - exitFault = true; - break; - } - } - result.put("output", new LiteralStringBinding("Successful")); - } catch (Exception e) { - e.printStackTrace(); - LOGGER.info("Exception: " + e.getMessage()); - throw new RuntimeException(e); - } - return result; - - } - - private void getSagaRepositoryProperties() throws BadParameterException, - NoSuccessException { - Property[] properties = WPSConfig.getInstance() - .getPropertiesForRepositoryName("JavaSagaRepository"); - Property WPSSaga = WPSConfig.getInstance().getPropertyForKey( - properties, "GridFilesDir"); - if (WPSSaga == null) { - throw new RuntimeException( - "Error. Could not find the required GridFilesDir property in wps_config.xml"); - } - GridFilesDir = WPSSaga.getStringValue(); - Property sagaLibProp = WPSConfig.getInstance().getPropertyForKey( - properties, "SagaLibDir"); - if (sagaLibProp == null) { - throw new RuntimeException( - "Error. Could not find the required SagaLibDir property in wps_config.xml"); - } - SagaLibDir = (sagaLibProp.getStringValue()); - Property wpsPublicRoot = WPSConfig.getInstance().getPropertyForKey( - properties, "WPSPublicationPrefix"); - if (wpsPublicRoot == null) { - throw new RuntimeException( - "Error. Could not find WPSPublicationPrefix"); - } - WPSPublicationPrefix = wpsPublicRoot.getStringValue(); - - // Set the deployement process directory - DeployProcessDir = (GridFilesDir + "deploy/process/"); - Property gridmap = WPSConfig.getInstance().getPropertyForKey( - properties, "GridGlue"); - if (gridmap == null) { - throw new RuntimeException( - "Error. Could not find the required GridGlue property in wps_config.xml"); - } - // Saga.location must be loaded before the following line - GridmapGLUE = URLFactory.createURL(gridmap.getStringValue()); - // Note system properties must already be set by a previous run - Property myProxyURLProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyURL"); - if (myProxyURLProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyURL = myProxyURLProp.getStringValue(); - - Property myProxyUserProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyUser"); - if (myProxyUserProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyUser = myProxyUserProp.getStringValue(); - - Property myProxyPasswordProp = WPSConfig.getInstance() - .getPropertyForKey(properties, "MyProxyPassword"); - if (myProxyPasswordProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyPassword = myProxyPasswordProp.getStringValue(); - - } - - // Callback monitors job. - public boolean cb(Monitorable m, Metric metric, Context ctxt) { - try { - String value = metric.getAttribute(Metric.VALUE); - String name = metric.getAttribute(Metric.NAME); - System.out.println("Callback called for metric " + name - + ", value = " + value); - } catch (Throwable e) { - System.err.println("error" + e); - e.printStackTrace(System.err); - } - // Keep the callback. - return true; - } - - public void setMyProxyURL(String myProxyURL) { - this.myProxyURL = myProxyURL; - } - - public String getMyProxyURL() { - return myProxyURL; - } - - public void setMyProxyUser(String myProxyUser) { - this.myProxyUser = myProxyUser; - } - - public String getMyProxyUser() { - return myProxyUser; - } - - public void setMyProxyPassword(String myProxyPassword) { - this.myProxyPassword = myProxyPassword; - } - - public String getMyProxyPassword() { - return myProxyPassword; - } -} \ No newline at end of file diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/description.xml b/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/description.xml deleted file mode 100644 index e999f63f4..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/description.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - GridDataTransfer - GridDataTransfer Process - Transfers files from one Grid to another - - - sourceList - List of source URLs - List of URLs of source files (or directories) to be - copied. - - - - text/xml - http://ssegrid.esa.int/wps/JavaSAGAProfile - - - - - text/xml - http://ssegrid.esa.int/wps/JavaSAGAProfile - - - - - - destinationList - List of destination URLs - List of URLs of destination files (or directories) to - be copied. - - - - text/xml - http://ssegrid.esa.int/wps/JavaSAGAProfile - - - - - text/xml - http://ssegrid.esa.int/wps/JavaSAGAProfile - - - - - - - - output - Output - Any output message. - - string - - - - - diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/jsdl.xml b/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/jsdl.xml deleted file mode 100644 index 59b54325d..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/intergrid/jsdl.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - GridDataTransfer_${GAI_JOB_UID} - Transfers a file (or a directory of files) from one Grid to another. - SSEGrid - - - - GridDataTransfer - - echo - stdin - stdout - stderr - ${GAI_JOB_WORKING_DIR} - - - - - - exitMessage - overwrite - - ${WPS_JOB_OUTPUTS_DIR}/exitMessage - - - - - stdout - overwrite - - ${WPS_JOB_AUDITS_DIR}/stdout - - - - - stderr - overwrite - - ${WPS_JOB_AUDITS_DIR}/stderr - - - - diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/publishgrid/PublishData.java b/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/publishgrid/PublishData.java deleted file mode 100644 index b46317352..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/algorithm/publishgrid/PublishData.java +++ /dev/null @@ -1,418 +0,0 @@ -package org.n52.wps.server.algorithm.publishgrid; - -import java.io.File; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; - -import org.apache.log4j.Logger; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.DataStagingType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDescriptionType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobIdentificationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.impl.CreationFlagEnumerationImpl; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.FileNameType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralStringBinding; -import org.n52.wps.server.AbstractSelfDescribingAlgorithm; -import org.n52.wps.server.profiles.JavaSaga.SagaCallbackManager; - -import org.ogf.saga.context.Context; -import org.ogf.saga.context.ContextFactory; -import org.ogf.saga.error.BadParameterException; -import org.ogf.saga.error.NoSuccessException; -import org.ogf.saga.job.Job; -import org.ogf.saga.monitoring.Metric; -import org.ogf.saga.monitoring.Monitorable; -import org.ogf.saga.session.Session; -import org.ogf.saga.session.SessionFactory; -import org.ogf.saga.url.URLFactory; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument.URLList; - -import com.terradue.ogf.saga.impl.job.JobDescription; -import com.terradue.ogf.saga.impl.job.JobFactory; -import com.terradue.ogf.saga.impl.job.JobImpl; -import com.terradue.ogf.saga.impl.job.JobServiceImpl; -import com.terradue.ogf.schema.jsdl.JSDLFactory; -import com.terradue.ssegrid.sagaext.JobServiceAssistant; -import com.terradue.ssegrid.sagaext.MyProxyClient; -import com.terradue.ssegrid.sagaext.ProcessingRegistry; - -public class PublishData extends AbstractSelfDescribingAlgorithm { - - private static Logger LOGGER = Logger.getLogger(PublishData.class); - - private static String GridFilesDir; - private static String SagaLibDir; - private static org.ogf.saga.url.URL GridmapGLUE; - private ProcessingRegistry processingRegistry = null; - private String WPSPublicationPrefix; - private String DeployProcessDir; - private String myProxyURL; - private String myProxyUser; - private String myProxyPassword; - - - public List getInputIdentifiers() { - List list = new ArrayList(); - list.add("sourceList"); - list.add("rootDir"); - return list; - } - - public Class getInputDataType(String identifier) { - if (identifier.equalsIgnoreCase("sourceList")) { - return URLListDataBinding.class; - } - if (identifier.equalsIgnoreCase("rootDir")) { - return LiteralStringBinding.class; - } - return null; - } - - public List getOutputIdentifiers() { - List list = new ArrayList(); - list.add("publishedList"); - return list; - } - - public Class getOutputDataType(String identifier) { - if (identifier.equalsIgnoreCase("publishedList")) { - return URLListDataBinding.class; - } - return null; - } - - public Map run(Map> inputData) { - // create unique process instance id - - HashMap result = new HashMap(); - try { - String pii = UUID.randomUUID().toString(); - // get JavaSaga Repository properties - getSagaRepositoryProperties(); - // wps MAP - // Initialize WPS Map - String processID = "PublishData"; - HashMap WPSmap = new HashMap(); - WPSmap.put("WPS_DEPLOY_PROCESS_DIR", GridFilesDir - + "deploy/process/"); - WPSmap.put("WPS_DEPLOY_AUXDATA_DIR", GridFilesDir - + "deploy/auxdata/"); - WPSmap.put("WPS_JOB_INPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/inputs"); - WPSmap.put("WPS_JOB_OUTPUTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/outputs"); - WPSmap.put("WPS_JOB_AUDITS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/audits"); - WPSmap.put("WPS_JOB_RESULTS_DIR", GridFilesDir + "execute/" - + processID + "/" + pii + "/${GAI_JOB_UID}/results"); - WPSmap.put("WPS_JOB_RESULTS_URL", WPSPublicationPrefix + "execute/"+ processID - + "/" + pii + "/${GAI_JOB_UID}/results"); - LOGGER.info("pii:" + pii); - // load registry - processingRegistry = new ProcessingRegistry(false); - // Read inputs - List sourceListData = inputData.get("sourceList"); - if (sourceListData == null || sourceListData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - List rootDirData = inputData.get("rootDir"); - if (rootDirData == null || rootDirData.size() != 1) { - throw new RuntimeException( - "Error while allocating input parameters"); - } - URLListDocument sourceListDoc = (URLListDocument) sourceListData - .get(0).getPayload(); - String rootDir = (String) rootDirData - .get(0).getPayload(); - if(!rootDir.endsWith(File.separator)) { - rootDir = rootDir + File.separator; - } - // Retrieve this algorithm directory path - String thisPath = this.getClass().getProtectionDomain() - .getCodeSource().getLocation().toString(); - thisPath = thisPath.replaceFirst("file:", ""); - thisPath = thisPath.substring(0, thisPath.indexOf("WEB-INF")) - + "WEB-INF"; - String thisDir = thisPath + File.separator + "TempJSDL"; - LOGGER.info("thisDir: " + thisDir); - (new File(thisDir)).mkdirs(); - String dummyDir = GridFilesDir + "deploy/process/Dummy/"; - String dummyPath = dummyDir + "dummy.sh"; - (new File(dummyDir)).mkdirs(); - LOGGER.info("dummyPath: " + dummyPath); - (new File(dummyPath)).createNewFile(); - - // Construct the JSDL - - JobDefinitionDocument jsdlDoc = JobDefinitionDocument.Factory - .newInstance(); - JobDescriptionType jsdlDec = jsdlDoc.addNewJobDefinition() - .addNewJobDescription(); - JobIdentificationType jobId = jsdlDec.addNewJobIdentification(); - jobId.setJobName("PublishData_${GAI_JOB_UID}"); - jobId.setDescription("Transfers a file (or a directory of files) from one Grid to another"); - jobId.addJobProject("SSEGrid"); - ApplicationType jobApp = jsdlDec.addNewApplication(); - POSIXApplicationDocument posix = POSIXApplicationDocument.Factory - .newInstance(); - - POSIXApplicationType posixApp = posix.addNewPOSIXApplication(); - FileNameType echo = FileNameType.Factory.newInstance(); - echo.setStringValue("dummy.sh"); - posixApp.setExecutable(echo); - // FileNameType stdin = FileNameType.Factory.newInstance(); - // stdin.setStringValue("stdin"); - // posixApp.setInput(stdin); - FileNameType stdout = FileNameType.Factory.newInstance(); - stdout.setStringValue("stdout"); - posixApp.setOutput(stdout); - FileNameType error = FileNameType.Factory.newInstance(); - error.setStringValue("stderr"); - posixApp.setError(error); - org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType working = org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.DirectoryNameType.Factory - .newInstance(); - working.setStringValue("${GAI_JOB_WORKING_DIR}"); - //posixApp.setWorkingDirectory(working); - jobApp.set(posix); - jobApp.setApplicationName("PublishData"); - DataStagingType dummyStage = jsdlDec.addNewDataStaging(); - dummyStage.setFileName("${GAI_JOB_WORKING_DIR}/dummy.sh"); - dummyStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - dummyStage.addNewSource().setURI( - "${WPS_DEPLOY_PROCESS_DIR}Dummy/dummy.sh"); - - DataStagingType exitStage = jsdlDec.addNewDataStaging(); - exitStage.setFileName("${GAI_JOB_WORKING_DIR}/exitMessage"); - exitStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - exitStage.addNewTarget().setURI( - "${WPS_JOB_OUTPUTS_DIR}/exitMessage"); - - DataStagingType outStage = jsdlDec.addNewDataStaging(); - outStage.setFileName("${GAI_JOB_WORKING_DIR}/stdout"); - outStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - outStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stdout"); - - DataStagingType errStage = jsdlDec.addNewDataStaging(); - errStage.setFileName("${GAI_JOB_WORKING_DIR}/stderr"); - errStage.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - errStage.addNewTarget().setURI("${WPS_JOB_OUTPUTS_DIR}/stderr"); - - // Modify jsdlDoc - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - String subURL = sourceURL.substring(rootDir.length()); - MessageDigest subHash = MessageDigest.getInstance("SHA"); - String hashFile = java.net.URLEncoder.encode("TrFile"+subHash.digest(subURL.getBytes()).toString()+".tmp", "UTF-8"); - String destinationURL = "${WPS_JOB_RESULTS_DIR}/"+subURL; - DataStagingType staging = jsdlDoc.getJobDefinition() - .getJobDescription().addNewDataStaging(); - staging.setFileName(hashFile); - staging.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging.setDeleteOnTermination(true); - staging.addNewSource().setURI(sourceURL); - DataStagingType staging2 = jsdlDoc.getJobDefinition() - .getJobDescription().addNewDataStaging(); - staging2.setFileName(hashFile); - staging2.setCreationFlag(CreationFlagEnumerationImpl.OVERWRITE); - staging2.setDeleteOnTermination(true); - staging2.addNewTarget().setURI(destinationURL); - } - LOGGER.info("jsdl: " + jsdlDoc.toString()); - File jsdlModifiedFile = new File(thisDir + File.separator + "jsdl_" - + pii + ".xml"); - jsdlDoc.save(jsdlModifiedFile); - LOGGER.info("written modified file: " + jsdlModifiedFile.getPath()); - - Session session = SessionFactory.createSession(false); - Context context = ContextFactory.createContext("globus"); - context.setAttribute(Context.USERPROXY, GridFilesDir + "proxy"); - session.addContext(context); - // Get delegation to that user proxy and set propoerly context - MyProxyClient.delegateProxyFromMyProxyServer(myProxyURL, 7512, - myProxyUser, myProxyPassword, 604800, context); - JobServiceImpl js = JobFactory.createJobService(session/* - * , - * gridmapGLUE - */); - JobServiceAssistant jsa = new JobServiceAssistant(js); - jsa.addSubstitutionVariables(WPSmap); - JobDescription jd = (JobDescription) JobFactory - .createJobDescription(JSDLFactory - .createJSDLDocument(jsdlModifiedFile)); - // jsa.substituteSimpleInputs(jd, (Map)(new - // HashMap())); - JobImpl jobs = null; - jobs = (JobImpl) ((JobServiceImpl) js).createJob(jd); - // create now the job execute dirs - String inputsDir = jobs - .getSubstitutedVariable("WPS_JOB_INPUTS_DIR"); - String outputsDir = jobs - .getSubstitutedVariable("WPS_JOB_OUTPUTS_DIR"); - String auditsDir = jobs - .getSubstitutedVariable("WPS_JOB_AUDITS_DIR"); - String resultsDir = jobs - .getSubstitutedVariable("WPS_JOB_RESULTS_DIR"); - String publishedDir = jobs - .getSubstitutedVariable("WPS_JOB_RESULTS_URL"); - (new File(inputsDir)).mkdirs(); - (new File(outputsDir)).mkdirs(); - (new File(auditsDir)).mkdirs(); - (new File(resultsDir)).mkdirs(); - (new File(resultsDir)).setWritable(true, false); - // Create all destination directories and create output URL list - URLListDocument publishedDataDoc = URLListDocument.Factory.newInstance(); - URLList urlList = publishedDataDoc.addNewURLList(); - urlList.setCount(sourceListDoc.getURLList().getCount()); - for (int i = 0; i < sourceListDoc.getURLList().getUrlArray().length; i++) { - String sourceURL = sourceListDoc.getURLList().getUrlArray(i); - String subURL = sourceURL.substring(rootDir.length()); - if(subURL.startsWith(File.separator)) { - subURL = subURL.substring(1); - } - String subURLDir = subURL.substring(0, subURL.lastIndexOf(File.separator)+1); - String destinationURL = resultsDir+File.separator+subURLDir; - File destinationFile= new File(destinationURL); - destinationFile.mkdirs(); - destinationFile.setWritable(true,false); - urlList.addUrl(publishedDir+ File.separator+subURL); - } - jobs.addCallback(Job.JOB_STATE, new SagaCallbackManager()); - jobs.addCallback(Job.JOB_STATEDETAIL, new SagaCallbackManager()); - jobs.run(); - jobs.waitFor(); - boolean exitFault = false; - String[][] exitMessages; - exitMessages = jsa.readExitMessages(jobs); - for (String[] exitMessage : exitMessages) { - if (!exitMessage[0].trim().equals("0")) { - exitFault = true; - break; - } - } - result.put("publishedList", new URLListDataBinding(publishedDataDoc)); - } catch (Exception e) { - e.printStackTrace(); - LOGGER.info("Exception: " + e.getMessage()); - throw new RuntimeException(e); - } - return result; - - } - - private void getSagaRepositoryProperties() throws BadParameterException, - NoSuccessException { - Property[] properties = WPSConfig.getInstance() - .getPropertiesForRepositoryName("JavaSagaRepository"); - Property WPSSaga = WPSConfig.getInstance().getPropertyForKey( - properties, "GridFilesDir"); - if (WPSSaga == null) { - throw new RuntimeException( - "Error. Could not find the required GridFilesDir property in wps_config.xml"); - } - GridFilesDir = WPSSaga.getStringValue(); - Property sagaLibProp = WPSConfig.getInstance().getPropertyForKey( - properties, "SagaLibDir"); - if (sagaLibProp == null) { - throw new RuntimeException( - "Error. Could not find the required SagaLibDir property in wps_config.xml"); - } - SagaLibDir = (sagaLibProp.getStringValue()); - Property wpsPublicRoot = WPSConfig.getInstance().getPropertyForKey( - properties, "WPSPublicationPrefix"); - if (wpsPublicRoot == null) { - throw new RuntimeException( - "Error. Could not find WPSPublicationPrefix"); - } - WPSPublicationPrefix = wpsPublicRoot.getStringValue(); - - // Set the deployement process directory - DeployProcessDir = (GridFilesDir + "deploy/process/"); - Property gridmap = WPSConfig.getInstance().getPropertyForKey( - properties, "GridGlue"); - if (gridmap == null) { - throw new RuntimeException( - "Error. Could not find the required GridGlue property in wps_config.xml"); - } - // Saga.location must be loaded before the following line - GridmapGLUE = URLFactory.createURL(gridmap.getStringValue()); - // Note system properties must already be set by a previous run - Property myProxyURLProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyURL"); - if (myProxyURLProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyURL = myProxyURLProp.getStringValue(); - - Property myProxyUserProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyUser"); - if (myProxyUserProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyUser = myProxyUserProp.getStringValue(); - - Property myProxyPasswordProp = WPSConfig.getInstance() - .getPropertyForKey(properties, "MyProxyPassword"); - if (myProxyPasswordProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyPassword = myProxyPasswordProp.getStringValue(); - - } - - // Callback monitors job. - public boolean cb(Monitorable m, Metric metric, Context ctxt) { - try { - String value = metric.getAttribute(Metric.VALUE); - String name = metric.getAttribute(Metric.NAME); - System.out.println("Callback called for metric " + name - + ", value = " + value); - } catch (Throwable e) { - System.err.println("error" + e); - e.printStackTrace(System.err); - } - // Keep the callback. - return true; - } - - public void setMyProxyURL(String myProxyURL) { - this.myProxyURL = myProxyURL; - } - - public String getMyProxyURL() { - return myProxyURL; - } - - public void setMyProxyUser(String myProxyUser) { - this.myProxyUser = myProxyUser; - } - - public String getMyProxyUser() { - return myProxyUser; - } - - public void setMyProxyPassword(String myProxyPassword) { - this.myProxyPassword = myProxyPassword; - } - - public String getMyProxyPassword() { - return myProxyPassword; - } -} \ No newline at end of file diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/feed/movingcode/AlgorithmDescription.xsd b/52n-wps-server/src/main/java/org/n52/wps/server/feed/movingcode/AlgorithmDescription.xsd index 19be46fad..0e99366a3 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/feed/movingcode/AlgorithmDescription.xsd +++ b/52n-wps-server/src/main/java/org/n52/wps/server/feed/movingcode/AlgorithmDescription.xsd @@ -1,110 +1,110 @@ - - - - - Deployment Description for a WPS Algorithm - - - - - - URL pointing to the workspace root, e.g. "file://level1/level2/workspaceX" - - - - - URL pointing to the algorithm; relative to the workspace root. If appropriate, this location can point to some location within the container, e.g. "algorithm://executables/tools.tbx?mytools/tool2" - - - - - URN referencing the specific container, e.g. urn:n52:wps:algorithmcontainer:arctoolbox:9.3 - - - - - URN referencing a required processing backend, e.g. urn:n52:wps:gpsystem:arcgis:9.3 - - - - - A collection of the algorithm parameters - - - - - - The tool's parameters - - - - - A string that acts as a seperator between parameters, e.g. " " for SPACE - - - - - - If true, this tool's parameters are indexed through their position as integers. Otherwise, the mapping from the ows:Identifier to the respective LegacyID is done via name strings. - - - - - - - - - - - Structure for a parameter description. - - - - - A prefix string that shall be added before this parameter, e.g. "-p(" - - - - - A suffix string that shall be added before this parameter, e.g. ")" - - - - - A string that acts as a separator between individual parameter values, e.g. " " for SPACE - - - - - The Legacy ID by which the parameters are defined in the Legacy environment. Use legacyIntID for sequential parameters, legacyStrindID for parameters name strings - - - - - - - The WPS Input ID this parameter shall be mapped to. - - - - - The WPS Output ID this parameter shall be mapped to. - - - - - - - - Positive integer indicationg the position of this parameter. - - - - - - - String indicating the name of this parameter. - - - - + + + + + Deployment Description for a WPS Algorithm + + + + + + URL pointing to the workspace root, e.g. "file://level1/level2/workspaceX" + + + + + URL pointing to the algorithm; relative to the workspace root. If appropriate, this location can point to some location within the container, e.g. "algorithm://executables/tools.tbx?mytools/tool2" + + + + + URN referencing the specific container, e.g. urn:n52:wps:algorithmcontainer:arctoolbox:9.3 + + + + + URN referencing a required processing backend, e.g. urn:n52:wps:gpsystem:arcgis:9.3 + + + + + A collection of the algorithm parameters + + + + + + The tool's parameters + + + + + A string that acts as a seperator between parameters, e.g. " " for SPACE + + + + + + If true, this tool's parameters are indexed through their position as integers. Otherwise, the mapping from the ows:Identifier to the respective LegacyID is done via name strings. + + + + + + + + + + + Structure for a parameter description. + + + + + A prefix string that shall be added before this parameter, e.g. "-p(" + + + + + A suffix string that shall be added before this parameter, e.g. ")" + + + + + A string that acts as a separator between individual parameter values, e.g. " " for SPACE + + + + + The Legacy ID by which the parameters are defined in the Legacy environment. Use legacyIntID for sequential parameters, legacyStrindID for parameters name strings + + + + + + + The WPS Input ID this parameter shall be mapped to. + + + + + The WPS Output ID this parameter shall be mapped to. + + + + + + + + Positive integer indicationg the position of this parameter. + + + + + + + String indicating the name of this parameter. + + + + diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/handler/RequestHandler.java b/52n-wps-server/src/main/java/org/n52/wps/server/handler/RequestHandler.java index 1b734b06d..fb6e3b8cb 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/handler/RequestHandler.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/handler/RequestHandler.java @@ -301,12 +301,14 @@ public void handle() throws ExceptionReport { ExceptionReport exceptionReport = null; try { + LOGGER.debug("submit the task for execution"); // submit the task for execution - pool.addTask(task); - // set status to accepted status.setProcessAccepted("Request is queued for execution."); task.getRequest().getExecuteResponseBuilder().setStatus(status); + pool.addTask(task); + // set status to accepted + if (((ExecuteRequest) req).isStoreResponse()) { resp = new ExecuteResponse(execReq); resp.save(os); @@ -315,7 +317,9 @@ public void handle() throws ExceptionReport { try { // retrieve status with timeout enabled try { + LOGGER.debug("Wait for finished"); resp = task.get(); + LOGGER.debug("Succeeded"); // Thread.sleep(this.sleepingTime); status.setProcessSucceeded("Process has succeeded"); status.unsetProcessAccepted(); @@ -324,6 +328,7 @@ public void handle() throws ExceptionReport { } catch (ExecutionException ee) { // the computation threw an error // probably the client input is not valid + LOGGER.debug("Exception of execution catched"); if (ee.getCause() instanceof ExceptionReport) { exceptionReport = (ExceptionReport) ee.getCause(); } else { @@ -396,12 +401,15 @@ else if (resp == null) { try { // CancelRequest is called with the WPSTask retrieved from the // tasks registry + String taskId = ((CancelRequest) req).getCancelDom() .getCancel().getProcessInstanceIdentifier() .getInstanceId(); + LOGGER.debug("loading Task with PID "+taskId); WPSTask task = pool.getTask(taskId); resp = ((CancelRequest) req).call(task); } catch (Exception e) { + e.printStackTrace(); if (e.getCause() instanceof ExceptionReport) { exceptionReport = (ExceptionReport) e.getCause(); } else { diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/AbstractProcessManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/AbstractProcessManager.java index 861f5287a..4c6b5a0e8 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/AbstractProcessManager.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/AbstractProcessManager.java @@ -1,13 +1,43 @@ -package org.n52.wps.server.profiles; - -import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; - -public abstract class AbstractProcessManager implements IProcessManager{ - protected ITransactionalAlgorithmRepository parentRepository; - - public AbstractProcessManager(ITransactionalAlgorithmRepository parentRepository){ - this.parentRepository = parentRepository; - } - - -} +package org.n52.wps.server.profiles; + +import net.opengis.wps.x100.ExecuteResponseDocument; + +import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; + +public abstract class AbstractProcessManager implements IProcessManager { + protected ITransactionalAlgorithmRepository parentRepository; + protected ExecuteResponseDocument executeResponse; + public AbstractProcessManager( + ITransactionalAlgorithmRepository parentRepository) { + this.parentRepository = parentRepository; + } + + /** + * Wait the asynchronousCallback + * + * @throws InterruptedException + */ + public synchronized void waitCallback() throws InterruptedException { + try { + wait(); + } catch (InterruptedException e) { + throw e; + } + + catch (Exception e) { + System.out.println(e); + } + return; + } + + public synchronized void notifyRequestManager() { + notify(); + } + @Override + public void callback(ExecuteResponseDocument execRespDom) { + this.executeResponse = execRespDom; + this.notifyRequestManager(); + return; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/Data/DataDeploymentProfile.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/Data/DataDeploymentProfile.java index ca641a462..e87b55521 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/Data/DataDeploymentProfile.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/Data/DataDeploymentProfile.java @@ -1,316 +1,161 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - -package org.n52.wps.server.profiles.Data; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.Map; - -import net.opengis.wps.x100.DataDeploymentProfileType; -import net.opengis.wps.x100.DeployDataDocument; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.net.ftp.FTP; -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPFile; -import org.apache.commons.net.ftp.FTPReply; -import org.apache.log4j.Logger; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.request.deploy.DeploymentProfile; -import org.w3c.dom.Node; - -/** - * TODO rename ApacheOdeDeployementProfile to match to the XSD element type - * **/ -public class DataDeploymentProfile extends DeploymentProfile { - - private static Logger LOGGER = Logger.getLogger(DataDeploymentProfile.class); - private Node suitCase; - private Node bpel; - private Node clientWSDL; - private Map wsdlList; - private byte[] archive; - private String processId; - private boolean reference; - private String archiveRef; - - public DataDeploymentProfile(DeployDataDocument deployDom, - String processID) { - super(deployDom, processID); - try { - - extractInformation(deployDom); - } catch (Exception e) { - - e.printStackTrace(); - } - - } - - public Node getSuitCase() { - return suitCase; - } - - public Node getBPEL() { - return bpel; - } - - public Node getClientWSDL() { - return clientWSDL; - } - - public Map getWSDLList() { - return wsdlList; - } - - private void extractInformation(DeployDataDocument deployDom) - throws Exception { - - DataDeploymentProfileType deployProfile = deployDom.getDeployData().getDeploymentProfile(); - setDataId(deployDom.getDeployData().getDataDescription() - .getIdentifier().getStringValue()); - if (deployProfile.isSetArchive()) { - // Note that XMLBeans automatically decodes base64 - setArchive(deployProfile.getArchive()); - setReference(false); - } else if (deployProfile.isSetArchiveReference()) { - LOGGER.info("archive reference is set"); - setArchiveRef(deployProfile.getArchiveReference().getHref()); - LOGGER.info("downloading archive"); - setArchive(downloadArchive(getArchiveRef())); - LOGGER.info("downloaded"); - setReference(true); - - } else if (deployProfile.isSetArchiveReference()) { - setArchiveRef(deployProfile.getArchiveReference().getHref()); - setReference(true); - throw new ExceptionReport("Archive Reference not supported yet", - org.n52.wps.server.ExceptionReport.OPERATION_NOT_SUPPORTED); - } - } - private byte[] downloadHTTP(String url) throws Exception { - URL u = new URL(url); - URLConnection uc = u.openConnection(); - String contentType = uc.getContentType(); - int contentLength = uc.getContentLength(); - InputStream raw = uc.getInputStream(); - InputStream in = new BufferedInputStream(raw); - byte[] data = new byte[contentLength]; - int bytesRead = 0; - int offset = 0; - LOGGER.info("loading started..."); - while (offset < contentLength) { - System.out.print("."); - bytesRead = in.read(data, offset, data.length - offset); - if (bytesRead == -1) - break; - offset += bytesRead; - } - in.close(); - if (offset != contentLength) { - throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes"); - } - return data; - } - - /** - * This method download a binary file located at the given URL and returns the byte array - * @param archiveRef2 - * @return - * @throws IOException - */ - private byte[] downloadArchive(String url) throws IOException { - LOGGER.info("Downloading url "+url); - URL u = new URL(url); - if (StringUtils.startsWithIgnoreCase(url, "http://") - || StringUtils - .startsWithIgnoreCase(url, "https://")) { - LOGGER.info("HTTP protocol"); - byte[] data=null; - try { - data = downloadHTTP(url); - } catch (Exception e) { - LOGGER.info(e.getMessage()); - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - return data; - } else if (StringUtils.startsWithIgnoreCase(url, "ftp://")) { - LOGGER.info("FTP protocol"); - byte[] data=null; - try { - data = downloadFTP(url); - } catch (Exception e) { - LOGGER.info(e.getMessage()); - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - return data; - } - return null; - } - - private byte[] downloadFTP(String url) throws Exception { - try { - LOGGER.info("Downloading through FTP: "+url); - URL u = new URL(url); - FTPClient client = new FTPClient(); - ByteArrayOutputStream fos = null; - int port = u.getPort() == -1 ? 21 : u.getPort(); - LOGGER.info("port: "+port+ " - connecting to "+u.getHost()); - try { - client.connect(u.getHost(), port); - } - catch(Exception e) { - LOGGER.info("connection fault:"+e.getMessage()+ " " + e.getCause().toString()); - - throw e; - } - // connection error code - int reply = client.getReplyCode(); - if (!FTPReply.isPositiveCompletion(reply)) { - LOGGER.info("Disconnect on positive completion"); - client.disconnect(); - throw new ExceptionReport("FTP connection failed",ExceptionReport.NO_APPLICABLE_CODE); - } - LOGGER.info("connected"); - client.setDefaultTimeout(60000); - client.setConnectTimeout(60000); - // currently bugging - //Property[] properties = WPSConfig.getInstance().getPropertiesForServer(); - //Property ftpUserProp = WPSConfig.getInstance().getPropertyForKey( - //properties, "portalFTPUser"); - //LOGGER.info("user found in config: "+ftpUserProp.getStringValue()); - //Property ftpPassProp = WPSConfig.getInstance().getPropertyForKey( - // properties, "portalFTPPassword"); - // LOGGER.info("password found in config: "+ftpPassProp.getStringValue()); - //client.login(ftpUserProp.getStringValue(), ftpPassProp.getStringValue()); - client.login("ftpuser", "ssegrid"); - LOGGER.info("logged"); - String filename = u.getFile(); - int slashIndex = filename.lastIndexOf('/') + 1; - String parent = "."+filename.substring(0, slashIndex); - String ftpFileName = filename.substring(slashIndex); - LOGGER.info("parent:"+parent); - LOGGER.info("filename:"+filename); - FTPFile ftpFile = null; - for (FTPFile f : client.listFiles(parent)) { - if (StringUtils.equals(f.getName(), ftpFileName)) { - LOGGER.info("found"+f.getName()); - ftpFile = f; - } - } - if (ftpFile == null) { - throw new IOException("File not found: " + ftpFileName); - } - int total = (int) ftpFile.getSize(); - LOGGER.info("total:"+total); - LOGGER.info("get file name: "+filename); - fos = new ByteArrayOutputStream(); - LOGGER.info("retrieve file...."); - //client.retrieveFile("."+filename, fos); - // Set to Binary Mode !!! - client.setFileType(FTP.BINARY_FILE_TYPE); - InputStream raw = client.retrieveFileStream("."+filename); - // InputStream in = new BufferedInputStream(raw, client.getBufferSize()); - byte[] data = new byte[total]; - data = IOUtils.toByteArray(raw); - /** useless - int bytesRead = 0; - int offset = 0; - LOGGER.info("loading started..."); - while (offset < total) { - System.out.print("."); - bytesRead = in.read(data, offset, client.getBufferSize()); - if (bytesRead == -1) - break; - offset += bytesRead; - } - */ - raw.close(); - /** - if (offset != total) { - LOGGER.info("Only read " + offset + " bytes; Expected " + total + " bytes"); - // throw new IOException("Only read " + offset + " bytes; Expected " + total + " bytes"); - } - */ - LOGGER.info("retrieved"); - //byte[] data = fos.toByteArray(); - //fos.close(); - client.disconnect(); - LOGGER.info("Lenght of file:"+data.length); - return data; - } - catch(Exception e) { - throw new ExceptionReport("FTP exception",ExceptionReport.REMOTE_COMPUTATION_ERROR,e); - - } - } - - public void setArchive(byte[] archive) { - LOGGER.info("setArchive"); - this.archive = archive; - } - - public byte[] getArchive() { - return archive; - } - - public void setDataId(String processId) { - this.processId = processId; - } - - public String getDataId() { - return processId; - } - - public void setReference(boolean reference) { - this.reference = reference; - } - - public boolean isReference() { - return reference; - } - - public void setArchiveRef(String string) { - this.archiveRef = string; - } - - public String getArchiveRef() { - return archiveRef; - } - -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + +package org.n52.wps.server.profiles.Data; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import net.opengis.wps.x100.DataDeploymentProfileType; +import net.opengis.wps.x100.DeployDataDocument; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.net.ftp.FTP; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.net.ftp.FTPReply; +import org.apache.log4j.Logger; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.w3c.dom.Node; + +/** + * TODO rename ApacheOdeDeployementProfile to match to the XSD element type + * **/ +public class DataDeploymentProfile extends DeploymentProfile { + + private static Logger LOGGER = Logger.getLogger(DataDeploymentProfile.class); + private Node suitCase; + private Node bpel; + private Node clientWSDL; + private Map wsdlList; + private byte[] archive; + private String processId; + private boolean reference; + private String archiveRef; + + public DataDeploymentProfile(DeployDataDocument deployDom, + String processID) { + super(deployDom, processID); + try { + + extractInformation(deployDom); + } catch (Exception e) { + + e.printStackTrace(); + } + + } + + public Node getSuitCase() { + return suitCase; + } + + public Node getBPEL() { + return bpel; + } + + public Node getClientWSDL() { + return clientWSDL; + } + + public Map getWSDLList() { + return wsdlList; + } + + private void extractInformation(DeployDataDocument deployDom) + throws Exception { + + DataDeploymentProfileType deployProfile = deployDom.getDeployData().getDeploymentProfile(); + setDataId(deployDom.getDeployData().getDataDescription() + .getIdentifier().getStringValue()); + if (deployProfile.isSetArchive()) { + // Note that XMLBeans automatically decodes base64 + setArchive(deployProfile.getArchive()); + setReference(false); + } else if (deployProfile.isSetArchiveReference()) { + LOGGER.info("archive reference is set"); + setArchiveRef(deployProfile.getArchiveReference().getHref()); + LOGGER.info("downloading archive"); + setArchive(downloadArchive(getArchiveRef())); + LOGGER.info("downloaded"); + setReference(true); + + } else if (deployProfile.isSetArchiveReference()) { + setArchiveRef(deployProfile.getArchiveReference().getHref()); + setReference(true); + throw new ExceptionReport("Archive Reference not supported yet", + org.n52.wps.server.ExceptionReport.OPERATION_NOT_SUPPORTED); + } + } + + + + + public void setArchive(byte[] archive) { + LOGGER.info("setArchive"); + this.archive = archive; + } + + public byte[] getArchive() { + return archive; + } + + public void setDataId(String processId) { + this.processId = processId; + } + + public String getDataId() { + return processId; + } + + public void setReference(boolean reference) { + this.reference = reference; + } + + public boolean isReference() { + return reference; + } + + public void setArchiveRef(String string) { + this.archiveRef = string; + } + + public String getArchiveRef() { + return archiveRef; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/DefaultTransactionalAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/DefaultTransactionalAlgorithm.java index 786ab0af1..5ffca0120 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/DefaultTransactionalAlgorithm.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/DefaultTransactionalAlgorithm.java @@ -1,378 +1,461 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - -package org.n52.wps.server.profiles; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CancellationException; - -import net.opengis.ows.x11.ExceptionReportDocument; -import net.opengis.wps.x100.AuditTraceType; -import net.opengis.wps.x100.ExecuteDocument; -import net.opengis.wps.x100.ExecuteResponseDocument; -import net.opengis.wps.x100.InputDescriptionType; -import net.opengis.wps.x100.OutputDataType; -import net.opengis.wps.x100.OutputDescriptionType; -import net.opengis.wps.x100.ProcessDescriptionDocument; -import net.opengis.wps.x100.ProcessDescriptionType; -import org.apache.log4j.Logger; -import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlOptions; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.GenericFileDataBinding; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralBooleanBinding; -import org.n52.wps.io.data.binding.literal.LiteralDoubleBinding; -import org.n52.wps.io.data.binding.literal.LiteralIntBinding; -import org.n52.wps.io.data.binding.literal.LiteralStringBinding; -import org.n52.wps.server.AbstractTransactionalAlgorithm; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.repository.TransactionalRepositoryManager; -import org.n52.wps.server.request.ExecuteRequest; -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; - -public class DefaultTransactionalAlgorithm extends - AbstractTransactionalAlgorithm { - - private List errors; - private static Logger LOGGER = Logger - .getLogger(DefaultTransactionalAlgorithm.class); - private ProcessDescriptionType processDescription; - private IProcessManager processManager; - - private static final String OGC_OWS_URI = "http://www.opengeospatial.net/ows"; - - public DefaultTransactionalAlgorithm(String processID) { - super(processID); - WPSConfig wpsConfig = WPSConfig.getInstance(); - Property[] properties = wpsConfig.getPropertiesForAlgorithm(processID); - try { - setProcessManager(TransactionalRepositoryManager - .getProcessManagerForSchema(wpsConfig.getPropertyForKey( - properties, "supportedFormat").getStringValue())); - } catch (InstantiationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalAccessException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - this.errors = new ArrayList(); - processDescription = initializeDescription(); - } - - public ProcessDescriptionType getDescription() { - return processDescription; - } - - // TODO : BPEL has nothing to do here... - public HashMap run(ExecuteRequest req) - throws ExceptionReport { - ExecuteResponseDocument responseDocument; - HashMap resultHash = new HashMap(); - /** - * Note cnl : The DefaultTransactionAlgorithm receives an - * ExecuteResponseDocument from the backend process manager If the - * process manager returns another kind of DOM document, another - * TransactionalAlgorithm should handle this. - */ - Document invokeResponse; - LOGGER.info("DefaultTransactionAlgo Run"); - try { - invokeResponse = getProcessManager().invoke(req, getAlgorithmID()); - /** - * Parsing - */ - LOGGER.info("invoke response"); - responseDocument = ExecuteResponseDocument.Factory - .parse(invokeResponse); - LOGGER.info(responseDocument.toString()); - OutputDataType[] resultValues = responseDocument - .getExecuteResponse().getProcessOutputs().getOutputArray(); - for (int i = 0; i < resultValues.length; i++) { - OutputDataType ioElement = resultValues[i]; - String key = ioElement.getIdentifier().getStringValue(); - if (ioElement.getData().isSetLiteralData()) { - resultHash.put(key, - OutputParser.handleLiteralValue(ioElement)); - } - if (ioElement.getData().isSetComplexData()) { - resultHash.put(key, OutputParser.handleComplexValue( - ioElement, getDescription())); - } - /** - * TODO if(ioElement.isSetReference()){ resultHash.put(key, - * OutputParser.handleComplexValueReference(ioElement)); } - */ - if (ioElement.getData().getBoundingBoxData() != null) { - resultHash - .put(key, OutputParser.handleBBoxValue(ioElement)); - } - } - } catch (CancellationException e) { - throw e; - } catch (ExceptionReport e) { - e.printStackTrace(); - throw e; - } catch (Exception e) { - e.printStackTrace(); - String error = "Could not create ExecuteResponseDocument"; - errors.add(error); - LOGGER.warn(error + " Reason: " + e.getMessage()); - throw new ExceptionReport(error, - ExceptionReport.REMOTE_COMPUTATION_ERROR); - - } - return resultHash; - } - - public List getErrors() { - return errors; - } - - protected ProcessDescriptionType initializeDescription() { - String fullPath = DefaultTransactionalAlgorithm.class - .getProtectionDomain().getCodeSource().getLocation().toString(); - int searchIndex = fullPath.indexOf("WEB-INF"); - String subPath = fullPath.substring(0, searchIndex); - subPath = subPath.replaceFirst("file:", ""); - String processID = getAlgorithmID(); - // sanitize processID: strip version number and namespace if passed in - if (processID.contains("-")) - processID = processID.split("-")[0]; - if (processID.contains("}")) - processID = processID.split("}")[1]; - try { - File xmlDesc = new File(subPath + File.separator + "WEB-INF" - + File.separator + "ProcessDescriptions" + File.separator - + processID + ".xml"); - XmlOptions option = new XmlOptions(); - option.setLoadTrimTextBuffer(); - ProcessDescriptionDocument doc = ProcessDescriptionDocument.Factory - .parse(xmlDesc, option); - if (doc == null) { - LOGGER.warn("ProcessDescription does not contain any description"); - return null; - } - - doc.getProcessDescription().getIdentifier() - .setStringValue(processID); - - return doc.getProcessDescription(); - } catch (IOException e) { - LOGGER.warn("Could not initialize algorithm, parsing error: " - + getAlgorithmID(), e); - } catch (XmlException e) { - LOGGER.warn("Could not initialize algorithm, parsing error: " - + getAlgorithmID(), e); - } - return null; - - } - - public boolean processDescriptionIsValid() { - return processDescription.validate(); - } - - private Document checkResultDocument(Document doc) { - if (getFirstElementNode(doc.getFirstChild()).getNodeName().equals( - "ExceptionReport") - && getFirstElementNode(doc.getFirstChild()).getNamespaceURI() - .equals(OGC_OWS_URI)) { - try { - ExceptionReportDocument exceptionDoc = ExceptionReportDocument.Factory - .parse(doc); - throw new RuntimeException( - "Error occured while executing query"); - } catch (Exception e) { - throw new RuntimeException( - "Error while parsing ExceptionReport retrieved from server", - e); - } - } - return doc; - } - - private Node getFirstElementNode(Node node) { - if (node == null) { - return null; - } - if (node.getNodeType() == Node.ELEMENT_NODE) { - return node; - } else { - return getFirstElementNode(node.getNextSibling()); - } - - } - - public String getWellKnownName() { - return ""; - } - - public Class getInputDataType(String id) { - InputDescriptionType[] inputs = processDescription.getDataInputs() - .getInputArray(); - for (InputDescriptionType input : inputs) { - if (input.getIdentifier().getStringValue().equals(id)) { - if (input.isSetLiteralData()) { - String datatype = input.getLiteralData().getDataType() - .getStringValue(); - if (datatype.contains("tring")) { - return LiteralStringBinding.class; - } - if (datatype.contains("ollean")) { - return LiteralBooleanBinding.class; - } - if (datatype.contains("loat") || datatype.contains("ouble")) { - return LiteralDoubleBinding.class; - } - if (datatype.contains("nt")) { - return LiteralIntBinding.class; - } - } - if (input.isSetComplexData()) { - LOGGER.info("-------- complex --- --- "); - LOGGER.info(input.getComplexData().toString()); - LOGGER.info("-------- def--- --- "); - LOGGER.info(input.getComplexData().getDefault().toString()); - LOGGER.info("--------format --- --- "); - LOGGER.info(input.getComplexData().getDefault().getFormat() - .toString()); - String mimeType = input.getComplexData().getDefault() - .getFormat().getMimeType(); - if (mimeType.contains("xml") || (mimeType.contains("XML"))) { - return URLListDataBinding.class; - } else { - return URLListDataBinding.class; - } - } - } - } - throw new RuntimeException("Could not determie internal inputDataType"); - } - - public Class getOutputDataType(String id) { - OutputDescriptionType[] outputs = processDescription - .getProcessOutputs().getOutputArray(); - - for (OutputDescriptionType output : outputs) { - if (output.getIdentifier().getStringValue().equals(id)) { - LOGGER.info("output is :" + id); - if (output.isSetLiteralOutput()) { - // Missing case when dataType is not present - if (output.getLiteralOutput().getDataType() == null) { - return LiteralStringBinding.class; - } - String datatype = output.getLiteralOutput().getDataType() - .getStringValue(); - if (datatype.contains("tring")) { - return LiteralStringBinding.class; - } - if (datatype.contains("ollean")) { - return LiteralBooleanBinding.class; - } - if (datatype.contains("loat") || datatype.contains("ouble")) { - return LiteralDoubleBinding.class; - } - if (datatype.contains("nt")) { - return LiteralIntBinding.class; - } - } - if (output.isSetComplexOutput()) { - String mimeType = output.getComplexOutput().getDefault() - .getFormat().getMimeType(); - if (mimeType.contains("xml") || (mimeType.contains("XML"))) { - if (output.getComplexOutput().getDefault().getFormat() - .getSchema().contains("wps")) { - LOGGER.info("Output Data Type found is URLListDataBinding"); - return URLListDataBinding.class; - - } else { - return GenericFileDataBinding.class; - } - - } else { - return GenericFileDataBinding.class; - } - } - } - } - throw new RuntimeException("Could not determie internal inputDataType"); - } - - public Map run(Map> inputData) { - // TODO Auto-generated method stub - // processManager - return null; - } - - public void setProcessManager(IProcessManager o) { - this.processManager = o; - } - - public IProcessManager getProcessManager() { - return processManager; - } - - public AuditTraceType getAudit() throws Exception { - LOGGER.info("short"); - return getProcessManager().getAudit(); - } - - public AuditTraceType getAuditLongForm() throws Exception { - LOGGER.info("long"); - return getProcessManager().getAuditLongForm(); - } - - public void callback(ExecuteResponseDocument execRespDom) { - getProcessManager().callback(execRespDom); - return; - } - - @Override - public void cancel() { - LOGGER.info("get process manager cancel"); - getProcessManager().cancel(); - return; - } -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + +package org.n52.wps.server.profiles; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CancellationException; + +import net.opengis.ows.x11.ExceptionReportDocument; +import net.opengis.wps.x100.AuditTraceType; +import net.opengis.wps.x100.ExecuteDocument; +import net.opengis.wps.x100.ExecuteResponseDocument; +import net.opengis.wps.x100.InputDescriptionType; +import net.opengis.wps.x100.OutputDataType; +import net.opengis.wps.x100.OutputDescriptionType; +import net.opengis.wps.x100.ProcessDescriptionDocument; +import net.opengis.wps.x100.ProcessDescriptionType; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.FileFilterUtils; +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.DataListDataBinding; +import org.n52.wps.io.data.binding.complex.EODataCacheDataBinding; +import org.n52.wps.io.data.binding.complex.GenericFileDataBinding; +import org.n52.wps.io.data.binding.complex.URLListDataBinding; +import org.n52.wps.io.data.binding.literal.LiteralBooleanBinding; +import org.n52.wps.io.data.binding.literal.LiteralDoubleBinding; +import org.n52.wps.io.data.binding.literal.LiteralIntBinding; +import org.n52.wps.io.data.binding.literal.LiteralStringBinding; +import org.n52.wps.server.AbstractTransactionalAlgorithm; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.profiles.java.JavaManager; +import org.n52.wps.server.profiles.java.JavaTransactionalAlgorithm; +import org.n52.wps.server.repository.TransactionalRepositoryManager; +import org.n52.wps.server.request.ExecuteRequest; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + + + +public class DefaultTransactionalAlgorithm extends + AbstractTransactionalAlgorithm { + + private List errors; + private static Logger LOGGER = Logger + .getLogger(DefaultTransactionalAlgorithm.class); + private ProcessDescriptionType processDescription; + private IProcessManager processManager; + + private static final String OGC_OWS_URI = "http://www.opengeospatial.net/ows"; + + public DefaultTransactionalAlgorithm(String processID) { + super(processID); + WPSConfig wpsConfig = WPSConfig.getInstance(); + Property[] properties = wpsConfig.getPropertiesForAlgorithm(processID); + try { + setProcessManager(TransactionalRepositoryManager + .getProcessManagerForSchema(wpsConfig.getPropertyForKey( + properties, "supportedFormat").getStringValue())); + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + this.errors = new ArrayList(); + processDescription = initializeDescription(); + } + + public ProcessDescriptionType getDescription() { + return processDescription; + } + + // TODO : BPEL has nothing to do here... + public Map run(ExecuteRequest req) + throws ExceptionReport { + ExecuteResponseDocument responseDocument; + HashMap resultHash = new HashMap(); + /** + * Note cnl : The DefaultTransactionAlgorithm receives an + * ExecuteResponseDocument from the backend process manager If the + * process manager returns another kind of DOM document, another + * TransactionalAlgorithm should handle this. + */ + Document invokeResponse; + LOGGER.info("DefaultTransactionAlgo Run"); + try { + // in case of the specific case of JavaManager the invokeJava method must be called + // because it directly returns the Map format + if(getProcessManager() instanceof JavaManager) { + return ((JavaManager)getProcessManager()).invokeJava(req, getAlgorithmID()); + } + invokeResponse = getProcessManager().invoke(req, getAlgorithmID()); + /** + * Parsing + */ + LOGGER.info("invoke response"); + responseDocument = ExecuteResponseDocument.Factory + .parse(invokeResponse); + LOGGER.info(responseDocument.toString()); + OutputDataType[] resultValues = responseDocument + .getExecuteResponse().getProcessOutputs().getOutputArray(); + for (int i = 0; i < resultValues.length; i++) { + OutputDataType ioElement = resultValues[i]; + String key = ioElement.getIdentifier().getStringValue(); + if (ioElement.getData().isSetLiteralData()) { + resultHash.put(key, + OutputParser.handleLiteralValue(ioElement)); + } + if (ioElement.getData().isSetComplexData()) { + resultHash.put(key, OutputParser.handleComplexValue( + ioElement, getDescription())); + } + /** + * TODO if(ioElement.isSetReference()){ resultHash.put(key, + * OutputParser.handleComplexValueReference(ioElement)); } + */ + if (ioElement.getData().getBoundingBoxData() != null) { + resultHash + .put(key, OutputParser.handleBBoxValue(ioElement)); + } + } + } + catch(InterruptedException e) { + throw new CancellationException(); + } + catch (CancellationException e) { + throw e; + } catch (ExceptionReport e) { + e.printStackTrace(); + throw e; + } catch (Exception e) { + e.printStackTrace(); + String error = "Could not create ExecuteResponseDocument"; + errors.add(error); + LOGGER.warn(error + " Reason: " + e.getMessage()); + throw new ExceptionReport(error, + ExceptionReport.REMOTE_COMPUTATION_ERROR); + + } + return resultHash; + } + + public List getErrors() { + return errors; + } + + protected ProcessDescriptionType initializeDescription() { + String fullPath = DefaultTransactionalAlgorithm.class + .getProtectionDomain().getCodeSource().getLocation().toString(); + int searchIndex = fullPath.indexOf("WEB-INF"); + String subPath = fullPath.substring(0, searchIndex); + subPath = subPath.replaceFirst("file:", ""); + String processID = getAlgorithmID(); + // sanitize processID: strip version number and namespace if passed in + if (processID.contains("-")) + processID = processID.split("-")[0]; + if (processID.contains("}")) + processID = processID.split("}")[1]; + try { + File xmlDesc = new File(subPath + File.separator + "WEB-INF" + + File.separator + "ProcessDescriptions" + File.separator + + processID + ".xml"); + XmlOptions option = new XmlOptions(); + option.setLoadTrimTextBuffer(); + ProcessDescriptionDocument doc = ProcessDescriptionDocument.Factory + .parse(xmlDesc, option); + if (doc == null) { + LOGGER.warn("ProcessDescription does not contain any description"); + return null; + } + + doc.getProcessDescription().getIdentifier() + .setStringValue(processID); + + return doc.getProcessDescription(); + } catch (IOException e) { + LOGGER.warn("Could not initialize algorithm, parsing error: " + + getAlgorithmID(), e); + } catch (XmlException e) { + LOGGER.warn("Could not initialize algorithm, parsing error: " + + getAlgorithmID(), e); + } + return null; + + } + + public boolean processDescriptionIsValid() { + return processDescription.validate(); + } + + private Document checkResultDocument(Document doc) { + if (getFirstElementNode(doc.getFirstChild()).getNodeName().equals( + "ExceptionReport") + && getFirstElementNode(doc.getFirstChild()).getNamespaceURI() + .equals(OGC_OWS_URI)) { + try { + ExceptionReportDocument exceptionDoc = ExceptionReportDocument.Factory + .parse(doc); + throw new RuntimeException( + "Error occured while executing query"); + } catch (Exception e) { + throw new RuntimeException( + "Error while parsing ExceptionReport retrieved from server", + e); + } + } + return doc; + } + + private Node getFirstElementNode(Node node) { + if (node == null) { + return null; + } + if (node.getNodeType() == Node.ELEMENT_NODE) { + return node; + } else { + return getFirstElementNode(node.getNextSibling()); + } + + } + + public String getWellKnownName() { + return ""; + } + + public Class getInputDataType(String id) { + + if(getProcessManager() instanceof JavaManager) { + try { + JavaManager manager = (JavaManager)getProcessManager(); + List jarList = new ArrayList(); + String jarDir = manager.getProcessDeploymentDirectory(getAlgorithmID()); + // List all file in parent directory with jar suffix extension + Collection list = FileUtils.listFiles(new File(jarDir), FileFilterUtils.suffixFileFilter("jar"), null); + for(File f : list) { + URL jarURL = f.toURI().toURL(); + jarList.add(jarURL); + } + ClassLoader classLoader = new URLClassLoader(jarList.toArray(new URL[jarList.size()]), this.getClass().getClassLoader()); + + //if( be.spacebel.ese.data.wps.DownloadEOData) + + JavaTransactionalAlgorithm algorithm = (JavaTransactionalAlgorithm)classLoader.loadClass(algorithmID).newInstance(); + Class itype = algorithm.getInputDataType(id); + if(itype !=null) + return itype; + } + catch(Exception e) {e.printStackTrace();}; + } + InputDescriptionType[] inputs = processDescription.getDataInputs() + .getInputArray(); + for (InputDescriptionType input : inputs) { + if (input.getIdentifier().getStringValue().equals(id)) { + if (input.isSetLiteralData()) { + String datatype = input.getLiteralData().getDataType() + .getStringValue(); + if (datatype.contains("tring")) { + return LiteralStringBinding.class; + } + if (datatype.contains("ollean")) { + return LiteralBooleanBinding.class; + } + if (datatype.contains("loat") || datatype.contains("ouble")) { + return LiteralDoubleBinding.class; + } + if (datatype.contains("nt")) { + return LiteralIntBinding.class; + } + } + if (input.isSetComplexData()) { + LOGGER.info("-------- complex --- --- "); + LOGGER.info(input.getComplexData().toString()); + LOGGER.info("-------- def--- --- "); + LOGGER.info(input.getComplexData().getDefault().toString()); + LOGGER.info("--------format --- --- "); + LOGGER.info(input.getComplexData().getDefault().getFormat() + .toString()); + String mimeType = input.getComplexData().getDefault() + .getFormat().getMimeType(); + if (mimeType.contains("xml") || (mimeType.contains("XML"))) { + return URLListDataBinding.class; + } else { + return URLListDataBinding.class; + } + } + } + } + throw new RuntimeException("Could not determie internal inputDataType"); + } + + public Class getOutputDataType(String id) { + if(getProcessManager() instanceof JavaManager) { + try { + JavaManager manager = (JavaManager)getProcessManager(); + List jarList = new ArrayList(); + String jarDir = manager.getProcessDeploymentDirectory(getAlgorithmID()); + // List all file in parent directory with jar suffix extension + Collection list = FileUtils.listFiles(new File(jarDir), FileFilterUtils.suffixFileFilter("jar"), null); + for(File f : list) { + URL jarURL = f.toURI().toURL(); + jarList.add(jarURL); + } + ClassLoader classLoader = new URLClassLoader(jarList.toArray(new URL[jarList.size()]), this.getClass().getClassLoader()); + + //if( be.spacebel.ese.data.wps.DownloadEOData) + + JavaTransactionalAlgorithm algorithm = (JavaTransactionalAlgorithm)classLoader.loadClass(algorithmID).newInstance(); + Class itype = algorithm.getOutputDataType(id); + if(itype !=null) { + LOGGER.info("itype is not null so using the implemented local method"); + return itype; + } + + } + catch(Exception e) {e.printStackTrace();}; + } + LOGGER.info("LOOKing for standard default transactional algorithm output class"); + OutputDescriptionType[] outputs = processDescription + .getProcessOutputs().getOutputArray(); + + for (OutputDescriptionType output : outputs) { + if (output.getIdentifier().getStringValue().equals(id)) { + LOGGER.info("output is :" + id); + if (output.isSetLiteralOutput()) { + // Missing case when dataType is not present + if (output.getLiteralOutput().getDataType() == null) { + return LiteralStringBinding.class; + } + String datatype = output.getLiteralOutput().getDataType() + .getStringValue(); + if (datatype.contains("tring")) { + return LiteralStringBinding.class; + } + if (datatype.contains("ollean")) { + return LiteralBooleanBinding.class; + } + if (datatype.contains("loat") || datatype.contains("ouble")) { + return LiteralDoubleBinding.class; + } + if (datatype.contains("nt")) { + return LiteralIntBinding.class; + } + } + if (output.isSetComplexOutput()) { + String mimeType = output.getComplexOutput().getDefault() + .getFormat().getMimeType(); + if (mimeType.contains("xml") || (mimeType.contains("XML"))) { + if (output.getComplexOutput().getDefault().getFormat() + .getSchema().contains("URLList")) { + LOGGER.info("Output Data Type found is URLListDataBinding"); + return URLListDataBinding.class; + + } + else if (output.getComplexOutput().getDefault().getFormat() + .getSchema().contains("DataList")) { + LOGGER.info("Output Data Type found is URLListDataBinding"); + return DataListDataBinding.class; + + } + else if (output.getComplexOutput().getDefault().getFormat() + .getSchema().contains("EODataCache")) { + LOGGER.info("Output Data Type found is URLListDataBinding"); + return EODataCacheDataBinding.class; + + } + + + else { + return GenericFileDataBinding.class; + } + + } else { + return GenericFileDataBinding.class; + } + } + } + } + throw new RuntimeException("Could not determie internal inputDataType"); + } + + public Map run(Map> inputData) { + // TODO Auto-generated method stub + // processManager + return null; + } + + public void setProcessManager(IProcessManager o) { + this.processManager = o; + } + + public IProcessManager getProcessManager() { + return processManager; + } + + public AuditTraceType getAudit() throws Exception { + LOGGER.info("short"); + return getProcessManager().getAudit(); + } + + public AuditTraceType getAuditLongForm() throws Exception { + LOGGER.info("long"); + return getProcessManager().getAuditLongForm(); + } + + public void callback(ExecuteResponseDocument execRespDom) { + getProcessManager().callback(execRespDom); + return; + } + + @Override + public void cancel() { + LOGGER.info("get process manager cancel"); + getProcessManager().cancel(); + return; + } +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IDataManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IDataManager.java index 79aa6712e..3906a77d5 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IDataManager.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IDataManager.java @@ -1,55 +1,46 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - - -package org.n52.wps.server.profiles; - -import java.util.Collection; -import java.util.HashMap; - -import net.opengis.wps.x100.ExecuteDocument; -import net.opengis.wps.x100.UndeployDataDocument.UndeployData; - -import org.n52.wps.io.data.IData; -import org.n52.wps.server.request.DeployDataRequest; -import org.n52.wps.server.request.DeployProcessRequest; -import org.n52.wps.server.request.UndeployDataRequest; -import org.n52.wps.server.request.UndeployProcessRequest; -import org.w3c.dom.Document; - -public interface IDataManager { - - - boolean unDeployData(UndeployDataRequest request) throws Exception; - boolean containsData(String processID) throws Exception; - Collection getAllDatas() throws Exception; - boolean deployData(DeployDataRequest request) throws Exception; - -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + + +package org.n52.wps.server.profiles; + +import java.util.Collection; +import org.n52.wps.server.request.DeployDataRequest; +import org.n52.wps.server.request.UndeployDataRequest; + +public interface IDataManager { + + + boolean unDeployData(UndeployDataRequest request) throws Exception; + boolean containsData(String processID) throws Exception; + Collection getAllDatas() throws Exception; + boolean deployData(DeployDataRequest request) throws Exception; + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IProcessManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IProcessManager.java index 7d9fac6ad..0666c3dc6 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IProcessManager.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IProcessManager.java @@ -1,62 +1,64 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - - -package org.n52.wps.server.profiles; - -import java.util.Collection; -import java.util.HashMap; - -import net.opengis.wps.x100.AuditTraceType; -import net.opengis.wps.x100.ExecuteDocument; -import net.opengis.wps.x100.ExecuteResponseDocument; - -import org.n52.wps.io.data.IData; -import org.n52.wps.server.request.DeployProcessRequest; -import org.n52.wps.server.request.ExecuteRequest; -import org.n52.wps.server.request.UndeployProcessRequest; -import org.w3c.dom.Document; - -public interface IProcessManager { - - - boolean unDeployProcess(UndeployProcessRequest request) throws Exception; - boolean containsProcess(String processID) throws Exception; - Collection getAllProcesses() throws Exception; - Document invoke(ExecuteDocument payload, String algorithmID) throws Exception; - Document invoke(ExecuteRequest request, String algorithmID) throws Exception; - boolean deployProcess(DeployProcessRequest request) throws Exception; - AuditTraceType getAuditLongForm() throws Exception; - AuditTraceType getAudit() throws Exception; - - String getIID(); - void callback(ExecuteResponseDocument execRespDom); - void cancel(); -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + + +package org.n52.wps.server.profiles; + +import java.util.Collection; +import java.util.HashMap; + +import net.opengis.wps.x100.AuditTraceType; +import net.opengis.wps.x100.ExecuteDocument; +import net.opengis.wps.x100.ExecuteResponseDocument; + +import org.n52.wps.io.data.IData; +import org.n52.wps.server.request.DeployProcessRequest; +import org.n52.wps.server.request.ExecuteRequest; +import org.n52.wps.server.request.UndeployProcessRequest; +import org.w3c.dom.Document; + +public interface IProcessManager { + + boolean unDeployProcess(UndeployProcessRequest request) throws Exception; + boolean containsProcess(String processID) throws Exception; + Collection getAllProcesses() throws Exception; + Document invoke(ExecuteDocument payload, String algorithmID) throws Exception; + Document invoke(ExecuteRequest request, String algorithmID) throws Exception; + boolean deployProcess(DeployProcessRequest request) throws Exception; + AuditTraceType getAuditLongForm() throws Exception; + AuditTraceType getAudit() throws Exception; + + String getIID(); + void callback(ExecuteResponseDocument execRespDom); + void cancel(); + + + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ApacheOdeProcessManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ApacheOdeProcessManager.java index 8e284c59e..74c1e5e79 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ApacheOdeProcessManager.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ApacheOdeProcessManager.java @@ -64,14 +64,14 @@ import org.n52.wps.server.request.ExecuteRequest; import org.n52.wps.server.request.UndeployProcessRequest; import org.n52.wps.server.request.deploy.DeploymentProfile; -import org.w3.x2005.x08.addressing.MessageIDDocument; -import org.w3.x2005.x08.addressing.ReplyToDocument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; +import xint.esa.ese.wps.format.urlList.URLListDocument; + + /** * TODO this class was based on transactional branch implementation. However the diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/BPELDeploymentProfile.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/BPELDeploymentProfile.java index 27682ea9d..5e54ee17d 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/BPELDeploymentProfile.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/BPELDeploymentProfile.java @@ -1,242 +1,154 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - -package org.n52.wps.server.profiles.IntalioBPMS; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.Map; - -import net.opengis.wps.x100.ApacheOdeDeploymentProfileType; -import net.opengis.wps.x100.DeployProcessDocument; - -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPReply; -import org.apache.log4j.Logger; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.request.deploy.DeploymentProfile; -import org.w3c.dom.Node; - -/** - * TODO rename ApacheOdeDeployementProfile to match to the XSD element type - * **/ -public class BPELDeploymentProfile extends DeploymentProfile { - - private static Logger LOGGER = Logger.getLogger(BPELDeploymentProfile.class); - private Node suitCase; - private Node bpel; - private Node clientWSDL; - private Map wsdlList; - private byte[] archive; - private String processId; - private boolean reference; - private String archiveRef; - - public BPELDeploymentProfile(DeployProcessDocument deployDom, - String processID) { - super(deployDom, processID); - try { - - extractInformation(deployDom); - } catch (Exception e) { - - e.printStackTrace(); - } - - } - - public Node getSuitCase() { - return suitCase; - } - - public Node getBPEL() { - return bpel; - } - - public Node getClientWSDL() { - return clientWSDL; - } - - public Map getWSDLList() { - return wsdlList; - } - - private void extractInformation(DeployProcessDocument deployDom) - throws Exception { - - ApacheOdeDeploymentProfileType deployProfile = (ApacheOdeDeploymentProfileType) deployDom.getDeployProcess().getDeploymentProfile().changeType(ApacheOdeDeploymentProfileType.type); - if(!deployProfile.validate()) { - throw new ExceptionReport("BPEL Deploy Profile is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); - } - setProcessId(deployDom.getDeployProcess().getProcessDescription() - .getIdentifier().getStringValue()); - if (deployProfile.isSetArchive()) { - // Note that XMLBeans automatically decodes base64 - setArchive(deployProfile.getArchive()); - setReference(false); - } else if (deployProfile.isSetArchiveReference()) { - setArchiveRef(deployProfile.getArchiveReference().getHref()); - LOGGER.info("downloading archive"); - setArchive(downloadArchive(getArchiveRef())); - setReference(true); - } - } - - private byte[] downloadHTTP(String url) throws Exception { - URL u = new URL(url); - URLConnection uc = u.openConnection(); - String contentType = uc.getContentType(); - int contentLength = uc.getContentLength(); - InputStream raw = uc.getInputStream(); - InputStream in = new BufferedInputStream(raw); - byte[] data = new byte[contentLength]; - int bytesRead = 0; - int offset = 0; - LOGGER.info("loading started..."); - while (offset < contentLength) { - System.out.print("."); - bytesRead = in.read(data, offset, data.length - offset); - if (bytesRead == -1) - break; - offset += bytesRead; - } - in.close(); - if (offset != contentLength) { - throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes"); - } - return data; - } - - /** - * This method download a binary file located at the given URL and returns the byte array - * TODO move to an util class - * @param archiveRef2 - * @return - * @throws IOException - */ - private byte[] downloadArchive(String url) throws IOException { - LOGGER.info("Downloading url "+url); - URL u = new URL(url); - if (StringUtils.startsWithIgnoreCase(url, "http://") - || StringUtils - .startsWithIgnoreCase(url, "https://")) { - LOGGER.info("HTTP protocol"); - byte[] data=null; - try { - data = downloadHTTP(url); - } catch (Exception e) { - LOGGER.info(e.getMessage()); - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - return data; - } else if (StringUtils.startsWithIgnoreCase(url, "ftp://")) { - LOGGER.info("FTP protocol"); - byte[] data=null; - try { - data = downloadFTP(url); - } catch (Exception e) { - LOGGER.info(e.getMessage()); - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - return data; - } - return null; - } - - private byte[] downloadFTP(String url) throws Exception { - URL u = new URL(url); - FTPClient client = new FTPClient(); - ByteArrayOutputStream fos = null; - client.connect(u.getHost(), u.getPort()); - // hardcoded - Property[] properties = WPSConfig.getInstance().getPropertiesForServer(); - Property ftpUserProp = WPSConfig.getInstance().getPropertyForKey( - properties, "portalFTPUser"); - Property ftpPassProp = WPSConfig.getInstance().getPropertyForKey( - properties, "portalFTPPassword"); - client.login(ftpUserProp.getStringValue(), ftpPassProp.getStringValue()); - int reply = client.getReplyCode(); - if (!FTPReply.isPositiveCompletion(reply)) { - client.disconnect(); - } - String filename = u.getFile(); - fos = new ByteArrayOutputStream(); - client.retrieveFile(filename, fos); - byte[] data = fos.toByteArray(); - fos.close(); - client.disconnect(); - return data; - } - - - - public void setArchive(byte[] archive) { - LOGGER.info("setArchive"); - this.archive = archive; - } - - public byte[] getArchive() { - return archive; - } - - public void setProcessId(String processId) { - this.processId = processId; - } - - public String getProcessId() { - return processId; - } - - public void setReference(boolean reference) { - this.reference = reference; - } - - public boolean isReference() { - return reference; - } - - public void setArchiveRef(String string) { - this.archiveRef = string; - } - - public String getArchiveRef() { - return archiveRef; - } - -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + +package org.n52.wps.server.profiles.IntalioBPMS; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import net.opengis.wps.x100.ApacheOdeDeploymentProfileType; +import net.opengis.wps.x100.DeployProcessDocument; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPReply; +import org.apache.log4j.Logger; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.w3c.dom.Node; + +/** + * TODO rename ApacheOdeDeployementProfile to match to the XSD element type + * **/ +public class BPELDeploymentProfile extends DeploymentProfile { + + private static Logger LOGGER = Logger.getLogger(BPELDeploymentProfile.class); + private Node suitCase; + private Node bpel; + private Node clientWSDL; + private Map wsdlList; + private byte[] archive; + private String processId; + private boolean reference; + private String archiveRef; + + public BPELDeploymentProfile(DeployProcessDocument deployDom, + String processID) { + super(deployDom, processID); + try { + + extractInformation(deployDom); + } catch (Exception e) { + + e.printStackTrace(); + } + + } + + public Node getSuitCase() { + return suitCase; + } + + public Node getBPEL() { + return bpel; + } + + public Node getClientWSDL() { + return clientWSDL; + } + + public Map getWSDLList() { + return wsdlList; + } + + private void extractInformation(DeployProcessDocument deployDom) + throws Exception { + + ApacheOdeDeploymentProfileType deployProfile = (ApacheOdeDeploymentProfileType) deployDom.getDeployProcess().getDeploymentProfile().changeType(ApacheOdeDeploymentProfileType.type); + if(!deployProfile.validate()) { + throw new ExceptionReport("BPEL Deploy Profile is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + setProcessId(deployDom.getDeployProcess().getProcessDescription() + .getIdentifier().getStringValue()); + if (deployProfile.isSetArchive()) { + // Note that XMLBeans automatically decodes base64 + setArchive(deployProfile.getArchive()); + setReference(false); + } else if (deployProfile.isSetArchiveReference()) { + setArchiveRef(deployProfile.getArchiveReference().getHref()); + LOGGER.info("downloading archive"); + setArchive(downloadArchive(getArchiveRef())); + setReference(true); + } + } + + + + public void setArchive(byte[] archive) { + LOGGER.info("setArchive"); + this.archive = archive; + } + + public byte[] getArchive() { + return archive; + } + + public void setProcessId(String processId) { + this.processId = processId; + } + + public String getProcessId() { + return processId; + } + + public void setReference(boolean reference) { + this.reference = reference; + } + + public boolean isReference() { + return reference; + } + + public void setArchiveRef(String string) { + this.archiveRef = string; + } + + public String getArchiveRef() { + return archiveRef; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/CallbackManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/CallbackManager.java index b30a5efd7..c07c38d65 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/CallbackManager.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/CallbackManager.java @@ -1,57 +1,53 @@ -package org.n52.wps.server.profiles.IntalioBPMS; - -import net.opengis.wps.x100.ExecuteResponseDocument; -import net.opengis.wps.x100.ExecuteResponseDocument.ExecuteResponse; - -import org.apache.axis2.client.async.AxisCallback; -import org.apache.axis2.context.MessageContext; -import org.apache.axis2.saaj.util.SAAJUtil; -import org.apache.axis2.util.XMLUtils; -import org.apache.log4j.spi.LoggerFactory; -import org.apache.xmlbeans.XmlException; -import org.w3c.dom.Document; - -public class CallbackManager implements AxisCallback { - - private String id = "0"; - public boolean completed = false; - private ApacheOdeProcessManager pm; - - public CallbackManager(ApacheOdeProcessManager pm) { - this.pm = pm; - } - - @Override - public void onComplete() { - this.pm.notifyRequestManager(); - } - - @Override - public void onError(Exception arg0) { - // TODO - System.out.println("Unhandled error"); - } - - @Override - public void onFault(MessageContext arg0) { - // TODO Auto-generated method stub - System.out.println("Thread #" + this.id + " fault"); - } - - @Override - public void onMessage(MessageContext message) { - Document envelope = SAAJUtil.getDocumentFromSOAPEnvelope(message - .getEnvelope()); - ExecuteResponseDocument result = null; - try { - result = ExecuteResponseDocument.Factory.parse(envelope - .getFirstChild().getChildNodes().item(1).getFirstChild()); - } catch (XmlException e) { - e.printStackTrace(); - } - if (result instanceof ExecuteResponseDocument) { - this.pm.setExecuteResponse((ExecuteResponseDocument) result); - } - } - -} +package org.n52.wps.server.profiles.IntalioBPMS; + +import net.opengis.wps.x100.ExecuteResponseDocument; +import org.apache.axis2.client.async.AxisCallback; +import org.apache.axis2.context.MessageContext; +import org.apache.axis2.saaj.util.SAAJUtil; +import org.apache.xmlbeans.XmlException; +import org.w3c.dom.Document; + +public class CallbackManager implements AxisCallback { + + private String id = "0"; + public boolean completed = false; + private ApacheOdeProcessManager pm; + + public CallbackManager(ApacheOdeProcessManager pm) { + this.pm = pm; + } + + @Override + public void onComplete() { + this.pm.notifyRequestManager(); + } + + @Override + public void onError(Exception arg0) { + // TODO + System.out.println("Unhandled error"); + } + + @Override + public void onFault(MessageContext arg0) { + // TODO Auto-generated method stub + System.out.println("Thread #" + this.id + " fault"); + } + + @Override + public void onMessage(MessageContext message) { + Document envelope = SAAJUtil.getDocumentFromSOAPEnvelope(message + .getEnvelope()); + ExecuteResponseDocument result = null; + try { + result = ExecuteResponseDocument.Factory.parse(envelope + .getFirstChild().getChildNodes().item(1).getFirstChild()); + } catch (XmlException e) { + e.printStackTrace(); + } + if (result instanceof ExecuteResponseDocument) { + this.pm.setExecuteResponse((ExecuteResponseDocument) result); + } + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ODEServiceClient.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ODEServiceClient.java index f9931fd40..165dd3d74 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ODEServiceClient.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/IntalioBPMS/ODEServiceClient.java @@ -16,7 +16,7 @@ import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.transport.http.HTTPConstants; -import org.apache.ode.utils.Namespaces; + /** * @@ -71,7 +71,7 @@ public OMElement send(OMElement msg, String url, long timeout, String action) th public OMElement buildMessage(String operation, String[] params, Object[] values) { OMFactory _factory = OMAbstractFactory.getOMFactory(); - OMNamespace pmns = _factory.createOMNamespace(Namespaces.ODE_PMAPI_NS, "pmapi"); + OMNamespace pmns = _factory.createOMNamespace("", "pmapi"); OMElement root = _factory.createOMElement(operation, pmns); for (int m = 0; m < params.length; m++) { OMElement omelmt = _factory.createOMElement(params[m], null); diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/JavaSagaDeploymentProfile.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/JavaSagaDeploymentProfile.java deleted file mode 100644 index b45261149..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/JavaSagaDeploymentProfile.java +++ /dev/null @@ -1,334 +0,0 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - -package org.n52.wps.server.profiles.JavaSaga; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.Map; - -import net.opengis.wps.x100.DeployProcessDocument; -import net.opengis.wps.x100.SagaDeploymentProfileType; -import net.opengis.wps.x100.SagaDeploymentProfileType.JsdlTemplate; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.net.ftp.FTP; -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPFile; -import org.apache.commons.net.ftp.FTPReply; - - -import org.apache.log4j.Logger; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.request.deploy.DeploymentProfile; -import org.w3c.dom.Node; - - -/** - * TODO rename ApacheOdeDeployementProfile to match to the XSD element type - * **/ -public class JavaSagaDeploymentProfile extends DeploymentProfile { - - private static Logger LOGGER = Logger.getLogger(JavaSagaDeploymentProfile.class); - private Node suitCase; - private Node bpel; - private Node clientWSDL; - private Map wsdlList; - private byte[] archive; - private String processId; - private boolean reference; - private String archiveRef; - private JsdlTemplate jsdlTemplate; - - public JavaSagaDeploymentProfile(DeployProcessDocument deployDom, - String processID) { - super(deployDom, processID); - LOGGER.info("Java Saga Deployement Profile creating instance"); - try { - - extractInformation(deployDom); - } catch (Exception e) { - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - - } - - public Node getSuitCase() { - return suitCase; - } - - public Node getBPEL() { - return bpel; - } - - public Node getClientWSDL() { - return clientWSDL; - } - - public Map getWSDLList() { - return wsdlList; - } - - private void extractInformation(DeployProcessDocument deployDom) - throws Exception { - LOGGER.info("extract information from saga profile"); - SagaDeploymentProfileType deployProfile = (SagaDeploymentProfileType) deployDom.getDeployProcess().getDeploymentProfile().changeType(SagaDeploymentProfileType.type); - if(!deployProfile.validate()) { - throw new ExceptionReport("Saga Deploy Profile is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); - } - - LOGGER.info("deployProfile doc:"+deployProfile.toString()); - setProcessId(deployDom.getDeployProcess().getProcessDescription() - .getIdentifier().getStringValue()); - if (deployProfile.isSetArchive()) { - // Note that XMLBeans automatically decodes base64 - setArchive(deployProfile.getArchive()); - setReference(false); - } else if (deployProfile.isSetArchiveReference()) { - LOGGER.info("archive reference is set"); - setArchiveRef(deployProfile.getArchiveReference().getHref()); - LOGGER.info("downloading archive"); - setArchive(downloadArchive(getArchiveRef())); - LOGGER.info("downloaded"); - setReference(true); - } - //LOGGER.info(deployProfile.getJsdlTemplate()); - setJsdlTemplate(deployProfile.getJsdlTemplate()); - } - - private byte[] downloadHTTP(String url) throws Exception { - URL u = new URL(url); - URLConnection uc = u.openConnection(); - String contentType = uc.getContentType(); - int contentLength = uc.getContentLength(); - InputStream raw = uc.getInputStream(); - InputStream in = new BufferedInputStream(raw); - byte[] data = new byte[contentLength]; - int bytesRead = 0; - int offset = 0; - LOGGER.info("loading started..."); - while (offset < contentLength) { - System.out.print("."); - bytesRead = in.read(data, offset, data.length - offset); - if (bytesRead == -1) - break; - offset += bytesRead; - } - in.close(); - if (offset != contentLength) { - throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes"); - } - return data; - } - - /** - * This method download a binary file located at the given URL and returns the byte array - * @param archiveRef2 - * @return - * @throws IOException - */ - private byte[] downloadArchive(String url) throws IOException { - LOGGER.info("Downloading url "+url); - URL u = new URL(url); - if (StringUtils.startsWithIgnoreCase(url, "http://") - || StringUtils - .startsWithIgnoreCase(url, "https://")) { - LOGGER.info("HTTP protocol"); - byte[] data=null; - try { - data = downloadHTTP(url); - } catch (Exception e) { - LOGGER.info(e.getMessage()); - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - return data; - } else if (StringUtils.startsWithIgnoreCase(url, "ftp://")) { - LOGGER.info("FTP protocol"); - byte[] data=null; - try { - data = downloadFTP(url); - } catch (Exception e) { - LOGGER.info(e.getMessage()); - LOGGER.info(e.getStackTrace().toString()); - e.printStackTrace(); - } - return data; - } - return null; - } - - private byte[] downloadFTP(String url) throws Exception { - try { - LOGGER.info("Downloading through FTP: "+url); - URL u = new URL(url); - FTPClient client = new FTPClient(); - ByteArrayOutputStream fos = null; - int port = u.getPort() == -1 ? 21 : u.getPort(); - LOGGER.info("port: "+port+ " - connecting to "+u.getHost()); - try { - client.connect(u.getHost(), port); - } - catch(Exception e) { - LOGGER.info("connection fault:"+e.getMessage()+ " " + e.getCause().toString()); - - throw e; - } - // connection error code - int reply = client.getReplyCode(); - if (!FTPReply.isPositiveCompletion(reply)) { - LOGGER.info("Disconnect on positive completion"); - client.disconnect(); - throw new ExceptionReport("FTP connection failed",ExceptionReport.NO_APPLICABLE_CODE); - } - LOGGER.info("connected"); - client.setDefaultTimeout(60000); - client.setConnectTimeout(60000); - // currently bugging - //Property[] properties = WPSConfig.getInstance().getPropertiesForServer(); - //Property ftpUserProp = WPSConfig.getInstance().getPropertyForKey( - //properties, "portalFTPUser"); - //LOGGER.info("user found in config: "+ftpUserProp.getStringValue()); - //Property ftpPassProp = WPSConfig.getInstance().getPropertyForKey( - // properties, "portalFTPPassword"); - // LOGGER.info("password found in config: "+ftpPassProp.getStringValue()); - //client.login(ftpUserProp.getStringValue(), ftpPassProp.getStringValue()); - client.login("ftpuser", "ssegrid"); - LOGGER.info("logged"); - String filename = u.getFile(); - int slashIndex = filename.lastIndexOf('/') + 1; - String parent = "."+filename.substring(0, slashIndex); - String ftpFileName = filename.substring(slashIndex); - LOGGER.info("parent:"+parent); - LOGGER.info("filename:"+filename); - FTPFile ftpFile = null; - for (FTPFile f : client.listFiles(parent)) { - if (StringUtils.equals(f.getName(), ftpFileName)) { - LOGGER.info("found"+f.getName()); - ftpFile = f; - } - } - if (ftpFile == null) { - throw new IOException("File not found: " + ftpFileName); - } - int total = (int) ftpFile.getSize(); - LOGGER.info("total:"+total); - LOGGER.info("get file name: "+filename); - fos = new ByteArrayOutputStream(); - LOGGER.info("retrieve file...."); - //client.retrieveFile("."+filename, fos); - // Set to Binary Mode !!! - client.setFileType(FTP.BINARY_FILE_TYPE); - InputStream raw = client.retrieveFileStream("."+filename); - // InputStream in = new BufferedInputStream(raw, client.getBufferSize()); - byte[] data = new byte[total]; - data = IOUtils.toByteArray(raw); - /** useless - int bytesRead = 0; - int offset = 0; - LOGGER.info("loading started..."); - while (offset < total) { - System.out.print("."); - bytesRead = in.read(data, offset, client.getBufferSize()); - if (bytesRead == -1) - break; - offset += bytesRead; - } - */ - raw.close(); - /** - if (offset != total) { - LOGGER.info("Only read " + offset + " bytes; Expected " + total + " bytes"); - // throw new IOException("Only read " + offset + " bytes; Expected " + total + " bytes"); - } - */ - LOGGER.info("retrieved"); - //byte[] data = fos.toByteArray(); - //fos.close(); - client.disconnect(); - LOGGER.info("Lenght of file:"+data.length); - return data; - } - catch(Exception e) { - throw new ExceptionReport("FTP exception",ExceptionReport.REMOTE_COMPUTATION_ERROR,e); - - } - } - - public void setArchive(byte[] archive) { - LOGGER.info("setArchive"); - this.archive = archive; - } - - public byte[] getArchive() { - return archive; - } - - public void setProcessId(String processId) { - this.processId = processId; - } - - public String getProcessId() { - return processId; - } - - public void setReference(boolean reference) { - this.reference = reference; - } - - public boolean isReference() { - return reference; - } - - public void setArchiveRef(String string) { - this.archiveRef = string; - } - - public String getArchiveRef() { - return archiveRef; - } - - public void setJsdlTemplate(JsdlTemplate jsdlTemplate) { - this.jsdlTemplate = jsdlTemplate; - } - - public JsdlTemplate getJsdlTemplate() { - return jsdlTemplate; - } - -} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/JavaSagaProcessManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/JavaSagaProcessManager.java deleted file mode 100644 index 6228e7d74..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/JavaSagaProcessManager.java +++ /dev/null @@ -1,1274 +0,0 @@ -package org.n52.wps.server.profiles.JavaSaga; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.NoSuchElementException; -import java.util.Vector; -import java.util.concurrent.CancellationException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathFactory; - -// XMLBeans schemas import -import net.opengis.ows.x11.ExceptionReportDocument; -import net.opengis.ows.x11.ExceptionType; -import net.opengis.wps.x100.AuditTraceType; -import net.opengis.wps.x100.DataInputsType; -import net.opengis.wps.x100.DocumentOutputDefinitionType; -import net.opengis.wps.x100.ExecuteDocument; -import net.opengis.wps.x100.ExecuteResponseDocument; -import net.opengis.wps.x100.ExecuteResponseDocument.ExecuteResponse.ProcessOutputs; -import net.opengis.wps.x100.InputType; -import net.opengis.wps.x100.OutputDataType; -import net.opengis.wps.x100.OutputDescriptionType; -import net.opengis.wps.x100.SagaDeploymentProfileType.JsdlTemplate; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; -import xint.esa.ssegrid.wps.javaSAGAProfile.URLListDocument; - -// Apache import -import org.apache.axiom.om.OMAbstractFactory; -import org.apache.axiom.om.OMAttribute; -import org.apache.axiom.om.OMElement; -import org.apache.axiom.om.OMNamespace; -import org.apache.axiom.soap.SOAPEnvelope; -import org.apache.axiom.soap.SOAPFactory; -import org.apache.axiom.soap.SOAPHeaderBlock; -import org.apache.axis2.client.ServiceClient; -import org.apache.axis2.util.XMLUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; -import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlObject; -import org.apache.xmlbeans.XmlOptions; - -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.ComplexExceptionReport; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.profiles.AbstractProcessManager; -import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; -import org.n52.wps.server.request.DeployProcessRequest; -import org.n52.wps.server.request.ExecuteRequest; -import org.n52.wps.server.request.UndeployProcessRequest; -import org.n52.wps.server.request.deploy.DeploymentProfile; - -// Saga import -import org.ogf.saga.context.Context; -import org.ogf.saga.context.ContextFactory; -import org.ogf.saga.error.BadParameterException; -import org.ogf.saga.error.NoSuccessException; -import org.ogf.saga.job.Job; -import org.ogf.saga.session.Session; -import org.ogf.saga.session.SessionFactory; -import org.ogf.saga.task.State; -import org.ogf.saga.url.URLFactory; -import com.terradue.ogf.saga.impl.job.JobDescription; -import com.terradue.ogf.saga.impl.job.JobFactory; -import com.terradue.ogf.saga.impl.job.JobImpl; -import com.terradue.ogf.saga.impl.job.JobServiceImpl; -import com.terradue.ogf.schema.jsdl.JSDLException; -import com.terradue.ogf.schema.jsdl.JSDLFactory; -import com.terradue.ssegrid.sagaext.JSDLNotApplicableException; -import com.terradue.ssegrid.sagaext.JobServiceAssistant; -import com.terradue.ssegrid.sagaext.MyProxyClient; -import com.terradue.ssegrid.sagaext.ProcessingRegistry; - -import org.w3.x2005.x08.addressing.MessageIDDocument; -import org.w3.x2005.x08.addressing.ReplyToDocument; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -public class JavaSagaProcessManager extends AbstractProcessManager { - - // WPS Logger - private static Logger LOGGER = Logger - .getLogger(JavaSagaProcessManager.class); - - private String processesPrefix; - // Location for process deployement - private String deployProcessDir; - private String WPSPublicationPrefix; - private HashMap WPSmap; - private String myProxyURL; - private String myProxyUser; - private String myProxyPassword; - - private String IID; - private String processInstanceID; - - private String processID; - private static String GridFilesDir; - private static String SagaLibDir; - private static org.ogf.saga.url.URL gridmapGLUE; - private static ProcessingRegistry pr; - private JobImpl runningJob; - private boolean cancelHack; - // Asychronous execute client must be shared between threads - /** - * TODO delete - */ - public static ServiceClient executeClient; - - /** - * @param repository - * @throws NoSuccessException - * @throws BadParameterException - * @throws JSDLException - * @throws JSDLNotApplicableException - * @throws IOException - * @throws FileNotFoundException - */ - public JavaSagaProcessManager(ITransactionalAlgorithmRepository repository) - throws BadParameterException, NoSuccessException, - FileNotFoundException, IOException, JSDLNotApplicableException, - JSDLException { - super(repository); - /** - * Get useful properties from the repository configuration file: - SAGA - * Home : home directory for saga files - GridmapGLUE : the gridmapGLUE - * file location - */ - Property[] properties = WPSConfig.getInstance() - .getPropertiesForRepositoryName("JavaSagaRepository"); - Property WPSSaga = WPSConfig.getInstance().getPropertyForKey( - properties, "GridFilesDir"); - if (WPSSaga == null) { - throw new RuntimeException( - "Error. Could not find the required GridFilesDir property in wps_config.xml"); - } - setGridFilesDir(WPSSaga.getStringValue()); - Property sagaLibProp = WPSConfig.getInstance().getPropertyForKey( - properties, "SagaLibDir"); - if (sagaLibProp == null) { - throw new RuntimeException( - "Error. Could not find the required SagaLibDir property in wps_config.xml"); - } - setSagaLibDir(sagaLibProp.getStringValue()); - - Property myProxyURLProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyURL"); - if (myProxyURLProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyURL = myProxyURLProp.getStringValue(); - - Property myProxyUserProp = WPSConfig.getInstance().getPropertyForKey( - properties, "MyProxyUser"); - if (myProxyUserProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyUser = myProxyUserProp.getStringValue(); - - Property myProxyPasswordProp = WPSConfig.getInstance() - .getPropertyForKey(properties, "MyProxyPassword"); - if (myProxyPasswordProp == null) { - throw new RuntimeException( - "Error. Could not find the required MyProxyUser property in wps_config.xml"); - } - myProxyPassword = myProxyPasswordProp.getStringValue(); - - System.setProperty("saga.location", getSagaLibDir()); - Property wpsPublicRoot = WPSConfig.getInstance().getPropertyForKey( - properties, "WPSPublicationPrefix"); - if (wpsPublicRoot == null) { - throw new RuntimeException( - "Error. Could not find WPSPublicationPrefix"); - } - setWPSPublicationPrefix(wpsPublicRoot.getStringValue()); - - // Set the deployement process directory - setDeployProcessDir(GridFilesDir + "deploy/process/"); - Property gridmap = WPSConfig.getInstance().getPropertyForKey( - properties, "GridGlue"); - if (gridmap == null) { - throw new RuntimeException( - "Error. Could not find the required GridGlue property in wps_config.xml"); - } - // Saga.location must be loaded before the following line - JavaSagaProcessManager.gridmapGLUE = URLFactory.createURL(gridmap - .getStringValue()); - /** - * Set the required system properties (instead of setting them from - * tomcat script) - */ - - System.setProperty("gai.default.rm", gridmapGLUE.toString()); - System.setProperty("gai.debug.working.dir", "true"); - System.setProperty("org.globus.tcp.port.range", "20000,22000"); - System.setProperty("gai.deploy.process.path", getDeployProcessDir()); - // Add port range prop org.globus.tcp.port.range="20000,20200" - // TODO remove (useless here : getPRInstance();) - - } - - /** - * Singleton for the ProcessingRegistry - * - * @return - * @throws FileNotFoundException - * @throws IOException - * @throws JSDLNotApplicableException - * @throws JSDLException - */ - public static ProcessingRegistry getPRInstance() - throws FileNotFoundException, IOException, - JSDLNotApplicableException, JSDLException { - if (pr == null) { - LOGGER.info("ProcessingRegistry was not already instantiated."); - try { - pr = new ProcessingRegistry(true); - } catch (FileNotFoundException e) { - pr = new ProcessingRegistry(false); - } - // If recover is not working this should work - /** - * FindFilter fileFilter = new FindFilter("*.xml"); File[] files = - * new File(getWPSSagaHome()).listFiles(fileFilter); if (files != - * null && files.length > 0) { for (File JSDLFile : files) { - * LOGGER.info("Registering JSDL :" + JSDLFile.getAbsolutePath()); - * pr.registerProcessing(JSDLFactory .createJSDLDocument(JSDLFile)); - * } } - */ - } - return pr; - } - - /** - * Get the WPS Saga home directory - * - * @return - */ - public static String getGridFilesDir() { - return GridFilesDir; - } - - /** - * Set the WPS Saga home directory - * - * @param wPSSagaHome - */ - public static void setGridFilesDir(String gFilesDir) { - GridFilesDir = gFilesDir; - } - - /** - * Deploy a process : register the JSDL, store the archive (parsed by the - * saga deployement profile) TODO interface signature should move to void - * (exception is thrown on failure) - * - * @throws ExceptionReport - */ - public boolean deployProcess(DeployProcessRequest request) - throws ExceptionReport { - DeploymentProfile profile = request.getDeploymentProfile(); - if (!(profile instanceof JavaSagaDeploymentProfile)) { - throw new ExceptionReport("JavaSaga Deployement Profile not valid", - ExceptionReport.INVALID_PARAMETER_VALUE); - } - JavaSagaDeploymentProfile deploymentProfile = (JavaSagaDeploymentProfile) profile; - String processID = deploymentProfile.getProcessID(); - LOGGER.info("Saga deployement process for: " + processID); - try { - LOGGER.info("storing archive"); - storeArchive(deploymentProfile.getArchive(), processID); - LOGGER.info("register JSDL"); - registerJSDL(processID, deploymentProfile.getJsdlTemplate()); - - } catch (Exception e) { - e.printStackTrace(); - throw new ExceptionReport("IO Exception during deployement", - ExceptionReport.NO_APPLICABLE_CODE, e); - } - return true; - } - - /** - * Unzip a collection of files contained in a archive zip file and write - * onto disk - * - * @param archive - * @throws IOException - */ - private void storeArchive(byte[] archive, String processId) - throws IOException { - LOGGER.info("Store Archive"); - String archiveDir = getDeployProcessDir() + processId + File.separator; - // create dir - File archiveFile = new File(archiveDir); - if (!archiveFile.exists()) { - archiveFile.mkdirs(); - } - LOGGER.info("Storing archive in " + archiveDir); - ByteArrayInputStream bais = new ByteArrayInputStream(archive); - byte[] buf = new byte[1024]; - ZipInputStream zis = new ZipInputStream(bais); - ZipEntry zipentry = zis.getNextEntry(); - while (zipentry != null) { - String entryName = zipentry.getName(); - LOGGER.info("Writing file " + entryName); - int n; - FileOutputStream fileoutputstream; - File newFile = new File(entryName); - String directory = newFile.getParent(); - if (directory == null) { - if (newFile.isDirectory()) - break; - } - fileoutputstream = new FileOutputStream(archiveDir + entryName); - while ((n = zis.read(buf, 0, 1024)) > -1) - fileoutputstream.write(buf, 0, n); - fileoutputstream.close(); - zis.closeEntry(); - zipentry = zis.getNextEntry(); - } - zis.close(); - } - - private void unstoreArchive(String processId) throws IOException { - String archiveDir = getDeployProcessDir() + processId + File.separator; - LOGGER.info("unstoring archive in " + archiveDir); - File archFile = new File(archiveDir); - deleteDir(archFile); - } - - // Deletes all files and subdirectories under dir. - // Returns true if all deletions were successful. - // If a deletion fails, the method stops attempting to delete and returns - // false. - public static boolean deleteDir(File dir) { - if (dir.isDirectory()) { - String[] children = dir.list(); - for (int i = 0; i < children.length; i++) { - boolean success = deleteDir(new File(dir, children[i])); - if (!success) { - return false; - } - } - } - - // The directory is now empty so delete it - return dir.delete(); - } - - /** - * Store the given jsdl document in the DEPLOY_DIR and register with the - * Processing Registry. - * - * @param processId - * @param jsdlTemplate - * @throws IOException - * @throws TransformerFactoryConfigurationError - * @throws TransformerException - * @throws ParserConfigurationException - * @throws NoSuccessException - * @throws BadParameterException - * @throws ExceptionReport - * @throws JSDLException - * @throws JSDLNotApplicableException - */ - private void registerJSDL(String processId, JsdlTemplate jsdlTemplate) - throws IOException, TransformerFactoryConfigurationError, - TransformerException, ParserConfigurationException, - BadParameterException, NoSuccessException, ExceptionReport, - JSDLNotApplicableException, JSDLException { - JobDefinitionDocument jsdl = JobDefinitionDocument.Factory - .newInstance(); - jsdl.addNewJobDefinition().set(jsdlTemplate.getJobDefinition()); - LOGGER.info("JSDL to wrile:" + jsdl); - String dirPath = GridFilesDir + "JSDLtemplates"; - LOGGER.info(dirPath); - File directory = new File(dirPath); - if (!directory.exists()) { - directory.mkdirs(); - } - String jsdlPath = dirPath + File.separator + processId + ".xml"; - File f = new File(jsdlPath); - jsdl.save(f); - LOGGER.info("Store JSDL in " + jsdlPath); - // Register the JSDL - File procJSDL = new File(jsdlPath); - String regProcId = getPRInstance().registerProcessing( - JSDLFactory.createJSDLDocument(procJSDL)); - if (!regProcId.equals(processId)) { - LOGGER.info("matching failed between : " + regProcId + " - " - + processId); - throw new ExceptionReport( - "Registered process id does not match the right process id", - ExceptionReport.NO_APPLICABLE_CODE); - } - LOGGER.info("registering end..."); - } - - private void unregisterJSDL(String processId) - throws NoSuchElementException, FileNotFoundException, IOException, - JSDLNotApplicableException, JSDLException { - String dirPath = GridFilesDir + "JSDLtemplates"; - String jsdlPath = dirPath + File.separator + processId + ".xml"; - File f = new File(jsdlPath); - f.delete(); - LOGGER.info("Deleted JSDL in " + jsdlPath); - // Unregister the JSDL - try { - getPRInstance().unregisterProcessing(processId); - } catch (Exception e) { - LOGGER.warn("-- PR Unregister failed -"); - } - - } - - /** - * TODO - * - * @param processID - * @return - * @throws Exception - */ - public boolean unDeployProcess(String processID) throws Exception { - // Prepare undeploy message - // TODO - // Undeploy - // sendToDeployment(root); - unregisterJSDL(processID); - unstoreArchive(processID); - - return true; - } - - public String getStringFromDocument(Document doc) { - try { - DOMSource domSource = new DOMSource(doc); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - transformer.transform(domSource, result); - return writer.toString(); - } catch (TransformerException ex) { - ex.printStackTrace(); - return null; - } - } - - public Document invoke(ExecuteRequest req, String algorithmID) - throws Exception { - cancelHack = false; - setProcessInstanceID(req.getId()); - ExecuteDocument doc = req.getExecDom(); - this.processID = algorithmID; - // Initialize WPS Map - WPSmap = new HashMap(); - WPSmap.put("WPS_DEPLOY_PROCESS_DIR", GridFilesDir + "deploy/process/"); - WPSmap.put("WPS_DEPLOY_AUXDATA_DIR", GridFilesDir + "deploy/auxdata/"); - WPSmap.put("WPS_JOB_INPUTS_DIR", GridFilesDir + "execute/" + processID - + "/" + getProcessInstanceID() + "/${GAI_JOB_UID}/inputs"); - WPSmap.put("WPS_JOB_OUTPUTS_DIR", GridFilesDir + "execute/" + processID - + "/" + getProcessInstanceID() + "/${GAI_JOB_UID}/outputs"); - WPSmap.put("WPS_JOB_AUDITS_DIR", GridFilesDir + "execute/" + processID - + "/" + getProcessInstanceID() + "/${GAI_JOB_UID}/audits"); - WPSmap.put("WPS_JOB_RESULTS_DIR", GridFilesDir + "execute/" + processID - + "/" + getProcessInstanceID() + "/${GAI_JOB_UID}/results"); - WPSmap.put("WPS_JOB_RESULTS_URL", WPSPublicationPrefix + "execute/" - + processID + "/" + getProcessInstanceID() - + "/${GAI_JOB_UID}/results"); - - ExecuteResponseDocument execRepDom = null; - this.setProcessID(algorithmID); - // First create a session containing at least a context - // for user credentials information - Session session = SessionFactory.createSession(false); - Context context = ContextFactory.createContext("globus"); - context.setAttribute(Context.USERPROXY, GridFilesDir + "proxy"); - session.addContext(context); - LOGGER.info(context.getAttribute(Context.USERPROXY)); - // Get delegation to that user proxy and set propoerly context - String cnName = null; - try { - - for (SOAPHeaderBlock samlHeader : req.getSamlHeader()) { - LOGGER.info("LocalName = " + samlHeader.getLocalName()); - OMElement assertion = (OMElement) samlHeader - .getChildrenWithLocalName("Assertion").next(); - LOGGER.info("Assertion found:"+assertion.toString()); - OMElement attributeStatement = (OMElement) assertion - .getChildrenWithLocalName("AttributeStatement").next(); - LOGGER.info("AttributeStatement found"); - OMElement subject = (OMElement) attributeStatement - .getChildrenWithLocalName("Subject").next(); - LOGGER.info("Subject found:"+subject.toString()); - OMElement nameIdentifier = (OMElement) subject - .getChildrenWithLocalName("NameIdentifier").next(); - LOGGER.info("Name Id found"+nameIdentifier.toString()); - cnName = nameIdentifier.getText(); - LOGGER.info(cnName); - } - - } catch (Exception e) { - } - - if (cnName != null && !cnName.equals("spb") && !cnName.equals("vito") - && !cnName.equals("superuser") && !cnName.equals("esasp")) { - throw new ExceptionReport( - "No Grid Proxy account is associated with the user", - ExceptionReport.REMOTE_COMPUTATION_ERROR); - } - MyProxyClient.delegateProxyFromMyProxyServer(myProxyURL, 7512, - myProxyUser, myProxyPassword, 604800, context); - // then create a JobService from the JobFactory - // that is ready to handle job submission passing the session - // information - // and the Resource Manager - // N.B. here is an "extended" JobService - JobServiceImpl js = JobFactory - .createJobService(session/* , gridmapGLUE */); - // Pass the additional substitution - // create the JobServiceAssistant in order to provide - // useful methods for the backend WPS process manager - JobServiceAssistant jsa = new JobServiceAssistant(js); - jsa.addSubstitutionVariables(WPSmap); - // initialize a job description from the registered processing - JobDescription jd = (JobDescription) JobFactory - .createJobDescription(getPRInstance().getJSDLFromProc( - algorithmID)); - // Build literal and complex inputs maps - Map literalInputs = new HashMap(); - Map complexInputs = new HashMap(); - InputType[] inputs = doc.getExecute().getDataInputs().getInputArray(); - int numberOfTasks = 0; - for (int i = 0; i < inputs.length; i++) { - if (inputs[i].getData().isSetLiteralData()) { - LOGGER.info("Found literal data: " - + inputs[i].getIdentifier().getStringValue() + " - " - + inputs[i].getData().getLiteralData().getStringValue()); - if (inputs[i].getIdentifier().getStringValue() - .equals("numberOfTasks")) { - numberOfTasks = Integer.parseInt(inputs[i].getData() - .getLiteralData().getStringValue()); - } else { - literalInputs.put("WPS_INPUT_" - + inputs[i].getIdentifier().getStringValue(), - inputs[i].getData().getLiteralData() - .getStringValue()); - } - } - if (inputs[i].getData().isSetComplexData()) { - LOGGER.info("Found complex data: " - + inputs[i].getIdentifier().getStringValue() + " - " - + inputs[i].getData().getComplexData().xmlText()); - // TODO the following conversion to String can be simplified - StringWriter stringWriter = new StringWriter(); - Transformer transformer = TransformerFactory.newInstance() - .newTransformer(); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, - "no"); - NodeList nodeList = inputs[i].getData().getComplexData() - .getDomNode().getChildNodes(); - Node urlListNode = null; - for (int k = 0; k < nodeList.getLength(); k++) { - if (nodeList.item(k).getLocalName() != null - && nodeList.item(k).getLocalName() - .equals("URLList")) { - urlListNode = nodeList.item(k); - break; - } - } - transformer.transform(new DOMSource(urlListNode), - new StreamResult(stringWriter)); - - // XMLBeans parsing for validation (exception is thrown on - // failure) - LOGGER.info("String writer contains : " - + stringWriter.toString()); - XmlOptions options = new XmlOptions(); - URLListDocument urlDom = URLListDocument.Factory.parse( - stringWriter.toString(), options); - // Namespace-non-aware document used as workaround for the - // extension bug (xpath does not include namespace) - // -> xpath.compile("/URLList/url/text()"); int m = ((Double) - String sampleString = stringWriter.toString(); - InputSource is = new InputSource(new StringReader(sampleString)); - DocumentBuilderFactory dbf = DocumentBuilderFactory - .newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - Document inputXML = db.parse(is); - LOGGER.info("Complex Document Added: " - + inputs[i].getIdentifier().getStringValue() + " - " - + getStringFromDocument(inputXML)); - complexInputs.put(inputs[i].getIdentifier().getStringValue(), - inputXML); - } - } - if (literalInputs.size() > 0) { - try { - jsa.substituteSimpleInputs(jd, literalInputs); - } catch (Exception e) { - throw new ExceptionReport(e.getMessage(), - ExceptionReport.INVALID_PARAMETER_VALUE, e); - } - } - // Once JobDescription ready to run, create the jobs, run them, and wait - // for them. - // N.B. In this case, the "extension" provides a new class to handle an - // array of jobs; they are still accessible individually from the - // attributes - // System.out.println("Creating job in " - // + jd.getAttribute("NUMBEROFPROCESSES") + " instances"); - if (((com.terradue.ogf.saga.impl.job.JobDescriptionImpl) jd) - .getAttribute("NumberOfProcesses") != null) { - LOGGER.info("Creating job in " - + ((com.terradue.ogf.saga.impl.job.JobDescriptionImpl) jd) - .getAttribute("NumberOfProcesses") + " instances"); - } else { - LOGGER.info("NumberOfProcesses attribute is null"); - } - JobImpl jobs = null; - if (numberOfTasks == 0) { - jobs = ((JobServiceImpl) js).createJob(jd); - } else { - jobs = ((JobServiceImpl) js).createJob(jd, numberOfTasks); - } - // create now the job execute dirs - String inputsDir = jobs.getSubstitutedVariable("WPS_JOB_INPUTS_DIR"); - String outputsDir = jobs.getSubstitutedVariable("WPS_JOB_OUTPUTS_DIR"); - String auditsDir = jobs.getSubstitutedVariable("WPS_JOB_AUDITS_DIR"); - String resultsDir = jobs.getSubstitutedVariable("WPS_JOB_RESULTS_DIR"); - LOGGER.info("Creating inputsDir:" + inputsDir); - (new File(inputsDir)).mkdirs(); - (new File(outputsDir)).mkdirs(); - (new File(auditsDir)).mkdirs(); - (new File(resultsDir)).mkdirs(); - (new File(resultsDir)).setWritable(true, false); - if (complexInputs.size() > 0) { - try { - jsa.writeComplexInputs(jobs, complexInputs); - } catch (Exception e) { - throw new ExceptionReport(e.getMessage(), - ExceptionReport.INVALID_PARAMETER_VALUE, e); - } - } - // Callbacks - jobs.addCallback(Job.JOB_STATE, new SagaCallbackManager()); - jobs.addCallback(Job.JOB_STATEDETAIL, new SagaCallbackManager()); - LOGGER.info("Running job..."); - setRunningJob(jobs); - jobs.run(); - LOGGER.info("saga job id:" + jobs.getId()); - setIID(jobs.getId()); - LOGGER.info("jobs.run() returned " + jobs.getState().getValue()); - // wait for all jobs in the job array - LOGGER.info("Waiting for..."); - jobs.waitFor(); - if (jobs.isCancelled() || cancelHack) { - LOGGER.info("Force cancel if interruption not successful"); - throw new CancellationException(); - } - // Check if any exitMessage is non null - boolean exitFault = false; - String[][] exitMessages; - try { - exitMessages = jsa.readExitMessages(jobs); - for (String[] exitMessage : exitMessages) { - if (!exitMessage[0].trim().equals("0")) { - exitFault = true; - LOGGER.info("exitFault is true: " + exitMessage[0] + "-" - + exitMessage[1]); - break; - } - } - } catch (Exception e) { - e.printStackTrace(); - throw new ExceptionReport( - "No exitMessage file is present: check the Grid infrastructure or the application script file.", - ExceptionReport.REMOTE_COMPUTATION_ERROR); - } - LOGGER.info("Job state:" + jobs.getState()); - if (jobs.getState() == State.DONE & !exitFault) { - LOGGER.info("Jobs completed"); - OutputDescriptionType[] outputsDesc = this.parentRepository - .getProcessDescription(algorithmID).getProcessOutputs() - .getOutputArray(); - Vector literalOutputNames = new Vector(); - Vector complexOutputNames = new Vector(); - // TODO other case ? and check valid ? - LOGGER.info("Building outputs"); - if (doc.getExecute().getResponseForm() != null) { - DocumentOutputDefinitionType[] outputs = doc.getExecute() - .getResponseForm().getResponseDocument() - .getOutputArray(); - for (int i = 0; i < outputs.length; i++) { - String id = outputs[i].getIdentifier().getStringValue(); - for (int j = 0; j < outputsDesc.length; j++) { - if (outputsDesc[j].getIdentifier().getStringValue() - .equals(id)) { - if (outputsDesc[j].isSetLiteralOutput()) { - literalOutputNames.add(id); - } - if (outputsDesc[j].isSetComplexOutput()) { - complexOutputNames.add(id); - } - } - } - } - } else { - for (int j = 0; j < outputsDesc.length; j++) { - - if (outputsDesc[j].isSetLiteralOutput()) { - literalOutputNames.add(outputsDesc[j].getIdentifier() - .getStringValue()); - LOGGER.info("Literal output:" - + outputsDesc[j].getIdentifier() - .getStringValue()); - } - if (outputsDesc[j].isSetComplexOutput()) { - complexOutputNames.add(outputsDesc[j].getIdentifier() - .getStringValue()); - LOGGER.info("Complex Output:" - + outputsDesc[j].getIdentifier() - .getStringValue()); - } - } - } - - // Preparing an ExecuteResponse document - // (This is the fastest way to implement but probably not the right - // way to go) - execRepDom = ExecuteResponseDocument.Factory.newInstance(); - execRepDom.addNewExecuteResponse(); - execRepDom.getExecuteResponse().setLang("en"); - execRepDom.getExecuteResponse().addNewProcessInstanceIdentifier() - .setInstanceId(req.getId()); - execRepDom.getExecuteResponse().addNewStatus() - .setProcessSucceeded("success"); - execRepDom.getExecuteResponse().addNewProcessOutputs(); - ProcessOutputs outputsDom = execRepDom.getExecuteResponse() - .getProcessOutputs(); - if (complexOutputNames.size() > 0) { - Map complexOutputMap = jsa - .readComplexOutputs(jobs, (String[]) complexOutputNames - .toArray(new String[complexOutputNames.size()])); - Iterator> complexOutputsIterator = complexOutputMap - .entrySet().iterator(); - while (complexOutputsIterator.hasNext()) { - Entry entry = complexOutputsIterator - .next(); - LOGGER.info("Found Complex Output:" + entry.getKey() - + " - " + nodeToString(entry.getValue())); - OutputDataType newOutput = outputsDom.addNewOutput(); - newOutput.addNewIdentifier().setStringValue(entry.getKey()); - newOutput - .addNewData() - .addNewComplexData() - .set(URLListDocument.Factory - .parse(nodeToString(entry.getValue()))); - LOGGER.info("test:" - + URLListDocument.Factory.parse( - nodeToString(entry.getValue())).toString()); - } - } - if (literalOutputNames.size() > 0) { - Iterator> simpleOutputsIterator = jsa - .readSimpleOutputs(jobs).entrySet().iterator(); - // build map - while (simpleOutputsIterator.hasNext()) { - Entry entry = simpleOutputsIterator.next(); - OutputDataType newOutput = outputsDom.addNewOutput(); - newOutput.addNewIdentifier().setStringValue(entry.getKey()); - newOutput.addNewData().addNewLiteralData() - .setStringValue(entry.getValue()); - LOGGER.info("Found Literal Output:" + entry.getKey() - + " - " + entry.getValue()); - } - } - LOGGER.info("Execution Output Document: " + outputsDom.toString()); - - System.out.println("END"); - - } else { - LOGGER.info("Jobs failed, throwing exception"); - // TODO handle ExitMessages - throw new ComplexExceptionReport( - "Grid Jobs failed throwing exceptions", - buildExceptionReportDom(exitMessages), - ExceptionReport.REMOTE_COMPUTATION_ERROR); - - } - - return (Document) execRepDom.getDomNode(); - - } - - private void setProcessInstanceID(String instanceID) { - this.processInstanceID = instanceID; - - } - - private void setIID(String id) { - this.IID = id; - - } - - public ExceptionReportDocument buildExceptionReportDom( - String[][] exitMessages) { - // Printing serivce Exception - ExceptionReportDocument report = ExceptionReportDocument.Factory - .newInstance(); - net.opengis.ows.x11.ExceptionReportDocument.ExceptionReport exceptionReport = report - .addNewExceptionReport(); - for (int i = 0; i < exitMessages.length; i++) { - String[] exitMessage = exitMessages[i]; - LOGGER.info("exitMessage:" + exitMessages[i]); - ExceptionType ex = exceptionReport.addNewException(); - ex.setExceptionCode(exitMessage[0]); - ex.setLocator("Task" + (i + 1)); - ex.addExceptionText(exitMessage[1]); - } - // Adding additional Java exception - return report; - } - - public Collection getAllProcesses() { - LOGGER.info("TODO should not be reached yet"); - return null; - } - - public boolean containsProcess(String processID) throws Exception { - boolean containsProcess = false; - // need to filter out the namespace if it is passed in. - if (processID.contains("}")) - processID = processID.split("}")[1]; - - // return getAllProcesses().contains(processID); - return containsProcess; - // throw new UnsupportedOperationException("Not supported yet."); - } - - public boolean unDeployProcess(UndeployProcessRequest request) - throws Exception { - // unDeployProcess(String processID) is implemented though... - LOGGER.info("Saga undeploying..."); - return unDeployProcess((String) request.getProcessID()); - // return false; - // throw new UnsupportedOperationException("Not supported yet."); - } - - /** - * private OMElement sendToPM(OMElement msg) throws AxisFault { return - * _client.send(msg, this.processManagerEndpoint); // return - * _PMclient.send(msg, this.processManagerEndpoint,10000); } - * - * private OMElement sendToDeployment(OMElement msg) throws AxisFault { - * return _client.send(msg, this.deploymentEndpoint); - * - * // return _DEPclient.send(msg,this.deploymentEndpoint,10000); } - */ - private ByteArrayOutputStream writeXMLToStream(Source source) - throws TransformerException { - // Prepare the DOM document for writing - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - // Prepare the output file - - Result result = new StreamResult(out); - // System.etProperty("javax.xml.transform.TransformerFactory","com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"); - // Write the DOM document to the file - TransformerFactory x = TransformerFactory.newInstance(); - Transformer xformer = x.newTransformer(); - xformer.transform(source, result); - - return out; - } - - private String nodeToString(Node node) - throws TransformerFactoryConfigurationError, TransformerException { - StringWriter stringWriter = new StringWriter(); - Transformer transformer = TransformerFactory.newInstance() - .newTransformer(); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - transformer.transform(new DOMSource(node), new StreamResult( - stringWriter)); - - return stringWriter.toString(); - } - - public SOAPEnvelope createSOAPEnvelope(Node domNode) { - SOAPFactory fac = OMAbstractFactory.getSOAP11Factory(); - SOAPEnvelope envelope = fac.getDefaultEnvelope(); - - NamespaceContext ctx = new NamespaceContext() { - - public String getNamespaceURI(String prefix) { - String uri; - if (prefix.equals("wps")) - uri = "http://www.opengis.net/wps/1.0.0"; - else if (prefix.equals("ows")) - uri = "http://www.opengis.net/ows/1.1"; - else - uri = null; - return uri; - } - - public String getPrefix(String namespaceURI) { - return null; - } - - public Iterator getPrefixes(String namespaceURI) { - return null; - } - }; - - XPathFactory xpathFact = XPathFactory.newInstance(); - XPath xpath = xpathFact.newXPath(); - xpath.setNamespaceContext(ctx); - - String identifier = null; - String input = null; - String xpathidentifier = "//ows:Identifier"; - String xpathinput = "//wps:DataInputs/wps:Input/wps:Data/wps:LiteralData"; - - try { - identifier = xpath.evaluate(xpathidentifier, domNode); - input = xpath.evaluate(xpathinput, domNode); - } catch (Exception e) { - e.printStackTrace(); - } - // OMNamespace wpsNs = - // fac.createOMNamespace("http://scenz.lcr.co.nz/wpsHelloWorld", "wps"); - OMNamespace wpsNs = fac.createOMNamespace("http://scenz.lcr.co.nz/" - + identifier, "wps"); - // creating the payload - - // TODO: parse the domNode to a request doc - // OMElement method = fac.createOMElement("wpsHelloWorldRequest", - // wpsNs); - OMElement method = fac.createOMElement(identifier + "Request", wpsNs); - OMElement value = fac.createOMElement("input", wpsNs); - // value.setText("Niels"); - value.setText(input); - method.addChild(value); - envelope.getBody().addChild(method); - return envelope; - } - - @SuppressWarnings("unchecked") - private SOAPEnvelope createSOAPEnvelope(ExecuteDocument execDoc) { - - SOAPFactory fac = OMAbstractFactory.getSOAP11Factory(); - SOAPEnvelope envelope = fac.getDefaultEnvelope(); - - new NamespaceContext() { - - public String getNamespaceURI(String prefix) { - String uri; - if (prefix.equals("wps")) - uri = "http://www.opengis.net/wps/1.0.0"; - else if (prefix.equals("ows")) - uri = "http://www.opengis.net/ows/1.1"; - else - uri = null; - return uri; - } - - public String getPrefix(String namespaceURI) { - return null; - } - - public Iterator getPrefixes(String namespaceURI) { - return null; - } - }; - - // _client = new ODEServiceClient(); - HashMap allProcesses = new HashMap(); - - // OMElement listRoot = _client.buildMessage("listAllProcesses", - // new String[] {}, new String[] {}); - - OMElement result = null; - /** - * try { //result = sendToPM(listRoot); } catch (AxisFault e) { // TODO - * Auto-generated catch block e.printStackTrace(); } - */ - Iterator pi = result.getFirstElement().getChildrenWithName( - new QName("http://www.apache.org/ode/pmapi/types/2006/08/02/", - "process-info")); - - while (pi.hasNext()) { - OMElement omPID = pi.next(); - - String fullName = omPID - .getFirstChildWithName( - new QName( - "http://www.apache.org/ode/pmapi/types/2006/08/02/", - "pid")).getText(); - allProcesses.put( - fullName.substring(fullName.indexOf("}") + 1, - fullName.indexOf("-")), - fullName.substring(1, fullName.indexOf("}"))); - - } - - String identifier = execDoc.getExecute().getIdentifier() - .getStringValue(); - - OMNamespace wpsNs = null; - - for (String string : allProcesses.keySet()) { - - if (string.equals(identifier)) { - wpsNs = fac.createOMNamespace(allProcesses.get(string), "nas"); - break; - } - - } - // creating the payload - - // TODO: parse the domNode to a request doc - // OMElement method = fac.createOMElement("wpsHelloWorldRequest", - // wpsNs); - OMElement method = fac.createOMElement(identifier + "Request", wpsNs); - envelope.getBody().addChild(method); - - DataInputsType datainputs = execDoc.getExecute().getDataInputs(); - - for (InputType input1 : datainputs.getInputArray()) { - - String inputIdentifier = input1.getIdentifier().getStringValue(); - OMElement value = fac.createOMElement(inputIdentifier, "", ""); - if (input1.getData() != null - && input1.getData().getLiteralData() != null) { - value.setText(input1.getData().getLiteralData() - .getStringValue()); - } else { - // Node no = - // input1.getData().getComplexData().getDomNode().getChildNodes().item(1); - // value.setText(""); - // value.addChild(no); - OMElement reference = fac.createOMElement("Reference", - "http://www.opengis.net/wps/1.0.0", "wps"); - OMNamespace xlin = fac.createOMNamespace( - "http://www.w3.org/1999/xlink", "xlin"); - - OMAttribute attr = fac.createOMAttribute("href", xlin, input1 - .getReference().getHref()); - reference.addAttribute(attr); - reference.addAttribute("schema", input1.getReference() - .getSchema(), fac.createOMNamespace("", "")); - value.addChild(reference); - } - method.addChild(value); - } - - return envelope; - - } - - public void setProcessesPrefix(String processesPrefix) { - this.processesPrefix = processesPrefix; - } - - public String getProcessesPrefix() { - return processesPrefix; - } - - /** - * Wait the asynchronousCallback - */ - public synchronized void waitCallback() { - try { - LOGGER.info("Waiting callback"); - wait(); - LOGGER.info("Callback received"); - } catch (Exception e) { - System.out.println(e); - } - return; - } - - public synchronized void notifyRequestManager() { - notify(); - } - - public void setDeployProcessDir(String deployProcessDir) { - deployProcessDir.replace('/', File.separatorChar); - deployProcessDir.replace('\\', File.separatorChar); - if (deployProcessDir.endsWith("/") || deployProcessDir.endsWith("\\")) { - this.deployProcessDir = deployProcessDir; - } else { - this.deployProcessDir = deployProcessDir + File.separator; - } - } - - public String getDeployProcessDir() { - return deployProcessDir; - } - - public AuditTraceType getAudit() { - LOGGER.info("short form apache get audit"); - AuditTraceType audit = null; - URLListDocument auditURLS = URLListDocument.Factory.newInstance(); - File auditDir = new File(GridFilesDir + "execute" + File.separator - + processID + File.separator + getProcessInstanceID() - + File.separator + getIID() + File.separator + "audits" - + File.separator); - - LOGGER.info("--------------------------------------------------------------------"); - LOGGER.info("Audit dir: " + GridFilesDir + "execute" + File.separator - + processID + File.separator + getProcessInstanceID() - + File.separator + getIID() + File.separator + "audits" - + File.separator); - String[] filenames = auditDir.list(); - auditURLS.addNewURLList().setCount(filenames.length); - for (String filename : filenames) { - auditURLS - .getURLList() - .addNewUrl() - .setStringValue( - getWPSPublicationPrefix() + "execute" - + File.separator + processID - + File.separator + getProcessInstanceID() - + File.separator + getIID() - + File.separator + "audits" - + File.separator + filename); - } - try { - audit = AuditTraceType.Factory.parse(auditURLS.getDomNode()); - } catch (XmlException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } - // LOGGER.info(audit.toString()); - return audit; - - } - - public AuditTraceType getAuditLongForm() { - LOGGER.info("long form saga get audit"); - - return getAudit(); - - } - - @Override - public String getIID() { - // TODO Auto-generated method stub - return this.IID; - } - - public void setProcessID(String processID) { - this.processID = processID; - } - - public String getProcessID() { - return processID; - } - - /** - * TODO : re design the IProcessManager : instanceID is required for some - * backend. All request information should be available at backend. To be - * discussed... - */ - - @Override - public Document invoke(ExecuteDocument payload, String algorithmID) - throws Exception { - // TODO Auto-generated method stub - return null; - } - - @Override - public void callback(ExecuteResponseDocument execRespDom) { - // TODO Auto-generated method stub - return; - } - - public void setWPSPublicationPrefix(String wPSPublicationPrefix) { - WPSPublicationPrefix = wPSPublicationPrefix; - } - - public String getWPSPublicationPrefix() { - return WPSPublicationPrefix; - } - - public String getProcessInstanceID() { - return processInstanceID; - } - - public static void setSagaLibDir(String sagaLibDir) { - SagaLibDir = sagaLibDir; - } - - public static String getSagaLibDir() { - return SagaLibDir; - } - - public void cancel() { - LOGGER.info("getrunning job cancel"); - this.cancelHack = true; - this.getRunningJob().cancel(true); - } - - public void setRunningJob(JobImpl runningJob) { - this.runningJob = runningJob; - } - - public JobImpl getRunningJob() { - return runningJob; - } - - public String getMyProxyURL() { - return myProxyURL; - } - - public void setMyProxyURL(String myProxyURL) { - this.myProxyURL = myProxyURL; - } - - public String getMyProxyUser() { - return myProxyUser; - } - - public void setMyProxyUser(String myProxyUser) { - this.myProxyUser = myProxyUser; - } - - public String getMyProxyPassword() { - return myProxyPassword; - } - - public void setMyProxyPassword(String myProxyPassword) { - this.myProxyPassword = myProxyPassword; - } - -} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/SagaCallbackManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/SagaCallbackManager.java deleted file mode 100644 index 222eef653..000000000 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/JavaSaga/SagaCallbackManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.n52.wps.server.profiles.JavaSaga; - -import org.ogf.saga.context.Context; -import org.ogf.saga.error.AuthorizationFailedException; -import org.ogf.saga.error.NotImplementedException; -import org.ogf.saga.monitoring.Callback; -import org.ogf.saga.monitoring.Metric; -import org.ogf.saga.monitoring.Monitorable; - -public class SagaCallbackManager implements Callback { - - @Override - public boolean cb(Monitorable monitorable, Metric metric, Context context) - throws NotImplementedException, AuthorizationFailedException { - try { - String value = metric.getAttribute(Metric.VALUE); - String name = metric.getAttribute(Metric.NAME); - System.out.println("Callback called for metric " + name + ", value = " - + value); - } catch (Throwable e) { - System.err.println("error" + e); - e.printStackTrace(System.err); - } - - // Keep the callback. - return true; - } - -} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/OutputParser.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/OutputParser.java index ef9d95e7f..f05c61f15 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/OutputParser.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/OutputParser.java @@ -1,197 +1,196 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - - -package org.n52.wps.server.profiles; -import net.opengis.wps.x100.OutputDataType; -import net.opengis.wps.x100.OutputDescriptionType; -import net.opengis.wps.x100.ProcessDescriptionType; - -import org.apache.log4j.Logger; -import org.n52.wps.io.IParser; -import org.n52.wps.io.ParserFactory; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.GTRasterDataBinding; -import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; -import org.n52.wps.io.data.binding.complex.URLListDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralBooleanBinding; -import org.n52.wps.io.data.binding.literal.LiteralDoubleBinding; -import org.n52.wps.io.data.binding.literal.LiteralIntBinding; -import org.n52.wps.io.data.binding.literal.LiteralStringBinding; -import org.n52.wps.io.datahandler.xml.AbstractXMLParser; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.util.BasicXMLTypeFactory; - - -public class OutputParser { - - private static Logger LOGGER = Logger - .getLogger(OutputParser.class); - - /** - * Handles the ComplexValueReference - * @param class1 - * @param input The client input - * @throws ExceptionReport If the input (as url) is invalid, or there is an error while parsing the XML. - */ - protected static String handleComplexValueReference(OutputDataType output) throws ExceptionReport{ - return output.getReference().getHref(); - - } - - /** - * Handles the complexValue, which in this case should always include XML - * which can be parsed into a FeatureCollection. - * @param class1 - * @param input The client input - * @throws ExceptionReport If error occured while parsing XML - */ - protected static IData handleComplexValue(OutputDataType output, ProcessDescriptionType processDescription) throws ExceptionReport{ - String outputID = output.getIdentifier().getStringValue(); - String complexValue = output.getData().getComplexData().toString(); - OutputDescriptionType outputDesc = null; - for(OutputDescriptionType tempDesc : processDescription.getProcessOutputs().getOutputArray()) { - if((tempDesc.getIdentifier().getStringValue().startsWith(outputID))) { - outputDesc = tempDesc; - break; - } - } - - if(outputDesc == null) { - throw new RuntimeException("output cannot be found in description for " + processDescription.getIdentifier().getStringValue() + "," + outputID); - } - - String schema = output.getData().getComplexData().getSchema(); - String encoding = output.getData().getComplexData().getEncoding(); - String format = output.getData().getComplexData().getMimeType(); - if(schema == null) { - schema = outputDesc.getComplexOutput().getDefault().getFormat().getSchema(); - } - if(format == null) { - format = outputDesc.getComplexOutput().getDefault().getFormat().getMimeType(); - } - if(encoding == null) { - encoding = outputDesc.getComplexOutput().getDefault().getFormat().getEncoding(); - } - LOGGER.info(schema+" "+encoding+" "+format); - Class outputDataType = determineOutputDataType(outputID, outputDesc); - - IParser parser=null; - try { - parser = ParserFactory.getInstance().getParser(schema, format, encoding, outputDataType); - } catch (Exception e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - if(parser == null) { - parser = ParserFactory.getInstance().getSimpleParser(); - } - IData collection = null; - if(parser instanceof AbstractXMLParser) { - try { - collection = ((AbstractXMLParser)parser).parseXML(complexValue); - } - catch(RuntimeException e) { - throw new ExceptionReport("Error occured, while XML parsing", - ExceptionReport.NO_APPLICABLE_CODE, e); - } - } - else { - throw new ExceptionReport("parser does not support operation: " + parser.getClass().getName(), ExceptionReport.INVALID_PARAMETER_VALUE); - } - return collection; - } - - - - private static Class determineOutputDataType(String outputID, OutputDescriptionType output) { - - if(output.isSetLiteralOutput()){ - String datatype = output.getLiteralOutput().getDataType().getStringValue(); - if(datatype.contains("tring")){ - return LiteralStringBinding.class; - } - if(datatype.contains("ollean")){ - return LiteralBooleanBinding.class; - } - if(datatype.contains("loat") || datatype.contains("ouble")){ - return LiteralDoubleBinding.class; - } - if(datatype.contains("nt")){ - return LiteralIntBinding.class; - } - } - if(output.isSetComplexOutput()){ - String mimeType = output.getComplexOutput().getDefault().getFormat().getMimeType(); - if(mimeType.contains("xml") || (mimeType.contains("XML"))){ - if(output.getComplexOutput().getDefault().getFormat().getSchema().contains("wps")) - { - return URLListDataBinding.class; - } - else { - return GTVectorDataBinding.class;} - }else{ - return GTRasterDataBinding.class; - } - } - - throw new RuntimeException("Could not determie internal inputDataType"); - } - - public static IData handleLiteralValue(OutputDataType output) throws ExceptionReport { - - String parameter = output.getData().getLiteralData().getStringValue(); - String xmlDataType = output.getData().getLiteralData().getDataType(); - IData parameterObj = null; - try { - parameterObj = BasicXMLTypeFactory.getBasicJavaObject(xmlDataType, parameter); - } - catch(RuntimeException e) { - throw new ExceptionReport("The passed parameterValue: " + parameter + ", but should be of type: " + xmlDataType, ExceptionReport.INVALID_PARAMETER_VALUE); - } - if(parameterObj == null) { - throw new ExceptionReport("XML datatype as LiteralParameter is not supported by the server: dataType " + xmlDataType, - ExceptionReport.INVALID_PARAMETER_VALUE); - } - return parameterObj; - - } - - /** - * Handles BBoxValue - * @param input The client input - * @param class1 - */ - protected static IData handleBBoxValue(OutputDataType input) throws ExceptionReport{ - //String inputID = input.getIdentifier().getStringValue(); - throw new ExceptionReport("BBox is not supported", ExceptionReport.OPERATION_NOT_SUPPORTED); - } - -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + + +package org.n52.wps.server.profiles; +import net.opengis.wps.x100.OutputDataType; +import net.opengis.wps.x100.OutputDescriptionType; +import net.opengis.wps.x100.ProcessDescriptionType; + +import org.apache.log4j.Logger; +import org.n52.wps.io.IParser; +import org.n52.wps.io.ParserFactory; +import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.binding.complex.GTRasterDataBinding; +import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; +import org.n52.wps.io.data.binding.complex.URLListDataBinding; +import org.n52.wps.io.data.binding.literal.LiteralBooleanBinding; +import org.n52.wps.io.data.binding.literal.LiteralDoubleBinding; +import org.n52.wps.io.data.binding.literal.LiteralIntBinding; +import org.n52.wps.io.data.binding.literal.LiteralStringBinding; +import org.n52.wps.io.datahandler.xml.AbstractXMLParser; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.util.BasicXMLTypeFactory; + + +public class OutputParser { + + private static Logger LOGGER = Logger + .getLogger(OutputParser.class); + + /** + * Handles the ComplexValueReference + * @param class1 + * @param input The client input + * @throws ExceptionReport If the input (as url) is invalid, or there is an error while parsing the XML. + */ + protected static String handleComplexValueReference(OutputDataType output) throws ExceptionReport{ + return output.getReference().getHref(); + + } + + /** + * Handles the complexValue, which in this case should always include XML + * which can be parsed into a FeatureCollection. + * @param class1 + * @param input The client input + * @throws ExceptionReport If error occured while parsing XML + */ + protected static IData handleComplexValue(OutputDataType output, ProcessDescriptionType processDescription) throws ExceptionReport{ + String outputID = output.getIdentifier().getStringValue(); + String complexValue = output.getData().getComplexData().toString(); + OutputDescriptionType outputDesc = null; + for(OutputDescriptionType tempDesc : processDescription.getProcessOutputs().getOutputArray()) { + if((tempDesc.getIdentifier().getStringValue().startsWith(outputID))) { + outputDesc = tempDesc; + break; + } + } + + if(outputDesc == null) { + throw new RuntimeException("output cannot be found in description for " + processDescription.getIdentifier().getStringValue() + "," + outputID); + } + + String schema = output.getData().getComplexData().getSchema(); + String encoding = output.getData().getComplexData().getEncoding(); + String format = output.getData().getComplexData().getMimeType(); + if(schema == null) { + schema = outputDesc.getComplexOutput().getDefault().getFormat().getSchema(); + } + if(format == null) { + format = outputDesc.getComplexOutput().getDefault().getFormat().getMimeType(); + } + if(encoding == null) { + encoding = outputDesc.getComplexOutput().getDefault().getFormat().getEncoding(); + } + LOGGER.info(schema+" "+encoding+" "+format); + Class outputDataType = determineOutputDataType(outputID, outputDesc); + + IParser parser=null; + try { + parser = ParserFactory.getInstance().getParser(schema, format, encoding, outputDataType); + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + if(parser == null) { + parser = ParserFactory.getInstance().getSimpleParser(); + } + IData collection = null; + if(parser instanceof AbstractXMLParser) { + try { + collection = ((AbstractXMLParser)parser).parseXML(complexValue); + } + catch(RuntimeException e) { + throw new ExceptionReport("Error occured, while XML parsing", + ExceptionReport.NO_APPLICABLE_CODE, e); + } + } + else { + throw new ExceptionReport("parser does not support operation: " + parser.getClass().getName(), ExceptionReport.INVALID_PARAMETER_VALUE); + } + return collection; + } + + + + private static Class determineOutputDataType(String outputID, OutputDescriptionType output) { + + if(output.isSetLiteralOutput()){ + String datatype = output.getLiteralOutput().getDataType().getStringValue(); + if(datatype.contains("tring")){ + return LiteralStringBinding.class; + } + if(datatype.contains("ollean")){ + return LiteralBooleanBinding.class; + } + if(datatype.contains("loat") || datatype.contains("ouble")){ + return LiteralDoubleBinding.class; + } + if(datatype.contains("nt")){ + return LiteralIntBinding.class; + } + } + if(output.isSetComplexOutput()){ + String mimeType = output.getComplexOutput().getDefault().getFormat().getMimeType(); + if(mimeType.contains("xml") || (mimeType.contains("XML"))){ + if(output.getComplexOutput().getDefault().getFormat().getSchema().contains("wps")) + { + return URLListDataBinding.class; + } + else { + return GTVectorDataBinding.class;} + }else{ + return GTRasterDataBinding.class; + } + } + + throw new RuntimeException("Could not determie internal inputDataType"); + } + + public static IData handleLiteralValue(OutputDataType output) throws ExceptionReport { + String parameter = output.getData().getLiteralData().getStringValue(); + String xmlDataType = output.getData().getLiteralData().getDataType(); + IData parameterObj = null; + try { + parameterObj = BasicXMLTypeFactory.getBasicJavaObject(xmlDataType, parameter); + } + catch(RuntimeException e) { + throw new ExceptionReport("The passed parameterValue: " + parameter + ", but should be of type: " + xmlDataType, ExceptionReport.INVALID_PARAMETER_VALUE); + } + if(parameterObj == null) { + throw new ExceptionReport("XML datatype as LiteralParameter is not supported by the server: dataType " + xmlDataType, + ExceptionReport.INVALID_PARAMETER_VALUE); + } + return parameterObj; + + } + + /** + * Handles BBoxValue + * @param input The client input + * @param class1 + */ + protected static IData handleBBoxValue(OutputDataType input) throws ExceptionReport{ + //String inputID = input.getIdentifier().getStringValue(); + throw new ExceptionReport("BBox is not supported", ExceptionReport.OPERATION_NOT_SUPPORTED); + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaDeploymentProfile.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaDeploymentProfile.java new file mode 100644 index 000000000..06c794f8a --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaDeploymentProfile.java @@ -0,0 +1,154 @@ +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + +package org.n52.wps.server.profiles.java; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import net.opengis.wps.x100.ApacheOdeDeploymentProfileType; +import net.opengis.wps.x100.DeployProcessDocument; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPReply; +import org.apache.log4j.Logger; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.w3c.dom.Node; + +/** + * TODO rename ApacheOdeDeployementProfile to match to the XSD element type + * **/ +public class JavaDeploymentProfile extends DeploymentProfile { + + private static Logger LOGGER = Logger.getLogger(JavaDeploymentProfile.class); + private Node suitCase; + private Node bpel; + private Node clientWSDL; + private Map wsdlList; + private byte[] archive; + private String processId; + private boolean reference; + private String archiveRef; + + public JavaDeploymentProfile(DeployProcessDocument deployDom, + String processID) { + super(deployDom, processID); + try { + Property[] properties = WPSConfig.getInstance() + .getPropertiesForRepositoryName("JavaRepository"); + extractInformation(deployDom); + } catch (Exception e) { + + e.printStackTrace(); + } + + } + + public Node getSuitCase() { + return suitCase; + } + + public Node getBPEL() { + return bpel; + } + + public Node getClientWSDL() { + return clientWSDL; + } + + public Map getWSDLList() { + return wsdlList; + } + + private void extractInformation(DeployProcessDocument deployDom) + throws Exception { + + ApacheOdeDeploymentProfileType deployProfile = (ApacheOdeDeploymentProfileType) deployDom.getDeployProcess().getDeploymentProfile().changeType(ApacheOdeDeploymentProfileType.type); + if(!deployProfile.validate()) { + throw new ExceptionReport("Oozie Deploy Profile is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + setProcessId(deployDom.getDeployProcess().getProcessDescription() + .getIdentifier().getStringValue()); + if (deployProfile.isSetArchive()) { + // Note that XMLBeans automatically decodes base64 + setArchive(deployProfile.getArchive()); + setReference(false); + } else if (deployProfile.isSetArchiveReference()) { + setArchiveRef(deployProfile.getArchiveReference().getHref()); + LOGGER.info("downloading archive"); + setArchive(downloadArchive(getArchiveRef())); + setReference(true); + } + } + + + public void setArchive(byte[] archive) { + LOGGER.info("setArchive"); + this.archive = archive; + } + + public byte[] getArchive() { + return archive; + } + + public void setProcessId(String processId) { + this.processId = processId; + } + + public String getProcessId() { + return processId; + } + + public void setReference(boolean reference) { + this.reference = reference; + } + + public boolean isReference() { + return reference; + } + + public void setArchiveRef(String string) { + this.archiveRef = string; + } + + public String getArchiveRef() { + return archiveRef; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaManager.java new file mode 100644 index 000000000..4cd6d0e05 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaManager.java @@ -0,0 +1,420 @@ +package org.n52.wps.server.profiles.java; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import net.opengis.wps.x100.AuditTraceType; +import net.opengis.wps.x100.ExecuteDocument; +import net.opengis.wps.x100.InputType; + +import org.apache.axiom.om.OMElement; +import org.apache.axiom.soap.SOAPHeaderBlock; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.apache.commons.io.filefilter.FileFilterUtils; +import org.apache.log4j.Logger; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.io.data.IData; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.profiles.AbstractProcessManager; +import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; +import org.n52.wps.server.request.DeployProcessRequest; +import org.n52.wps.server.request.ExecuteRequest; +import org.n52.wps.server.request.InputHandler; +import org.n52.wps.server.request.UndeployProcessRequest; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.n52.wps.util.StreamUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + + + + +/** + * TODO this class was based on transactional branch implementation. However the + * invoke method was reimplemented Therefore there is a doublon implementation + * for sending request. * + * + * @author cnl + * + */ +public class JavaManager extends AbstractProcessManager { + // logger for debug purpose + private final Logger log = Logger.getLogger(getClass()); + private String deployDirectory; + // the WPS instance ID (not expected to be the same) + private String taskId; + // the oozie instance ID + private String jobId; + // Client for Oozie (oozie jar) + // HDFS manager (for file system operations) + private String jobTrackerUrl; + private JavaTransactionalAlgorithm algorithm; + + + /** + * Contructor + * + * @param parentRepository + */ + public JavaManager(ITransactionalAlgorithmRepository parentRepository) { + super(parentRepository); + // Retrieve repository properties from wps_config.xml (WEB-INF/config) + Property[] properties = WPSConfig.getInstance() + .getPropertiesForRepositoryName("JavaRepository"); + String fullPath = this.getClass() + .getProtectionDomain().getCodeSource().getLocation().toString(); + int searchIndex = fullPath.indexOf("WEB-INF"); + String subPath = fullPath.substring(0, searchIndex); + subPath = subPath.replaceFirst("file:", ""); + String path = subPath + "WEB-INF/JavaProcesses/"; + this.setDeployDirectory(path); + // Todo include the configuration files + + } + + /** + * undeploy a process + */ + @Override + public boolean unDeployProcess(UndeployProcessRequest request) + throws Exception { + return unstoreArchive(request.getProcessID()); + } + + @Override + public boolean containsProcess(String processID) throws Exception { + // Not used, inherited historically + return false; + } + + @Override + public Collection getAllProcesses() throws Exception { + // TODO Auto-generated method stub + return null; + } + + @Override + public Document invoke(ExecuteDocument payload, String algorithmID) + throws Exception { + // TODO Auto-generated method stub + return null; + } + + + public Map invokeJava(ExecuteRequest request, String algorithmID) + throws Exception { + + Properties outputProps = null; + //String processPath = getProcessJar(algorithmID); + // Get the user from the SOAP header + // String user = getUser(request); + // TODO replace user by saml token value + String user = "christophe"; + // Get the WPS process instance id (task id) + String taskId = request.getId(); + // set the username + // set the namenode and jobtracker URLs + // do not change the IP of the jobTracker and the nameNode + String inputDir = "/user/" + user + File.separator + algorithmID + File.separator+ "/results/" + taskId + "/inputs"; + String outputDir = "/user/" + user + File.separator + algorithmID + File.separator + "/results/" + taskId + "/ouputs"; + List jarList = new ArrayList(); + // Jar file + String jarDir = getProcessDeploymentDirectory(algorithmID); + // List all file in parent directory with jar suffix extension + Collection list = FileUtils.listFiles(new File(jarDir), FileFilterUtils.suffixFileFilter("jar"), null); + for(File f : list) { + URL jarURL = f.toURI().toURL(); + jarList.add(jarURL); + } + ClassLoader classLoader = new URLClassLoader(jarList.toArray(new URL[jarList.size()]), this.getClass().getClassLoader()); + + //if( be.spacebel.ese.data.wps.DownloadEOData) + + JavaTransactionalAlgorithm algorithm = (JavaTransactionalAlgorithm)classLoader.loadClass(algorithmID).newInstance(); + InputType[] inputs = new InputType[0]; + if (request.getExecute().getDataInputs() != null) { + inputs = request.getExecute().getDataInputs().getInputArray(); + } + InputHandler parser = new InputHandler(inputs,algorithmID); + algorithm.setInstanceId(taskId); + this.setAlgorithm(algorithm); + Map outputs = algorithm.run(parser.getParsedInputData()); + return outputs; + + + + } + + @Override + public boolean deployProcess(DeployProcessRequest request) throws Exception { + // Get the the deployment profile from the request + DeploymentProfile profile = request.getDeploymentProfile(); + if (!(profile instanceof JavaDeploymentProfile)) { + throw new Exception("Requested Deployment Profile not supported"); + } + JavaDeploymentProfile deploymentProfile = (JavaDeploymentProfile) profile; + String processID = deploymentProfile.getProcessID(); + // Store the archive from the request + writePackage(deploymentProfile.getArchive(), processID); + log.debug("Stored Archive:" + deploymentProfile.getArchive()); + return true; + } + + /** + * Write a jar file + * + * @param archive + * @param processID + * @throws IOException + */ + private void writePackage(byte[] archive, String processID) + throws IOException { + // Deployment directory (definition) + String archiveDir = getProcessDeploymentDirectory(processID); + File directory = new File(archiveDir); + if (!directory.exists()) { + log.info("Creating directory " + archiveDir); + directory.mkdirs(); + } + ByteArrayInputStream bais = new ByteArrayInputStream(archive); + byte[] buf = new byte[1024]; + ZipInputStream zis = new ZipInputStream(bais); + ZipEntry zipentry = null; + // For each zip entry (file), create the directory, then write the file + while ((zipentry = zis.getNextEntry()) != null) { + String entryName = zipentry.getName(); + if (zipentry.isDirectory()) { + log.info("Create dir " + entryName); + File entryFile = new File(archiveDir+entryName); + if(!directory.exists()) + directory.mkdirs(); + //this.getHdfsManager().mkdir(archiveDir + entryName); + } else { + log.info("Writing file " + entryName); + File entryFile = new File(archiveDir+entryName); + byte[] byteArray = IOUtils.toByteArray(zis); + // note: cannot use write Stream to file because it closes the input stream. + FileUtils.writeByteArrayToFile(new File(archiveDir+entryName),byteArray); + } + zis.closeEntry(); + + } + + zis.close(); + log.info("Stored archive in " + archiveDir); + + } + + /** + * Unstore Archive + * + * @param processId + * @return + * @throws IOException + */ + private boolean unstoreArchive(String processId) throws IOException { + String archiveDir = getProcessDeploymentDirectory(processId); + FileUtils.deleteDirectory(new File(archiveDir)); + return true; + + } + + /** + * Deletes all files and subdirectories under dir. Returns true if all + * deletions were successful. If a deletion fails, the method stops + * attempting to delete and returns false. + * + * @param dir + * @return + */ + public static boolean deleteDir(File dir) { + if (dir.isDirectory()) { + String[] children = dir.list(); + for (int i = 0; i < children.length; i++) { + boolean success = deleteDir(new File(dir, children[i])); + if (!success) { + return false; + } + } + } + + // The directory is now empty so delete it + return dir.delete(); + } + + /** + * Get the deployment directory of a process + * + * @param processID + * @return + */ + public String getProcessDeploymentDirectory(String processID) { + return this.getDeployDirectory() + processID + File.separator; + } + + + + @Override + public AuditTraceType getAuditLongForm() throws Exception { + log.debug("long form"); + + // Get the job log + System.out.print("JobLog:"); + // Create a new empty XML document + DocumentBuilderFactory docFactory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.newDocument(); + // Create a "Log" root element + Element rootElement = doc.createElement("Log"); + // Set the log as text content + rootElement.setTextContent(this.getAlgorithm().getAudit()); + doc.appendChild(rootElement); + // Parse the Audit Trace document (any el / any att type) + AuditTraceType audit = AuditTraceType.Factory.parse(doc); + return audit; + } + + @Override + public AuditTraceType getAudit() throws Exception { + // TODO Auto-generated method stub + + return AuditTraceType.Factory.newInstance(); + } + + @Override + public String getIID() { + return this.getTaskId(); + } + + @Override + public void cancel() { + try { + //this.getClient().kill(this.jobId); + this.getAlgorithm().cancel(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * Utility method that should better be implemented in WPSConfig class Get + * the property string value and throws exception if null + */ + + private String getPropertyUtil(String property, Property[] properties) { + Property prop = WPSConfig.getInstance().getPropertyForKey(properties, + property); + if (prop == null) { + throw new RuntimeException("Error. Could not find " + property); + } + return prop.getStringValue(); + + } + + + + public String getDeployDirectory() { + return this.deployDirectory; + } + + public void setDeployDirectory(String deployDirectory) { + this.deployDirectory = deployDirectory; + } + + private String getUser(ExecuteRequest req) { + String cnName = null; + try { + + for (SOAPHeaderBlock samlHeader : req.getSamlHeader()) { + log.info("LocalName = " + samlHeader.getLocalName()); + OMElement assertion = (OMElement) samlHeader + .getChildrenWithLocalName("Assertion").next(); + log.info("Assertion found:" + assertion.toString()); + OMElement attributeStatement = (OMElement) assertion + .getChildrenWithLocalName("AttributeStatement").next(); + log.info("AttributeStatement found"); + OMElement subject = (OMElement) attributeStatement + .getChildrenWithLocalName("Subject").next(); + log.info("Subject found:" + subject.toString()); + OMElement nameIdentifier = (OMElement) subject + .getChildrenWithLocalName("NameIdentifier").next(); + log.info("Name Id found" + nameIdentifier.toString()); + cnName = nameIdentifier.getText(); + log.info(cnName); + } + + } catch (Exception e) { + } + + return cnName; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + + + public String getJobTrackerUrl() { + return jobTrackerUrl; + } + + public void setJobTrackerUrl(String jobTrackerUrl) { + this.jobTrackerUrl = jobTrackerUrl; + } + + public static String getJavaProcessPath(String process) { + String fullPath = JavaManager.class + .getProtectionDomain().getCodeSource().getLocation().toString(); + int searchIndex = fullPath.indexOf("WEB-INF"); + String subPath = fullPath.substring(0, searchIndex); + subPath = subPath.replaceFirst("file:", ""); + String javaProcessPath = subPath + "WEB-INF/JavaRepository/"+process+"/"; + return javaProcessPath; + } + + @Override + public Document invoke(ExecuteRequest request, String algorithmID) + throws Exception { + throw new ExceptionReport("This method should not have been called. Implementation error.", "1", "none"); + } + + public JavaTransactionalAlgorithm getAlgorithm() { + return algorithm; + } + + public void setAlgorithm(JavaTransactionalAlgorithm algorithm) { + this.algorithm = algorithm; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaTransactionalAlgorithm.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaTransactionalAlgorithm.java new file mode 100644 index 000000000..b75bc653d --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/java/JavaTransactionalAlgorithm.java @@ -0,0 +1,47 @@ +package org.n52.wps.server.profiles.java; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.n52.wps.io.data.IData; +import org.n52.wps.server.ITransactionalAlgorithm; + +public abstract class JavaTransactionalAlgorithm implements ITransactionalAlgorithm { + + private String instanceId; + + + + + @Override + public void cancel() { + // TODO Auto-generated method stub + + } + + @Override + public Map run(Map> inputData) + throws InterruptedException { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getAudit() { + // TODO Auto-generated method stub + return null; + } + + public String getInstanceId() { + return instanceId; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + public abstract Class getInputDataType(String id); + public abstract Class getOutputDataType(String id); + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/HDFSClient.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/HDFSClient.java new file mode 100644 index 000000000..9c83abd94 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/HDFSClient.java @@ -0,0 +1,480 @@ +/* + This file is a modification of the free code given on the link below: + http://linuxjunkies.wordpress.com/ + + 2011 + */ +package org.n52.wps.server.profiles.oozie; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.PrivilegedExceptionAction; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.BlockLocation; +import org.apache.hadoop.fs.FSDataInputStream; +import org.apache.hadoop.fs.FSDataOutputStream; +import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hdfs.DistributedFileSystem; +import org.apache.hadoop.hdfs.protocol.DatanodeInfo; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.log4j.Logger; + +public class HDFSClient { + + // HDFS System configuration files + private Logger log = Logger.getLogger(getClass()); + private String hdfsURL; + private String user; + private Configuration configuration; + + /** + * If needed, creates the home directory for the user because Oozie expects + * this directory to exist. + * + * @param userId + * user id for which the home directory is checked (and created). + * @throws Exception + */ + public void createHomeDirectoryIfNeeded(final String userId) + throws Exception { + + try { + final FileSystem fs = FileSystem.get(this.getConfiguration()); + UserGroupInformation ugi = UserGroupInformation + .createRemoteUser(this.getUser()); + log.debug("Creating home directory of user "+userId+" using privilege of user "+this.getUser()); + ugi.doAs(new PrivilegedExceptionAction() { + + public Void run() throws Exception { + + org.apache.hadoop.fs.Path homeDir = new org.apache.hadoop.fs.Path( + "/user/" + userId); + if (!fs.exists(homeDir)) { + fs.mkdirs(homeDir); + fs.setOwner(homeDir, userId, userId); + } + + return null; + + } + }); + } catch (Exception ex) { + log.error( + "Error occured while trying to create the Oozie home directory: " + + ex.getMessage(), ex); + throw new Exception( + "Error occured while trying to create the Oozie home directory: " + + ex.getMessage(), null); + } + + } + + public static void main(String[] args) throws IOException, + InterruptedException { + HDFSClient client = new HDFSClient("hdfs://quickstart.cloudera:8020", + "hdfs"); + String deployDirectory = "/user/christophe/deploy"; + + // Deployment directory (definition) + String archiveDir = deployDirectory + File.separator + "test3" + + File.separator; + // Creation of deployment directory + client.mkdir(archiveDir); + + try { + client.createHomeDirectoryIfNeeded("pouet"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // Read the zip archive + + } + + public HDFSClient(String url, String hdfsAdmin) { + this.setHdfsURL(url); + this.setUser(hdfsAdmin); + System.setProperty("HADOOP_USER_NAME", "hdfs"); + Configuration conf = new Configuration(); + //conf.set("user.name", hdfsAdmin); + //conf.set("hadoop.job.ugi", "hdfs"); + conf.set("fs.defaultFS", url); + conf.set("fs.trash.interval", "1"); + conf.set("io.file.buffer.size", "65536"); + conf.set("dfs.namenode.servicerpc-address", "192.168.56.101:8022"); + conf.set("dfs.https.address", "192.168.56.101:50470"); + conf.set("dfs.https.port", "50470"); + conf.set("dfs.namenode.http-address", "192.168.56.101:50070"); + conf.set("dfs.blocksize", "134217728"); + conf.set("dfs.replication", "3"); + conf.set("dfs.client.use.datanode.hostname", "true"); + + this.setConfiguration(conf); + } + + public static void printUsage() { + System.out + .println("Usage: hdfsclient add" + " "); + System.out.println("Usage: hdfsclient read" + ""); + System.out.println("Usage: hdfsclient delete" + ""); + System.out.println("Usage: hdfsclient mkdir" + ""); + System.out.println("Usage: hdfsclient copyfromlocal" + + " "); + System.out.println("Usage: hdfsclient copytolocal" + + " "); + System.out + .println("Usage: hdfsclient modificationtime" + ""); + System.out.println("Usage: hdfsclient getblocklocations" + + ""); + System.out.println("Usage: hdfsclient gethostnames"); + } + + public boolean ifExists(Path source) throws IOException { + + FileSystem hdfs = FileSystem.get(this.getConfiguration()); + boolean isExists = hdfs.exists(source); + return isExists; + } + + public void getHostnames() throws IOException { + FileSystem fs = FileSystem.get(this.getConfiguration()); + DistributedFileSystem hdfs = (DistributedFileSystem) fs; + DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats(); + + String[] names = new String[dataNodeStats.length]; + for (int i = 0; i < dataNodeStats.length; i++) { + names[i] = dataNodeStats[i].getHostName(); + System.out.println((dataNodeStats[i].getHostName())); + } + } + + public void getBlockLocations(String source) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + Path srcPath = new Path(source); + + // Check if the file already exists + if (!(ifExists(srcPath))) { + System.out.println("No such destination " + srcPath); + return; + } + // Get the filename out of the file path + String filename = source.substring(source.lastIndexOf('/') + 1, + source.length()); + + FileStatus fileStatus = fileSystem.getFileStatus(srcPath); + + BlockLocation[] blkLocations = fileSystem.getFileBlockLocations( + fileStatus, 0, fileStatus.getLen()); + int blkCount = blkLocations.length; + + System.out.println("File :" + filename + "stored at:"); + for (int i = 0; i < blkCount; i++) { + String[] hosts = blkLocations[i].getHosts(); + System.out.format("Host %d: %s %n", i, hosts); + } + + } + + public void getModificationTime(String source) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + Path srcPath = new Path(source); + + // Check if the file already exists + if (!(fileSystem.exists(srcPath))) { + System.out.println("No such destination " + srcPath); + return; + } + // Get the filename out of the file path + String filename = source.substring(source.lastIndexOf('/') + 1, + source.length()); + + FileStatus fileStatus = fileSystem.getFileStatus(srcPath); + long modificationTime = fileStatus.getModificationTime(); + + System.out.format("File %s; Modification time : %0.2f %n", filename, + modificationTime); + + } + + public Configuration getConfiguration() { + return this.configuration; + } + + public void writeFile(final InputStream in, final String dest) + throws IOException, InterruptedException { + final Path path = new Path(dest); + log.debug("Writing file on HDFS by using privilege of user "+this.getUser()); + UserGroupInformation ugi = UserGroupInformation.createRemoteUser(this + .getUser()); + final FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + /* + * // Create the destination path including the filename. if + * (dest.charAt(dest.length() - 1) != '/') { dest = dest + "/" + + * filename; } else { dest = dest + filename; } + * + * // Check if the file already exists + * + * if (fileSystem.exists(path)) { System.out.println("File " + dest + + * " already exists"); return; } // if parent directory does not exist + * if (path.getParent() != null && !fileSystem.exists(path.getParent())) + * { log.debug("MKDIR in writeFile "+path.getParent()); + * fileSystem.mkdirs(path.getParent()); } + */ + // Create a new file and write data to it. + ugi.doAs(new PrivilegedExceptionAction() { + public Void run() throws Exception { + FSDataOutputStream out; + log.debug("create file system file:" + path); + out = fileSystem.create(path); + byte[] b = new byte[1024]; + int numBytes = 0; + while ((numBytes = in.read(b)) > 0) { + out.write(b, 0, numBytes); + } + + // Close all the file descripters + // in.close(); + out.close(); + log.debug("closing fs"); + fileSystem.close(); + return null; + } + }); + } + + public void copyFromLocal(String source, String dest) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + Path srcPath = new Path(source); + + Path dstPath = new Path(dest); + // Check if the file already exists + if (!(fileSystem.exists(dstPath))) { + System.out.println("No such destination " + dstPath); + return; + } + + // Get the filename out of the file path + String filename = source.substring(source.lastIndexOf('/') + 1, + source.length()); + + try { + fileSystem.copyFromLocalFile(srcPath, dstPath); + System.out.println("File " + filename + "copied to " + dest); + } catch (Exception e) { + System.err.println("Exception caught! :" + e); + System.exit(1); + } finally { + fileSystem.close(); + } + } + + public void copyToLocal(String source, String dest) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + Path srcPath = new Path(source); + + Path dstPath = new Path(dest); + // Check if the file already exists + if (!(fileSystem.exists(srcPath))) { + System.out.println("No such destination " + srcPath); + return; + } + + // Get the filename out of the file path + String filename = source.substring(source.lastIndexOf('/') + 1, + source.length()); + + try { + fileSystem.copyToLocalFile(srcPath, dstPath); + System.out.println("File " + filename + "copied to " + dest); + } catch (Exception e) { + System.err.println("Exception caught! :" + e); + System.exit(1); + } finally { + fileSystem.close(); + } + } + + public void renameFile(String fromthis, String tothis) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + Path fromPath = new Path(fromthis); + Path toPath = new Path(tothis); + + if (!(fileSystem.exists(fromPath))) { + System.out.println("No such destination " + fromPath); + return; + } + + if (fileSystem.exists(toPath)) { + System.out.println("Already exists! " + toPath); + return; + } + + try { + boolean isRenamed = fileSystem.rename(fromPath, toPath); + if (isRenamed) { + System.out.println("Renamed from " + fromthis + "to " + tothis); + } + } catch (Exception e) { + System.out.println("Exception :" + e); + System.exit(1); + } finally { + fileSystem.close(); + } + + } + + public void addFile(String source, String dest) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + + // Get the filename out of the file path + String filename = source.substring(source.lastIndexOf('/') + 1, + source.length()); + + // Create the destination path including the filename. + if (dest.charAt(dest.length() - 1) != '/') { + dest = dest + "/" + filename; + } else { + dest = dest + filename; + } + + // Check if the file already exists + Path path = new Path(dest); + if (fileSystem.exists(path)) { + System.out.println("File " + dest + " already exists"); + return; + } + + // Create a new file and write data to it. + FSDataOutputStream out = fileSystem.create(path); + InputStream in = new BufferedInputStream(new FileInputStream(new File( + source))); + + byte[] b = new byte[1024]; + int numBytes = 0; + while ((numBytes = in.read(b)) > 0) { + out.write(b, 0, numBytes); + } + + // Close all the file descripters + in.close(); + out.close(); + fileSystem.close(); + } + + public void readFile(String file) throws IOException { + + FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + + Path path = new Path(file); + if (!fileSystem.exists(path)) { + System.out.println("File " + file + " does not exists"); + return; + } + + FSDataInputStream in = fileSystem.open(path); + + String filename = file.substring(file.lastIndexOf('/') + 1, + file.length()); + + OutputStream out = new BufferedOutputStream(new FileOutputStream( + new File(filename))); + + byte[] b = new byte[1024]; + int numBytes = 0; + while ((numBytes = in.read(b)) > 0) { + out.write(b, 0, numBytes); + } + + in.close(); + out.close(); + fileSystem.close(); + } + + public void deleteFile(final String file) throws IOException, + InterruptedException { + log.debug("Delete file using the privilege of user "+this.getUser()); + final FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + final Path path = new Path(file); + UserGroupInformation ugi = UserGroupInformation.createRemoteUser(this + .getUser()); + ugi.doAs(new PrivilegedExceptionAction() { + public Void run() throws Exception { + + if (!fileSystem.exists(path)) { + System.out.println("File " + file + " does not exists"); + return null; + } + fileSystem.delete(new Path(file), true); + fileSystem.close(); + return null; + } + }); + } + + /** + * Configured user (admin) creates a directory + * + * @param dir + * @throws IOException + * @throws InterruptedException + */ + public void mkdir(final String dir) throws IOException, + InterruptedException { + log.debug("MKDIR " + dir); + UserGroupInformation ugi = UserGroupInformation.createRemoteUser(this + .getUser()); + + final FileSystem fileSystem = FileSystem.get(this.getConfiguration()); + + ugi.doAs(new PrivilegedExceptionAction() { + + public Void run() throws Exception { + + Path path = new Path(dir); + if (fileSystem.exists(path)) { + System.out.println("Dir " + dir + " already exists!"); + return null; + } + fileSystem.mkdirs(path); + fileSystem.close(); + return null; + } + }); + + } + + public void setConfiguration(Configuration configuration) { + this.configuration = configuration; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getHdfsURL() { + return hdfsURL; + } + + public void setHdfsURL(String hdfsURL) { + this.hdfsURL = hdfsURL; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/OozieDeploymentProfile.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/OozieDeploymentProfile.java new file mode 100644 index 000000000..387af5701 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/OozieDeploymentProfile.java @@ -0,0 +1,143 @@ +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + +package org.n52.wps.server.profiles.oozie; + +import java.util.Map; + +import net.opengis.wps.x100.DeployProcessDocument; +import net.opengis.wps.x100.OozieDeploymentProfileType; + +import org.apache.log4j.Logger; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.w3c.dom.Node; + +/** + * TODO rename ApacheOdeDeployementProfile to match to the XSD element type + * **/ +public class OozieDeploymentProfile extends DeploymentProfile { + + private static Logger LOGGER = Logger.getLogger(OozieDeploymentProfile.class); + private Node suitCase; + private Node bpel; + private Node clientWSDL; + private Map wsdlList; + private byte[] archive; + private String processId; + private boolean reference; + private String archiveRef; + + public OozieDeploymentProfile(DeployProcessDocument deployDom, + String processID) { + super(deployDom, processID); + try { + + extractInformation(deployDom); + } catch (Exception e) { + + e.printStackTrace(); + } + + } + + public Node getSuitCase() { + return suitCase; + } + + public Node getBPEL() { + return bpel; + } + + public Node getClientWSDL() { + return clientWSDL; + } + + public Map getWSDLList() { + return wsdlList; + } + + private void extractInformation(DeployProcessDocument deployDom) + throws Exception { + + OozieDeploymentProfileType deployProfile = (OozieDeploymentProfileType) deployDom.getDeployProcess().getDeploymentProfile().changeType(OozieDeploymentProfileType.type); + if(!deployProfile.validate()) { + throw new ExceptionReport("Oozie Deploy Profile is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + setProcessId(deployDom.getDeployProcess().getProcessDescription() + .getIdentifier().getStringValue()); + if (deployProfile.isSetArchive()) { + // Note that XMLBeans automatically decodes base64 + setArchive(deployProfile.getArchive()); + setReference(false); + } else if (deployProfile.isSetArchiveReference()) { + setArchiveRef(deployProfile.getArchiveReference().getHref()); + LOGGER.info("downloading archive"); + setArchive(downloadArchive(getArchiveRef())); + setReference(true); + } + } + + + + public void setArchive(byte[] archive) { + LOGGER.info("setArchive"); + this.archive = archive; + } + + public byte[] getArchive() { + return archive; + } + + public void setProcessId(String processId) { + this.processId = processId; + } + + public String getProcessId() { + return processId; + } + + public void setReference(boolean reference) { + this.reference = reference; + } + + public boolean isReference() { + return reference; + } + + public void setArchiveRef(String string) { + this.archiveRef = string; + } + + public String getArchiveRef() { + return archiveRef; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/OozieManager.java b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/OozieManager.java new file mode 100644 index 000000000..7aad38172 --- /dev/null +++ b/52n-wps-server/src/main/java/org/n52/wps/server/profiles/oozie/OozieManager.java @@ -0,0 +1,784 @@ +package org.n52.wps.server.profiles.oozie; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import net.opengis.wps.x100.AuditTraceType; +import net.opengis.wps.x100.DocumentOutputDefinitionType; +import net.opengis.wps.x100.ExecuteDocument; +import net.opengis.wps.x100.ExecuteResponseDocument; +import net.opengis.wps.x100.ExecuteResponseDocument.ExecuteResponse.ProcessOutputs; +import net.opengis.wps.x100.InputType; +import net.opengis.wps.x100.OutputDataType; +import net.opengis.wps.x100.OutputDescriptionType; + +import org.apache.axiom.om.OMElement; +import org.apache.axiom.soap.SOAPHeaderBlock; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.oozie.client.OozieClient; +import org.apache.oozie.client.OozieClientException; +import org.apache.oozie.client.WorkflowAction; +import org.apache.oozie.client.WorkflowJob; +import org.apache.oozie.client.WorkflowJob.Status; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlString; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.profiles.AbstractProcessManager; +import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; +import org.n52.wps.server.request.DeployProcessRequest; +import org.n52.wps.server.request.ExecuteRequest; +import org.n52.wps.server.request.UndeployProcessRequest; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import xint.esa.ese.wps.format.urlList.URLListDocument; +import xint.esa.ese.wps.format.urlList.URLListDocument.URLList; + +/** + * TODO this class was based on transactional branch implementation. However the + * invoke method was reimplemented Therefore there is a doublon implementation + * for sending request. * + * + * @author cnl + * + */ +public class OozieManager extends AbstractProcessManager { + // TODO rename to Oozie instead ozzie + // logger for debug purpose + private final Logger log = Logger.getLogger(getClass()); + private String oozieUrl; + private String deployDirectory; + private String hdfsUrl; + + // the WPS instance ID (not expected to be the same) + private String taskId; + // the oozie instance ID + private String jobId; + // Client for Oozie (oozie jar) + private OozieClient client; + // HDFS manager (for file system operations) + private HDFSClient hdfsManager; + private String jobTrackerUrl; + private String hadoopDefaultUser; + + /** + * Singleton for the Oozie client + * + * @return + */ + private OozieClient getClient() { + if (this.client == null) { + this.client = new OozieClient(this.getOozieUrl()); + } + return this.client; + } + + + public String getPriority(ArrayList priority) { + String cnName = null; + try { + for (SOAPHeaderBlock samlHeader : priority) { + OMElement priority1 = (OMElement) samlHeader + .getChildrenWithLocalName("Priority").next(); + + cnName = priority1.getText(); + log.debug("discovered CNAME is "+cnName); + } + } catch (Exception e) { + e.printStackTrace(); + } + if (StringUtils.isBlank(cnName)) { + return null; + } + return cnName; + } + + + public String getSAMLUserName(ArrayList saml) { + String cnName = null; + try { + for (SOAPHeaderBlock samlHeader : saml) { + OMElement assertion = (OMElement) samlHeader + .getChildrenWithLocalName("Assertion").next(); + OMElement attributeStatement = (OMElement) assertion + .getChildrenWithLocalName("AttributeStatement").next(); + OMElement subject = (OMElement) attributeStatement + .getChildrenWithLocalName("Subject").next(); + OMElement nameIdentifier = (OMElement) subject + .getChildrenWithLocalName("NameIdentifier").next(); + cnName = nameIdentifier.getText(); + } + } catch (Exception e) { + } + if (StringUtils.isBlank(cnName)) { + return this.getHadoopDefaultUser(); + } + return cnName; + } + + /** + * Contructor + * + * @param parentRepository + */ + public OozieManager(ITransactionalAlgorithmRepository parentRepository) { + super(parentRepository); + // Retrieve repository properties from wps_config.xml (WEB-INF/config) + Property[] properties = WPSConfig.getInstance() + .getPropertiesForRepositoryName("OozieRepository"); + // Get the Oozie URL property + this.setOozieUrl(getPropertyUtil("Oozie_URL", properties)); + this.setDeployDirectory(getPropertyUtil("HDFS_Deploy_Directory", + properties)); + this.hdfsUrl = getPropertyUtil("HDFS_Local_URL", properties); + this.jobTrackerUrl = getPropertyUtil("JobTracker_URL", properties); + // Todo include the configuration files + this.setHdfsManager(new HDFSClient(getPropertyUtil("HDFS_Remote_URL", + properties), getPropertyUtil("HDFS_Admin_User", properties))); + this.setHadoopDefaultUser(getPropertyUtil("Hadoop_Default_User", + properties)); + } + + /** + * undeploy a process + */ + @Override + public boolean unDeployProcess(UndeployProcessRequest request) + throws Exception { + return unstoreArchive(request.getProcessID()); + } + + @Override + public boolean containsProcess(String processID) throws Exception { + // Not used, inherited historically + return false; + } + + @Override + public Collection getAllProcesses() throws Exception { + // TODO Auto-generated method stub + return null; + } + + @Override + public Document invoke(ExecuteDocument payload, String algorithmID) + throws Exception { + // TODO Auto-generated method stub + return null; + } + + @Override + public Document invoke(ExecuteRequest request, String algorithmID) + throws Exception { + Properties outputProps = null; + Properties conf = this.getClient().createConfiguration(); + // Get the user from the SOAP header + // String user = getUser(request); + // TODO replace user by saml token value + String user = this.getSAMLUserName(request.getSamlHeader()); + // Get the WPS process instance id (task id) + String taskId = request.getId(); + // set the username + conf.setProperty("user.name", user); + log.debug("has set the user name: " + user); + // create the user home directory if necessary + try { + this.getHdfsManager().createHomeDirectoryIfNeeded(user); + } + catch(Exception e) { + // create Home directory error. + } + String priority = this.getPriority(request.getQOSHeaderBlocks()); + if(priority != null) { + conf.setProperty("priority",priority); + log.debug("priority property set :"+priority); + } + // set the namenode and jobtracker URLs + conf.setProperty("jobTracker", this.getJobTrackerUrl()); + // do not change the IP of the jobTracker and the nameNode + conf.setProperty("nameNode", this.getHdfsUrl()); + ///conf.setProperty("jobTracker", this.getJobTrackerUrl()); + // set the path to the workflow that is deployed on HDFS + conf.setProperty( + "oozie.wf.application.path", + "${nameNode}" + this.getDeployDirectory() + + request.getAlgorithmIdentifier() + "/workflow.xml"); + // String inputDir = "/user/" + user + "/results/" + taskId + "/inputs"; + String outputDir = "/user/" + user + "/results/" + taskId + "/ouputs"; + // this.getHdfsManager().mkdir(inputDir); + // this.getHdfsManager().mkdir(outputDir); + // conf.setProperty("inputDir", "${nameNode}/user/" + user + "/eodata"); + // conf.setProperty("outputDir", "${nameNode}/user/" + user + + // "/results"); + // conf.setProperty("inputDir", "${nameNode}" + inputDir); + // conf.setProperty("outputDir", "${nameNode}" + outputDir); + + InputType[] inputs = request.getExecute().getDataInputs() + .getInputArray(); + + for (InputType input : inputs) { + if (input.getData().isSetLiteralData()) { + String identifier = input.getIdentifier().getStringValue(); + String value = input.getData().getLiteralData() + .getStringValue(); + conf.setProperty(identifier, value); + } + if (input.getData().isSetComplexData()) { + log.debug("INPUT:" + input.toString()); + URLListDocument doc = URLListDocument.Factory.parse(input + .getData().getComplexData().newInputStream()); + StringBuffer sb = new StringBuffer(); + for (String url : doc.getURLList().getUrlArray()) { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(url); + } + String identifier = input.getIdentifier().getStringValue(); + conf.setProperty(identifier, sb.toString()); + } + if (input.getData().isSetBoundingBoxData()) { + log.debug("INPUT:" + input.toString()); + List upCorner = (List)input.getData().getBoundingBoxData().getUpperCorner(); + List lowCorner = (List) input.getData().getBoundingBoxData().getLowerCorner(); + String identifier = input.getIdentifier().getStringValue(); + conf.setProperty(identifier+"_tlx", lowCorner.get(1).toString()); + conf.setProperty(identifier+"_tly", upCorner.get(0).toString()); + conf.setProperty(identifier+"_brx", upCorner.get(1).toString()); + conf.setProperty(identifier+"_bry", lowCorner.get(0).toString()); + } + } + try { + this.jobId = this.getClient().run(conf); + System.out.println("Job ID: " + this.jobId); + WorkflowJob workflowJob = this.getClient().getJobInfo(this.jobId); + Status status = workflowJob.getStatus(); + int sleepStrategy = 150; + while (status != WorkflowJob.Status.SUCCEEDED + && status != WorkflowJob.Status.FAILED + && status != WorkflowJob.Status.KILLED) { + Thread.sleep(sleepStrategy); + log.debug("sleeping for " + sleepStrategy + " ms"); + if (sleepStrategy < 3000) + sleepStrategy = sleepStrategy * 2; + workflowJob = this.getClient().getJobInfo(this.jobId); + status = workflowJob.getStatus(); + + } + if (status == WorkflowJob.Status.SUCCEEDED) { + log.debug("publishing"); + for (WorkflowAction action : workflowJob.getActions()) { + if (action.getName().equals("Publish")) { + System.out.println("Data: " + action.getData()); + outputProps = new Properties(); + outputProps.load(new StringReader(action.getData())); + log.debug(outputProps.toString()); + } + } + } else { + if (status == WorkflowJob.Status.KILLED) { + String errorMessage = "Killed Process - Failed Actions:"; + + for (WorkflowAction action : workflowJob.getActions()) { + if (action.getStatus() == WorkflowAction.Status.ERROR) { + WorkflowAction realAction; + if(action.getErrorMessage()==null){ + realAction = guessSubWorkflowErrorMessage(action.getExternalId()); + } + else { + realAction= action; + } + errorMessage = errorMessage.concat("\n" + + realAction.getName() + "(id:" + + realAction.getId() + ") - status:" + + realAction.getStatus().toString() + + " -start time:" + + realAction.getStartTime().toGMTString() + + " - error code:" + realAction.getErrorCode() + + " - message:" + realAction.getErrorMessage()); + } + + } + + ExceptionReport exReport = new ExceptionReport( + errorMessage, ExceptionReport.NO_APPLICABLE_CODE); + log.debug("killed"); + exReport.printStackTrace(); + throw exReport; + + } + if (status == WorkflowJob.Status.FAILED) { + String errorMessage = "Failed Process - Failed Actions:"; + + for (WorkflowAction action : workflowJob.getActions()) { + if (action.getStatus() == WorkflowAction.Status.ERROR) { + WorkflowAction realAction; + if(action.getErrorMessage()==null){ + realAction = guessSubWorkflowErrorMessage(action.getExternalId()); + } + else { + realAction= action; + } + errorMessage = errorMessage.concat("\n" + + realAction.getName() + "(id:" + + realAction.getId() + ") - status:" + + realAction.getStatus().toString() + + " -start time:" + + realAction.getStartTime().toGMTString() + + " - error code:" + realAction.getErrorCode() + + " - message:" + realAction.getErrorMessage()); + } + + } + ExceptionReport exReport = new ExceptionReport( + errorMessage, ExceptionReport.NO_APPLICABLE_CODE); + log.debug("killed"); + exReport.printStackTrace(); + throw exReport; + + } + log.debug("untrowned exception"); + throw new ExceptionReport("Oozie - Not successful job", + ExceptionReport.NO_APPLICABLE_CODE); + } + } + + catch (OozieClientException ex) { + ex.printStackTrace(); + throw new ExceptionReport("Oozie client exception", "1", "none"); + } + ExecuteResponseDocument execRepDom = ExecuteResponseDocument.Factory + .newInstance(); + execRepDom.addNewExecuteResponse(); + execRepDom.getExecuteResponse().setLang("en"); + execRepDom.getExecuteResponse().addNewProcessInstanceIdentifier() + .setInstanceId(taskId); + execRepDom.getExecuteResponse().addNewStatus() + .setProcessSucceeded("success"); + execRepDom.getExecuteResponse().addNewProcessOutputs(); + execRepDom.getExecuteResponse().addNewProcessOutputs(); + ProcessOutputs outputsDom = execRepDom.getExecuteResponse() + .getProcessOutputs(); + + for (DocumentOutputDefinitionType outputEntry : request.getExecute() + .getResponseForm().getResponseDocument().getOutputArray()) { + String outputName = outputEntry.getIdentifier().getStringValue(); + String value = outputProps.getProperty(outputName); + OutputDataType output = outputsDom.addNewOutput(); + output.addNewIdentifier().setStringValue(outputName); + OutputDescriptionType desc = getOutputDescription( + request.getAlgorithmIdentifier(), outputName); + if (desc != null && desc.isSetComplexOutput()) { + output.addNewData().addNewComplexData() + .set(this.createURLList(value)); + } else { + output.addNewData().addNewLiteralData().setStringValue(value); + } + } + + log.debug(execRepDom.toString()); + // ProcessOutputs outputsDom = execRepDom.getExecuteResponse() + return (Document) execRepDom.getDomNode(); + } + + private URLListDocument createURLList(String urls) { + URLListDocument urlListDocument = URLListDocument.Factory.newInstance(); + URLList list = urlListDocument.addNewURLList(); + StringTokenizer st = new StringTokenizer(urls, ","); + while (st.hasMoreTokens()) { + list.addNewUrl().setStringValue(st.nextToken()); + } + return urlListDocument; + } + + private WorkflowAction guessSubWorkflowErrorMessage(String oozieSubWorkflowId) throws OozieClientException { + + WorkflowJob workflowJob = this.getClient().getJobInfo( + oozieSubWorkflowId); + List workflowActions = workflowJob.getActions(); + for (WorkflowAction workflowAction : workflowActions) { + if (workflowAction.getErrorMessage() != null) { + return workflowAction; + } else if ("sub-workflow".equals(workflowAction.getType())) { + return guessSubWorkflowErrorMessage(workflowAction + .getExternalId()); + } + } + return null; + } + + public OutputDescriptionType getOutputDescription(String algo, + String identifier) { + OutputDescriptionType[] outputsDesc = this.parentRepository + .getProcessDescription(algo).getProcessOutputs() + .getOutputArray(); + for (OutputDescriptionType desc : outputsDesc) { + if (desc.getIdentifier().getStringValue() + .equalsIgnoreCase(identifier)) { + return desc; + } + } + return null; + } + + @Override + public boolean deployProcess(DeployProcessRequest request) throws Exception { + // Get the the deployment profile from the request + DeploymentProfile profile = request.getDeploymentProfile(); + if (!(profile instanceof OozieDeploymentProfile)) { + throw new Exception("Requested Deployment Profile not supported"); + } + OozieDeploymentProfile deploymentProfile = (OozieDeploymentProfile) profile; + String processID = deploymentProfile.getProcessID(); + // Store the archive from the request + storeArchive(deploymentProfile.getArchive(), processID); + log.debug("Stored Archive:" + deploymentProfile.getArchive()); + return true; + } + + /** + * Unzip a collection of files contained in a archive zip file and write + * onto hdfs + * + * @param archive + * @param processID + * @throws IOException + * @throws InterruptedException + */ + private void storeArchive(byte[] archive, String processID) + throws IOException, InterruptedException { + // Deployment directory (definition) + String archiveDir = getProcessDeploymentDirectory(processID); + // Creation of deployment directory + log.info("Creating directory " + archiveDir); + this.getHdfsManager().mkdir(archiveDir); + log.info("Storing archive in " + archiveDir); + // Read the zip archive + ByteArrayInputStream bais = new ByteArrayInputStream(archive); + byte[] buf = new byte[1024]; + ZipInputStream zis = new ZipInputStream(bais); + ZipEntry zipentry = null; + // For each zip entry (file), create the directory, then write the file + while ((zipentry = zis.getNextEntry()) != null) { + String entryName = zipentry.getName(); + if (zipentry.isDirectory()) { + log.info("Create dir " + entryName); + this.getHdfsManager().mkdir(archiveDir + entryName); + } else { + log.info("Writing file " + entryName); + this.getHdfsManager().writeFile(zis, archiveDir + entryName); + } + zis.closeEntry(); + + } + + zis.close(); + + } + + /** + * Unstore Archive + * + * @param processId + * @return + * @throws IOException + * @throws InterruptedException + */ + private boolean unstoreArchive(String processId) throws IOException, InterruptedException { + String archiveDir = getProcessDeploymentDirectory(processId); + this.getHdfsManager().deleteFile(archiveDir); + ; + + return true; + } + + /** + * Deletes all files and subdirectories under dir. Returns true if all + * deletions were successful. If a deletion fails, the method stops + * attempting to delete and returns false. + * + * @param dir + * @return + */ + public static boolean deleteDir(File dir) { + if (dir.isDirectory()) { + String[] children = dir.list(); + for (int i = 0; i < children.length; i++) { + boolean success = deleteDir(new File(dir, children[i])); + if (!success) { + return false; + } + } + } + + // The directory is now empty so delete it + return dir.delete(); + } + + /** + * Get the deployment directory of a process + * + * @param processID + * @return + */ + private String getProcessDeploymentDirectory(String processID) { + return this.getDeployDirectory() + processID + File.separator; + } + + @Override + public AuditTraceType getAuditLongForm() throws Exception { + log.debug("long form"); + if (this.getJobId() == null) { + throw new RuntimeException( + "Error. WPS service has not created the Oozie job yet."); + } + // Get the job log + String jobLog = this.getClient().getJobLog(jobId); + System.out.print("JobLog:"+jobLog); + + DocumentBuilderFactory docFactory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.newDocument(); + // Create a "Log" root element + Element rootElement = doc.createElement("Audit"); + // Set the log as text content + rootElement.setTextContent(jobLog); + + //doc.appendChild(rootElement); + // Parse the Audit Trace document (any el / any att type) + //AuditTraceType audit = AuditTraceType.Factory.parse(jobLog); + AuditTraceType audit = AuditTraceType.Factory.parse(rootElement); + return audit; + } + + public static void main(String[] args) throws XmlException, ParserConfigurationException { + XmlString xmlString =XmlString.Factory.newInstance(); + xmlString.setStringValue("1"); + AuditTraceType audit = AuditTraceType.Factory.parse(xmlString.getDomNode()); + audit.setShortForm(true); + + //audit.set(xmlString); + + /** + DocumentBuilderFactory docFactory = DocumentBuilderFactory + .newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.newDocument(); + // Create a "Log" root element + Element rootElement = doc.createElement("Audit"); + // Set the log as text content + rootElement.setTextContent(test); + + //doc.appendChild(rootElement); + //AuditTraceType audit = AuditTraceType.Factory.parse(rootElement); + AuditTraceType audit = AuditTraceType.Factory.newInstance(); + */ + XmlString x = XmlString.Factory.parse(audit.getDomNode()); + + System.out.println(x.getStringValue()); + + } + + @Override + public AuditTraceType getAudit() throws Exception { + // TODO Auto-generated method stub + XmlString xmlString =XmlString.Factory.newInstance(); + xmlString.setStringValue(this.jobId); + AuditTraceType audit = AuditTraceType.Factory.parse(xmlString.getDomNode()); + audit.setShortForm(true); +return audit; + + } + + @Override + public String getIID() { + return this.getTaskId(); + } + + @Override + public void cancel() { + try { + if (StringUtils.isNotBlank(this.jobId)) { + this.getClient().kill(this.jobId); + } + } catch (OozieClientException e) { + e.printStackTrace(); + } + + } + + /** + * Utility method that should better be implemented in WPSConfig class Get + * the property string value and throws exception if null + */ + + private String getPropertyUtil(String property, Property[] properties) { + Property prop = WPSConfig.getInstance().getPropertyForKey(properties, + property); + if (prop == null) { + throw new RuntimeException("Error. Could not find " + property); + } + return prop.getStringValue(); + + } + + public String getOozieUrl() { + return oozieUrl; + } + + public void setOozieUrl(String oozieUrl) { + this.oozieUrl = oozieUrl; + } + + public String getDeployDirectory() { + if (!deployDirectory.endsWith(File.separator)) { + deployDirectory = deployDirectory.concat(File.separator); + } + return deployDirectory; + } + + public void setDeployDirectory(String deployDirectory) { + this.deployDirectory = deployDirectory; + } + + private String getUser(ExecuteRequest req) { + String cnName = null; + try { + + for (SOAPHeaderBlock samlHeader : req.getSamlHeader()) { + log.info("LocalName = " + samlHeader.getLocalName()); + OMElement assertion = (OMElement) samlHeader + .getChildrenWithLocalName("Assertion").next(); + log.info("Assertion found:" + assertion.toString()); + OMElement attributeStatement = (OMElement) assertion + .getChildrenWithLocalName("AttributeStatement").next(); + log.info("AttributeStatement found"); + OMElement subject = (OMElement) attributeStatement + .getChildrenWithLocalName("Subject").next(); + log.info("Subject found:" + subject.toString()); + OMElement nameIdentifier = (OMElement) subject + .getChildrenWithLocalName("NameIdentifier").next(); + log.info("Name Id found" + nameIdentifier.toString()); + cnName = nameIdentifier.getText(); + log.info(cnName); + } + + } catch (Exception e) { + } + + return cnName; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public HDFSClient getHdfsManager() { + return hdfsManager; + } + + public void setHdfsManager(HDFSClient hdfsManager) { + this.hdfsManager = hdfsManager; + } + + public String getJobTrackerUrl() { + return jobTrackerUrl; + } + + public void setJobTrackerUrl(String jobTrackerUrl) { + this.jobTrackerUrl = jobTrackerUrl; + } + + public static void main2(String[] args) { + OozieClient xclient = new OozieClient( + "http://192.168.56.101:11000/oozie/"); + Properties conf = xclient.createConfiguration(); + + // set the username + // conf.setProperty("user.name", "oozie"); + conf.setProperty("user.name", "christophe"); + // set the namenode and jobtracker URLs + + // do not change the IP of the jobTracker and the nameNode + conf.setProperty("nameNode", "hdfs://localhost.localdomain:8020"); + conf.setProperty("jobTracker", "localhost.localdomain:8021"); + + // set the path to the workflow that is deployed on HDFS + conf.setProperty("oozie.wf.application.path", + "${nameNode}/user/christophe/workflows/parent/workflow.xml"); + // set additional parameters for the Oozie workflow + conf.setProperty("roiX", "4000"); + conf.setProperty("roiY", "4000"); + conf.setProperty("roiW", "1000"); + conf.setProperty("roiH", "1000"); + conf.setProperty("byteDepth", "1"); + conf.setProperty("inputDir", "${nameNode}/user/christophe/eodata"); + conf.setProperty("outputDir", "${nameNode}/user/christophe/results"); + try { + String jobId = xclient.run(conf); + System.out.println("Workflow job submitted : " + jobId); + WorkflowJob workflowJob = xclient.getJobInfo(jobId); + Status status = workflowJob.getStatus(); + while (status != WorkflowJob.Status.SUCCEEDED) { + String jobLog = xclient.getJobLog(jobId); + System.out.print("JobLog:"); + System.out.println(jobLog); + + Thread.sleep(5000); + workflowJob = xclient.getJobInfo(jobId); + status = workflowJob.getStatus(); + + } + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public String getHdfsUrl() { + return hdfsUrl; + } + + public void setHdfsUrl(String hdfsUrl) { + this.hdfsUrl = hdfsUrl; + } + + public String getHadoopDefaultUser() { + return hadoopDefaultUser; + } + + public void setHadoopDefaultUser(String hadoopDefaultUser) { + this.hadoopDefaultUser = hadoopDefaultUser; + } +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/repository/DefaultTransactionalProcessRepository.java b/52n-wps-server/src/main/java/org/n52/wps/server/repository/DefaultTransactionalProcessRepository.java index f5450de99..61670c64b 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/repository/DefaultTransactionalProcessRepository.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/repository/DefaultTransactionalProcessRepository.java @@ -1,355 +1,356 @@ -package org.n52.wps.server.repository; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import net.opengis.wps.x100.DataDescriptionType; -import net.opengis.wps.x100.ProcessDescriptionType; - -import org.apache.log4j.Logger; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.RepositoryDocument.Repository; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.AbstractTransactionalAlgorithm; -import org.n52.wps.server.AbstractTransactionalData; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.IAlgorithm; -import org.n52.wps.server.profiles.AbstractProcessManager; -import org.n52.wps.server.profiles.DefaultTransactionalAlgorithm; -import org.n52.wps.server.profiles.IProcessManager; -import org.n52.wps.server.request.DeployProcessRequest; -import org.n52.wps.server.request.ExecuteRequest; -import org.n52.wps.server.request.UndeployProcessRequest; - -/** - * DefaultTransactionalProcessRepository is a default repository which include : - * -profile deployement class - process manager class - schema related to the - * profile - algorithm class - * - */ -public class DefaultTransactionalProcessRepository implements - ITransactionalAlgorithmRepository { - private static Logger LOGGER = Logger - .getLogger(DefaultTransactionalProcessRepository.class); - protected Map processDescriptionMap; - protected Map dataDescriptionMap; - protected String format; - - public String getFormat() { - return format; - } - - public void setFormat(String format) { - this.format = format; - } - - protected IProcessManager processManager; - private Repository repository; - - public DefaultTransactionalProcessRepository(String format) { - setFormat(format); - LOGGER.info("DefaultTransactionalProcessRepository - format:" + format); - setRepository(WPSConfig.getInstance().getRepositoryForFormat(format)); - - // DONE think of multiple instance of this class registered (yet not - // possible since singleton) - Property processManagerXML = getPropertyForKey("ProcessManager"); - if (processManagerXML == null) { - throw new RuntimeException( - "Error. Could not find matching ProcessManager"); - } - LOGGER.info("found process maanger"); - processDescriptionMap = new HashMap(); - dataDescriptionMap = new HashMap(); - // TODO check repository is active - /** - * algorithmMap = new HashMap(); for (Property property - * : getRepository().getPropertyArray()) { if - * (property.getName().equalsIgnoreCase("Algorithm") && - * property.getActive()) { algorithmMap.put(property.getStringValue(), - * property.getStringValue()); } } - */ - String className = processManagerXML.getStringValue(); - try { - LOGGER.info("Process Manager class: " - + processManagerXML.getStringValue()); - Class processManagerClass = Class.forName(className); - if (processManagerClass.asSubclass(AbstractProcessManager.class) - .equals(processManagerClass)) { - Constructor constructor = processManagerClass - .getConstructor(ITransactionalAlgorithmRepository.class); - processManager = (IProcessManager) constructor - .newInstance(this); - LOGGER.info("asSubclass"); - } else { - processManager = (IProcessManager) processManagerClass - .newInstance(); - } - - } catch (InstantiationException e) { - e.printStackTrace(); - throw new RuntimeException( - "Error. Could not find matching DeployManager"); - } catch (IllegalAccessException e) { - e.printStackTrace(); - throw new RuntimeException( - "Error. Could not find matching DeployManager"); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - throw new RuntimeException( - "Error. Could not find matching DeployManager"); - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (NoSuchMethodException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InvocationTargetException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - LOGGER.info("end constructor DefaultTrans"); - } - - public Repository getRepository() { - return repository; - } - - public void setRepository(Repository repository) { - this.repository = repository; - } - - public Property getPropertyForKey(String key) { - for (Property property : getRepository().getPropertyArray()) { - if (property.getName().equals(key)) { - return property; - } - } - return null; - } - - public boolean addAlgorithm(Object process) { - /** Should not be used anymore (see new signature) - * if (!(process instanceof DeployProcessRequest)) { - return false; - } - DeployProcessRequest request = (DeployProcessRequest) process; - try { - if(containsAlgorithm(request.getProcessID())) { - throw new ExceptionReport("Process already exists. Please undeploy before redeploying a Process.", - ExceptionReport.NO_APPLICABLE_CODE); - } - LOGGER.info("Adding process for profile: " + this.getFormat()); - processManager.deployProcess(request); - Property algoProp = getRepository().addNewProperty(); - algoProp.setName("Algorithm"); - algoProp.setActive(true); - algoProp.setStringValue(request.getProcessID()); - WPSConfig.getInstance().save(); - } catch (Exception e) { - LOGGER.warn("Could not instantiate algorithm: " + request); - e.printStackTrace(); - return false; - }*/ - return false; - } - - public void addAlgorithm(DeployProcessRequest request) throws ExceptionReport { - if(containsAlgorithm(request.getProcessID())) { - throw new ExceptionReport("Process already exists. Please undeploy before redeploying a Process.", - ExceptionReport.NO_APPLICABLE_CODE); - } - LOGGER.info("Adding process for profile: " + this.getFormat()); - try { - processManager.deployProcess(request); - /** - * Moved (TODO delete) - Property algoProp = getRepository().addNewProperty(); - algoProp.setName("Algorithm"); - algoProp.setActive(true); - algoProp.setStringValue(request.getProcessID()); - WPSConfig.getInstance().save(); - */ - } catch (Exception e) { - e.printStackTrace(); - throw new ExceptionReport("Deployment failed.", - ExceptionReport.NO_APPLICABLE_CODE); - } - return; - } - - /** - * TODO : check if the remote contains also the process --- return - * processManager.containsProcess(processID); Note: for some profile the - * backend doesn't support any deploy / undeploy / contains operation -> - * done through WPS - */ - public boolean containsAlgorithm(String processID) { - try { - for (Property property : getRepository().getPropertyArray()) { - if (property.getName().equalsIgnoreCase("Algorithm") - && property.getActive()) { - if (property.getStringValue().equals(processID)) { - return true; - } - } - } - return false; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - public IAlgorithm getAlgorithm(String processID, - ExecuteRequest executeRequest) { - return new DefaultTransactionalAlgorithm(processID); - - } - public Collection getDataNames() { - LOGGER.info("Get data names..."); - Collection dataNames= new ArrayList(); - try { - for (Property property : getRepository().getPropertyArray()) { - if (property.getName().equalsIgnoreCase("Data") - && property.getActive()) { - if (!property.getStringValue().isEmpty()) { - dataNames.add(property.getStringValue()); - LOGGER.info(property.getStringValue()); - } - } - } - } catch (Exception e) { - e.printStackTrace(); - return null; - } - return dataNames; - } - public Collection getAlgorithmNames() { - Collection algoNames= new ArrayList(); - try { - for (Property property : getRepository().getPropertyArray()) { - if (property.getName().equalsIgnoreCase("Algorithm") - && property.getActive()) { - if (!property.getStringValue().isEmpty()) { - algoNames.add(property.getStringValue()); - } - } - } - } catch (Exception e) { - e.printStackTrace(); - return null; - } - return algoNames; - /** - * Previous implementation which request backend : - * in SSEGRid this is not the case - * - try { - - return processManager.getAllProcesses(); - } catch (Exception e) { - e.printStackTrace(); - return new ArrayList(); - } - */ - } - - public Collection getAlgorithms() { - Collection result = new ArrayList(); - Collection allAlgorithms; - try { - LOGGER.info("class of processManager:" - + processManager.getClass().getName()); - allAlgorithms = processManager.getAllProcesses(); - } catch (Exception e) { - e.printStackTrace(); - return new ArrayList(); - } - for (String processID : allAlgorithms) { - result.add(new DefaultTransactionalAlgorithm(processID)); - } - return result; - } - - public boolean removeAlgorithm(Object process) { - LOGGER.info("removeAlgorithm"); - if (!(process instanceof UndeployProcessRequest)) { - LOGGER.info("not instance"); - return false; - } - UndeployProcessRequest request = (UndeployProcessRequest) process; - try { - LOGGER.info("try undeploy"); - processManager.unDeployProcess(request); - Property[] propArray = getRepository().getPropertyArray(); - for (int i = 0; i < propArray.length; i++) { - LOGGER.info(i); - Property algoProp = propArray[i]; - if (algoProp.getName().equalsIgnoreCase("Algorithm") - && algoProp.getActive()) { - if (algoProp.getStringValue() - .equals(request.getProcessID())) { - getRepository().removeProperty(i); - WPSConfig.getInstance().save(); - processDescriptionMap.remove(request.getProcessID()); - return true; - } - } - } - - } catch (Exception e) { - LOGGER.warn("Could not remove algorithm: " + request); - e.printStackTrace(); - return false; - } - return false; - - } - - @Override - public ProcessDescriptionType getProcessDescription(String processID) { - if (!processDescriptionMap.containsKey(processID)) { - LOGGER.info("Adding new process description to the map."); - processDescriptionMap.put(processID, - AbstractTransactionalAlgorithm.getDescription(processID)); - } - return processDescriptionMap.get(processID); - } - - public boolean containsData(String dataName) { - try { - for (Property property : getRepository().getPropertyArray()) { - if (property.getName().equalsIgnoreCase("Data") - && property.getActive()) { - if (property.getStringValue().equals(dataName)) { - return true; - } - } - } - return false; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - public DataDescriptionType getDataDescription(String dataName) { - LOGGER.info("start"); - if (!dataDescriptionMap.containsKey(dataName)) { - LOGGER.info("Adding new process description to the map."); - dataDescriptionMap.put(dataName, - AbstractTransactionalData.getDescription(dataName)); - } - return dataDescriptionMap.get(dataName); - - } - -} +package org.n52.wps.server.repository; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import net.opengis.wps.x100.DataDescriptionType; +import net.opengis.wps.x100.ProcessDescriptionType; + +import org.apache.log4j.Logger; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.RepositoryDocument.Repository; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.server.AbstractTransactionalAlgorithm; +import org.n52.wps.server.AbstractTransactionalData; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.IAlgorithm; +import org.n52.wps.server.profiles.AbstractProcessManager; +import org.n52.wps.server.profiles.DefaultTransactionalAlgorithm; +import org.n52.wps.server.profiles.IProcessManager; +import org.n52.wps.server.request.DeployProcessRequest; +import org.n52.wps.server.request.ExecuteRequest; +import org.n52.wps.server.request.UndeployProcessRequest; + +/** + * DefaultTransactionalProcessRepository is a default repository which include : + * -profile deployement class - process manager class - schema related to the + * profile - algorithm class + * + */ +public class DefaultTransactionalProcessRepository implements + ITransactionalAlgorithmRepository { + private static Logger LOGGER = Logger + .getLogger(DefaultTransactionalProcessRepository.class); + protected Map processDescriptionMap; + protected Map dataDescriptionMap; + protected String format; + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + protected IProcessManager processManager; + private Repository repository; + + public DefaultTransactionalProcessRepository(String format) { + setFormat(format); + LOGGER.info("DefaultTransactionalProcessRepository - format:" + format); + setRepository(WPSConfig.getInstance().getRepositoryForFormat(format)); + + // DONE think of multiple instance of this class registered (yet not + // possible since singleton) + Property processManagerXML = getPropertyForKey("ProcessManager"); + if (processManagerXML == null) { + throw new RuntimeException( + "Error. Could not find matching ProcessManager"); + } + LOGGER.info("found process maanger"); + processDescriptionMap = new HashMap(); + dataDescriptionMap = new HashMap(); + // TODO check repository is active + /** + * algorithmMap = new HashMap(); for (Property property + * : getRepository().getPropertyArray()) { if + * (property.getName().equalsIgnoreCase("Algorithm") && + * property.getActive()) { algorithmMap.put(property.getStringValue(), + * property.getStringValue()); } } + */ + String className = processManagerXML.getStringValue(); + try { + LOGGER.info("Process Manager class: " + + processManagerXML.getStringValue()); + Class processManagerClass = Class.forName(className); + if (processManagerClass.asSubclass(AbstractProcessManager.class) + .equals(processManagerClass)) { + Constructor constructor = processManagerClass + .getConstructor(ITransactionalAlgorithmRepository.class); + processManager = (IProcessManager) constructor + .newInstance(this); + LOGGER.info("asSubclass"); + } else { + processManager = (IProcessManager) processManagerClass + .newInstance(); + } + + } catch (InstantiationException e) { + e.printStackTrace(); + throw new RuntimeException( + "Error. Could not find matching DeployManager"); + } catch (IllegalAccessException e) { + e.printStackTrace(); + throw new RuntimeException( + "Error. Could not find matching DeployManager"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException( + "Error. Could not find matching DeployManager"); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchMethodException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + LOGGER.info("end constructor DefaultTrans"); + } + + public Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public Property getPropertyForKey(String key) { + for (Property property : getRepository().getPropertyArray()) { + if (property.getName().equals(key)) { + return property; + } + } + return null; + } + + public boolean addAlgorithm(Object process) { + /** Should not be used anymore (see new signature) + * if (!(process instanceof DeployProcessRequest)) { + return false; + } + DeployProcessRequest request = (DeployProcessRequest) process; + try { + if(containsAlgorithm(request.getProcessID())) { + throw new ExceptionReport("Process already exists. Please undeploy before redeploying a Process.", + ExceptionReport.NO_APPLICABLE_CODE); + } + LOGGER.info("Adding process for profile: " + this.getFormat()); + processManager.deployProcess(request); + Property algoProp = getRepository().addNewProperty(); + algoProp.setName("Algorithm"); + algoProp.setActive(true); + algoProp.setStringValue(request.getProcessID()); + WPSConfig.getInstance().save(); + } catch (Exception e) { + LOGGER.warn("Could not instantiate algorithm: " + request); + e.printStackTrace(); + return false; + }*/ + return false; + } + + public void addAlgorithm(DeployProcessRequest request) throws ExceptionReport { + if(containsAlgorithm(request.getProcessID())) { + throw new ExceptionReport("Process already exists. Please undeploy before redeploying a Process.", + ExceptionReport.NO_APPLICABLE_CODE); + } + LOGGER.info("Adding process for profile: " + this.getFormat()); + try { + processManager.deployProcess(request); + /** + * Moved (TODO delete) + Property algoProp = getRepository().addNewProperty(); + algoProp.setName("Algorithm"); + algoProp.setActive(true); + algoProp.setStringValue(request.getProcessID()); + WPSConfig.getInstance().save(); + */ + } catch (Exception e) { + e.printStackTrace(); + throw new ExceptionReport("Deployment failed.", + ExceptionReport.NO_APPLICABLE_CODE); + } + return; + } + + /** + * TODO : check if the remote contains also the process --- return + * processManager.containsProcess(processID); Note: for some profile the + * backend doesn't support any deploy / undeploy / contains operation -> + * done through WPS + */ + public boolean containsAlgorithm(String processID) { + try { + for (Property property : getRepository().getPropertyArray()) { + if (property.getName().equalsIgnoreCase("Algorithm") + && property.getActive()) { + if (property.getStringValue().equals(processID)) { + return true; + } + } + } + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public IAlgorithm getAlgorithm(String processID, + ExecuteRequest executeRequest) { + return new DefaultTransactionalAlgorithm(processID); + + } + public Collection getDataNames() { + LOGGER.info("Get data names..."); + Collection dataNames= new ArrayList(); + try { + for (Property property : getRepository().getPropertyArray()) { + if (property.getName().equalsIgnoreCase("Data") + && property.getActive()) { + if (!property.getStringValue().isEmpty()) { + dataNames.add(property.getStringValue()); + LOGGER.info(property.getStringValue()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return dataNames; + } + public Collection getAlgorithmNames() { + Collection algoNames= new ArrayList(); + try { + for (Property property : getRepository().getPropertyArray()) { + if (property.getName().equalsIgnoreCase("Algorithm") + && property.getActive()) { + if (!property.getStringValue().isEmpty()) { + algoNames.add(property.getStringValue()); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + return algoNames; + /** + * Previous implementation which request backend : + * in SSEGRid this is not the case + * + try { + + return processManager.getAllProcesses(); + } catch (Exception e) { + e.printStackTrace(); + return new ArrayList(); + } + */ + } + + public Collection getAlgorithms() { + Collection result = new ArrayList(); + Collection allAlgorithms; + try { + LOGGER.info("class of processManager:" + + processManager.getClass().getName()); + allAlgorithms = processManager.getAllProcesses(); + } catch (Exception e) { + e.printStackTrace(); + return new ArrayList(); + } + for (String processID : allAlgorithms) { + result.add(new DefaultTransactionalAlgorithm(processID)); + } + return result; + } + + public boolean removeAlgorithm(Object process) { + LOGGER.info("removeAlgorithm"); + if (!(process instanceof UndeployProcessRequest)) { + LOGGER.info("not instance"); + return false; + } + UndeployProcessRequest request = (UndeployProcessRequest) process; + try { + LOGGER.info("try undeploy"); + Property[] propArray = getRepository().getPropertyArray(); + for (int i = 0; i < propArray.length; i++) { + LOGGER.info(i); + Property algoProp = propArray[i]; + if (algoProp.getName().equalsIgnoreCase("Algorithm") + && algoProp.getActive()) { + if (algoProp.getStringValue() + .equals(request.getProcessID())) { + getRepository().removeProperty(i); + WPSConfig.getInstance().save(); + processDescriptionMap.remove(request.getProcessID()); + return true; + } + } + } + processManager.unDeployProcess(request); + + + } catch (Exception e) { + LOGGER.warn("Could not remove algorithm: " + request); + e.printStackTrace(); + return false; + } + return false; + + } + + @Override + public ProcessDescriptionType getProcessDescription(String processID) { + if (!processDescriptionMap.containsKey(processID)) { + LOGGER.info("Adding new process description to the map."); + processDescriptionMap.put(processID, + AbstractTransactionalAlgorithm.getDescription(processID)); + } + return processDescriptionMap.get(processID); + } + + public boolean containsData(String dataName) { + try { + for (Property property : getRepository().getPropertyArray()) { + if (property.getName().equalsIgnoreCase("Data") + && property.getActive()) { + if (property.getStringValue().equals(dataName)) { + return true; + } + } + } + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public DataDescriptionType getDataDescription(String dataName) { + LOGGER.info("start"); + if (!dataDescriptionMap.containsKey(dataName)) { + LOGGER.info("Adding new process description to the map."); + dataDescriptionMap.put(dataName, + AbstractTransactionalData.getDescription(dataName)); + } + return dataDescriptionMap.get(dataName); + + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/request/CancelRequest.java b/52n-wps-server/src/main/java/org/n52/wps/server/request/CancelRequest.java index 736d6e00c..3f93659a5 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/request/CancelRequest.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/request/CancelRequest.java @@ -1,169 +1,185 @@ -package org.n52.wps.server.request; - -import net.opengis.wps.x100.CancelDocument; -import net.opengis.wps.x100.ExecuteResponseDocument; -import net.opengis.wps.x100.GetStatusDocument; -import net.opengis.wps.x100.StatusType; - -import org.apache.commons.collections.map.CaseInsensitiveMap; -import org.apache.log4j.Logger; -import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlOptions; -import org.n52.wps.server.AbstractTransactionalAlgorithm; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.handler.WPSTask; -import org.n52.wps.server.response.CancelResponse; -import org.n52.wps.server.response.ExecuteResponse; -import org.n52.wps.server.response.Response; -import org.n52.wps.server.response.builder.CancelResponseBuilder; -import org.n52.wps.server.response.builder.GetStatusResponseBuilder; -import org.w3c.dom.Document; - -public class CancelRequest extends Request { - - private static Logger LOGGER = Logger.getLogger(CancelRequest.class); - private CancelDocument cancelDom; - private CancelResponseBuilder cancelRespBuilder; - private WPSTask task; - - // not implemented yet (HTTP GET) - public CancelRequest(CaseInsensitiveMap map) throws ExceptionReport { - super(map); - // TODO Auto-generated constructor stub - } - - /** - * Create a Cancel Request based on Document (HTTP Post) - * - * @param doc - * @throws ExceptionReport - */ - public CancelRequest(Document doc) throws ExceptionReport { - super(doc); - try { - /** - * XMLBeans option : the underlying xml text buffer is trimmed - * immediately after parsing a document resulting in a smaller - * memory footprint. - */ - XmlOptions option = new XmlOptions(); - option.setLoadTrimTextBuffer(); - this.cancelDom = CancelDocument.Factory.parse(doc, option); - if (this.cancelDom == null) { - LOGGER.fatal("CancelDocument is null"); - throw new ExceptionReport("Error while parsing post data", - ExceptionReport.MISSING_PARAMETER_VALUE); - } - } catch (XmlException e) { - throw new ExceptionReport("Error while parsing post data", - ExceptionReport.MISSING_PARAMETER_VALUE, e); - } - // Validate the request - if(!this.cancelDom.validate()) { - throw new ExceptionReport("Cancel request is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); - } - // create an initial response - } - - public CancelDocument getCancelDom() { - return cancelDom; - } - - public void setCancelDom(CancelDocument cancelDom) { - this.cancelDom = cancelDom; - } - - @Override - public Object getAttachedResult() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Response call() throws ExceptionReport { - LOGGER.info("Cancel call()"); - if (getTask() == null) { - // TODO check if ExecuteResponse document available (failed, - // cancelled) to be more precised - LOGGER.info("task doesn't exist"); - throw new ExceptionReport( - "The process instance identifier is not valid. The taks may have been already cancelled.", - ExceptionReport.INVALID_TASKID); - } - try { - // If a task is already started, the backend should also - // cancel the task - if (getTaskStatus().isSetProcessStarted()) { - LOGGER.info("Doing Process Cancellation"); - getTask().cancel(true); - if (getTask().isCancelled()) { - LOGGER.info("ProcessCancelled Yes"); - } - LOGGER.info("Process is started --> cancel backend"); - if (getTask().getRequest().getAlgorithm() instanceof AbstractTransactionalAlgorithm) { - LOGGER.info("Process is started --> cancel backend"); - ((AbstractTransactionalAlgorithm) getTask().getRequest() - .getAlgorithm()).cancel(); - } - // then cancel the task (the previous step generated an - // Exception if a problem occured) - - // update database (status file) with new status cancelled - // TODO replace with ProcessCancelled - getTaskStatus().unsetProcessStarted(); - getTaskStatus().setProcessCancelled(""); - ExecuteResponse resp = new ExecuteResponse(getTask() - .getRequest()); - } - } catch (Exception e) { - LOGGER.info("Task cannot be cancelled"); - throw new ExceptionReport("The task cannot be cancelled.", - ExceptionReport.CANCELLATION_FAILED); - } - // The CancelResponse is only returned if no exception occurs - setCancelRespBuilder(new CancelResponseBuilder(this)); - return new CancelResponse(this); - } - - private StatusType getTaskStatus() { - return getTask().getRequest().getExecuteResponseBuilder().getDoc() - .getExecuteResponse().getStatus(); - } - - /* - * (non-Javadoc) - * - * @see org.n52.wps.server.request.Request#validate() TODO not implemented - * yet - */ - @Override - public boolean validate() throws ExceptionReport { - return true; - } - - public void setCancelRespBuilder(CancelResponseBuilder cancelRespBuilder) { - this.cancelRespBuilder = cancelRespBuilder; - } - - public CancelResponseBuilder getCancelRespBuilder() { - return cancelRespBuilder; - } - - public Response call(WPSTask task) throws ExceptionReport { - setTask(task); - return call(); - } - - public void setTask(WPSTask task) { - this.task = task; - } - - public ExecuteResponseDocument getDoc() { - return getTask().getRequest().getExecuteResponseBuilder().getDoc(); - } - - public WPSTask getTask() { - return task; - } - -} +package org.n52.wps.server.request; + +import net.opengis.wps.x100.CancelDocument; +import net.opengis.wps.x100.ExecuteResponseDocument; +import net.opengis.wps.x100.GetStatusDocument; +import net.opengis.wps.x100.StatusType; + +import org.apache.commons.collections.map.CaseInsensitiveMap; +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; +import org.mortbay.log.Log; +import org.n52.wps.server.AbstractCancellableAlgorithm; +import org.n52.wps.server.AbstractTransactionalAlgorithm; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.handler.WPSTask; +import org.n52.wps.server.response.CancelResponse; +import org.n52.wps.server.response.ExecuteResponse; +import org.n52.wps.server.response.Response; +import org.n52.wps.server.response.builder.CancelResponseBuilder; +import org.n52.wps.server.response.builder.GetStatusResponseBuilder; +import org.w3c.dom.Document; + +public class CancelRequest extends Request { + + private static Logger LOGGER = Logger.getLogger(CancelRequest.class); + private CancelDocument cancelDom; + private CancelResponseBuilder cancelRespBuilder; + private WPSTask task; + + // not implemented yet (HTTP GET) + public CancelRequest(CaseInsensitiveMap map) throws ExceptionReport { + super(map); + // TODO Auto-generated constructor stub + } + + /** + * Create a Cancel Request based on Document (HTTP Post) + * + * @param doc + * @throws ExceptionReport + */ + public CancelRequest(Document doc) throws ExceptionReport { + super(doc); + try { + /** + * XMLBeans option : the underlying xml text buffer is trimmed + * immediately after parsing a document resulting in a smaller + * memory footprint. + */ + XmlOptions option = new XmlOptions(); + option.setLoadTrimTextBuffer(); + this.cancelDom = CancelDocument.Factory.parse(doc, option); + if (this.cancelDom == null) { + LOGGER.fatal("CancelDocument is null"); + throw new ExceptionReport("Error while parsing post data", + ExceptionReport.MISSING_PARAMETER_VALUE); + } + } catch (XmlException e) { + throw new ExceptionReport("Error while parsing post data", + ExceptionReport.MISSING_PARAMETER_VALUE, e); + } + // Validate the request + if(!this.cancelDom.validate()) { + throw new ExceptionReport("Cancel request is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + // create an initial response + } + + public CancelDocument getCancelDom() { + return cancelDom; + } + + public void setCancelDom(CancelDocument cancelDom) { + this.cancelDom = cancelDom; + } + + @Override + public Object getAttachedResult() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Response call() throws ExceptionReport { + LOGGER.info("Cancel call()"); + if (getTask() == null) { + // TODO check if ExecuteResponse document available (failed, + // cancelled) to be more precised + LOGGER.info("task doesn't exist"); + throw new ExceptionReport( + "The process instance identifier is not valid. The taks may have been already cancelled.", + ExceptionReport.INVALID_TASKID); + } + try { + if (getTaskStatus().isSetProcessStarted() || getTaskStatus().isSetProcessAccepted()) { + getTask().cancel(true); + + } + // If a task is already started, the backend should also + // cancel the task + if (getTaskStatus().isSetProcessStarted()) { + LOGGER.info("Doing Process Cancellation"); + if (getTask().isCancelled()) { + LOGGER.info("ProcessCancelled Yes"); + } + LOGGER.info("Process is started --> cancel backend"); + if (getTask().getRequest().getAlgorithm() instanceof AbstractTransactionalAlgorithm) { + LOGGER.info("Process is started --> cancel backend"); + ((AbstractTransactionalAlgorithm) getTask().getRequest() + .getAlgorithm()).cancel(); + } + if (getTask().getRequest().getAlgorithm() instanceof AbstractCancellableAlgorithm) { + LOGGER.info("Process is started --> cancel backend"); + ((AbstractCancellableAlgorithm) getTask().getRequest() + .getAlgorithm()).cancel(); + } + // then cancel the task (the previous step generated an + // Exception if a problem occured) + + // update database (status file) with new status cancelled + // TODO replace with ProcessCancelled + try { + getTaskStatus().unsetProcessStarted(); + } + catch(Exception e) { + Log.debug(getTaskStatus().toString()); + } + getTaskStatus().setProcessCancelled(""); + ExecuteResponse resp = new ExecuteResponse(getTask() + .getRequest()); + } + } catch (Exception e) { + e.printStackTrace(); + LOGGER.info("Task cannot be cancelled"); + throw new ExceptionReport("The task cannot be cancelled.", + ExceptionReport.CANCELLATION_FAILED); + } + // The CancelResponse is only returned if no exception occurs + setCancelRespBuilder(new CancelResponseBuilder(this)); + return new CancelResponse(this); + } + + private StatusType getTaskStatus() { + return getTask().getRequest().getExecuteResponseBuilder().getDoc() + .getExecuteResponse().getStatus(); + } + + /* + * (non-Javadoc) + * + * @see org.n52.wps.server.request.Request#validate() TODO not implemented + * yet + */ + @Override + public boolean validate() throws ExceptionReport { + return true; + } + + public void setCancelRespBuilder(CancelResponseBuilder cancelRespBuilder) { + this.cancelRespBuilder = cancelRespBuilder; + } + + public CancelResponseBuilder getCancelRespBuilder() { + return cancelRespBuilder; + } + + public Response call(WPSTask task) throws ExceptionReport { + setTask(task); + return call(); + } + + public void setTask(WPSTask task) { + this.task = task; + } + + public ExecuteResponseDocument getDoc() { + return getTask().getRequest().getExecuteResponseBuilder().getDoc(); + } + + public WPSTask getTask() { + return task; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/request/DeployProcessRequest.java b/52n-wps-server/src/main/java/org/n52/wps/server/request/DeployProcessRequest.java index 9720aa94d..2743963b5 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/request/DeployProcessRequest.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/request/DeployProcessRequest.java @@ -1,226 +1,303 @@ -package org.n52.wps.server.request; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import net.opengis.wps.x100.DeployProcessDocument; -import net.opengis.wps.x100.ProcessDescriptionType; - -import org.apache.commons.collections.map.CaseInsensitiveMap; -import org.apache.log4j.Logger; -import org.apache.xmlbeans.XmlException; -import org.apache.xmlbeans.XmlOptions; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.AbstractTransactionalAlgorithm; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; -import org.n52.wps.server.repository.TransactionalRepositoryManager; -import org.n52.wps.server.request.deploy.DeploymentProfile; -import org.n52.wps.server.response.DeployProcessResponse; -import org.n52.wps.server.response.Response; -import org.n52.wps.server.response.builder.DeployProcessResponseBuilder; -import org.w3c.dom.Document; - -public class DeployProcessRequest extends Request { - - private DeployProcessDocument deployProcessDom; - private static Logger LOGGER = Logger.getLogger(DeployProcessRequest.class); - private DeployProcessResponseBuilder deployProcessRespBuilder; - private String processID; - private String schema; - private ProcessDescriptionType processDescription; - private DeploymentProfile deploymentProfile; - private ITransactionalAlgorithmRepository repositoryManager; - - public DeployProcessRequest(CaseInsensitiveMap map) throws ExceptionReport { - super(map); - // TODO use optionally for HTTP Get (not supported) - } - - public DeployProcessRequest(Document doc) throws ExceptionReport { - super(doc); - /** - * XMLBeans option : the underlying xml text buffer is trimmed - * immediately after parsing a document resulting in a smaller memory - * footprint. - */ - try { - XmlOptions option = new XmlOptions(); - option.setLoadTrimTextBuffer(); - // Parse (with XMLBeans generated library) the request - this.deployProcessDom = DeployProcessDocument.Factory.parse(doc, - option); - } catch (XmlException e) { - throw new ExceptionReport("Error while parsing post data", - ExceptionReport.MISSING_PARAMETER_VALUE, e); - } - if (this.deployProcessDom == null ) { - LOGGER.fatal("DeployProcessDocument is null"); - throw new ExceptionReport("Error while parsing post data", - ExceptionReport.MISSING_PARAMETER_VALUE); - } - if(!this.deployProcessDom.validate()) { - throw new ExceptionReport("DeployProcess request is not valid (according WPS schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); - } - // TODO Validate the request (semantic compliance) - // validate(); - // Get useful infos - processID = getDeployProcessDom().getDeployProcess() - .getProcessDescription().getIdentifier().getStringValue(); - if (processID == null) { - throw new ExceptionReport( - "Error. Could not find process identifier in the process description", - ExceptionReport.MISSING_PARAMETER_VALUE); - } - processDescription = getDeployProcessDom().getDeployProcess() - .getProcessDescription(); - if(!processDescription.validate()) { - throw new ExceptionReport("Process Description is not valid according to the schema!",ExceptionReport.INVALID_PARAMETER_VALUE); - } - schema = getDeployProcessDom().getDeployProcess() - .getDeploymentProfile().getSchema().getHref(); - if (schema == null) { - throw new ExceptionReport( - "Error. Could not find schema in the deployment profile", - ExceptionReport.MISSING_PARAMETER_VALUE); - } - LOGGER.info("Deploying process ID: " + processID); - // Parse the specialized part (profile) - try { - // Get the DeployementProfile specialized for this profile - String deployementProfileClass = TransactionalRepositoryManager - .getDeploymentProfileForSchema(schema); - LOGGER.info("deployementprofile class:" + deployementProfileClass); - // Load the DeployementProfile Constructor for parsing the specific - // profile part - Constructor constructor; - constructor = Class.forName(deployementProfileClass) - .getConstructor(DeployProcessDocument.class, String.class); - LOGGER.info("Constructor loaded"); - setDeploymentProfile((DeploymentProfile) constructor.newInstance( - getDeployProcessDom(), processID)); - LOGGER.info("Deployement Profile Set"); - } catch (NoSuchMethodException e) { - throw new ExceptionReport("An error has occurred while obtaining " - + "the deployment profile", - ExceptionReport.NO_APPLICABLE_CODE, e); - } catch (ClassNotFoundException e) { - throw new ExceptionReport("An error has occurred while obtaining " - + "the deployment profile", - ExceptionReport.NO_APPLICABLE_CODE, e); - } catch (InstantiationException e) { - throw new ExceptionReport("An error has occurred while obtaining " - + "the deployment profile", - ExceptionReport.NO_APPLICABLE_CODE, e); - } catch (IllegalAccessException e) { - throw new ExceptionReport("An error has occurred while obtaining " - + "the deployment profile", - ExceptionReport.NO_APPLICABLE_CODE, e); - } catch (InvocationTargetException e) { - throw new ExceptionReport("An error has occurred while obtaining " - + "the deployment profile", - ExceptionReport.NO_APPLICABLE_CODE, e); - } - - } - - public String getProcessID() { - return processID; - } - - public void setProcessID(String processID) { - this.processID = processID; - } - - public DeployProcessDocument getDeployProcessDom() { - return deployProcessDom; - } - - public void setDeployProcessDom(DeployProcessDocument deployProcessDom) { - this.deployProcessDom = deployProcessDom; - } - - @Override - public Object getAttachedResult() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Response call() throws ExceptionReport { - // stores the Process Description (in WEB-INF) - // TODO check to enhance with FlatFileDatabase (?) - LOGGER.info("Starting the deployement..."); - // Get the repository manager (typically the - // DefaultTransactionalProcessRepository) - repositoryManager = TransactionalRepositoryManager - .getMatchingTransactionalRepository(schema); - LOGGER.info("*************************=========... match"); - - if (repositoryManager == null) { - LOGGER.info("*************************=========... not found"); - throw new ExceptionReport("Could not find matching repository", - ExceptionReport.NO_APPLICABLE_CODE); - - - } - // Add the algorithm the repository of the specific profile - repositoryManager.addAlgorithm(this); - LOGGER.info("*************************=========... addedAlgo"); - // if Deployement Successful then store the process description - /** - * TODO I suggest not to use AbstractTransactionalAlgorithm but a - * ProcessDescriptionManager class instead - * */ - AbstractTransactionalAlgorithm.setDescription(this.getProcessID(), - this.getProcessDescription()); - Property algoProp = WPSConfig.getInstance().getRepositoryForFormat(schema).addNewProperty(); - algoProp.setName("Algorithm"); - algoProp.setActive(true); - algoProp.setStringValue(this.getProcessID()); - WPSConfig.getInstance().save(); - setDeployProcessRespBuilder(new DeployProcessResponseBuilder(this)); - return new DeployProcessResponse(this); - } - - @Override - public boolean validate() throws ExceptionReport { - // TODO Auto-generated method stub - return false; - } - - public void setDeployProcessRespBuilder( - DeployProcessResponseBuilder deployProcessRespBuilder) { - this.deployProcessRespBuilder = deployProcessRespBuilder; - } - - public DeployProcessResponseBuilder getDeployProcessRespBuilder() { - return deployProcessRespBuilder; - } - - public void setDeploymentProfile(DeploymentProfile deploymentProfile) { - this.deploymentProfile = deploymentProfile; - } - - public DeploymentProfile getDeploymentProfile() { - return deploymentProfile; - } - - public ProcessDescriptionType getProcessDescription() { - return processDescription; - } - - public void setProcessDescription(ProcessDescriptionType processDescription) { - this.processDescription = processDescription; - } - - public String getSchema() { - return schema; - } - - public void setSchema(String schema) { - this.schema = schema; - } - -} +package org.n52.wps.server.request; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +import javax.xml.namespace.QName; + +import net.opengis.ows.x11.MetadataType; +import net.opengis.wps.x100.DeployProcessDocument; +import net.opengis.wps.x100.ProcessDescriptionDocument; +import net.opengis.wps.x100.ProcessDescriptionType; + +import org.apache.commons.collections.map.CaseInsensitiveMap; +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.server.AbstractTransactionalAlgorithm; +import org.n52.wps.server.ExceptionReport; +import org.n52.wps.server.repository.ITransactionalAlgorithmRepository; +import org.n52.wps.server.repository.TransactionalRepositoryManager; +import org.n52.wps.server.request.deploy.DeploymentProfile; +import org.n52.wps.server.response.DeployProcessResponse; +import org.n52.wps.server.response.Response; +import org.n52.wps.server.response.builder.DeployProcessResponseBuilder; +import org.w3c.dom.Document; + +import xint.esa.ese.wps.metadata.MetadataDocument; + +public class DeployProcessRequest extends Request { + + private DeployProcessDocument deployProcessDom; + private static Logger LOGGER = Logger.getLogger(DeployProcessRequest.class); + private DeployProcessResponseBuilder deployProcessRespBuilder; + private String processID; + private String schema; + private ProcessDescriptionType processDescription; + private DeploymentProfile deploymentProfile; + private ITransactionalAlgorithmRepository repositoryManager; + + public static void main(String[] args) { + try { + File f = new File("D:\\users\\cnl\\project\\ESE\\meetings\\demo\\OozieURLList\\OozieURL-Estimates.xml"); + ProcessDescriptionDocument docx = ProcessDescriptionDocument.Factory.parse(f); + System.out.println(docx.toString()); + System.out.println(docx.validate()); + + f = new File("D:\\users\\cnl\\project\\ESE\\meetings\\demo\\OozieURLList\\DeployProcessRequest.txt"); + + DeployProcessDocument doc = DeployProcessDocument.Factory.parse(f); + MetadataType test = doc.getDeployProcess().getProcessDescription().getMetadataArray()[0]; + + System.out.println("validation is "+doc.validate()); + System.out.println("validation is "+doc.getDeployProcess().getProcessDescription().getMetadataArray()[0].validate()); + System.out.println(doc.getDeployProcess().getProcessDescription().getMetadataArray()[0].toString()); + + //MetadataDcument doc2 = (MetadataDocument) doc.getDeployProcess().getProcessDescription().getMetadataArray()[0].getAbstractMetaData(); +// QName qname = new javax.xml.namespace.QName("http://ese.esa.int/wps/metadata", "Metadata"); + // doc2 = (MetadataDocument) doc.getDeployProcess().getProcessDescription().getMetadataArray()[0].getAbstractMetaData().substitute(qname, MetadataDocument.type); + // System.out.println(doc2.toString()); + //DeployProcessDocument doc = DeployProcessDocument.Factory.parse(f); + MetadataDocument doc2 = MetadataDocument.Factory.parse(doc.getDeployProcess().getProcessDescription().getMetadataArray()[0].toString()); + doc.getDeployProcess().getProcessDescription().removeMetadata(0); + doc.getDeployProcess().getProcessDescription().addNewMetadata().set(doc2); + System.out.println(doc.toString()); + + System.out.println("validation is "+doc.validate( )); + System.out.println("validation is "+doc2.getMetadata().validate()); + System.out.println("validation is "+doc2.getMetadata().getResourceEstimates().validate()); + + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + public DeployProcessRequest(CaseInsensitiveMap map) throws ExceptionReport { + super(map); + // TODO use optionally for HTTP Get (not supported) + } + + public DeployProcessRequest(Document doc) throws ExceptionReport { + super(doc); + /** + * XMLBeans option : the underlying xml text buffer is trimmed + * immediately after parsing a document resulting in a smaller memory + * footprint. + */ + try { + LOGGER.debug("Starting DeployProcessREquest constructor"); + XmlOptions option = new XmlOptions(); + option.setLoadTrimTextBuffer(); + // Parse (with XMLBeans generated library) the request + LOGGER.debug("Parsing"); + this.deployProcessDom = DeployProcessDocument.Factory.parse(doc, + option); + /** + * XMLBeans workaround: xmlbeans does not parse correctly the document when including an abstract element + * The workaround rebuild the object as expected + */ + if(this.deployProcessDom.getDeployProcess().getProcessDescription().getMetadataArray() !=null && this.deployProcessDom.getDeployProcess().getProcessDescription().getMetadataArray().length > 0) { + MetadataDocument substElement = MetadataDocument.Factory.parse(this.deployProcessDom.getDeployProcess().getProcessDescription().getMetadataArray()[0].toString()); + this.deployProcessDom.getDeployProcess().getProcessDescription().removeMetadata(0); + this.deployProcessDom.getDeployProcess().getProcessDescription().addNewMetadata().set(substElement); + } + + + } catch (XmlException e) { + throw new ExceptionReport("Error while parsing post data", + ExceptionReport.MISSING_PARAMETER_VALUE, e); + } + if (this.deployProcessDom == null ) { + LOGGER.fatal("DeployProcessDocument is null"); + throw new ExceptionReport("Error while parsing post data", + ExceptionReport.MISSING_PARAMETER_VALUE); + } + if(!this.deployProcessDom.getDeployProcess().getDeploymentProfile().validate()) { + throw new ExceptionReport("DeployProcess request (deployement profile section) is not valid against WPS-G schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + if(!this.deployProcessDom.getDeployProcess().getProcessDescription().getDataInputs().validate()) { + throw new ExceptionReport("DeployProcess request (data inputs section) is not valid against WPS-G schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + if(!this.deployProcessDom.getDeployProcess().getProcessDescription().getProcessOutputs().validate()) { + throw new ExceptionReport("DeployProcess request is not valid against WPS-G schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + if(this.deployProcessDom.getDeployProcess().getProcessDescription().getMetadataArray()!=null && this.deployProcessDom.getDeployProcess().getProcessDescription().getMetadataArray().length > 0) { + try { + MetadataDocument doc2 = MetadataDocument.Factory.parse(this.deployProcessDom.getDeployProcess().getProcessDescription().getMetadataArray()[0].toString()); + if(!doc2.validate()) { + throw new ExceptionReport("DeployProcess request (in Metadata section) is not valid against WPS-G schemas)",ExceptionReport.INVALID_PARAMETER_VALUE); + } + } catch (XmlException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + // TODO Validate the request (semantic compliance) + // validate(); + // Get useful infos + processID = getDeployProcessDom().getDeployProcess() + .getProcessDescription().getIdentifier().getStringValue(); + if (processID == null) { + throw new ExceptionReport( + "Error. Could not find process identifier in the process description", + ExceptionReport.MISSING_PARAMETER_VALUE); + } + processDescription = getDeployProcessDom().getDeployProcess() + .getProcessDescription(); + + schema = getDeployProcessDom().getDeployProcess() + .getDeploymentProfile().getSchema().getHref(); + if (schema == null) { + throw new ExceptionReport( + "Error. Could not find schema in the deployment profile", + ExceptionReport.MISSING_PARAMETER_VALUE); + } + LOGGER.info("Deploying process ID: " + processID); + // Parse the specialized part (profile) + try { + // Get the DeployementProfile specialized for this profile + String deployementProfileClass = TransactionalRepositoryManager + .getDeploymentProfileForSchema(schema); + LOGGER.info("deployementprofile class:" + deployementProfileClass); + // Load the DeployementProfile Constructor for parsing the specific + // profile part + Constructor constructor; + constructor = Class.forName(deployementProfileClass) + .getConstructor(DeployProcessDocument.class, String.class); + LOGGER.info("Constructor loaded"); + setDeploymentProfile((DeploymentProfile) constructor.newInstance( + getDeployProcessDom(), processID)); + LOGGER.info("Deployement Profile Set"); + } catch (NoSuchMethodException e) { + throw new ExceptionReport("An error has occurred while obtaining " + + "the deployment profile", + ExceptionReport.NO_APPLICABLE_CODE, e); + } catch (ClassNotFoundException e) { + throw new ExceptionReport("An error has occurred while obtaining " + + "the deployment profile", + ExceptionReport.NO_APPLICABLE_CODE, e); + } catch (InstantiationException e) { + throw new ExceptionReport("An error has occurred while obtaining " + + "the deployment profile", + ExceptionReport.NO_APPLICABLE_CODE, e); + } catch (IllegalAccessException e) { + throw new ExceptionReport("An error has occurred while obtaining " + + "the deployment profile", + ExceptionReport.NO_APPLICABLE_CODE, e); + } catch (InvocationTargetException e) { + throw new ExceptionReport("An error has occurred while obtaining " + + "the deployment profile", + ExceptionReport.NO_APPLICABLE_CODE, e); + } + + } + + public String getProcessID() { + return processID; + } + + public void setProcessID(String processID) { + this.processID = processID; + } + + public DeployProcessDocument getDeployProcessDom() { + return deployProcessDom; + } + + public void setDeployProcessDom(DeployProcessDocument deployProcessDom) { + this.deployProcessDom = deployProcessDom; + } + + @Override + public Object getAttachedResult() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Response call() throws ExceptionReport { + // stores the Process Description (in WEB-INF) + // TODO check to enhance with FlatFileDatabase (?) + LOGGER.info("Starting the deployement..."); + // Get the repository manager (typically the + // DefaultTransactionalProcessRepository) + repositoryManager = TransactionalRepositoryManager + .getMatchingTransactionalRepository(schema); + LOGGER.info("*************************=========... match"); + + if (repositoryManager == null) { + LOGGER.info("*************************=========... not found"); + throw new ExceptionReport("Could not find matching repository", + ExceptionReport.NO_APPLICABLE_CODE); + + + } + // Add the algorithm the repository of the specific profile + repositoryManager.addAlgorithm(this); + LOGGER.info("*************************=========... addedAlgo"); + // if Deployement Successful then store the process description + /** + * TODO I suggest not to use AbstractTransactionalAlgorithm but a + * ProcessDescriptionManager class instead + * */ + AbstractTransactionalAlgorithm.setDescription(this.getProcessID(), + this.getProcessDescription()); + Property algoProp = WPSConfig.getInstance().getRepositoryForFormat(schema).addNewProperty(); + algoProp.setName("Algorithm"); + algoProp.setActive(true); + algoProp.setStringValue(this.getProcessID()); + WPSConfig.getInstance().save(); + setDeployProcessRespBuilder(new DeployProcessResponseBuilder(this)); + return new DeployProcessResponse(this); + } + + @Override + public boolean validate() throws ExceptionReport { + // TODO Auto-generated method stub + return false; + } + + public void setDeployProcessRespBuilder( + DeployProcessResponseBuilder deployProcessRespBuilder) { + this.deployProcessRespBuilder = deployProcessRespBuilder; + } + + public DeployProcessResponseBuilder getDeployProcessRespBuilder() { + return deployProcessRespBuilder; + } + + public void setDeploymentProfile(DeploymentProfile deploymentProfile) { + this.deploymentProfile = deploymentProfile; + } + + public DeploymentProfile getDeploymentProfile() { + return deploymentProfile; + } + + public ProcessDescriptionType getProcessDescription() { + return processDescription; + } + + public void setProcessDescription(ProcessDescriptionType processDescription) { + this.processDescription = processDescription; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/request/ExecuteRequest.java b/52n-wps-server/src/main/java/org/n52/wps/server/request/ExecuteRequest.java index d04b16218..58555bf4e 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/request/ExecuteRequest.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/request/ExecuteRequest.java @@ -68,6 +68,7 @@ import org.n52.wps.commons.context.ExecutionContext; import org.n52.wps.commons.context.ExecutionContextFactory; import org.n52.wps.io.data.IData; +import org.n52.wps.server.AbstractCancellableAlgorithm; import org.n52.wps.server.AbstractTransactionalAlgorithm; import org.n52.wps.server.ExceptionReport; import org.n52.wps.server.IAlgorithm; @@ -126,8 +127,8 @@ public ExecuteRequest(Document inputDoc, SOAPHeader mySOAPHeader) MessageContext context = MessageContext.getCurrentMessageContext(); if (context != null) { ServiceContext serviceContext = context.getServiceContext(); - String address = serviceContext.getMyEPR().getAddress(); - setMyEPR(address); + //String address = serviceContext.getMyEPR(arg0)getMyEPR().getAddress(); + //setMyEPR(address); } } @@ -187,6 +188,7 @@ public ExecuteRequest(Document doc) throws ExceptionReport { */ public ExecuteRequest(CaseInsensitiveMap ciMap) throws ExceptionReport { super(ciMap); + getUniqueId(); initForGET(ciMap); // validate the client input validate(); @@ -523,7 +525,9 @@ public boolean validate() throws ExceptionReport { } } } - // For each input supplied by the client + // For each input supplied by the client; + if(getExecute().getDataInputs()==null) + return true; for (InputType input : getExecute().getDataInputs().getInputArray()) { boolean identifierMatched = false; // Try to match the input with one of the descriptions @@ -621,6 +625,7 @@ public Response call() throws ExceptionReport { // register so that any function that calls // ExecuteContextFactory.getContext() gets the instance registered // with this thread + LOGGER.debug("Registered Execution Context with Id:"+getId()); ExecutionContext context = new ExecutionContext(getId()); ExecutionContextFactory.registerContext(context); @@ -630,9 +635,7 @@ public Response call() throws ExceptionReport { if (getExecute().getDataInputs() != null) { inputs = getExecute().getDataInputs().getInputArray(); } - // The input handler parses (and validates) the inputs. - InputHandler parser = new InputHandler(inputs, - getAlgorithmIdentifier()); + // TODO (Spacebel) OutputHandler for validation // we got so far: // get the algorithm, and run it with the clients input @@ -646,7 +649,13 @@ public Response call() throws ExceptionReport { */ algorithm = RepositoryManager.getInstance().getAlgorithm( getAlgorithmIdentifier(), this); - + + if(algorithm == null) { + LOGGER.error("Algorithm is null - unexpected"); + throw new ExceptionReport("Impossible to instantiate algorithm : " + getAlgorithmIdentifier(), ExceptionReport.NO_APPLICABLE_CODE); + + } + if (algorithm instanceof ISubject) { ISubject subject = (ISubject) algorithm; subject.addObserver(this); @@ -654,9 +663,11 @@ public Response call() throws ExceptionReport { } if (algorithm instanceof AbstractTransactionalAlgorithm) { + LOGGER.info("running the script"); returnResults = ((AbstractTransactionalAlgorithm) algorithm) .run(this); - LOGGER.info("Storing audit..."); + + LOGGER.info("Ends run - Storing audit..."); try { AbstractTransactionalAlgorithm.storeAuditLongDocument(this .getUniqueId().toString(), @@ -668,6 +679,7 @@ public Response call() throws ExceptionReport { .getAudit()); } catch(Exception e) { + e.printStackTrace(); LOGGER.warn("Cannot store audit after process run !"); } } @@ -692,6 +704,12 @@ public Response call() throws ExceptionReport { && !(algorithm instanceof AbstractTransactionalAlgorithm)) { // TODO maybe this method signature should disappear // (getParsedInputData can be called later) + if(algorithm instanceof AbstractCancellableAlgorithm) { + ((AbstractCancellableAlgorithm)algorithm).setInstanceId(this.getId()); + } + // The input handler parses (and validates) the inputs. + InputHandler parser = new InputHandler(inputs, + getAlgorithmIdentifier()); returnResults = algorithm.run(parser.getParsedInputData()); } /** @@ -706,9 +724,13 @@ public Response call() throws ExceptionReport { } } catch (CancellationException e) { + LOGGER.info("catch cancelllation exception"); return null; + } catch (Exception e) { - if(!(algorithm instanceof AbstractTransactionalAlgorithm)) { + LOGGER.info("catch exception"); + e.printStackTrace(); + if(!(algorithm instanceof AbstractTransactionalAlgorithm) && !(algorithm instanceof AbstractCancellableAlgorithm)) { LOGGER.debug("RuntimeException:" + e.getMessage()); StatusType statusFailed = StatusType.Factory.newInstance(); statusFailed.addNewProcessFailed(); @@ -727,7 +749,7 @@ public Response call() throws ExceptionReport { ExceptionReport.NO_APPLICABLE_CODE, e); } try { - LOGGER.info("Storing audit..."); + LOGGER.info("Storing audit (exception case)..."); AbstractTransactionalAlgorithm.storeAuditLongDocument(this .getUniqueId().toString(), ((AbstractTransactionalAlgorithm) algorithm) @@ -736,6 +758,7 @@ public Response call() throws ExceptionReport { .storeAuditDocument(this.getUniqueId().toString(), ((AbstractTransactionalAlgorithm) algorithm) .getAudit()); + LOGGER.info("Audit stored"); } catch (Exception e1) { // TODO Auto-generated catch block LOGGER.info("Audit storing failed"); @@ -743,6 +766,7 @@ public Response call() throws ExceptionReport { } // send callback with exception if (addressingHeader != null) { + LOGGER.info("found addressing header"); try { StatusType status = StatusType.Factory.newInstance(); status.addNewProcessFailed().setExceptionReport( @@ -758,6 +782,9 @@ public Response call() throws ExceptionReport { e2.printStackTrace(); } } + else { + LOGGER.info("header not found"); + } throw exReport; } finally { // you ***MUST*** call this or else you will have a PermGen @@ -807,6 +834,26 @@ public Response call() throws ExceptionReport { } + public ArrayList getQOSHeaderBlocks() { + LOGGER.info("Addressing header"); + // TODO Auto-generated method stub + if (this.soapHeader == null) { + LOGGER.info("soap Header is null"); + return null; + } + try { + ArrayList headerBlocks = this.soapHeader + .getHeaderBlocksWithNSURI("http://ese.esa.int/wps/qos"); + LOGGER.info(headerBlocks.toString()); + // sendCallback(headerBlocks); + return headerBlocks; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private ArrayList getSAMLHeaderBlocks() { LOGGER.info("Addressing header"); // TODO Auto-generated method stub diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/request/InputHandler.java b/52n-wps-server/src/main/java/org/n52/wps/server/request/InputHandler.java index 28380ce86..de25671fb 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/request/InputHandler.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/request/InputHandler.java @@ -58,6 +58,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import net.opengis.ows.x11.BoundingBoxType; import net.opengis.ows.x11.DomainMetadataType; import net.opengis.wps.x100.InputDescriptionType; import net.opengis.wps.x100.InputType; @@ -67,6 +68,7 @@ import org.n52.wps.io.IParser; import org.n52.wps.io.ParserFactory; import org.n52.wps.io.data.IData; +import org.n52.wps.io.data.SimpleBBoxBinding; import org.n52.wps.io.datahandler.xml.AbstractXMLParser; import org.n52.wps.io.datahandler.xml.GML2BasicParser; import org.n52.wps.io.datahandler.xml.GML3BasicParser; @@ -417,7 +419,13 @@ protected void handleComplexValueReference(InputType input) throws ExceptionRepo */ protected void handleBBoxValue(InputType input) throws ExceptionReport{ //String inputID = input.getIdentifier().getStringValue(); - throw new ExceptionReport("BBox is not supported", ExceptionReport.OPERATION_NOT_SUPPORTED); + String inputID = input.getIdentifier().getStringValue(); + BoundingBoxType bbox = input.getData().getBoundingBoxData(); + + List list = new ArrayList(); + list.add(new SimpleBBoxBinding(bbox)); + inputData.put(inputID, list); + } /** diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/request/deploy/DeploymentProfile.java b/52n-wps-server/src/main/java/org/n52/wps/server/request/deploy/DeploymentProfile.java index 67cecd488..8d5789dd0 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/request/deploy/DeploymentProfile.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/request/deploy/DeploymentProfile.java @@ -1,84 +1,187 @@ -/*************************************************************** - This implementation provides a framework to publish processes to the -web through the OGC Web Processing Service interface. The framework -is extensible in terms of processes and data handlers. - - Copyright (C) 2006 by con terra GmbH - - Authors: - Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany - - Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, - 48155 Muenster, Germany, 52n@conterra.de - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as published by the Free Software Foundation. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program (see gnu-gpl v2.txt); if not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA or visit the web page of the Free - Software Foundation, http://www.fsf.org. - - ***************************************************************/ - - -package org.n52.wps.server.request.deploy; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import net.opengis.wps.x100.DeployDataDocument; -import net.opengis.wps.x100.DeployProcessDocument; - -import org.n52.wps.server.repository.TransactionalRepositoryManager; -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -public abstract class DeploymentProfile { - - private Object payload; - private String processID; - - public DeploymentProfile(DeployProcessDocument deployDom, String processID){ - this.processID = processID; - this.payload = payload; - - } - public DeploymentProfile(DeployDataDocument deployDom, String processID){ - this.processID = processID; - this.payload = payload; - - } - - public String getProcessID() { - return processID; - } - - public Object getPayload() { - return payload; - } - - - -} +/*************************************************************** + This implementation provides a framework to publish processes to the +web through the OGC Web Processing Service interface. The framework +is extensible in terms of processes and data handlers. + + Copyright (C) 2006 by con terra GmbH + + Authors: + Bastian Schaeffer, Institute for Geoinformatics, Muenster, Germany + + Contact: Albert Remke, con terra GmbH, Martin-Luther-King-Weg 24, + 48155 Muenster, Germany, 52n@conterra.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + version 2 as published by the Free Software Foundation. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program (see gnu-gpl v2.txt); if not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA or visit the web page of the Free + Software Foundation, http://www.fsf.org. + + ***************************************************************/ + +package org.n52.wps.server.request.deploy; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.net.URLConnection; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import net.opengis.wps.x100.DeployDataDocument; +import net.opengis.wps.x100.DeployProcessDocument; + +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPReply; +import org.apache.log4j.Logger; +import org.n52.wps.PropertyDocument.Property; +import org.n52.wps.commons.WPSConfig; +import org.n52.wps.server.profiles.oozie.OozieDeploymentProfile; +import org.n52.wps.server.repository.TransactionalRepositoryManager; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +public abstract class DeploymentProfile { + + private static Logger LOGGER = Logger + .getLogger(OozieDeploymentProfile.class); + + private Object payload; + private String processID; + + public DeploymentProfile(DeployProcessDocument deployDom, String processID) { + this.processID = processID; + this.payload = payload; + + } + + public DeploymentProfile(DeployDataDocument deployDom, String processID) { + this.processID = processID; + this.payload = payload; + + } + + public String getProcessID() { + return processID; + } + + public Object getPayload() { + return payload; + } + + protected byte[] downloadHTTP(String url) throws Exception { + URL u = new URL(url); + URLConnection uc = u.openConnection(); + String contentType = uc.getContentType(); + int contentLength = uc.getContentLength(); + InputStream raw = uc.getInputStream(); + InputStream in = new BufferedInputStream(raw); + byte[] data = new byte[contentLength]; + int bytesRead = 0; + int offset = 0; + LOGGER.info("loading started..."); + while (offset < contentLength) { + System.out.print("."); + bytesRead = in.read(data, offset, data.length - offset); + if (bytesRead == -1) + break; + offset += bytesRead; + } + in.close(); + if (offset != contentLength) { + throw new IOException("Only read " + offset + " bytes; Expected " + + contentLength + " bytes"); + } + return data; + } + + /** + * This method download a binary file located at the given URL and returns + * the byte array TODO move to an util class + * + * @param archiveRef2 + * @return + * @throws IOException + */ + protected byte[] downloadArchive(String url) throws IOException { + LOGGER.info("Downloading url " + url); + URL u = new URL(url); + if (StringUtils.startsWithIgnoreCase(url, "http://") + || StringUtils.startsWithIgnoreCase(url, "https://")) { + LOGGER.info("HTTP protocol"); + byte[] data = null; + try { + data = downloadHTTP(url); + } catch (Exception e) { + LOGGER.info(e.getMessage()); + LOGGER.info(e.getStackTrace().toString()); + e.printStackTrace(); + } + return data; + } else if (StringUtils.startsWithIgnoreCase(url, "ftp://")) { + LOGGER.info("FTP protocol"); + byte[] data = null; + try { + data = downloadFTP(url); + } catch (Exception e) { + LOGGER.info(e.getMessage()); + LOGGER.info(e.getStackTrace().toString()); + e.printStackTrace(); + } + return data; + } + return null; + } + + private byte[] downloadFTP(String url) throws Exception { + URL u = new URL(url); + FTPClient client = new FTPClient(); + ByteArrayOutputStream fos = null; + client.connect(u.getHost(), u.getPort()); + // hardcoded + Property[] properties = WPSConfig.getInstance() + .getPropertiesForServer(); + Property ftpUserProp = WPSConfig.getInstance().getPropertyForKey( + properties, "portalFTPUser"); + Property ftpPassProp = WPSConfig.getInstance().getPropertyForKey( + properties, "portalFTPPassword"); + client.login(ftpUserProp.getStringValue(), ftpPassProp.getStringValue()); + int reply = client.getReplyCode(); + if (!FTPReply.isPositiveCompletion(reply)) { + client.disconnect(); + } + String filename = u.getFile(); + fos = new ByteArrayOutputStream(); + client.retrieveFile(filename, fos); + byte[] data = fos.toByteArray(); + fos.close(); + client.disconnect(); + return data; + } + +} diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponse.java b/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponse.java index 5849a9f6f..556bbacbf 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponse.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponse.java @@ -148,7 +148,11 @@ public void sendCallback(ArrayList headerBlocks) sender.sendRobust(XMLUtils.toOM(((Document) this .getExecuteResponseBuilder().getDoc().getDomNode()) .getDocumentElement())); - + LOGGER.debug("Fire and Forget Callback closed"); + sender.cleanupTransport(); + sender.cleanup(); + LOGGER.debug("All cleaned for axis service client"); + } // use this if you want a single ServiceClient (TODO to be deleted) diff --git a/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponseBuilder.java b/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponseBuilder.java index 0d088eb39..60a772b85 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponseBuilder.java +++ b/52n-wps-server/src/main/java/org/n52/wps/server/response/ExecuteResponseBuilder.java @@ -414,7 +414,7 @@ private void generateLiteralDataOutput(String responseID, } public void save(OutputStream os) throws ExceptionReport { - LOGGER.info("SAVE: " + doc.toString()); + LOGGER.info("SAVE RESPONSE: " + doc.toString()); if (request.isRawData() && rawDataHandler != null) { rawDataHandler.save(os); return; diff --git a/52n-wps-server/src/main/java/org/n52/wps/util/BasicXMLTypeFactory.java b/52n-wps-server/src/main/java/org/n52/wps/util/BasicXMLTypeFactory.java index 99a3aa042..eeba444b7 100644 --- a/52n-wps-server/src/main/java/org/n52/wps/util/BasicXMLTypeFactory.java +++ b/52n-wps-server/src/main/java/org/n52/wps/util/BasicXMLTypeFactory.java @@ -35,6 +35,8 @@ package org.n52.wps.util; import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import org.apache.log4j.Logger; import org.apache.ws.security.util.XmlSchemaDateFormat; @@ -73,6 +75,13 @@ private BasicXMLTypeFactory(){ } + + public static void main(String[] args) throws ParseException { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date dateStr = formatter.parse("2010-02-02"); + System.out.println(dateStr.toGMTString()); + } + /** * This is a helper method to create always the correct Java Type out of a string. * It is based on the basic schema datatypes. @@ -100,7 +109,20 @@ public static IData getBasicJavaObject(String xmlDataTypeURI, String obj) { return new LiteralBooleanBinding(Boolean.parseBoolean(obj)); } else if (xmlDataTypeURI.equals(STRING_URI)) { return new LiteralStringBinding(obj); - } else if (xmlDataTypeURI.equals(DATETIME_URI) || xmlDataTypeURI.equals(DATE_URI)) { + } + else if (xmlDataTypeURI.equals(DATE_URI)) { + + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date dateStr = formatter.parse(obj); + return new LiteralDateTimeBinding(dateStr); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + else if ( xmlDataTypeURI.equals(DATETIME_URI)) { try { return new LiteralDateTimeBinding(new XmlSchemaDateFormat() .parse(obj)); diff --git a/52n-wps-sextante/.gitignore b/52n-wps-sextante/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-sextante/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-sextante/.settings/org.eclipse.core.resources.prefs b/52n-wps-sextante/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-sextante/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-sextante/.settings/org.eclipse.jdt.core.prefs b/52n-wps-sextante/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-sextante/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-sextante/.settings/org.eclipse.m2e.core.prefs b/52n-wps-sextante/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-sextante/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-sextante/.settings/org.eclipse.wst.common.component b/52n-wps-sextante/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..9b6625702 --- /dev/null +++ b/52n-wps-sextante/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-sextante/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-sextante/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-sextante/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-sextante/.settings/org.eclipse.wst.validation.prefs b/52n-wps-sextante/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-sextante/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-sextante/src/main/java/org/n52/wps/server/sextante/SextanteProcessDescriptionCreator.java b/52n-wps-sextante/src/main/java/org/n52/wps/server/sextante/SextanteProcessDescriptionCreator.java index 04ea1dd85..cf3f889ce 100644 --- a/52n-wps-sextante/src/main/java/org/n52/wps/server/sextante/SextanteProcessDescriptionCreator.java +++ b/52n-wps-sextante/src/main/java/org/n52/wps/server/sextante/SextanteProcessDescriptionCreator.java @@ -89,7 +89,7 @@ public ProcessDescriptionType createDescribeProcessType(GeoAlgorithm algorithm) } return pdt; - + } @@ -133,9 +133,9 @@ private void addOutput(ProcessOutputs outputs, Output out) { output.addNewIdentifier().setStringValue(out.getName()); output.addNewTitle().setStringValue(out.getDescription()); if (out instanceof OutputRasterLayer){ - SupportedComplexDataType complexOutput = output.addNewComplexOutput(); - complexOutput.addNewDefault().addNewFormat().setMimeType("image/tiff"); - complexOutput.addNewSupported().addNewFormat().setMimeType("image/tiff"); + SupportedComplexDataType complexOutput = output.addNewComplexOutput(); + complexOutput.addNewDefault().addNewFormat().setMimeType("image/tiff"); + complexOutput.addNewSupported().addNewFormat().setMimeType("image/tiff"); } else if (out instanceof OutputVectorLayer){ SupportedComplexDataType complexOutput = output.addNewComplexOutput(); diff --git a/52n-wps-transactional/.gitignore b/52n-wps-transactional/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-transactional/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-transactional/.settings/org.eclipse.core.resources.prefs b/52n-wps-transactional/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-transactional/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-transactional/.settings/org.eclipse.jdt.core.prefs b/52n-wps-transactional/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-transactional/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-transactional/.settings/org.eclipse.m2e.core.prefs b/52n-wps-transactional/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-transactional/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-transactional/.settings/org.eclipse.wst.common.component b/52n-wps-transactional/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..81322e406 --- /dev/null +++ b/52n-wps-transactional/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-transactional/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-transactional/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-transactional/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-transactional/.settings/org.eclipse.wst.validation.prefs b/52n-wps-transactional/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-transactional/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-transactional/pom.xml b/52n-wps-transactional/pom.xml index ac42a1cbb..42d57dfa1 100644 --- a/52n-wps-transactional/pom.xml +++ b/52n-wps-transactional/pom.xml @@ -55,6 +55,7 @@ + org.apache.ode ode-axis2 @@ -134,8 +135,7 @@ org.apache.neethi neethi - 2.0.4 - compile + 3.0.2 commons-codec diff --git a/52n-wps-unicore/pom.xml b/52n-wps-unicore/pom.xml deleted file mode 100644 index df987ef97..000000000 --- a/52n-wps-unicore/pom.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - org.n52.wps - 52n-wps-parent - 2.0-RC8-SNAPSHOT - - 4.0.0 - 52n-wps-unicore - 52north 52n-wps-unicore - The project 52 north 52n-wps-grid does something with - JAVA. - - - - vsgc-public - VSGC public repository - http://zam904.zam.kfa-juelich.de/maven - - - - - ${project.groupId} - 52n-wps-commons - - - ${project.groupId} - 52n-wps-io - - - ${project.groupId} - 52n-wps-server - - - be.spacebel.wps - wpsg-xml - 1.0.0 - - - org.vafer - dependency - 0.4 - - - - de.fzj.unicore - uas-core - 1.1.2 - - - net.sf.saxon - saxon - - - - xmlbeans - - - xbean - - - - - org.apache.ws.security - - - wss4j - - - - - net.sf.saxon - - - saxon-path - - - - - net.sf.saxon - - - saxon-dom - - - - - - commons-httpclient - commons-httpclient - 3.1 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.5 - 1.5 - - - - - diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/AbstractUnicoreAlgorithm.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/AbstractUnicoreAlgorithm.java deleted file mode 100644 index 0f689ea18..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/AbstractUnicoreAlgorithm.java +++ /dev/null @@ -1,73 +0,0 @@ - -package org.n52.wps.unicore; - -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; -import org.n52.wps.io.data.IData; -import org.n52.wps.server.AbstractObservableAlgorithm; -import org.n52.wps.server.IAlgorithm; -import org.n52.wps.unicore.client.UnicoreClient; - -public abstract class AbstractUnicoreAlgorithm extends AbstractObservableAlgorithm implements IUnicoreAlgorithm -{ - private static Logger LOGGER = Logger.getLogger(AbstractUnicoreAlgorithm.class); - - protected IAlgorithm embeddedAlgorithm; - - public IAlgorithm getEmbeddedAlgorithm() - { - return embeddedAlgorithm; - } - - public AbstractUnicoreAlgorithm(IAlgorithm pEmbeddedAlgorithm) - { - super(); - this.embeddedAlgorithm = pEmbeddedAlgorithm; - } - - public AbstractUnicoreAlgorithm(String wellKnownName, IAlgorithm pEmbeddedAlgorithm) - { - super(wellKnownName); - this.embeddedAlgorithm = pEmbeddedAlgorithm; - } - - public List getErrors() - { - return embeddedAlgorithm.getErrors(); - } - - public Class getInputDataType(String id) - { - return embeddedAlgorithm.getInputDataType(id); - } - - public Class getOutputDataType(String id) - { - return embeddedAlgorithm.getOutputDataType(id); - } - - public Map run(Map> pInputData) - { - try - { - - List>> inputDataList = split(pInputData); - - UnicoreClient client = new UnicoreClient(); - - List outputDataList = client.perform(UnicoreAlgorithmInput.transform(inputDataList, embeddedAlgorithm.getDescription() - .getIdentifier().getStringValue())); - - Map outputData = merge(UnicoreAlgorithmOutput.transform(outputDataList)); - - return outputData; - } - catch (Exception e) - { - LOGGER.error(e); - throw new RuntimeException(e); - } - } -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/IUnicoreAlgorithm.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/IUnicoreAlgorithm.java deleted file mode 100644 index 086d9a4aa..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/IUnicoreAlgorithm.java +++ /dev/null @@ -1,15 +0,0 @@ - -package org.n52.wps.unicore; - -import java.util.List; -import java.util.Map; - -import org.n52.wps.io.data.IData; -import org.n52.wps.server.IAlgorithm; - -public interface IUnicoreAlgorithm extends IAlgorithm -{ - List>> split(Map> inputData); - - Map merge(List> outputData); -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmInput.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmInput.java deleted file mode 100644 index 2730287a5..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmInput.java +++ /dev/null @@ -1,54 +0,0 @@ - -package org.n52.wps.unicore; - -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.n52.wps.io.data.IData; - -public class UnicoreAlgorithmInput implements Serializable -{ - protected transient Map> data; - protected transient String embeddedAlgorithm; - - public String getEmbeddedAlgorithm() - { - return embeddedAlgorithm; - } - - public UnicoreAlgorithmInput(Map> pData, String pEmbeddedAlgorithm) - { - data = pData; - embeddedAlgorithm = pEmbeddedAlgorithm; - } - - public Map> getData() - { - return data; - } - - public static List transform(List>> pData, String pAlgorithmIdentifier) - { - List result = new ArrayList(); - for (Map> input : pData) - { - result.add(new UnicoreAlgorithmInput(input, pAlgorithmIdentifier)); - } - return result; - } - - private synchronized void writeObject(java.io.ObjectOutputStream oos) throws IOException - { - oos.writeObject(data); - oos.writeObject(embeddedAlgorithm); - } - - private synchronized void readObject(java.io.ObjectInputStream oos) throws IOException, ClassNotFoundException - { - data = (Map>) oos.readObject(); - embeddedAlgorithm = (String) oos.readObject(); - } -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmOutput.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmOutput.java deleted file mode 100644 index cfced5258..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmOutput.java +++ /dev/null @@ -1,51 +0,0 @@ - -package org.n52.wps.unicore; - -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.n52.wps.io.data.IData; - -public class UnicoreAlgorithmOutput implements Serializable -{ - protected transient Map data; - - public UnicoreAlgorithmOutput() - { - data = new HashMap(); - } - - public UnicoreAlgorithmOutput(Map pData) - { - data = pData; - } - - public Map getData() - { - return data; - } - - public static List> transform(List pData) - { - List> result = new ArrayList>(); - for (UnicoreAlgorithmOutput output : pData) - { - result.add(output.getData()); - } - return result; - } - - private synchronized void writeObject(java.io.ObjectOutputStream oos) throws IOException - { - oos.writeObject(data); - } - - private synchronized void readObject(java.io.ObjectInputStream oos) throws IOException, ClassNotFoundException - { - data = (HashMap) oos.readObject(); - } -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmRepository.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmRepository.java deleted file mode 100644 index 9c1b17f84..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/UnicoreAlgorithmRepository.java +++ /dev/null @@ -1,271 +0,0 @@ - -package org.n52.wps.unicore; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import net.opengis.wps.x100.ProcessDescriptionType; - -import org.apache.log4j.Logger; -import org.n52.wps.PropertyDocument.Property; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.IAlgorithm; -import org.n52.wps.server.repository.IAlgorithmRepository; -import org.n52.wps.server.request.ExecuteRequest; - -public class UnicoreAlgorithmRepository implements IAlgorithmRepository -{ - private static Logger LOGGER = Logger.getLogger(UnicoreAlgorithmRepository.class); - - public static String CFG_REGISTRY = "Registry"; - public static String CFG_KEYSTORE = "Keystore"; - public static String CFG_ALIAS = "Alias"; - public static String CFG_PASSWORD = "Password"; - public static String CFG_TYPE = "Type"; - - public static String CFG_OVERWRITE = "OverwriteRemoteFile"; - public static String CFG_COMPRESSION = "CompressInputData"; - - private static UnicoreAlgorithmRepository instance; - - //private Map algorithmMap; - private Properties unicoreProperties; - protected Map processDescriptionMap; - - public UnicoreAlgorithmRepository() - { - processDescriptionMap = new HashMap(); - - if(WPSConfig.getInstance().isRepositoryActive(this.getClass().getCanonicalName())){ - Property[] propertyArray = WPSConfig.getInstance().getPropertiesForRepositoryClass(this.getClass().getCanonicalName()); - unicoreProperties = createUnicoreProperties(propertyArray); - for(Property property : propertyArray){ - if(property.getName().equalsIgnoreCase("Algorithm") && property.getActive()){ - addAlgorithm(property.getStringValue()); - } - } - } else { - LOGGER.debug("Local Algorithm Repository is inactive."); - } - } - - public UnicoreAlgorithmRepository(String wpsConfigPath) - { - processDescriptionMap = new HashMap(); - - Property[] propertyArray = WPSConfig.getInstance(wpsConfigPath).getPropertiesForRepositoryClass(this.getClass().getCanonicalName()); - - unicoreProperties = createUnicoreProperties(propertyArray); - - for (Property property : propertyArray) - { - if (property.getName().equalsIgnoreCase("Algorithm")) - { - addAlgorithm(property.getStringValue()); - } - } - } - - private Properties createUnicoreProperties(Property[] propertyArray) - { - Properties result = new Properties(); - - for (Property property : propertyArray) - { - if (property.getName().equalsIgnoreCase(CFG_REGISTRY)) - { - result.setProperty(CFG_REGISTRY, property.getStringValue()); - } - else if (property.getName().equalsIgnoreCase(CFG_KEYSTORE)) - { - result.setProperty(CFG_KEYSTORE, property.getStringValue()); - } - else if (property.getName().equalsIgnoreCase(CFG_ALIAS)) - { - result.setProperty(CFG_ALIAS, property.getStringValue()); - } - else if (property.getName().equalsIgnoreCase(CFG_PASSWORD)) - { - result.setProperty(CFG_PASSWORD, property.getStringValue()); - } - else if (property.getName().equalsIgnoreCase(CFG_TYPE)) - { - result.setProperty(CFG_TYPE, property.getStringValue()); - } - else if (property.getName().equalsIgnoreCase(CFG_OVERWRITE)) - { - result.setProperty(CFG_OVERWRITE, property.getStringValue()); - } - else if (property.getName().equalsIgnoreCase(CFG_COMPRESSION)) - { - result.setProperty(CFG_COMPRESSION, property.getStringValue()); - } - else - { - LOGGER.warn("Unsupported configuration paramter '" + property.getName() + "'."); - } - } - - return result; - } - - public static UnicoreAlgorithmRepository getInstance() - { - if (instance == null) - { - instance = new UnicoreAlgorithmRepository(); - } - return instance; - } - - public static UnicoreAlgorithmRepository getInstance(String wpsConfigPath) - { - if (instance == null) - { - instance = new UnicoreAlgorithmRepository(wpsConfigPath); - } - return instance; - } - - public Properties getUnicoreProperties() - { - return unicoreProperties; - } - - public boolean addAlgorithm(Object processID) - { - if (!(processID instanceof String)) - { - return false; - } - - String algorithmClassName = (String) processID; - - try - { - IUnicoreAlgorithm algorithm = (IUnicoreAlgorithm) UnicoreAlgorithmRepository.class.getClassLoader().loadClass(algorithmClassName).newInstance(); - - if (!algorithm.processDescriptionIsValid()) - { - LOGGER.warn("Algorithm description is not valid: " + algorithmClassName); - return false; - } - - processDescriptionMap.put(algorithmClassName, algorithm.getDescription()); - LOGGER.info("Algorithm class registered: " + algorithmClassName); - - if (algorithm.getWellKnownName().length() != 0) - { - processDescriptionMap.put(algorithm.getWellKnownName(), algorithm.getDescription()); - } - } - catch (ClassNotFoundException e) - { - LOGGER.warn("Could not find algorithm class: " + algorithmClassName, e); - return false; - } - catch (IllegalAccessException e) - { - LOGGER.warn("Access error occured while registering algorithm: " + algorithmClassName); - return false; - } - catch (InstantiationException e) - { - LOGGER.warn("Could not instantiate algorithm: " + algorithmClassName); - return false; - } - return true; - } - - public boolean containsAlgorithm(String processID) - { - return processDescriptionMap.containsKey(processID); - } - - public IAlgorithm getAlgorithm(String processID, ExecuteRequest executeRequest) - { - try - { - IUnicoreAlgorithm algorithm = (IUnicoreAlgorithm) UnicoreAlgorithmRepository.class.getClassLoader().loadClass(processID).newInstance(); - - return algorithm; - } - catch (ClassNotFoundException e) - { - LOGGER.warn("Could not find algorithm class: " + processID, e); - throw new RuntimeException(e); - } - catch (IllegalAccessException e) - { - LOGGER.warn("Access error occured while registering algorithm: " + processID); - throw new RuntimeException(e); - } - catch (InstantiationException e) - { - LOGGER.warn("Could not instantiate algorithm: " + processID); - throw new RuntimeException(e); - } - } - - public Collection getAlgorithmNames() - { - return processDescriptionMap.keySet(); - } - - public Collection getAlgorithms() - { - List algorithmList = new ArrayList(); - for(String algorithmName : getAlgorithmNames()){ - try - { - IUnicoreAlgorithm algorithm = (IUnicoreAlgorithm) UnicoreAlgorithmRepository.class.getClassLoader().loadClass(algorithmName).newInstance(); - - algorithmList.add(algorithm); - } - catch (ClassNotFoundException e) - { - LOGGER.warn("Could not find algorithm class: " + algorithmName, e); - throw new RuntimeException(e); - } - catch (IllegalAccessException e) - { - LOGGER.warn("Access error occured while registering algorithm: " + algorithmName); - throw new RuntimeException(e); - } - catch (InstantiationException e) - { - LOGGER.warn("Could not instantiate algorithm: " + algorithmName); - throw new RuntimeException(e); - } - } - return algorithmList; - } - - public boolean removeAlgorithm(Object processID) - { - if (!(processID instanceof String)) - { - return false; - } - String className = (String) processID; - if (processDescriptionMap.containsKey(className)) - { - processDescriptionMap.remove(className); - return true; - } - return false; - } - - - public ProcessDescriptionType getProcessDescription(String processID) { - if(!processDescriptionMap.containsKey(processID)){ - processDescriptionMap.put(processID, getAlgorithm(processID, null).getDescription()); - } - return processDescriptionMap.get(processID); - } - -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/algorithm/UnicoreSimpleBufferAlgorithm.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/algorithm/UnicoreSimpleBufferAlgorithm.java deleted file mode 100644 index 132a2de37..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/algorithm/UnicoreSimpleBufferAlgorithm.java +++ /dev/null @@ -1,88 +0,0 @@ - -package org.n52.wps.unicore.algorithm; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.geotools.feature.DefaultFeatureCollections; -import org.geotools.feature.FeatureCollection; -import org.n52.wps.io.data.IData; -import org.n52.wps.io.data.binding.complex.GTVectorDataBinding; -import org.n52.wps.io.data.binding.literal.LiteralIntBinding; -import org.n52.wps.unicore.AbstractUnicoreAlgorithm; -import org.opengis.feature.Feature; - -public class UnicoreSimpleBufferAlgorithm extends AbstractUnicoreAlgorithm -{ - public UnicoreSimpleBufferAlgorithm() - { - super(new org.n52.wps.server.algorithm.SimpleBufferAlgorithm()); - } - - public List>> split(Map> pInputData) - { - List>> result = new ArrayList>>(); - FeatureCollection featureCollection = ((GTVectorDataBinding) pInputData.get("data").get(0)).getPayload(); - FeatureCollection[] featureCollectionList = splitFeatureCollection(featureCollection, getNumberOfChunks(pInputData)); - for (FeatureCollection fc : featureCollectionList) - { - Map> chunk = new HashMap>(); - chunk.put("width", pInputData.get("width")); - List data = new ArrayList(); - data.add(new GTVectorDataBinding(fc)); - chunk.put("data", data); - result.add(chunk); - } - return result; - } - - public Map merge(List> outputData) - { - FeatureCollection mergedFeatureCollection = DefaultFeatureCollections.newCollection(); - for (Map data : outputData) - { - FeatureCollection singleFeatureCollection = (FeatureCollection) data.get("result").getPayload(); - mergedFeatureCollection.addAll(singleFeatureCollection); - } - Map result = new HashMap(); - result.put("result", new GTVectorDataBinding(mergedFeatureCollection)); - return result; - } - - protected int getNumberOfChunks(Map> pInputData) - { - // return a fixed number -// return 3; - - // return a number depending on an input parameter -// int numberOfChunks = ((LiteralIntBinding) pInputData.get("numberOfChunks").get(0)).getPayload().intValue(); -// return numberOfChunks; - - // return a number depending on the complexity of input data - FeatureCollection features = ((GTVectorDataBinding) pInputData.get("data").get(0)).getPayload(); - return features.size() % 5; - } - - protected FeatureCollection[] splitFeatureCollection(FeatureCollection pFeatureCollection, int pNumberOfChucks) - { - FeatureCollection[] result = new FeatureCollection[pNumberOfChucks]; - int chunkSize = (int) Math.floor((double) pFeatureCollection.size() / (double) pNumberOfChucks); - int currentFeatureCollection = -1; - Iterator iterator = pFeatureCollection.iterator(); - for (int i = 0; i < pFeatureCollection.size(); i++) - { - if (i % chunkSize == 0 && currentFeatureCollection < (pNumberOfChucks - 1)) - { - currentFeatureCollection++; - result[currentFeatureCollection] = DefaultFeatureCollections.newCollection(); - } - result[currentFeatureCollection].add((Feature) iterator.next()); - } - return result; - } - - -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreClient.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreClient.java deleted file mode 100644 index 8ba7b04fb..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreClient.java +++ /dev/null @@ -1,387 +0,0 @@ - -package org.n52.wps.unicore.client; - -import java.io.File; -import java.io.FileInputStream; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.List; -import java.util.Properties; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import org.apache.log4j.Logger; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.unicore.UnicoreAlgorithmInput; -import org.n52.wps.unicore.UnicoreAlgorithmOutput; -import org.n52.wps.unicore.UnicoreAlgorithmRepository; -import org.oasisOpen.docs.wsrf.rl2.TerminationTimeDocument.TerminationTime; -import org.unigrids.services.atomic.types.GridFileType; -import org.unigrids.services.atomic.types.ProtocolType; -import org.unigrids.x2006.x04.services.sms.ImportFileDocument; -import org.unigrids.x2006.x04.services.sms.ImportFileResponseDocument; -import org.unigrids.x2006.x04.services.tsf.CreateTSRDocument; -import org.w3.x2005.x08.addressing.EndpointReferenceType; - -import de.fzj.unicore.uas.TargetSystemFactory; -import de.fzj.unicore.uas.client.RByteIOClient; -import de.fzj.unicore.uas.client.RegistryClient; -import de.fzj.unicore.uas.client.StorageClient; -import de.fzj.unicore.uas.client.TSFClient; -import de.fzj.unicore.uas.client.TSSClient; -import de.fzj.unicore.uas.security.DSigOutHandler; -import de.fzj.unicore.uas.security.IUASSecurityProperties; -import de.fzj.unicore.uas.security.TDOutHandler; -import de.fzj.unicore.uas.security.UASSecurityProperties; -import de.fzj.unicore.wsrflite.xmlbeans.BaseFault; - -public class UnicoreClient -{ - private static Logger LOGGER = Logger.getLogger(UnicoreClient.class); - - protected IUASSecurityProperties securityProperties; - - public UnicoreClient() - { - Properties unicoreProperties = UnicoreAlgorithmRepository.getInstance().getUnicoreProperties(); - securityProperties = createSecurityProperties(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_KEYSTORE), unicoreProperties - .getProperty(UnicoreAlgorithmRepository.CFG_ALIAS), unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_PASSWORD), unicoreProperties - .getProperty(UnicoreAlgorithmRepository.CFG_TYPE)); - } - - public List perform(List pInputDataList) throws Exception - { - // create a target system - TSSClient targetSystem = createTargetSystem(); - - // submit application files - submitApplicationFiles(securityProperties, targetSystem); - - // create task list - Collection> taskList = new ArrayList>(); - for (UnicoreAlgorithmInput input : pInputDataList) - { - taskList.add(new UnicoreTask(securityProperties, targetSystem, input)); - } - - // start task execution - ExecutorService executor = Executors.newCachedThreadPool(); - List> resultList; - try - { - resultList = executor.invokeAll(taskList); - } - catch (InterruptedException e) - { - LOGGER.error(e); - throw new RuntimeException("Error .", e); - } - - // fetch output of tasks - List outputDataList = new ArrayList(); - - for (Future result : resultList) - { - UnicoreAlgorithmOutput output; - try - { - output = (UnicoreAlgorithmOutput) result.get(); - } - catch (InterruptedException e) - { - LOGGER.debug("InterruptedException:" + e.getMessage()); - throw new RuntimeException("Error .", e); - } - catch (ExecutionException e) - { - LOGGER.debug("ExecutionException:" + e.getMessage()); - throw new RuntimeException("Error .", e); - } - outputDataList.add(output); - } - - // destroy remote target system - try - { - LOGGER.info("Destroy Target System Service (TSS) at '" + targetSystem.getEPR().getAddress().getStringValue() + "'."); - targetSystem.destroy(); - } - catch (Exception e) - { - LOGGER.error("Unable to destroy Target System Service (TSS).", e); - throw new RuntimeException("Unable to destroy Target System Service (TSS).", e); - } - - return outputDataList; - } - - protected IUASSecurityProperties createSecurityProperties(String pKeystore, String pAlias, String pPassword, String pType) - { - UASSecurityProperties secProps = new UASSecurityProperties(); - - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_KEYSTORE, pKeystore); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_KEYPASS, pPassword); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_KEYTYPE, pType); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_KEYALIAS, pAlias); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_TRUSTSTORE, pKeystore); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_TRUSTPASS, pPassword); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_TRUSTTYPE, pType); - - secProps.setProperty(IUASSecurityProperties.WSRF_SSL, "true"); - secProps.setProperty(IUASSecurityProperties.WSRF_SSL_CLIENTAUTH, "true"); - - String outHandlers = DSigOutHandler.class.getName() + " " + TDOutHandler.class.getName(); - secProps.setProperty(IUASSecurityProperties.UAS_OUTHANDLER_NAME, outHandlers); - - secProps.setSignMessage(true); - secProps.setAddTrustDelegation(true); - - return secProps; - } - - private TSSClient createTargetSystem() - { - Random random = new Random(); - - RegistryClient registry; - try - { - Properties unicoreProperties = UnicoreAlgorithmRepository.getInstance().getUnicoreProperties(); - - // connect to registry - EndpointReferenceType registryEpr = EndpointReferenceType.Factory.newInstance(); - registryEpr.addNewAddress().setStringValue(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_REGISTRY)); - LOGGER.info("Connect to UNCIORE Registry Service at '" + registryEpr.getAddress().getStringValue() + "'."); - registry = new RegistryClient(registryEpr.getAddress().getStringValue(), registryEpr, securityProperties); - } - catch (Exception e) - { - LOGGER.error("Unable to connect to UNCIORE Registry Service."); - throw new RuntimeException(e); - } - - // get target system factory - TSFClient tsf; - try - { - List tsfList = registry.listServices(TargetSystemFactory.TSF_PORT); - for (EndpointReferenceType tsfEpr : tsfList) - { - LOGGER.info("Found Target System Factory (TSF) at '" + tsfEpr.getAddress().getStringValue() + "'."); - } - EndpointReferenceType tsfEpr = tsfList.get(random.nextInt(tsfList.size())); - LOGGER.info("Select Target System Factory (TSF) at '" + tsfEpr.getAddress().getStringValue() + "'."); - tsf = new TSFClient(tsfEpr.getAddress().getStringValue(), tsfEpr, securityProperties); - } - catch (Exception e) - { - LOGGER.error("No Target System Factory (TSF) found."); - throw new RuntimeException(e); - } - - // select target system - List tssList = tsf.getTargetSystems(); - for (EndpointReferenceType tssEpr : tssList) - { - LOGGER.info("Found Target System Service (TSS) at '" + tssEpr.getAddress().getStringValue() + "'."); - } - - TSSClient tss; - try - { - // create target system - CreateTSRDocument in = getCreateDocument(); - tss = tsf.createTSS(in); - LOGGER.info("Create Target System Service (TSS) at '" + tss.getEPR().getAddress().getStringValue() + "'."); - } - catch (Exception e) - { - LOGGER.error("Unable to create Target System Service (TSS)."); - throw new RuntimeException(e); - } - - return tss; - } - - protected void submitApplicationFiles(IUASSecurityProperties pSecurityProperties, TSSClient pTargetSystem) throws Exception - { - Properties unicoreProperties = UnicoreAlgorithmRepository.getInstance().getUnicoreProperties(); - - // create storage client for home folder - StorageClient smsHome = getHomeStorageClient(pTargetSystem, pSecurityProperties); - - // check if remote application file already exist - boolean overwriteRemoteFile = Boolean.parseBoolean(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_OVERWRITE)); - - if (overwriteRemoteFile) - { - LOGGER.info("Overwrite existing remote application files."); - } - else - { - LOGGER.info("Do not overwrite existing remote application files."); - } - - - // check if lib directory exists - GridFileType[] directoryList; - try - { - directoryList = smsHome.listDirectory("."); - } - catch (BaseFault e) - { - LOGGER.error("Error while accessing home storage."); - throw new ExceptionReport("Error while accessing home storage.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - - boolean libDirectoryExists = false; - for (GridFileType gridFile : directoryList) - { - String path = gridFile.getPath(); - path = path.replaceAll("./", ""); - if (path.equals("/lib")) - { - libDirectoryExists = true; - break; - } - } - if (!libDirectoryExists) - { - smsHome.createDirectory("./lib"); - } - - // copy - try - { - directoryList = smsHome.listDirectory("./lib"); - } - catch (BaseFault e) - { - LOGGER.error("Error while accessing home storage."); - throw new ExceptionReport("Error while accessing home storage.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - - for (String applicationFile : getApplicationFiles()) - { - /* check if remote file exists */ - boolean remoteFileExist = false; - for (GridFileType entry : directoryList) - { - String path = entry.getPath(); - path = path.replaceAll("/./lib/", ""); - if (path.equalsIgnoreCase(applicationFile)) - { - remoteFileExist = true; - break; - } - } - - File sourceFile = new File(getLibraryPath() + "/" + applicationFile); - - /* submit file */ - if (!remoteFileExist || overwriteRemoteFile) - { - FileInputStream source = new FileInputStream(sourceFile); - - LOGGER.info("Copy application file '" + applicationFile + "' to target system."); - - ImportFileDocument out = ImportFileDocument.Factory.newInstance(); - out.addNewImportFile().setProtocol(ProtocolType.RBYTEIO); - out.getImportFile().setDestination("./lib/" + applicationFile); - ImportFileResponseDocument outDoc = smsHome.ImportFile(out); - EndpointReferenceType outEpr = outDoc.getImportFileResponse().getImportEPR(); - RByteIOClient fileClient = new RByteIOClient(outEpr.getAddress().getStringValue(), outEpr, pSecurityProperties); - fileClient.writeAllData(source); - } - else - { - LOGGER.info("Latest version of application file '" + applicationFile + "' already on target system."); - } - - } - } - - private List getApplicationFiles() - { - List applicationFiles = new ArrayList(); - - File directory = new File(getLibraryPath()); - for (String file : directory.list()) - { - if (file.endsWith(".jar")) - { - applicationFiles.add(file); - } - } - - return applicationFiles; - } - - private CreateTSRDocument getCreateDocument() - { - CreateTSRDocument in = CreateTSRDocument.Factory.newInstance(); - TerminationTime tt = TerminationTime.Factory.newInstance(); - tt.setCalendarValue(getTerminationTime()); - in.addNewCreateTSR().setTerminationTime(tt); - return in; - } - - private Calendar getTerminationTime() - { - int initialLifeTime = 1; - Calendar c = Calendar.getInstance(); - c.add(Calendar.DATE, initialLifeTime); - return c; - } - - private StorageClient getHomeStorageClient(TSSClient tss, IUASSecurityProperties pSecurityProperties) - { - List storageList = tss.getStorages(); - if (storageList.size() < 1) - { - LOGGER.error("No home storage found at target system '" + tss.getTargetSystemName() + "'."); - throw new RuntimeException("No home storage found at target system '" + tss.getTargetSystemName() + "'."); - } - if (storageList.size() > 1) - { - LOGGER.error("More than one home storage found at target system '" + tss.getTargetSystemName() + "'."); - throw new RuntimeException("More than one home storage found at target system '" + tss.getTargetSystemName() + "'."); - } - EndpointReferenceType smsEpr = storageList.get(0); - LOGGER.info("Create Storage Management Service (SMS) at '" + smsEpr.getAddress().getStringValue() + "'."); - StorageClient client; - try - { - client = new StorageClient(smsEpr.getAddress().getStringValue(), smsEpr, pSecurityProperties); - } - catch (Exception e) - { - LOGGER.error("Error during creation of Storage Management Service (SMS)."); - throw new RuntimeException("Error during creation of Storage Management Service (SMS)."); - } - - return client; - } - - private String getLibraryPath() - { - String domain = UnicoreClient.class.getProtectionDomain().getCodeSource().getLocation().getFile(); - int index = domain.indexOf("WEB-INF"); - if (index < 0) - { - throw new RuntimeException("Unable to find the 'WEB-INF' folder."); - } - String substring = domain.substring(0, index); - if (!substring.endsWith("/")) - { - substring = substring + "/"; - } - return substring + "WEB-INF/lib"; - } -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreExecutor.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreExecutor.java deleted file mode 100644 index aef6ccb8a..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreExecutor.java +++ /dev/null @@ -1,110 +0,0 @@ - -package org.n52.wps.unicore.client; - -import java.io.ByteArrayInputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.Properties; - -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.unicore.UnicoreAlgorithmInput; -import org.n52.wps.unicore.UnicoreAlgorithmOutput; -import org.n52.wps.unicore.UnicoreAlgorithmRepository; -import org.n52.wps.unicore.utilities.Compression; - -public class UnicoreExecutor -{ - public static String METHOD_NAME = "run"; - public static Class[] METHOD_PARAMETER = { - Map.class - }; - - protected String userDirectory; - protected Properties unicoreProperties; - - public UnicoreExecutor() throws Exception - { - userDirectory = System.getProperty("user.dir"); - WPSConfig.getInstance(userDirectory + "/wps_config.xml"); - unicoreProperties = UnicoreAlgorithmRepository.getInstance().getUnicoreProperties(); - } - - public static void main(String[] args) throws Exception - { - UnicoreExecutor executor = new UnicoreExecutor(); - - System.out.println("Load algorithm input data."); - UnicoreAlgorithmInput algorithmInput = executor.getAlgorithmInput(); - - System.out.println("Load dynamic class <" + algorithmInput.getEmbeddedAlgorithm() + ">."); - Class algorithmClass = UnicoreExecutor.class.getClassLoader().loadClass(algorithmInput.getEmbeddedAlgorithm()); - - System.out.println("Create new instance of algorithm."); - Object algorithmObject = algorithmClass.newInstance(); - - System.out.println("Get run method."); - Method algorithmMethod = algorithmClass.getMethod(METHOD_NAME, METHOD_PARAMETER); - - System.out.println("Create input data structure."); - Object[] algorithmArguments = { - algorithmInput.getData() - }; - - System.out.println("Invoke run method."); - Map data = (Map) algorithmMethod.invoke(algorithmObject, algorithmArguments); - - System.out.println("Invoke run method."); - UnicoreAlgorithmOutput algorithmOutput = new UnicoreAlgorithmOutput(data); - - System.out.println("Write job output data."); - executor.putAlgorithmOutput(algorithmOutput); - } - - protected UnicoreAlgorithmInput getAlgorithmInput() throws ExceptionReport - { - try - { - FileInputStream fis = new FileInputStream(userDirectory + "/" + UnicoreTask.TARGET_SYSTEM_INPUT_FILE_NAME); - byte[] data = Compression - .createUncompressedData(fis, Boolean.parseBoolean(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_COMPRESSION))); - ByteArrayInputStream bais = new ByteArrayInputStream(data); - ObjectInputStream ois = new ObjectInputStream(bais); - UnicoreAlgorithmInput algorithmInput = (UnicoreAlgorithmInput) ois.readObject(); - return algorithmInput; - } - catch (FileNotFoundException e) - { - e.printStackTrace(); - System.out.println("Error while accessing serialized algorithm input data file."); - throw new ExceptionReport("Error while accessing serialized algorithm input data file.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - catch (IOException e) - { - e.printStackTrace(); - System.out.println("Error while accessing serialized algorithm input data file."); - throw new ExceptionReport("Error while accessing serialized algorithm input data file.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - catch (ClassNotFoundException e) - { - e.printStackTrace(); - System.out.println("Error while accessing serialized algorithm input data file."); - throw new ExceptionReport("Error while accessing serialized algorithm input data file.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - } - - protected void putAlgorithmOutput(UnicoreAlgorithmOutput pAlgorithmOutput) throws FileNotFoundException, IOException - { - byte[] data = Compression.toByteArray(pAlgorithmOutput); - byte[] dataCompressed = Compression.createCompressedData(data, Boolean - .parseBoolean(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_COMPRESSION))); - FileOutputStream fos = new FileOutputStream(userDirectory + "/" + UnicoreTask.TARGET_SYSTEM_OUTPUT_FILE_NAME); - fos.write(dataCompressed); - fos.close(); - } -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreTask.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreTask.java deleted file mode 100644 index d41755c25..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/client/UnicoreTask.java +++ /dev/null @@ -1,234 +0,0 @@ - -package org.n52.wps.unicore.client; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.util.Properties; -import java.util.concurrent.Callable; - -import org.apache.log4j.Logger; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; -import org.n52.wps.commons.WPSConfig; -import org.n52.wps.server.ExceptionReport; -import org.n52.wps.server.IAlgorithm; -import org.n52.wps.unicore.UnicoreAlgorithmInput; -import org.n52.wps.unicore.UnicoreAlgorithmOutput; -import org.n52.wps.unicore.UnicoreAlgorithmRepository; -import org.n52.wps.unicore.utilities.Compression; -import org.unigrids.x2006.x04.services.tss.SubmitDocument; -import org.unigrids.x2006.x04.services.tss.SubmitResponseDocument; -import org.w3.x2005.x08.addressing.EndpointReferenceType; - -import de.fzj.unicore.uas.client.JobClient; -import de.fzj.unicore.uas.client.RByteIOClient; -import de.fzj.unicore.uas.client.StorageClient; -import de.fzj.unicore.uas.client.TSSClient; -import de.fzj.unicore.uas.security.IUASSecurityProperties; - -public class UnicoreTask implements Callable -{ - private static Logger LOGGER = Logger.getLogger(UnicoreTask.class); - - public static final String TARGET_SYSTEM_INPUT_FILE_NAME = "input"; - public static final String TARGET_SYSTEM_OUTPUT_FILE_NAME = "output"; - - public static String JOB_EXECUTION_SCRIPT = "UnicoreExecutor.sh"; - - protected static int WAIT_UNTIL_READY_TIMEOUT = 1800 * 1000; - protected static int WAIT_UNTIL_DONE_TIMEOUT = 1800 * 1000; - - protected IUASSecurityProperties securityProperties; - protected TSSClient targetSystem; - protected UnicoreAlgorithmInput inputData; - - public UnicoreTask(IUASSecurityProperties pSecurityProperties, TSSClient pTargetSystem, UnicoreAlgorithmInput pInputData) - { - securityProperties = pSecurityProperties; - targetSystem = pTargetSystem; - inputData = pInputData; - } - - public Object call() throws Exception - { - // submit job - JobClient job = submitJob(targetSystem); - - // stage in input data - StorageClient smsUspace = job.getUspaceClient(); - submitInputData(smsUspace, inputData); - - // stage in configuration - submitWpsConfiguration(smsUspace); - - // stage in execution script - submitExecutionScript(smsUspace); - - // run job - LOGGER.info("Run job."); - job.waitUntilReady(WAIT_UNTIL_READY_TIMEOUT); - job.start(); - job.waitUntilDone(WAIT_UNTIL_DONE_TIMEOUT); - - // fetch process outcome - UnicoreAlgorithmOutput processOutput = fetchOutputData(smsUspace); - - // destroy job at target system - job.destroy(); - - IAlgorithm alg = new org.n52.wps.server.algorithm.SimpleBufferAlgorithm(); - return new UnicoreAlgorithmOutput(alg.run(inputData.getData())); - } - - protected JobClient submitJob(final TSSClient tss) throws Exception - { - // create job definition document - LOGGER.info("Create job definition document."); - JobDefinitionDocument definition = getJobDefinition(); - - // submit job definition document - LOGGER.info("Submit job definition document."); - SubmitDocument submit = SubmitDocument.Factory.newInstance(); - submit.addNewSubmit().setJobDefinition(definition.getJobDefinition()); - SubmitResponseDocument response = tss.Submit(submit); - - // create job client - EndpointReferenceType jobEpr = response.getSubmitResponse().getJobReference(); - LOGGER.info("Create job at '" + jobEpr.getAddress().getStringValue() + "'."); - return new JobClient(jobEpr.getAddress().getStringValue(), jobEpr, securityProperties); - } - - protected JobDefinitionDocument getJobDefinition() - { - JobDefinitionDocument job = JobDefinitionDocument.Factory.newInstance(); - - ApplicationDocument ad = ApplicationDocument.Factory.newInstance(); - ApplicationType app = ad.addNewApplication(); - - app.setApplicationName("Bash shell"); - - POSIXApplicationDocument pAppD = POSIXApplicationDocument.Factory.newInstance(); - POSIXApplicationType pApp = pAppD.addNewPOSIXApplication(); - - EnvironmentType e1 = pApp.addNewEnvironment(); - e1.setName("SOURCE"); - e1.setStringValue("./UnicoreExecutor.sh"); - - de.fzj.unicore.wsrflite.utils.Utilities.append(pAppD, ad); - - job.addNewJobDefinition().addNewJobDescription().setApplication(ad.getApplication()); - - return job; - } - - protected UnicoreAlgorithmOutput fetchOutputData(final StorageClient uspace) throws ExceptionReport - { - // fetch and display standard input and output - byte[] stdout = stageOut(uspace, "stdout"); - byte[] stderr = stageOut(uspace, "stderr"); - - LOGGER.info(new String(stdout)); - LOGGER.info(new String(stderr)); - - // fetch output data - LOGGER.info("Fetch algorithm output data."); - byte[] dataCompressed = stageOut(uspace, "/" + TARGET_SYSTEM_OUTPUT_FILE_NAME); - - try - { - Properties unicoreProperties = UnicoreAlgorithmRepository.getInstance().getUnicoreProperties(); - - // create uncompressed output data - InputStream is = new ByteArrayInputStream(dataCompressed); - byte[] data = Compression.createUncompressedData(is, Boolean - .parseBoolean(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_COMPRESSION))); - LOGGER.info("Decompress output data (ratio: " + ((double) data.length) / ((double) dataCompressed.length) + ")."); - - // deserialize output data - LOGGER.info("Serialize output data."); - is = new ByteArrayInputStream(data); - ObjectInputStream ois = new ObjectInputStream(is); - return (UnicoreAlgorithmOutput) ois.readObject(); - } - catch (IOException e) - { - LOGGER.error("Error while deserialization of job output data."); - throw new ExceptionReport("Error while deserialization of job output data.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - catch (ClassNotFoundException e) - { - LOGGER.error("Error while deserialization of job output data."); - throw new ExceptionReport("Error while deserialization of job output data.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - } - - protected byte[] stageOut(final StorageClient uspace, final String pFileName) throws ExceptionReport - { - try - { - RByteIOClient fileClient = uspace.getExport(pFileName); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - fileClient.readAllData(bos); - return bos.toByteArray(); - } - catch (IOException e) - { - LOGGER.error("Error while fetching remote file '" + pFileName + "'."); - throw new ExceptionReport("Error while fetching remote file '" + pFileName + "'.", ExceptionReport.REMOTE_COMPUTATION_ERROR, e); - } - } - - private void submitExecutionScript(StorageClient pSms) throws Exception - { - LOGGER.info("Submit job execution script."); - InputStream source = UnicoreClient.class.getResourceAsStream(JOB_EXECUTION_SCRIPT); - RByteIOClient fileClient = pSms.getImport("/" + JOB_EXECUTION_SCRIPT); - fileClient.writeAllData(source); - } - - protected void submitInputData(StorageClient pSms, UnicoreAlgorithmInput pAlgorithmInput) throws Exception - { - RByteIOClient fileClient = pSms.getImport("/" + TARGET_SYSTEM_INPUT_FILE_NAME); - // create serialized input data - LOGGER.info("Serialize input data."); - byte[] data = Compression.toByteArray(pAlgorithmInput); - // create input data - Properties unicoreProperties = UnicoreAlgorithmRepository.getInstance().getUnicoreProperties(); - byte[] dataCompressed = null; - if (Boolean.parseBoolean(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_COMPRESSION))) - { - dataCompressed = Compression.createCompressedData(data, Boolean.parseBoolean(unicoreProperties - .getProperty(UnicoreAlgorithmRepository.CFG_COMPRESSION))); - LOGGER.info("Compress input data (ratio: " + ((double) dataCompressed.length) / ((double) data.length) + ")."); - } - // submit input data - if (Boolean.parseBoolean(unicoreProperties.getProperty(UnicoreAlgorithmRepository.CFG_COMPRESSION))) - { - LOGGER.info("Submit compressed input data."); - fileClient.write(dataCompressed); - } - else - { - LOGGER.info("Submit input data."); - fileClient.write(data); - } - } - - protected void submitWpsConfiguration(StorageClient pSms) throws Exception - { - RByteIOClient fileClient = pSms.getImport("/wps_config.xml"); - File f = new File(WPSConfig.getConfigPath()); - FileInputStream is = new FileInputStream(f); - fileClient.writeAllData(is); - is.close(); - } -} diff --git a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/utilities/Compression.java b/52n-wps-unicore/src/main/java/org/n52/wps/unicore/utilities/Compression.java deleted file mode 100755 index c488e0936..000000000 --- a/52n-wps-unicore/src/main/java/org/n52/wps/unicore/utilities/Compression.java +++ /dev/null @@ -1,62 +0,0 @@ - -package org.n52.wps.unicore.utilities; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectOutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -public class Compression -{ - public static synchronized byte[] toByteArray(final Object pData) throws IOException - { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(pData); - oos.close(); - return baos.toByteArray(); - } - - public static synchronized byte[] createCompressedData(byte[] data, boolean compressionEnabled) throws IOException - { - if (compressionEnabled) - { - ByteArrayInputStream bais = new ByteArrayInputStream(data); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - GZIPOutputStream zos = new GZIPOutputStream(baos); - byte[] buffer = new byte[1024]; - for (int length; (length = bais.read(buffer, 0, 1024)) > 0;) - { - zos.write(buffer, 0, length); - } - zos.close(); - baos.close(); - return baos.toByteArray(); - } - else - { - return data; - } - - } - - public static synchronized byte[] createUncompressedData(InputStream is, boolean compressionEnabled) throws IOException - { - if (compressionEnabled) - { - is = new GZIPInputStream(is); - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - for (int length; (length = is.read(buffer, 0, 1024)) > 0;) - { - baos.write(buffer, 0, length); - } - is.close(); - baos.close(); - return baos.toByteArray(); - } -} diff --git a/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/ExecuteDocument.xml b/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/ExecuteDocument.xml deleted file mode 100644 index 650e41f46..000000000 --- a/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/ExecuteDocument.xml +++ /dev/null @@ -1,22 +0,0 @@ - - org.n52.wps.unicore.algorithm.UnicoreSimpleBufferAlgorithm - - - data - - - - width - - 0.1 - - - - - - result - - - \ No newline at end of file diff --git a/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/algorithm/UnicoreSimpleBufferAlgorithm.xml b/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/algorithm/UnicoreSimpleBufferAlgorithm.xml deleted file mode 100644 index d84b57f5d..000000000 --- a/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/algorithm/UnicoreSimpleBufferAlgorithm.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - org.n52.wps.unicore.algorithm.UnicoreSimpleBufferAlgorithm - Create a buffer around a polygon. - Create a buffer around a single polygon. Accepts the polygon as GML and provides GML output for the buffered feature. - - - - - - - data - Polygon to be buffered - The Geometries to buffer - - - - text/XML - http://geoserver.itc.nl:8080/wps/schemas/gml/2.1.2/gmlpacket.xsd - - - - - text/XML - http://schemas.opengis.net/gml/2.1.2/feature.xsd - - - - - - - width - Buffer Distance - URI to a GML resource file - - - - - - - - - - - result - Buffered Polygon - GML stream describing the buffered polygon feature. - - - - - text/XML - http://geoserver.itc.nl:8080/wps/schemas/gml/2.1.2/gmlpacket.xsd - - - - - text/XML - http://schemas.opengis.net/gml/2.1.2/feature.xsd - - - - - - - diff --git a/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/client/UnicoreExecutor.sh b/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/client/UnicoreExecutor.sh deleted file mode 100755 index 9776516c8..000000000 --- a/52n-wps-unicore/src/main/resources/org/n52/wps/unicore/client/UnicoreExecutor.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# ----------------------------------------------------------------------------- -# Start Script for the UNICORE 'OGC Web Processing Service' Simple Job Executor -# ----------------------------------------------------------------------------- - -# build the classpath -for FILE in ~/lib/*.jar; do - CLASSPATH="${CLASSPATH:+${CLASSPATH}:}$FILE" -done - -echo $CLASSPATH - -# run the job executor application -java -Xmx256m -Xms256m -classpath "$CLASSPATH" org.n52.wps.unicore.client.UnicoreExecutor diff --git a/52n-wps-unicore/src/test/java/org/n52/wps/unicore/ExecuteTest.java b/52n-wps-unicore/src/test/java/org/n52/wps/unicore/ExecuteTest.java deleted file mode 100644 index 87240efdf..000000000 --- a/52n-wps-unicore/src/test/java/org/n52/wps/unicore/ExecuteTest.java +++ /dev/null @@ -1,55 +0,0 @@ - -package org.n52.wps.unicore; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -public class ExecuteTest -{ - public static void main(String[] args) throws MalformedURLException, IOException - { - String sUrl = "http://localhost:8761/wps/WebProcessingService"; - String sXml = "ExecuteDocument.xml"; - - new ExecuteTest().exampleRequest(sUrl, sXml); - } - - private void exampleRequest(String sUrl, String sXml) throws MalformedURLException, IOException - { - URL url = new URL(sUrl); - - URLConnection connection = url.openConnection(); - - connection.setDoInput(true); - connection.setDoOutput(true); - - OutputStream os = connection.getOutputStream(); - - InputStream is = ExecuteTest.class.getResourceAsStream(sXml); - byte[] buffer = new byte[1024]; - int c = is.read(buffer); - while (c > 0) - { - System.out.print(new String(buffer, 0, c)); - os.write(buffer, 0, c); - c = is.read(buffer); - } - os.close(); - System.out.println(); - - StringBuffer result = new StringBuffer(); - is = connection.getInputStream(); - buffer = new byte[1]; - c = is.read(buffer); - while (c > 0) - { - result.append(new String(buffer, 0, c)); - c = is.read(buffer); - } - System.out.println(result.toString()); - } -} diff --git a/52n-wps-webadmin/.gitignore b/52n-wps-webadmin/.gitignore new file mode 100644 index 000000000..ea8c4bf7f --- /dev/null +++ b/52n-wps-webadmin/.gitignore @@ -0,0 +1 @@ +/target diff --git a/52n-wps-webadmin/.settings/org.eclipse.core.resources.prefs b/52n-wps-webadmin/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..24e56b874 --- /dev/null +++ b/52n-wps-webadmin/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//src/main/java=ISO-8859-1 diff --git a/52n-wps-webadmin/.settings/org.eclipse.jdt.core.prefs b/52n-wps-webadmin/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..69c31cd49 --- /dev/null +++ b/52n-wps-webadmin/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/52n-wps-webadmin/.settings/org.eclipse.m2e.core.prefs b/52n-wps-webadmin/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-webadmin/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-webadmin/.settings/org.eclipse.wst.common.component b/52n-wps-webadmin/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..ad41a0593 --- /dev/null +++ b/52n-wps-webadmin/.settings/org.eclipse.wst.common.component @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-webadmin/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-webadmin/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..c78d9323f --- /dev/null +++ b/52n-wps-webadmin/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/52n-wps-webadmin/.settings/org.eclipse.wst.validation.prefs b/52n-wps-webadmin/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-webadmin/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-webapp/.settings/org.eclipse.jdt.core.prefs b/52n-wps-webapp/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..8209fce79 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,24 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.builder.cleanOutputFolder=clean +org.eclipse.jdt.core.builder.duplicateResourceTask=warning +org.eclipse.jdt.core.builder.invalidClasspath=abort +org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore +org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=wps_config.xml +org.eclipse.jdt.core.circularClasspath=error +org.eclipse.jdt.core.classpath.exclusionPatterns=enabled +org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled +org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.maxProblemPerUnit=100 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.incompatibleJDKLevel=ignore +org.eclipse.jdt.core.incompleteClasspath=error diff --git a/52n-wps-webapp/.settings/org.eclipse.jdt.launching.prefs b/52n-wps-webapp/.settings/org.eclipse.jdt.launching.prefs new file mode 100644 index 000000000..d211d3263 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.jdt.launching.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE=warning diff --git a/52n-wps-webapp/.settings/org.eclipse.m2e.core.prefs b/52n-wps-webapp/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/52n-wps-webapp/.settings/org.eclipse.wst.common.component b/52n-wps-webapp/.settings/org.eclipse.wst.common.component new file mode 100644 index 000000000..c1eb0ba27 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.wst.common.component @@ -0,0 +1,37 @@ + + + + + + + + uses + + + uses + + + uses + + + uses + + + uses + + + uses + + + uses + + + uses + + + uses + + + + + diff --git a/52n-wps-webapp/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/52n-wps-webapp/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml new file mode 100644 index 000000000..cc8138509 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/52n-wps-webapp/.settings/org.eclipse.wst.common.project.facet.core.xml b/52n-wps-webapp/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..a45adcf43 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/52n-wps-webapp/.settings/org.eclipse.wst.jsdt.ui.superType.container b/52n-wps-webapp/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 000000000..3bd5d0a48 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/52n-wps-webapp/.settings/org.eclipse.wst.jsdt.ui.superType.name b/52n-wps-webapp/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 000000000..05bd71b6e --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/52n-wps-webapp/.settings/org.eclipse.wst.validation.prefs b/52n-wps-webapp/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 000000000..04cad8cb7 --- /dev/null +++ b/52n-wps-webapp/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/52n-wps-webapp/pom.xml b/52n-wps-webapp/pom.xml index 5687d7e13..d49880d7d 100644 --- a/52n-wps-webapp/pom.xml +++ b/52n-wps-webapp/pom.xml @@ -1,214 +1,274 @@ - - - - org.n52.wps - 52n-wps-parent - 2.0-RC8-SNAPSHOT - - 4.0.0 - 52n-wps-webapp - war - 52n WPS Web Application - - - Geoprocessing - http://www2.52north.org/pipermail/geoprocessingservices/ - geoprocessingservices@52north.org - http://www2.52north.org/mailman/listinfo/geoprocessingservices - http://www2.52north.org/mailman/listinfo/geoprocessingservices - - - Geoprocessing Commits - http://www2.52north.org/pipermail/geoprocessing-commits - Geoprocessing-commits@52north.org - http://www2.52north.org/mailman/listinfo/geoprocessing-commits - http://www2.52north.org/mailman/listinfo/geoprocessing-commits - - - - - TheodorFoerster - Theodor Foerster - foerster@52north.org - http://www.itc.nl/about_itc/resumes/foerster.aspx - +2 - ITC - http://www.itc.nl - - Member of Geoprocessing community - Leader in WPS development - Java Developer - - - - BastianSchaeffer - Bastian Schaeffer - schaeffer@52north.org - +2 - IFGI, University of Muenster - http://ifgi.uni-muenster.de - - Member of Geoprocessing community - Leader in WPS development - Java Developer - - - - JohannesBrauner - Johannes Brauner - brauner@52north.org - +2 - Technical University of Dresden - http://tu-dresden.de/die_tu_dresden/fakultaeten/fakultaet_forst_geo_und_hydrowissenschaften/fachrichtung_geowissenschaften/gis - - Member of Geoprocessing community - Java Developer - - - - BastianBaranski - Bastian Baranski - baranski@52north.org - +2 - IFGI, University of Muenster - http://ifgi.uni-muenster.de - - Member of Geoprocessing community - Java Developer - - - - - - Janne Kovanen - Finnish Geodetic Institute, FGI - http://www.fgi.fi - - - Laura Diaz - Universitat Jaume I, Castellón, Spain - http://www.geoinfo.uji.es/ - - - Carlos Granell - Universitat Jaume I, Castellón, Spain - http://www.geoinfo.uji.es/ - - - David Robinson - Open Roads Consulting, Inc. - http://openroadsconsulting.com - - - Christophe Noel - Spacebel - http://www.spacebel.be - - + + + + org.n52.wps + 52n-wps-parent + 2.0-RC8-SNAPSHOT + + 4.0.0 + 52n-wps-webapp + war + 52n WPS Web Application + + + Geoprocessing + http://www2.52north.org/pipermail/geoprocessingservices/ + geoprocessingservices@52north.org + http://www2.52north.org/mailman/listinfo/geoprocessingservices + http://www2.52north.org/mailman/listinfo/geoprocessingservices + + + Geoprocessing Commits + http://www2.52north.org/pipermail/geoprocessing-commits + Geoprocessing-commits@52north.org + http://www2.52north.org/mailman/listinfo/geoprocessing-commits + http://www2.52north.org/mailman/listinfo/geoprocessing-commits + + + + + TheodorFoerster + Theodor Foerster + foerster@52north.org + http://www.itc.nl/about_itc/resumes/foerster.aspx + +2 + ITC + http://www.itc.nl + + Member of Geoprocessing community + Leader in WPS development + Java Developer + + + + BastianSchaeffer + Bastian Schaeffer + schaeffer@52north.org + +2 + IFGI, University of Muenster + http://ifgi.uni-muenster.de + + Member of Geoprocessing community + Leader in WPS development + Java Developer + + + + JohannesBrauner + Johannes Brauner + brauner@52north.org + +2 + Technical University of Dresden + http://tu-dresden.de/die_tu_dresden/fakultaeten/fakultaet_forst_geo_und_hydrowissenschaften/fachrichtung_geowissenschaften/gis + + Member of Geoprocessing community + Java Developer + + + + BastianBaranski + Bastian Baranski + baranski@52north.org + +2 + IFGI, University of Muenster + http://ifgi.uni-muenster.de + + Member of Geoprocessing community + Java Developer + + + + + + Janne Kovanen + Finnish Geodetic Institute, FGI + http://www.fgi.fi + + + Laura Diaz + Universitat Jaume I, Castellón, Spain + http://www.geoinfo.uji.es/ + + + Carlos Granell + Universitat Jaume I, Castellón, Spain + http://www.geoinfo.uji.es/ + + + David Robinson + Open Roads Consulting, Inc. + http://openroadsconsulting.com + + + Christophe Noel + Spacebel + http://www.spacebel.be + + - - - - - ${project.groupId} - 52n-wps-commons - ${project.version} - - - ${project.groupId} - 52n-wps-io - ${project.version} - - - ${project.groupId} - 52n-wps-server - ${project.version} - - - ${project.groupId} - 52n-wps-unicore - ${project.version} - - - ${project.groupId} - 52n-wps-gridgain - ${project.version} - - - ${project.groupId} - 52n-wps-sextante - ${project.version} - - - - ${project.groupId} - 52n-wps-grass - ${project.version} - - - - ${project.groupId} - 52n-wps-ags - ${project.version} - - - - ${project.groupId} - 52n-wps-python - ${project.version} - - - - ${project.groupId} - 52n-wps-webadmin - ${project.version} - - - - ${project.groupId} - 52n-wps-transactional - ${project.version} - - - - - - net.sourceforge.pjl-comp-filter - pjl-comp-filter - runtime - 1.6.4 - - - javax.servlet.jsp - jsp-api - provided - 2.1 - + + + - org.n52.security - 52n-security-config - 2.2-M2 - compile + ${project.groupId} + 52n-wps-commons + ${project.version} - org.n52.security - 52n-security-authentication - 2.2-M2 - compile + ${project.groupId} + 52n-wps-io + ${project.version} - org.n52.security - 52n-security-authn-web - 2.2-M2 - compile - - - + ${project.groupId} + 52n-wps-server + ${project.version} + + + + servlet-api + javax.servlet + + + servlet-api + org.mortbay.jetty + + + + jsp-api + javax.servlet.jsp + + + javax.servlet + org.glassfish + + + + jsp-api-2.1 + org.mortbay.jetty + + + jsp-2.1 + org.mortbay.jetty + + + jasper-runtime + tomcat + + + jasper-compiler + tomcat + + + + + + + ${project.groupId} + 52n-wps-sextante + ${project.version} + + + + ${project.groupId} + 52n-wps-grass + ${project.version} + + + + ${project.groupId} + 52n-wps-ags + ${project.version} + + + + ${project.groupId} + 52n-wps-python + ${project.version} + + + + ${project.groupId} + 52n-wps-webadmin + ${project.version} + + + + ${project.groupId} + 52n-wps-transactional + ${project.version} + + + + + + net.sourceforge.pjl-comp-filter + pjl-comp-filter + runtime + 1.6.4 + + + org.apache.tomcat + tomcat-jsp-api + provided + 7.0.6 + + + org.n52.security + 52n-security-config + 2.2-M2 + compile + + + servlet-api + javax.servlet + + + + + + org.n52.security + 52n-security-authentication + 2.2-M2 + compile + + + org.n52.security + 52n-security-authn-web + 2.2-M2 + compile + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + WPS + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + http://ese.spacebel.be:8080/manager/text + TomcatServer + /WPS + true +${project.build.directory}/WPS.war + tomcat + tomcat + + + + diff --git a/52n-wps-webapp/src/main/webapp/WEB-INF/classes/log4j.properties b/52n-wps-webapp/src/main/webapp/WEB-INF/classes/log4j.properties index 526937219..6f5fd41d9 100644 --- a/52n-wps-webapp/src/main/webapp/WEB-INF/classes/log4j.properties +++ b/52n-wps-webapp/src/main/webapp/WEB-INF/classes/log4j.properties @@ -1,22 +1,9 @@ log4j.rootLogger=WARN, CONSOLE -log4j.logger.org.n52.wps.server=INFO, WPS -log4j.logger.org.n52.wps.io=INFO, WPS + log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-5p [%c{1}\:%L] %m%n -log4j.appender.WPS=org.apache.log4j.RollingFileAppender -log4j.appender.WPS.File=/ssegrid/log/ssegrid.log -log4j.appender.WPS.Append=true -log4j.appender.WPS.layout=org.apache.log4j.PatternLayout -log4j.appender.WPS.layout.ConversionPattern=%d{dd-MM-yyyy HH\:mm\:ss,SSS} %-5p [%c{1}\:%L] %m%n -log4j.appender.WPS.MaxFileSize=5000KB -log4j.appender.WPS.MaxBackupIndex=5 - -log4j.logger.org.ogf.saga=WARN,WPS,CONSOLE -log4j.logger.org.gridlab=WARN,WPS,CONSOLE -log4j.logger.com.terradue=DEBUG,WPS,CONSOLE -log4j.logger.org.globus=WARN,WPS,CONSOLE - - +log4j.logger.org.n52.wps=DEBUG +log4j.logger.org.apache.hadoop=WARN \ No newline at end of file diff --git a/52n-wps-webapp/src/main/webapp/WEB-INF/web.xml b/52n-wps-webapp/src/main/webapp/WEB-INF/web.xml index e31d50e59..b18accf71 100644 --- a/52n-wps-webapp/src/main/webapp/WEB-INF/web.xml +++ b/52n-wps-webapp/src/main/webapp/WEB-INF/web.xml @@ -17,7 +17,7 @@ CONFIDENTIAL - - application/x-zipped-shp - Base64 - - - application/x-zipped-shp - application/shp - application/img - image/tiff - application/geotiff - application/dbase - application/remap - application/x-erdas-hfa - application/x-netcdf - application/dgn - image/jpeg - image/png - application/x-geotiff - UTF-8 - - - application/x-zipped-shp - application/img - application/img - image/tiff - application/geotiff - application/dbase - application/remap - Base64 - - - http://schemas.opengis.net/gml/2.0.0/feature.xsd - http://schemas.opengis.net/gml/2.1.1/feature.xsd - http://schemas.opengis.net/gml/2.1.2/feature.xsd - http://schemas.opengis.net/gml/2.1.2.1/feature.xsd - text/xml - UTF-8 - - - - - false - 4 - http://schemas.opengis.net/gml/3.0.0/base/feature.xsd - http://schemas.opengis.net/gml/3.0.1/base/feature.xsd - http://schemas.opengis.net/gml/3.1.0/base/feature.xsd - http://schemas.opengis.net/gml/3.1.1/base/feature.xsd - http://schemas.opengis.net/gml/3.2.1/base/feature.xsd - text/xml - UTF-8 - - - application/WMS - UTF-8 - admin - geoserver - localhost - 8080 - - - application/WFS - UTF-8 - admin - geoserver - localhost - 8080 - - - application/WCS - UTF-8 - admin - geoserver - localhost - 8080 - - - http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd - application/vnd.google-earth.kml+xml - UTF-8 - - - - - - - - - - - - - - - org.n52.wps.unicore.algorithm.UnicoreSimpleBufferAlgorithm - - https://localhost:8080/DEMO-SITE/services/Registry?res=default_registry - /home/bastian/.gpe4unicore/keystore.jks - jks - demo user - unicore - - false - true - - - - - - - - - - ftpuser - ssegrid - - + + + + + + http://schemas.opengis.net/gml/3.0.0/base/feature.xsd + http://schemas.opengis.net/gml/3.0.1/base/feature.xsd + http://schemas.opengis.net/gml/3.1.0/base/feature.xsd + http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + http://schemas.opengis.net/gml/3.2.1/base/feature.xsd + text/xml + UTF-8 + + + http://ese.esa.int/wps/format/URLList + text/xml + UTF-8 + + + http://ese.esa.int/wps/format/EODataCache + text/xml + UTF-8 + + + http://ese.esa.int/wps/format/DataList + text/xml + UTF-8 + + + http://www.opengeospatial.org/gmlpacket.xsd + http://geoserver.itc.nl:8080/wps/schemas/gml/2.1.2/gmlpacket.xsd + http://schemas.opengis.net/gml/2.1.2/gmlpacket.xsd + text/xml + UTF-8 + + + http://schemas.opengis.net/gml/2.0.0/feature.xsd + http://schemas.opengis.net/gml/2.1.1/feature.xsd + http://schemas.opengis.net/gml/2.1.2/feature.xsd + http://schemas.opengis.net/gml/2.1.2.1/feature.xsd + text/xml + UTF-8 + + + http://schemas.opengis.net/gml/2.0.0/feature.xsd + http://schemas.opengis.net/gml/2.1.1/feature.xsd + http://schemas.opengis.net/gml/2.1.2/feature.xsd + http://schemas.opengis.net/gml/2.1.2.1/feature.xsd + text/xml + UTF-8 + + + application/image-ascii-grass + UTF-8 + + + + text/xml + UTF-8 + http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + + + + + + application/x-zipped-shp + application/img + image/tiff + application/geotiff + application/dbase + application/remap + application/x-erdas-hfa + application/x-netcdf + application/dgn + image/jpeg + image/png + application/x-geotiff + UTF-8 + + + image/tiff + image/geotiff + UTF-8 + + + image/x-zipped-tiff + image/x-zipped-geotiff + UTF-8 + + + image/tiff + image/geotiff + Base64 + + + application/x-zipped-shp + Base64 + + + application/x-zipped-shp + UTF-8 + + + http://schemas.opengis.net/gml/3.0.0/base/feature.xsd + http://schemas.opengis.net/gml/3.0.1/base/feature.xsd + http://schemas.opengis.net/gml/3.1.0/base/feature.xsd + http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + http://schemas.opengis.net/gml/3.2.1/base/feature.xsd + text/xml + UTF-8 + + + http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd + application/vnd.google-earth.kml+xml + UTF-8 + + + http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd + application/vnd.google-earth.kml+xml + UTF-8 + + + application/x-zipped-wkt + Base64 + + + + + text/xml + UTF-8 + http://vito.be/ese/timeseries.xsd + + + http://ese.esa.int/wps/format/URLList + http://schemas.spacebel.be/wps/urllist.xsd + text/xml + UTF-8 + + + http://ese.esa.int/wps/format/EODataCache + text/xml + UTF-8 + + + http://ese.esa.int/wps/format/DataList + text/xml + UTF-8 + + + false + 4 + http://schemas.opengis.net/gml/3.0.0/base/feature.xsd + http://schemas.opengis.net/gml/3.0.1/base/feature.xsd + http://schemas.opengis.net/gml/3.1.0/base/feature.xsd + http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + http://schemas.opengis.net/gml/3.2.1/base/feature.xsd + text/xml + UTF-8 + + + false + 4 + http://schemas.opengis.net/gml/2.1.2/feature.xsd + text/xml + UTF-8 + + + http://www.opengeospatial.org/gmlpacket.xsd + http://geoserver.itc.nl:8080/wps/schemas/gml/2.1.2/gmlpacket.xsd + http://schemas.opengis.net/gml/2.1.2/gmlpacket.xsd + text/xml + UTF-8 + + + application/image-ascii-grass + UTF-8 + + + image/tiff + image/geotiff + UTF-8 + + + + application/x-zipped-shp + Base64 + + + application/x-zipped-shp + application/shp + application/img + image/tiff + application/geotiff + application/dbase + application/remap + application/x-erdas-hfa + application/x-netcdf + application/dgn + image/jpeg + image/png + application/x-geotiff + UTF-8 + + + application/x-zipped-shp + application/img + application/img + image/tiff + application/geotiff + application/dbase + application/remap + Base64 + + + http://schemas.opengis.net/gml/2.0.0/feature.xsd + http://schemas.opengis.net/gml/2.1.1/feature.xsd + http://schemas.opengis.net/gml/2.1.2/feature.xsd + http://schemas.opengis.net/gml/2.1.2.1/feature.xsd + text/xml + UTF-8 + + + + + false + 4 + http://schemas.opengis.net/gml/3.0.0/base/feature.xsd + http://schemas.opengis.net/gml/3.0.1/base/feature.xsd + http://schemas.opengis.net/gml/3.1.0/base/feature.xsd + http://schemas.opengis.net/gml/3.1.1/base/feature.xsd + http://schemas.opengis.net/gml/3.2.1/base/feature.xsd + text/xml + UTF-8 + + + application/WMS + UTF-8 + admin + geoserver + localhost + 8080 + + + application/WFS + UTF-8 + admin + geoserver + localhost + 8080 + + + application/WCS + UTF-8 + admin + geoserver + localhost + 8080 + + + http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd + application/vnd.google-earth.kml+xml + UTF-8 + + + + + + be.spacebel.ese.data.wps.DownloadEOData + be.spacebel.ese.data.wps.RemoveEOData + be.spacebel.ese.data.wps.ReleaseEOData + be.spacebel.ese.data.wps.QueryEOData + + + + + + + + + org.n52.wps.unicore.algorithm.UnicoreSimpleBufferAlgorithm + + https://localhost:8080/DEMO-SITE/services/Registry?res=default_registry + /home/bastian/.gpe4unicore/keystore.jks + jks + demo user + unicore + + false + true + + + + + + + + + org.n52.wps.server.profiles.DefaultTransactionalAlgorithm + org.n52.wps.server.profiles.java.JavaManager + org.n52.wps.server.profiles.java.JavaDeploymentProfile + java.xsd + + + + org.n52.wps.server.profiles.DefaultTransactionalAlgorithm + org.n52.wps.server.profiles.oozie.OozieManager + oozie.xsd + http://91.183.191.245:11000/oozie/ + + hdfs://quickstart.cloudera:8020 + + hdfs://91.183.191.245:8020 + + quickstart.cloudera:8032 + christophe + hdfs + /user/hdfs/deploy + org.n52.wps.server.profiles.oozie.OozieDeploymentProfile + + + + + + + + + \ No newline at end of file diff --git a/52n-wps-webapp/src/main/webapp/webAdmin/resources/jquery.js b/52n-wps-webapp/src/main/webapp/webAdmin/resources/jquery.js index fc06ace27..81a712883 100644 --- a/52n-wps-webapp/src/main/webapp/webAdmin/resources/jquery.js +++ b/52n-wps-webapp/src/main/webapp/webAdmin/resources/jquery.js @@ -1252,150 +1252,150 @@ jQuery.each({ function num(elem, prop) { return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; } -var expando = "jQuery" + now(), uuid = 0, windowData = {}; - -jQuery.extend({ - cache: {}, - - data: function( elem, name, data ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // Compute a unique ID for the element - if ( !id ) - id = elem[ expando ] = ++uuid; - - // Only generate the data cache if we're - // trying to access or manipulate it - if ( name && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; - - // Prevent overriding the named cache with undefined values - if ( data !== undefined ) - jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element - return name ? - jQuery.cache[ id ][ name ] : - id; - }, - - removeData: function( elem, name ) { - elem = elem == window ? - windowData : - elem; - - var id = elem[ expando ]; - - // If we want to remove a specific section of the element's data - if ( name ) { - if ( jQuery.cache[ id ] ) { - // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; - - // If we've removed all the data, remove the element's cache - name = ""; - - for ( name in jQuery.cache[ id ] ) - break; - - if ( !name ) - jQuery.removeData( elem ); - } - - // Otherwise, we want to remove all of the element's data - } else { - // Clean up the element expando - try { - delete elem[ expando ]; - } catch(e){ - // IE has trouble directly removing the expando - // but it's ok with using removeAttribute - if ( elem.removeAttribute ) - elem.removeAttribute( expando ); - } - - // Completely remove the data cache - delete jQuery.cache[ id ]; - } - }, - queue: function( elem, type, data ) { - if ( elem ){ - - type = (type || "fx") + "queue"; - - var q = jQuery.data( elem, type ); - - if ( !q || jQuery.isArray(data) ) - q = jQuery.data( elem, type, jQuery.makeArray(data) ); - else if( data ) - q.push( data ); - - } - return q; - }, - - dequeue: function( elem, type ){ - var queue = jQuery.queue( elem, type ), - fn = queue.shift(); - - if( !type || type === "fx" ) - fn = queue[0]; - - if( fn !== undefined ) - fn.call(elem); - } -}); - -jQuery.fn.extend({ - data: function( key, value ){ - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - if ( data === undefined && this.length ) - data = jQuery.data( this[0], key ); - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - } else - return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ - jQuery.data( this, key, value ); - }); - }, - - removeData: function( key ){ - return this.each(function(){ - jQuery.removeData( this, key ); - }); - }, - queue: function(type, data){ - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) - return jQuery.queue( this[0], type ); - - return this.each(function(){ - var queue = jQuery.queue( this, type, data ); - - if( type == "fx" && queue.length == 1 ) - queue[0].call(this); - }); - }, - dequeue: function(type){ - return this.each(function(){ - jQuery.dequeue( this, type ); - }); - } +var expando = "jQuery" + now(), uuid = 0, windowData = {}; + +jQuery.extend({ + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? + jQuery.cache[ id ][ name ] : + id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + + for ( name in jQuery.cache[ id ] ) + break; + + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + queue: function( elem, type, data ) { + if ( elem ){ + + type = (type || "fx") + "queue"; + + var q = jQuery.data( elem, type ); + + if ( !q || jQuery.isArray(data) ) + q = jQuery.data( elem, type, jQuery.makeArray(data) ); + else if( data ) + q.push( data ); + + } + return q; + }, + + dequeue: function( elem, type ){ + var queue = jQuery.queue( elem, type ), + fn = queue.shift(); + + if( !type || type === "fx" ) + fn = queue[0]; + + if( fn !== undefined ) + fn.call(elem); + } +}); + +jQuery.fn.extend({ + data: function( key, value ){ + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ + jQuery.data( this, key, value ); + }); + }, + + removeData: function( key ){ + return this.each(function(){ + jQuery.removeData( this, key ); + }); + }, + queue: function(type, data){ + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) + return jQuery.queue( this[0], type ); + + return this.each(function(){ + var queue = jQuery.queue( this, type, data ); + + if( type == "fx" && queue.length == 1 ) + queue[0].call(this); + }); + }, + dequeue: function(type){ + return this.each(function(){ + jQuery.dequeue( this, type ); + }); + } });/*! * Sizzle CSS Selector Engine - v0.9.1 * Copyright 2009, The Dojo Foundation diff --git a/52n-wps-webapp/src/site/apt/tutorials.apt b/52n-wps-webapp/src/site/apt/tutorials.apt index 6342d9075..869e9aaca 100644 --- a/52n-wps-webapp/src/site/apt/tutorials.apt +++ b/52n-wps-webapp/src/site/apt/tutorials.apt @@ -1,29 +1,29 @@ - ----- -Tutorials section - ----- -Bastian Schäffer - ----- - 2010-04-08 - ----- - -WPS Tutorials Section -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - In this section you can find tutorials for installing and developing the 52North WPS. - - - * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/Setting_up_the_WPS_as_a_Multiple_Module_Eclipse_Project_2.1.pdf} Setting up and compiling the 52North WPS sources}}. - - * Tutorial about {{{https://52north.org/twiki/bin/viewfile/Processing/52nWebProcessingService?rev=1;filename=WPS_Tutorial.pdf} 52North WPS process development}}. - - * Tutorial about {{{https://52north.org/twiki/pub/Processing/52nWebProcessingService/52n_WPS_Grid_Computing_Hands_On.pdf} Distributed Computing with GridGain and UNICORE}}. - - * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/configuring_arcgis_support_for_the_52n_wps-long_version-v1.0.pdf} Setting up the 52North WPS with ArcGIS Server and Python scripts-long version}}. - - * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/exposing_arcgis_server_functionality_with_52north_wps-short-version-_v1.0.pdf} Setting up the 52North WPS with ArcGIS Server-short version}}. - - * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/WPS-GRASS-Win.pdf} Setting up the 52North WPS with GRASS-Windows version}}. - - * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/WPS-GRASS-Linux.pdf} Setting up the 52North WPS with GRASS-Linux version}}. - + ----- +Tutorials section + ----- +Bastian Schäffer + ----- + 2010-04-08 + ----- + +WPS Tutorials Section +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + In this section you can find tutorials for installing and developing the 52North WPS. + + + * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/Setting_up_the_WPS_as_a_Multiple_Module_Eclipse_Project_2.1.pdf} Setting up and compiling the 52North WPS sources}}. + + * Tutorial about {{{https://52north.org/twiki/bin/viewfile/Processing/52nWebProcessingService?rev=1;filename=WPS_Tutorial.pdf} 52North WPS process development}}. + + * Tutorial about {{{https://52north.org/twiki/pub/Processing/52nWebProcessingService/52n_WPS_Grid_Computing_Hands_On.pdf} Distributed Computing with GridGain and UNICORE}}. + + * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/configuring_arcgis_support_for_the_52n_wps-long_version-v1.0.pdf} Setting up the 52North WPS with ArcGIS Server and Python scripts-long version}}. + + * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/exposing_arcgis_server_functionality_with_52north_wps-short-version-_v1.0.pdf} Setting up the 52North WPS with ArcGIS Server-short version}}. + + * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/WPS-GRASS-Win.pdf} Setting up the 52North WPS with GRASS-Windows version}}. + + * Tutorial about {{{https://52north.org/download/Geoprocessing/documents/WPS-GRASS-Linux.pdf} Setting up the 52North WPS with GRASS-Linux version}}. + diff --git a/external-libs/cog-jglobus-1.8.0.jar b/external-libs/cog-jglobus-1.8.0.jar deleted file mode 100644 index 6e17bab71..000000000 Binary files a/external-libs/cog-jglobus-1.8.0.jar and /dev/null differ diff --git a/external-libs/commons-jxpath-1.3.jar b/external-libs/commons-jxpath-1.3.jar deleted file mode 100644 index e344a1e66..000000000 Binary files a/external-libs/commons-jxpath-1.3.jar and /dev/null differ diff --git a/external-libs/cryptix-asn1.jar b/external-libs/cryptix-asn1.jar deleted file mode 100644 index 100836215..000000000 Binary files a/external-libs/cryptix-asn1.jar and /dev/null differ diff --git a/external-libs/cryptix.jar b/external-libs/cryptix.jar deleted file mode 100644 index a14010f1b..000000000 Binary files a/external-libs/cryptix.jar and /dev/null differ diff --git a/external-libs/cryptix32.jar b/external-libs/cryptix32.jar deleted file mode 100644 index 80429d71d..000000000 Binary files a/external-libs/cryptix32.jar and /dev/null differ diff --git a/external-libs/jaxb-api-2.1.jar b/external-libs/jaxb-api-2.1.jar deleted file mode 100644 index be3d6dca2..000000000 Binary files a/external-libs/jaxb-api-2.1.jar and /dev/null differ diff --git a/external-libs/jaxb-impl-2.2.2.jar b/external-libs/jaxb-impl-2.2.2.jar deleted file mode 100644 index 06b85fecb..000000000 Binary files a/external-libs/jaxb-impl-2.2.2.jar and /dev/null differ diff --git a/external-libs/jce-jdk13-131.jar b/external-libs/jce-jdk13-131.jar deleted file mode 100644 index 79f0397b8..000000000 Binary files a/external-libs/jce-jdk13-131.jar and /dev/null differ diff --git a/external-libs/jgss.jar b/external-libs/jgss.jar deleted file mode 100644 index 9504b8272..000000000 Binary files a/external-libs/jgss.jar and /dev/null differ diff --git a/external-libs/puretls.jar b/external-libs/puretls.jar deleted file mode 100644 index b8c7c7bc7..000000000 Binary files a/external-libs/puretls.jar and /dev/null differ diff --git a/external-libs/saga-api-1.1.1.jar b/external-libs/saga-api-1.1.1.jar deleted file mode 100644 index 541b15591..000000000 Binary files a/external-libs/saga-api-1.1.1.jar and /dev/null differ diff --git a/external-libs/saga-benchmarks.jar b/external-libs/saga-benchmarks.jar deleted file mode 100644 index 70806ff2c..000000000 Binary files a/external-libs/saga-benchmarks.jar and /dev/null differ diff --git a/external-libs/saga-ext-T2.jar b/external-libs/saga-ext-T2.jar deleted file mode 100644 index 100e9df50..000000000 Binary files a/external-libs/saga-ext-T2.jar and /dev/null differ diff --git a/external-libs/saga-impl-1.1.jar b/external-libs/saga-impl-1.1.jar deleted file mode 100644 index fea106467..000000000 Binary files a/external-libs/saga-impl-1.1.jar and /dev/null differ diff --git a/external-libs/saga-impl-T2-1.0.0.jar b/external-libs/saga-impl-T2-1.0.0.jar deleted file mode 100644 index 42b4bb6e7..000000000 Binary files a/external-libs/saga-impl-T2-1.0.0.jar and /dev/null differ diff --git a/external-libs/saga-tests.jar b/external-libs/saga-tests.jar deleted file mode 100644 index 45b54c7f2..000000000 Binary files a/external-libs/saga-tests.jar and /dev/null differ diff --git a/external-libs/slf4j-api-1.5.3.jar b/external-libs/slf4j-api-1.5.3.jar deleted file mode 100644 index 01b3e7c89..000000000 Binary files a/external-libs/slf4j-api-1.5.3.jar and /dev/null differ diff --git a/external-libs/slf4j-log4j12-1.5.3.jar b/external-libs/slf4j-log4j12-1.5.3.jar deleted file mode 100644 index 234611059..000000000 Binary files a/external-libs/slf4j-log4j12-1.5.3.jar and /dev/null differ diff --git a/pom.xml b/pom.xml index fb1e04f8c..86bf70481 100644 --- a/pom.xml +++ b/pom.xml @@ -73,11 +73,7 @@ opengeo repository http://repo.opengeo.org - - mpi-vito - mpi-vito-releases - http://mpi-vito.spacebel.be:8081/artifactory/libs-release-local - + mvnrepository.com mvnrepository.com @@ -86,6 +82,7 @@ + maven-assembly-plugin @@ -97,9 +94,10 @@ maven-compiler-plugin + 2.5.1 - 1.6 - 1.6 + 1.8 + 1.8 ISO-8859-1 @@ -129,15 +127,16 @@ --> + + wpsg-xml + 52n-wps-commons 52n-wps-io 52n-wps-server - 52n-wps-unicore - 52n-wps-gridgain 52n-wps-webapp 52n-wps-client-lib 52n-wps-sextante @@ -146,8 +145,6 @@ 52n-wps-webadmin 52n-wps-ags 52n-wps-python - - + + + + + diff --git a/wpsg-xml/pom.xml b/wpsg-xml/pom.xml new file mode 100644 index 000000000..bc27ab319 --- /dev/null +++ b/wpsg-xml/pom.xml @@ -0,0 +1,94 @@ + + 4.0.0 + + be.spacebel.wps + wpsg-xml + 2.0.3 + jar + OGC WPS-G schemas + http://maven.apache.org + + + UTF-8 + + + + + org.codehaus.mojo + xmlbeans-maven-plugin + 2.3.3 + + + main + + xmlbeans + + + + + ${basedir}/src/main/schemas + + xlink/1.0.0/xlinks.xsd + wps/wpsAll.xsd + wps/wpsESEQoS.xsd + wps/wpsESEMetadata.xsd + wps/wps_urllist.xsd + wps/wps_datalist.xsd + wps/wps_cachelist.xsd + wps/wps_vito.xsd + ode/pmapi.xsd + + false + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + org.codehaus.mojo + + + xmlbeans-maven-plugin + + + [2.3.3,) + + + xmlbeans + + + + + + + + + + + + + + + + org.apache.xmlbeans + xmlbeans + 2.6.0 + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gco/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gco/ReadMe.txt new file mode 100644 index 000000000..f02eeee43 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gco/ReadMe.txt @@ -0,0 +1,27 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gco from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas modified as follows : + +- basicTypes.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- basicTypes.xsd line8: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" + +- gcoBase.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- gcoBase.xsd line11: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gco/basicTypes.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gco/basicTypes.xsd new file mode 100644 index 000000000..2323eee16 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gco/basicTypes.xsd @@ -0,0 +1,430 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:00:05 ====== + + + + + + + + + + + + + A TypeName is a LocalName that references either a recordType or object type in some form of schema. The stored value "aName" is the returned value for the "aName()" operation. This is the types name. - For parsing from types (or objects) the parsible name normally uses a "." navigation separator, so that it is of the form [class].[member].[memberOfMember]. ...) + + + + + + + + + + + + + + + + + + + + + + + A MemberName is a LocalName that references either an attribute slot in a record or recordType or an attribute, operation, or association role in an object instance or type description in some form of schema. The stored value "aName" is the returned value for the "aName()" operation. + + + + + + + + + + + + + + + + + + + + + + + + Use to represent the possible cardinality of a relation. Represented by a set of simple multiplicity ranges. + + + + + + + + + + + + + + + + + + + + + + + A component of a multiplicity, consisting of an non-negative lower bound, and a potentially infinite upper bound. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gco/gco.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gco/gco.xsd new file mode 100644 index 000000000..65af021ba --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gco/gco.xsd @@ -0,0 +1,12 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:00:06 ====== + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gco/gcoBase.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gco/gcoBase.xsd new file mode 100644 index 000000000..66d79ee46 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gco/gcoBase.xsd @@ -0,0 +1,62 @@ + + + + + This schema provides: + 1. tools to handle specific objects like "code lists" and "record"; + 2. Some XML types representing that do not follow the general encoding rules. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gmd/ReadMe.txt new file mode 100644 index 000000000..d3d8acd17 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/ReadMe.txt @@ -0,0 +1,7 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gmd from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas without any modification \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/applicationSchema.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/applicationSchema.xsd new file mode 100644 index 000000000..fbf8f52f6 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/applicationSchema.xsd @@ -0,0 +1,42 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== + + + + + + + + + + Information about the application schema used to build the dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/citation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/citation.xsd new file mode 100644 index 000000000..b4508da36 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/citation.xsd @@ -0,0 +1,275 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== + + + + + + + + + + Identification of, and means of communication with, person(s) and organisations associated with the dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + Standardized resource reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Location of the responsible individual or organisation + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about online sources from which the dataset, specification, or community profile name and extended metadata elements can be obtained. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information required enabling contact with the responsible person and/or organisation + + + + + + + + + + + + + + + + + + + + + + + + + + + Telephone numbers for contacting the responsible individual or organisation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/constraints.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/constraints.xsd new file mode 100644 index 000000000..d3cf9416c --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/constraints.xsd @@ -0,0 +1,106 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:01 ====== + + + + + + + + + Restrictions on the access and use of a dataset or metadata + + + + + + + + + + + + + + + + + + + + + + + Restrictions and legal prerequisites for accessing and using the dataset. + + + + + + + + + + + + + + + + + + + + + + + + + Handling restrictions imposed on the dataset because of national security, privacy, or other concerns + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/content.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/content.xsd new file mode 100644 index 000000000..9089c3699 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/content.xsd @@ -0,0 +1,188 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== + + + + + + + + + + Information identifing the feature catalogue + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the domain of the raster cell + + + + + + + + + + + + + + + + + + + + + + + + + Information about an image's suitability for use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Set of adjacent wavelengths in the electro-magnetic spectrum with a common characteristic, such as the visible band + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/dataQuality.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/dataQuality.xsd new file mode 100644 index 000000000..70762bfdd --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/dataQuality.xsd @@ -0,0 +1,554 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:01 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + quantitative_result from Quality Procedures - - renamed to remove implied use limitiation. + + + + + + + + + + + + + + + + + + + + + + + + + Quantitative_conformance_measure from Quality Procedures. - - Renamed to remove implied use limitation - - OCL - -- result is type specified by valueDomain - result.tupleType = valueDomain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/distribution.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/distribution.xsd new file mode 100644 index 000000000..fee05da7a --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/distribution.xsd @@ -0,0 +1,202 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== + + + + + + + + + + Information about the media on which the data can be distributed + + + + + + + + + + + + + + + + + + + + + + + + + + + + Technical means and media by which a dataset is obtained from the distributor + + + + + + + + + + + + + + + + + + + + + + + + + + Common ways in which the dataset may be obtained or received, and related instructions and fee information + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the distributor + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the distributor of and options for obtaining the dataset + + + + + + + + + + + + + + + + + + + + + + + + + Description of the form of the data to be distributed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/extent.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/extent.xsd new file mode 100644 index 000000000..47d2a38a5 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/extent.xsd @@ -0,0 +1,205 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== + + + + + + + + + + + + + Time period covered by the content of the dataset + + + + + + + + + + + + + + + + + + + + + + + Vertical domain of dataset + + + + + + + + + + + + + + + + + + + + + + + + + Boundary enclosing the dataset expressed as the closed set of (x,y) coordinates of the polygon (last point replicates first point) + + + + + + + + + + + + + + + + + + + + + + + Information about spatial, vertical, and temporal extent + + + + + + + + + + + + + + + + + + + + + + + + + + Geographic area of the dataset + + + + + + + + + + + + + + + + + + + + + + + Geographic area of the entire dataset referenced to WGS 84 + + + + + + + + + + + + + + + + + + + + + + + + + + Extent with respect to date and time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/freeText.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/freeText.xsd new file mode 100644 index 000000000..ec541c98d --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/freeText.xsd @@ -0,0 +1,122 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 03-17-2005 17:21:53 ====== Informative package (concepts are not implementable) - pragmatic approach for encoding + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/gmd.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/gmd.xsd new file mode 100644 index 000000000..5a5975a73 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/gmd.xsd @@ -0,0 +1,12 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/identification.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/identification.xsd new file mode 100644 index 000000000..852babb78 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/identification.xsd @@ -0,0 +1,348 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:05 ====== + + + + + + + + + + + + Basic information about data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Graphic that provides an illustration of the dataset (should include a legend for the graphic) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + See 19119 for further info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Brief description of ways in which the dataset is currently used. + + + + + + + + + + + + + + + + + + + + + + + + + + Keywords, their type and reference source + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Encapsulates the dataset aggregation information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + High-level geospatial data thematic classification to assist in the grouping and search of available geospatial datasets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/maintenance.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/maintenance.xsd new file mode 100644 index 000000000..7d1d9b13f --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/maintenance.xsd @@ -0,0 +1,86 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== Status of the dataset or progress of a review + + + + + + + + + + + Information about the scope and frequency of updating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description of the class of information covered by the information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataApplication.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataApplication.xsd new file mode 100644 index 000000000..d63ec419d --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataApplication.xsd @@ -0,0 +1,175 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:05 ====== + + + + + + + + + + Identifiable collection of datasets + + + + + + + + + + + + + + + + + + + + + + + + + + Identifiable collection of data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataEntity.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataEntity.xsd new file mode 100644 index 000000000..77c4a27d9 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataEntity.xsd @@ -0,0 +1,70 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:00 ====== + + + + + + + + + + + + + + + + + Information about the metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataExtension.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataExtension.xsd new file mode 100644 index 000000000..21202ecce --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/metadataExtension.xsd @@ -0,0 +1,99 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== Method used to represent geographic information in the dataset + + + + + + + + + + New metadata element, not found in ISO 19115, which is required to describe geographic data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information describing metadata extensions. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/portrayalCatalogue.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/portrayalCatalogue.xsd new file mode 100644 index 000000000..0b774c6d3 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/portrayalCatalogue.xsd @@ -0,0 +1,36 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== + + + + + + + + + + Information identifing the portrayal catalogue used + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/referenceSystem.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/referenceSystem.xsd new file mode 100644 index 000000000..bf3864bb8 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/referenceSystem.xsd @@ -0,0 +1,100 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description of the spatial and temporal reference systems used in the dataset + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmd/spatialRepresentation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmd/spatialRepresentation.xsd new file mode 100644 index 000000000..e67de3836 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmd/spatialRepresentation.xsd @@ -0,0 +1,237 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:02 ====== Frequency with which modifications and deletations are made to the data after it is first produced + + + + + + + + + + + Types and numbers of raster spatial objects in the dataset + + + + + + + + + + + + + + + + + + + + + + + + + + Information about the vector spatial objects in the dataset + + + + + + + + + + + + + + + + + + + + + + + + Digital mechanism used to represent spatial information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gmi/ReadMe.txt new file mode 100644 index 000000000..d6149d674 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/ReadMe.txt @@ -0,0 +1,18 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gmi from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas modified as follows : + +- spatialRepresentationInformation.xsd line3: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- spatialRepresentationInformation.xsd line11: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/acquisitionInformation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmi/acquisitionInformation.xsd new file mode 100644 index 000000000..92f532610 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/acquisitionInformation.xsd @@ -0,0 +1,373 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-04-2008 17:12:48 ====== + + + + + + + + + + + Description: Designations for the measuring instruments - FGDC: Platform_and_Instrument_Identification - shortName: PltfrmInstId + + + + + + + + + + + + + + + + + + + + + + + + + + Description: Designations for the operation used to acquire the dataset - shortName: MssnId + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: Designations for the platform used to acquire the dataset - shortName: PltfrmId + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: Designations for the measuring instruments and their bands, the platform carrying them, and the mission to which the data contributes - FGDC: Platform_and_Instrument_Identification, Mission_Information - shortName: PltfrmInstId + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: identification of a significant collection point within an operation - shortName: Event + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: requirement to be satisfied by the planned data acquisition - shortName: Requirement + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: identification of collection coverage - shortName: PlatformPass + + + + + + + + + + + + + + + + + + + + + + + + + Description: Describes the characteristics, spatial and temportal extent of the intended object to be observed - shortName: TargetId + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: Designations for the planning information related to meeting requirements - shortName: PlanId + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: range of date validity - shortName: ReqstDate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/contentInformation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmi/contentInformation.xsd new file mode 100644 index 000000000..27126a9ce --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/contentInformation.xsd @@ -0,0 +1,143 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-04-2008 17:12:47 ====== Name: Content - Position: 5 + + + + + + + + + + Description: extensions to electromagnetic spectrum wavelength description - shortName: BandExt + + + + + + + + + + + + + + + + + + + + + + + + + + Description: information about the content of a coverage, including the description of specific range elements - shortName: CCovDesc + + + + + + + + + + + + + + + + + + + + + + + Description: information about the content of an image, including the description of specific range elements - shortName: ICovDesc + + + + + + + + + + + + + + + + + + + + + + + Description: description of specific range elements - shortName: RgEltDesc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/dataQualityInformation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmi/dataQualityInformation.xsd new file mode 100644 index 000000000..61fe7e0d4 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/dataQualityInformation.xsd @@ -0,0 +1,211 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-04-2008 17:12:48 ====== Name: Lineage - Position: 2 + + + + + + + + + + + + + Description: Details of the methodology by which geographic information was derived from the instrument readings - FGDC: Algorithm_Information - shortName: Algorithm + + + + + + + + + + + + + + + + + + + + + + + + Description: Comprehensive information about the procedure(s), process(es) and algorithm(s) applied in the process step - shortName: Procsg + + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: information on source of data sets for processing step - shortName: SrcDataset + + + + + + + + + + + + + + + + + + + + + + + + Description: Information about an event or transformation in the life of the dataset including details of the algorithm and software used for processing - FGDC: - shortName: DetailProcStep + + + + + + + + + + + + + + + + + + + + + + + + + Description: Report of what occured during the process step - shortName: ProcStepRep + + + + + + + + + + + + + + + + + + + + + + + + + Description: Result of a data quality measure organising the measured values as a coverage - shortName: CoverageResult + + + + + + + + + + + + + + + + + + + + + + + + + + + Description: to: degree of adherence of a dataset to a specific set of user requirements - shortName: Usability + + + + + + + + + + + + + + + + + + + Description: Distance between adjacent pixels - shortName: nomRes + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/gmi.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmi/gmi.xsd new file mode 100644 index 000000000..3c346546c --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/gmi.xsd @@ -0,0 +1,20 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-04-2008 17:12:49 ====== + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/metadataEntitySet.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmi/metadataEntitySet.xsd new file mode 100644 index 000000000..e7cf704a9 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/metadataEntitySet.xsd @@ -0,0 +1,40 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-04-2008 17:12:49 ====== + + + + + + + + + + + Description: Root entity that defines information about imagery or gridded data - shortName: IMetadata + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmi/spatialRepresentationInformation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmi/spatialRepresentationInformation.xsd new file mode 100644 index 000000000..090cdec3e --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmi/spatialRepresentationInformation.xsd @@ -0,0 +1,135 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-04-2008 17:12:47 ====== Name: SpatialRepresentation - Position: 3 + + + + + + + + + + + + Description: Description of information provided in metadata that allows the geographic or map location raster points to be located - FGDC: Georeferencing_Description - shortName: IGeoref + + + + + + + + + + + + + + + + + + + + + + + + Description: extends georectified grid description to include associated checkpoints - shortName: IGeorect + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gml/ReadMe.txt new file mode 100644 index 000000000..360c2cbe2 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/ReadMe.txt @@ -0,0 +1,22 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gml from the OGC published GML 3.2.1 schemas from OGC 07-036 (schemas repository http://schemas.opengis.net/) modified as follows : + +- gmlBase.xsd line14: +schemaLocation="../../xlink/1.0.0/xlinks.xsd" +replaced by +schemaLocation="../xlink/xlinks.xsd" + +- referenceSystems.xsd line12: +schemaLocation="../../iso/19139/20070417/gmd/gmd.xsd" +replaced by +schemaLocation="../gmd/gmd.xsd" + +- coordinateOperations.xsd line16: +schemaLocation="../../iso/19139/20070417/gmd/gmd.xsd" +replaced by +schemaLocation="../gmd/gmd.xsd" \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/SchematronConstraints.xml b/wpsg-xml/src/main/schemas/ISO_19139/gml/SchematronConstraints.xml new file mode 100644 index 000000000..6cfd40f19 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/SchematronConstraints.xml @@ -0,0 +1,71 @@ + + Schematron constraints for GML / ISO 19136 + + + + + + ValueArray may not carry both a reference to a codeSpace and a uom + + + + + All components shall be of the same type + All components shall be of the same type + + + + + The presence of a dimension attribute implies the presence of the srsName attribute. + The presence of an axisLabels attribute implies the presence of the srsName attribute. + The presence of an uomLabels attribute implies the presence of the srsName attribute. + The presence of an uomLabels attribute implies the presence of the axisLabels attribute and vice versa. + + + + + All patches shall be gml:PolygonPatch elements or an element in the substitution group of gml:PolygonPatch. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + All patches shall be gml:Triangle elements or an element in the substitution group of gml:PolygonPatch. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + Property element may not carry both a reference to an object and contain an object. + Property element shall either carry a reference to an object or contain an object. + + + + + All values in the domain set shall be gml:MultiPoint elements or an element in its substitution group. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + All values in the domain set shall be gml:MultiCurve elements or an element in its substitution group. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + All values in the domain set shall be gml:MultiSurface elements or an element in its substitution group. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + All values in the domain set shall be gml:MultiSolid elements or an element in its substitution group. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + All values in the domain set shall be gml:Grid elements or an element in its substitution group. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + + + All values in the domain set shall be gml:RectifiedGrid elements or an element in its substitution group. Note that the test currently does not identify substitutable elements correctly, this will require the use of XPath 2 in the future. + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/basicTypes.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/basicTypes.xsd new file mode 100644 index 000000000..626539ade --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/basicTypes.xsd @@ -0,0 +1,262 @@ + + + + basicTypes.xsd + See ISO/DIS 19136 8.2. +W3C XML Schema provides a set of built-in "simple" types which define methods for representing values as literals without internal markup. These are described in W3C XML Schema Part 2:2001. Because GML is an XML encoding in which instances are described using XML Schema, these simple types shall be used as far as possible and practical for the representation of data types. W3C XML Schema also provides methods for defining +- new simple types by restriction and combination of the built-in types, and +- complex types, with simple content, but which also have XML attributes. +In many places where a suitable built-in simple type is not available, simple content types derived using the XML Schema mechanisms are used for the representation of data types in GML. +A set of these simple content types that are required by several GML components are defined in the basicTypes schema, as well as some elements based on them. These are primarily based around components needed to record amounts, counts, flags and terms, together with support for exceptions or null values. + + + + gml:NilReasonType defines a content model that allows recording of an explanation for a void value or other exception. +gml:NilReasonType is a union of the following enumerated values: +- inapplicable there is no value +- missing the correct value is not readily available to the sender of this data. Furthermore, a correct value may not exist +- template the value will be available later +- unknown the correct value is not known to, and not computable by, the sender of this data. However, a correct value probably exists +- withheld the value is not divulged +- other:text other brief explanation, where text is a string of two or more characters with no included spaces +and +- anyURI which should refer to a resource which describes the reason for the exception +A particular community may choose to assign more detailed semantics to the standard values provided. Alternatively, the URI method enables a specific or more complete explanation for the absence of a value to be provided elsewhere and indicated by-reference in an instance document. +gml:NilReasonType is used as a member of a union in a number of simple content types where it is necessary to permit a value from the NilReasonType union as an alternative to the primary type. + + + + + + + + + + + + + + + + + + + + + + + + gml:SignType is a convenience type with values "+" (plus) and "-" (minus). + + + + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value. + + + + + + Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value. + + + + + + gml:CodeType is a generalized type to be used for a term, keyword or name. +It adds a XML attribute codeSpace to a term, where the value of the codeSpace attribute (if present) shall indicate a dictionary, thesaurus, classification scheme, authority, or pattern for the term. + + + + + + + + + + gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance. + + + + + + + + + + gml:MeasureType supports recording an amount encoded as a value of XML Schema double, together with a units of measure indicated by an attribute uom, short for "units Of measure". The value of the uom attribute identifies a reference system for the amount, usually a ratio or interval scale. + + + + + + + + + + The simple type gml:UomIdentifer defines the syntax and value space of the unit of measure identifier. + + + + + + This type specifies a character string of length at least one, and restricted such that it must not contain any of the following characters: ":" (colon), " " (space), (newline), (carriage return), (tab). This allows values corresponding to familiar abbreviations, such as "kg", "m/s", etc. +It is recommended that the symbol be an identifier for a unit of measure as specified in the "Unified Code of Units of Measure" (UCUM) (http://aurora.regenstrief.org/UCUM). This provides a set of symbols and a grammar for constructing identifiers for units of measure that are unique, and may be easily entered with a keyboard supporting the limited character set known as 7-bit ASCII. ISO 2955 formerly provided a specification with this scope, but was withdrawn in 2001. UCUM largely follows ISO 2955 with modifications to remove ambiguities and other problems. + + + + + + + + This type specifies a URI, restricted such that it must start with one of the following sequences: "#", "./", "../", or a string of characters followed by a ":". These patterns ensure that the most common URI forms are supported, including absolute and relative URIs and URIs that are simple fragment identifiers, but prohibits certain forms of relative URI that could be mistaken for unit of measure symbol . +NOTE It is possible to re-write such a relative URI to conform to the restriction (e.g. "./m/s"). +In an instance document, on elements of type gml:MeasureType the mandatory uom attribute shall carry a value corresponding to either +- a conventional unit of measure symbol, +- a link to a definition of a unit of measure that does not have a conventional symbol, or when it is desired to indicate a precise or variant definition. + + + + + + + + This type is deprecated for tuples with ordinate values that are numbers. +CoordinatesType is a text string, intended to be used to record an array of tuples or coordinates. +While it is not possible to enforce the internal structure of the string through schema validation, some optional attributes have been provided in previous versions of GML to support a description of the internal structure. These attributes are deprecated. The attributes were intended to be used as follows: +Decimal symbol used for a decimal point (default="." a stop or period) +cs symbol used to separate components within a tuple or coordinate string (default="," a comma) +ts symbol used to separate tuples or coordinate strings (default=" " a space) +Since it is based on the XML Schema string type, CoordinatesType may be used in the construction of tables of tuples or arrays of tuples, including ones that contain mixed text and numeric values. + + + + + + + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + A type for a list of values of the respective simple type. + + + + + + gml:CodeListType provides for lists of terms. The values in an instance element shall all be valid according to the rules of the dictionary, classification scheme, or authority identified by the value of its codeSpace attribute. + + + + + + + + + + gml:CodeOrNilReasonListType provides for lists of terms. The values in an instance element shall all be valid according to the rules of the dictionary, classification scheme, or authority identified by the value of its codeSpace attribute. An instance element may also include embedded values from NilReasonType. It is intended to be used in situations where a term or classification is expected, but the value may be absent for some reason. + + + + + + + + + + gml:MeasureListType provides for a list of quantities. + + + + + + + + + + gml:MeasureOrNilReasonListType provides for a list of quantities. An instance element may also include embedded values from NilReasonType. It is intended to be used in situations where a value is expected, but the value may be absent for some reason. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateOperations.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateOperations.xsd new file mode 100644 index 000000000..f2ec5a93e --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateOperations.xsd @@ -0,0 +1,519 @@ + + + + coordinateOperations.xsd + See ISO/DIS 19136 13.6. +The spatial or temporal coordinate operations schema components can be divided into five logical parts, which define elements and types for XML encoding of the definitions of: +- Multiple abstract coordinate operations +- Multiple concrete types of coordinate operations, including Transformations and Conversions +- Abstract and concrete parameter values and groups +- Operation methods +- Abstract and concrete operation parameters and groups +These schema component encodes the Coordinate Operation package of the UML Model for ISO 19111 Clause 11. + + + + + + + gml:AbstractCoordinateOperation is a mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. Many but not all coordinate operations (from CRS A to CRS B) also uniquely define the inverse operation (from CRS B to CRS A). In some cases, the operation method algorithm for the inverse operation is the same as for the forward algorithm, but the signs of some operation parameter values shall be reversed. In other cases, different algorithms are required for the forward and inverse operations, but the same operation parameter values are used. If (some) entirely different parameter values are needed, a different coordinate operation shall be defined. +The optional coordinateOperationAccuracy property elements provide estimates of the impact of this coordinate operation on point position accuracy. + + + + + + + + + + + + + + + + + + + gml:operationVersion is the version of the coordinate transformation (i.e., instantiation due to the stochastic nature of the parameters). Mandatory when describing a transformation, and should not be supplied for a conversion. + + + + + gml:coordinateOperationAccuracy is an association role to a DQ_PositionalAccuracy object as encoded in ISO/TS 19139, either referencing or containing the definition of that positional accuracy. That object contains an estimate of the impact of this coordinate operation on point accuracy. That is, it gives position error estimates for the target coordinates of this coordinate operation, assuming no errors in the source coordinates. + + + + + + + + + + + gml:sourceCRS is an association role to the source CRS (coordinate reference system) of this coordinate operation. + + + + + gml:targetCRS is an association role to the target CRS (coordinate reference system) of this coordinate operation. + + + + + gml:CoordinateOperationPropertyType is a property type for association roles to a coordinate operation, either referencing or containing the definition of that coordinate operation. + + + + + + + + + gml:AbstractSingleOperation is a single (not concatenated) coordinate operation. + + + + + gml:SingleOperationPropertyType is a property type for association roles to a single operation, either referencing or containing the definition of that single operation. + + + + + + + + + gm:AbstractGeneralConversion is an abstract operation on coordinates that does not include any change of datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters. The operationVersion, sourceCRS, and targetCRS elements are omitted in a coordinate conversion. +This abstract complex type is expected to be extended for well-known operation methods with many Conversion instances, in GML Application Schemas that define operation-method-specialized element names and contents. This conversion uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to include a "usesMethod" element that references the "OperationMethod" element. Similarly, all concrete types derived from this type shall extend this type to include zero or more elements each named "uses...Value" that each use the type of an element substitutable for the "AbstractGeneralParameterValue" element. + + + + + + + + + + + + + + + + + + + + + + + gml:GeneralConversionPropertyType is a property type for association roles to a general conversion, either referencing or containing the definition of that conversion. + + + + + + + + + gml:AbstractGeneralTransformation is an abstract operation on coordinates that usually includes a change of Datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result in multiple (different) versions of the same coordinate transformation. The operationVersion, sourceCRS, and targetCRS proeprty elements are mandatory in a coordinate transformation. +This abstract complex type is expected to be extended for well-known operation methods with many Transformation instances, in Application Schemas that define operation-method-specialized value element names and contents. This transformation uses an operation method with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to include a "usesMethod" element that references one "OperationMethod" element. Similarly, all concrete types derived from this type shall extend this type to include one or more elements each named "uses...Value" that each use the type of an element substitutable for the "AbstractGeneralParameterValue" element. + + + + + + + + + + + + + + + + + + + + + + + + + + gml:GeneralTransformationPropertyType is a property type for association roles to a general transformation, either referencing or containing the definition of that transformation. + + + + + + + + + + gml:ConcatenatedOperation is an ordered sequence of two or more coordinate operations. This sequence of operations is constrained by the requirement that the source coordinate reference system of step (n+1) must be the same as the target coordinate reference system of step (n). The source coordinate reference system of the first step and the target coordinate reference system of the last step are the source and target coordinate reference system associated with the concatenated operation. Instead of a forward operation, an inverse operation may be used for one or more of the operation steps mentioned above, if the inverse operation is uniquely defined by the forward operation. +The gml:coordOperation property elements are an ordered sequence of associations to the two or more operations used by this concatenated operation. The AggregationAttributeGroup should be used to specify that the coordOperation associations are ordered. + + + + + + + + + + + + + gml:coordOperation is an association role to a coordinate operation. + + + + + gml:ConcatenatedOperationPropertyType is a property type for association roles to a concatenated operation, either referencing or containing the definition of that concatenated operation. + + + + + + + + + gml:PassThroughOperation is a pass-through operation specifies that a subset of a coordinate tuple is subject to a specific coordinate operation. +The modifiedCoordinate property elements are an ordered sequence of positive integers defining the positions in a coordinate tuple of the coordinates affected by this pass-through operation. The AggregationAttributeGroup should be used to specify that the modifiedCoordinate elements are ordered. + + + + + + + + + + + + + + + + gml:modifiedCoordinate is a positive integer defining a position in a coordinate tuple. + + + + + gml:PassThroughOperationPropertyType is a property type for association roles to a pass through operation, either referencing or containing the definition of that pass through operation. + + + + + + + + + gml:Conversion is a concrete operation on coordinates that does not include any change of Datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters. +This concrete complex type can be used without using a GML Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Conversion instance. +The usesValue property elements are an unordered list of composition associations to the set of parameter values used by this conversion operation. + + + + + + + + + + + + + + + gml:method is an association role to the operation method used by a coordinate operation. + + + + + gml:parameterValue is a composition association to a parameter value or group of parameter values used by a coordinate operation. + + + + + gml:ConversionPropertyType is a property type for association roles to a concrete general-purpose conversion, either referencing or containing the definition of that conversion. + + + + + + + + + gml:Transformation is a concrete object element derived from gml:GeneralTransformation (13.6.2.13). +This concrete object can be used for all operation methods, without using a GML Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Transformation instance. +The parameterValue elements are an unordered list of composition associations to the set of parameter values used by this conversion operation. + + + + + + + + + + + + + + + gml:TransformationPropertyType is a property type for association roles to a transformation, either referencing or containing the definition of that transformation. + + + + + + + + + gml:AbstractGeneralParameterValue is an abstract parameter value or group of parameter values. +This abstract complexType is expected to be extended and restricted for well-known operation methods with many instances, in Application Schemas that define operation-method-specialized element names and contents. Specific parameter value elements are directly contained in concrete subtypes, not in this abstract type. All concrete types derived from this type shall extend this type to include one "...Value" element with an appropriate type, which should be one of the element types allowed in the ParameterValueType. In addition, all derived concrete types shall extend this type to include a "operationParameter" property element that references one element substitutable for the "OperationParameter" object element. + + + + + + + + gml:AbstractGeneralParameterValuePropertyType is a property type for inline association roles to a parameter value or group of parameter values, always containing the values. + + + + + + + + gml:ParameterValue is a parameter value, an ordered sequence of values, or a reference to a file of parameter values. This concrete complex type may be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one instance. This complex type may be used, extended, or restricted for well-known operation methods, especially for methods with many instances. + + + + + + + + + + + + + + + + + + + + + + + + gml:value is a numeric value of an operation parameter, with its associated unit of measure. + + + + + gml:stringValue is a character string value of an operation parameter. A string value does not have an associated unit of measure. + + + + + gml:integerValue is a positive integer value of an operation parameter, usually used for a count. An integer value does not have an associated unit of measure. + + + + + gml:booleanValue is a boolean value of an operation parameter. A Boolean value does not have an associated unit of measure. + + + + + gml:valueList is an ordered sequence of two or more numeric values of an operation parameter list, where each value has the same associated unit of measure. An element of this type contains a space-separated sequence of double values. + + + + + gml:integerValueList is an ordered sequence of two or more integer values of an operation parameter list, usually used for counts. These integer values do not have an associated unit of measure. An element of this type contains a space-separated sequence of integer values. + + + + + gml:valueFile is a reference to a file or a part of a file containing one or more parameter values, each numeric value with its associated unit of measure. When referencing a part of a file, that file shall contain multiple identified parts, such as an XML encoded document. Furthermore, the referenced file or part of a file may reference another part of the same or different files, as allowed in XML documents. + + + + + gml:operationParameter is an association role to the operation parameter of which this is a value. + + + + + gml:ParameterValueGroup is a group of related parameter values. The same group can be repeated more than once in a Conversion, Transformation, or higher level ParameterValueGroup, if those instances contain different values of one or more parameterValues which suitably distinquish among those groups. This concrete complex type can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents. This complex type may be used, extended, or restricted for well-known operation methods, especially for methods with only one instance. +The parameterValue elements are an unordered set of composition association roles to the parameter values and groups of values included in this group. + + + + + + + + + + + + + + + gml:group is an association role to the operation parameter group for which this element provides parameter values. + + + + + gml:OperationMethod is a method (algorithm or procedure) used to perform a coordinate operation. Most operation methods use a number of operation parameters, although some coordinate conversions use none. Each coordinate operation using the method assigns values to these parameters. +The parameter elements are an unordered list of associations to the set of operation parameters and parameter groups used by this operation method. + + + + + + + + + + + + + + + + + + + + gml:formulaCitation provides a reference to a publication giving the formula(s) or procedure used by an coordinate operation method. + + + + + + + + + + + gml:formula Formula(s) or procedure used by an operation method. The use of the codespace attribite has been deprecated. The property value shall be a character string. + + + + + gml:sourceDimensions is the number of dimensions in the source CRS of this operation method. + + + + + gml:targetDimensions is the number of dimensions in the target CRS of this operation method. + + + + + gml:parameter is an association to an operation parameter or parameter group. + + + + + gml:OperationMethodPropertyType is a property type for association roles to a concrete general-purpose operation method, either referencing or containing the definition of that method. + + + + + + + + + gml:GeneralOperationParameter is the abstract definition of a parameter or group of parameters used by an operation method. + + + + + + + + + + + + + + gml:minimumOccurs is the minimum number of times that values for this parameter group or parameter are required. If this attribute is omitted, the minimum number shall be one. + + + + + gml:AbstractGeneralOperationParameterPropertyType is a property type for association roles to an operation parameter or group, either referencing or containing the definition of that parameter or group. + + + + + + + + + gml:OperationParameter is the definition of a parameter used by an operation method. Most parameter values are numeric, but other types of parameter values are possible. This complex type is expected to be used or extended for all operation methods, without defining operation-method-specialized element names. + + + + + + + + + + + + gml:OperationParameterPropertyType is a property type for association roles to an operation parameter, either referencing or containing the definition of that parameter. + + + + + + + + + gml:OperationParameterGroup is the definition of a group of parameters used by an operation method. This complex type is expected to be used or extended for all applicable operation methods, without defining operation-method-specialized element names. +The generalOperationParameter elements are an unordered list of associations to the set of operation parameters that are members of this group. + + + + + + + + + + + + + + + gml:maximumOccurs is the maximum number of times that values for this parameter group may be included. If this attribute is omitted, the maximum number shall be one. + + + + + gml:OperationParameterPropertyType is a property type for association roles to an operation parameter group, either referencing or containing the definition of that parameter group. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateReferenceSystems.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateReferenceSystems.xsd new file mode 100644 index 000000000..8832344e2 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateReferenceSystems.xsd @@ -0,0 +1,367 @@ + + + + coordinateReferenceSystems.xsd + See ISO/DIS 19136 13.3. +The spatial-temporal coordinate reference systems schema components are divided into two logical parts. One part defines elements and types for XML encoding of abstract coordinate reference systems definitions. The larger part defines specialized constructs for XML encoding of definitions of the multiple concrete types of spatial-temporal coordinate reference systems. +These schema components encode the Coordinate Reference System packages of the UML Models of ISO 19111 Clause 8 and ISO/DIS 19136 D.3.10, with the exception of the abstract "SC_CRS" class. + + + + + + + gml:AbstractSingleCRS implements a coordinate reference system consisting of one coordinate system and one datum (as opposed to a Compound CRS). + + + + + gml:SingleCRSPropertyType is a property type for association roles to a single coordinate reference system, either referencing or containing the definition of that coordinate reference system. + + + + + + + + + gml:AbstractGeneralDerivedCRS is a coordinate reference system that is defined by its coordinate conversion from another coordinate reference system. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document. + + + + + + + + + + + + + + gml:conversion is an association role to the coordinate conversion used to define the derived CRS. + + + + + gml:CompundCRS is a coordinate reference system describing the position of points through two or more independent coordinate reference systems. It is associated with a non-repeating sequence of two or more instances of SingleCRS. + + + + + + + + + + + + + + + The gml:componentReferenceSystem elements are an ordered sequence of associations to all the component coordinate reference systems included in this compound coordinate reference system. The gml:AggregationAttributeGroup should be used to specify that the gml:componentReferenceSystem properties are ordered. + + + + + gml:CompoundCRSPropertyType is a property type for association roles to a compound coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + + gml:GeodeticCRS is a coordinate reference system based on a geodetic datum. + + + + + + + + + + + + + + + + + gml:ellipsoidalCS is an association role to the ellipsoidal coordinate system used by this CRS. + + + + + gml:cartesianCS is an association role to the Cartesian coordinate system used by this CRS. + + + + + gml:sphericalCS is an association role to the spherical coordinate system used by this CRS. + + + + + gml:geodeticDatum is an association role to the geodetic datum used by this CRS. + + + + + + gml:GeodeticCRSPropertyType is a property type for association roles to a geodetic coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + gml:VerticalCRS is a 1D coordinate reference system used for recording heights or depths. Vertical CRSs make use of the direction of gravity to define the concept of height or depth, but the relationship with gravity may not be straightforward. By implication, ellipsoidal heights (h) cannot be captured in a vertical coordinate reference system. Ellipsoidal heights cannot exist independently, but only as an inseparable part of a 3D coordinate tuple defined in a geographic 3D coordinate reference system. + + + + + + + + + + + + + + + gml:verticalCS is an association role to the vertical coordinate system used by this CRS. + + + + + gml:verticalDatum is an association role to the vertical datum used by this CRS. + + + + + gml:VerticalCRSPropertyType is a property type for association roles to a vertical coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + gml:ProjectedCRS is a 2D coordinate reference system used to approximate the shape of the earth on a planar surface, but in such a way that the distortion that is inherent to the approximation is carefully controlled and known. Distortion correction is commonly applied to calculated bearings and distances to produce values that are a close match to actual field values. + + + + + + + + + + + + + + + + + + gml:baseGeodeticCRS is an association role to the geodetic coordinate reference system used by this projected CRS. + + + + + gml:ProjectedCRSPropertyType is a property type for association roles to a projected coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + gml:DerivedCRS is a single coordinate reference system that is defined by its coordinate conversion from another single coordinate reference system known as the base CRS. The base CRS can be a projected coordinate reference system, if this DerivedCRS is used for a georectified grid coverage as described in ISO 19123, Clause 8. + + + + + + + + + + + + + + + + gml:baseCRS is an association role to the coordinate reference system used by this derived CRS. + + + + + The gml:derivedCRSType property describes the type of a derived coordinate reference system. The required codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property. + + + + + An association role to the coordinate system used by this CRS. + + + + + gml:DerivedCRSPropertyType is a property type for association roles to a non-projected derived coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + gml:EngineeringCRS is a contextually local coordinate reference system which can be divided into two broad categories: +- earth-fixed systems applied to engineering activities on or near the surface of the earth; +- CRSs on moving platforms such as road vehicles, vessels, aircraft, or spacecraft, see ISO 19111 8.3. + + + + + + + + + + + + + + + + + deprecated + + + + + + + + + + + gml:cylindricalCS is an association role to the cylindrical coordinate system used by this CRS. + + + + + gml:linearCS is an association role to the linear coordinate system used by this CRS. + + + + + gml:polarCS is an association role to the polar coordinate system used by this CRS. + + + + + gml:userDefinedCS is an association role to the user defined coordinate system used by this CRS. + + + + + gml:engineeringDatum is an association role to the engineering datum used by this CRS. + + + + + gml:EngineeringCRSPropertyType is a property type for association roles to an engineering coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + gml:ImageCRS is an engineering coordinate reference system applied to locations in images. Image coordinate reference systems are treated as a separate sub-type because the definition of the associated image datum contains two attributes not relevant to other engineering datums. + + + + + + + + + + + + + + + + + + + gml:affineCS is an association role to the affine coordinate system used by this CRS. + + + + + gml:imageDatum is an association role to the image datum used by this CRS. + + + + + gml:ImageCRSPropertyType is a property type for association roles to an image coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + + + gml:TemporalCRS is a 1D coordinate reference system used for the recording of time. + + + + + + + + + + + + + + + + + + gml:timeCS is an association role to the time coordinate system used by this CRS. + + + + + gml:temporalDatum is an association role to the temporal datum used by this CRS. + + + + + gml:TemporalCRSPropertyType is a property type for association roles to a temporal coordinate reference system, either referencing or containing the definition of that reference system. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateSystems.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateSystems.xsd new file mode 100644 index 000000000..ced6368c9 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/coordinateSystems.xsd @@ -0,0 +1,291 @@ + + + + coordinateSystems.xsd + See ISO/DIS 19136 13.4. +The coordinate systems schema components can be divded into three logical parts, which define elements and types for XML encoding of the definitions of: +- Coordinate system axes +- Abstract coordinate system +- Multiple concrete types of spatial-temporal coordinate systems +These schema components encode the Coordinate System packages of the UML Models of ISO 19111 Clause 9 and ISO/DIS 19136 D.3.10. + + + + + gml:CoordinateSystemAxis is a definition of a coordinate system axis. + + + + + + + + + + + + + + + The uom attribute provides an identifier of the unit of measure used for this coordinate system axis. The value of this coordinate in a coordinate tuple shall be recorded using this unit of measure, whenever those coordinates use a coordinate reference system that uses a coordinate system that uses this axis. + + + + + + + + gml:axisAbbrev is the abbreviation used for this coordinate system axis; this abbreviation is also used to identify the coordinates in the coordinate tuple. The codeSpace attribute may reference a source of more information on a set of standardized abbreviations, or on this abbreviation. + + + + + gml:axisDirection is the direction of this coordinate system axis (or in the case of Cartesian projected coordinates, the direction of this coordinate system axis at the origin). +Within any set of coordinate system axes, only one of each pair of terms may be used. For earth-fixed CRSs, this direction is often approximate and intended to provide a human interpretable meaning to the axis. When a geodetic datum is used, the precise directions of the axes may therefore vary slightly from this approximate direction. +The codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property. + + + + + The gml:minimumValue and gml:maximumValue properties allow the specification of minimum and maximum value normally allowed for this axis, in the unit of measure for the axis. For a continuous angular axis such as longitude, the values wrap-around at this value. Also, values beyond this minimum/maximum can be used for specified purposes, such as in a bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a value of plus infiniy for the gml:maximumValue element. If these elements are omitted, the value is unspecified. + + + + + The gml:minimumValue and gml:maximumValue properties allow the specification of minimum and maximum value normally allowed for this axis, in the unit of measure for the axis. For a continuous angular axis such as longitude, the values wrap-around at this value. Also, values beyond this minimum/maximum can be used for specified purposes, such as in a bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a value of plus infiniy for the gml:maximumValue element. If these elements are omitted, the value is unspecified. + + + + + gml:rangeMeaning describes the meaning of axis value range specified by gml:minimumValue and gml:maximumValue. This element shall be omitted when both gml:minimumValue and gml:maximumValue are omitted. This element should be included when gml:minimumValue and/or gml:maximumValue are included. If this element is omitted when the gml:minimumValue and/or gml:maximumValue are included, the meaning is unspecified. The codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property. + + + + + gml:CoordinateSystemAxisPropertyType is a property type for association roles to a coordinate system axis, either referencing or containing the definition of that axis. + + + + + + + + + gml:AbstractCoordinateSystem is a coordinate system (CS) is the non-repeating sequence of coordinate system axes that spans a given coordinate space. A CS is derived from a set of mathematical rules for specifying how coordinates in a given space are to be assigned to points. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded. This abstract complex type shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document. + + + + + + + + + + + + + + + The gml:axis property is an association role (ordered sequence) to the coordinate system axes included in this coordinate system. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded, whenever those coordinates use a coordinate reference system that uses this coordinate system. The gml:AggregationAttributeGroup should be used to specify that the axis objects are ordered. + + + + + gml:CoordinateSystemPropertyType is a property type for association roles to a coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:EllipsoidalCS is a two- or three-dimensional coordinate system in which position is specified by geodetic latitude, geodetic longitude, and (in the three-dimensional case) ellipsoidal height. An EllipsoidalCS shall have two or three gml:axis property elements; the number of associations shall equal the dimension of the CS. + + + + + + + + + + gml:EllipsoidalCSPropertyType is a property type for association roles to an ellipsoidal coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:CartesianCS is a 1-, 2-, or 3-dimensional coordinate system. In the 1-dimensional case, it contains a single straight coordinate axis. In the 2- and 3-dimensional cases gives the position of points relative to orthogonal straight axes. In the multi-dimensional case, all axes shall have the same length unit of measure. A CartesianCS shall have one, two, or three gml:axis property elements. + + + + + + + + + + gml:CartesianCSPropertyType is a property type for association roles to a Cartesian coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:VerticalCS is a one-dimensional coordinate system used to record the heights or depths of points. Such a coordinate system is usually dependent on the Earth's gravity field, perhaps loosely as when atmospheric pressure is the basis for the vertical coordinate system axis. A VerticalCS shall have one gml:axis property element. + + + + + + + + + + gml:VerticalCSPropertyType is a property type for association roles to a vertical coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:TimeCS is a one-dimensional coordinate system containing a time axis, used to describe the temporal position of a point in the specified time units from a specified time origin. A TimeCS shall have one gml:axis property element. + + + + + + + + + + gml:TimeCSPropertyType is a property type for association roles to a time coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:LinearCS is a one-dimensional coordinate system that consists of the points that lie on the single axis described. The associated coordinate is the distance – with or without offset – from the specified datum to the point along the axis. A LinearCS shall have one gml:axis property element. + + + + + + + + + + gml:LinearCSPropertyType is a property type for association roles to a linear coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:UserDefinedCS is a two- or three-dimensional coordinate system that consists of any combination of coordinate axes not covered by any other coordinate system type. A UserDefinedCS shall have two or three gml:axis property elements; the number of property elements shall equal the dimension of the CS. + + + + + + + + + + gml:UserDefinedCSPropertyType is a property type for association roles to a user-defined coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:SphericalCS is a three-dimensional coordinate system with one distance measured from the origin and two angular coordinates. A SphericalCS shall have three gml:axis property elements. + + + + + + + + + + gml:SphericalCSPropertyType is property type for association roles to a spherical coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:PolarCS ia s two-dimensional coordinate system in which position is specified by the distance from the origin and the angle between the line from the origin to a point and a reference direction. A PolarCS shall have two gml:axis property elements. + + + + + + + + + + gml:PolarCSPropertyType is a property type for association roles to a polar coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:CylindricalCS is a three-dimensional coordinate system consisting of a polar coordinate system extended by a straight coordinate axis perpendicular to the plane spanned by the polar coordinate system. A CylindricalCS shall have three gml:axis property elements. + + + + + + + + + + gml:CylindricalCSPropertyType is a property type for association roles to a cylindrical coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + + + gml:AffineCS is a two- or three-dimensional coordinate system with straight axes that are not necessarily orthogonal. An AffineCS shall have two or three gml:axis property elements; the number of property elements shall equal the dimension of the CS. + + + + + + + + + + gml:AffineCSPropertyType is a property type for association roles to an affine coordinate system, either referencing or containing the definition of that coordinate system. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/coverage.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/coverage.xsd new file mode 100644 index 000000000..9b81c7d13 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/coverage.xsd @@ -0,0 +1,287 @@ + + + + coverage.xsd + See ISO/DIS 19136 20.3. +A coverage incorporates a mapping from a spatiotemporal domain to a range set, the latter providing the set in which the attribute values live. The range set may be an arbitrary set including discrete lists, integer or floating point ranges, and multi-dimensional vector spaces. +A coverage can be viewed as the graph of the coverage function f:A à B, that is as the set of ordered pairs {(x, f(x)) | where x is in A}. This view is especially applicable to the GML encoding of a coverage. In the case of a discrete coverage, the domain set A is partitioned into a collection of subsets (typically a disjoint collection) A = UAi and the function f is constant on each Ai. For a spatial domain, the Ai are geometry elements, hence the coverage can be viewed as a collection of (geometry,value) pairs, where the value is an element of the range set. If the spatial domain A is a topological space then the coverage can be viewed as a collection of (topology,value) pairs, where the topology element in the pair is a topological n-chain (in GML terms this is a gml:TopoPoint, gml:TopoCurve, gml:TopoSurface or gml:TopoSolid). +A coverage is implemented as a GML feature. We can thus speak of a "temperature distribution feature", or a "remotely sensed image feature", or a "soil distribution feature". +As is the case for any GML object, a coverage object may also be the value of a property of a feature. + + + + + + + + + The base type for coverages is gml:AbstractCoverageType. The basic elements of a coverage can be seen in this content model: the coverage contains gml:domainSet and gml:rangeSet properties. The gml:domainSet property describes the domain of the coverage and the gml:rangeSet property describes the range of the coverage. + + + + + + + + + + + + + This element serves as the head of a substitution group which may contain any coverage whose type is derived from gml:AbstractCoverageType. It may act as a variable in the definition of content models where it is required to permit any coverage to be valid. + + + + + + + + + + + + + + A discrete coverage consists of a domain set, range set and optionally a coverage function. The domain set consists of either spatial or temporal geometry objects, finite in number. The range set is comprised of a finite number of attribute values each of which is associated to every direct position within any single spatiotemporal object in the domain. In other words, the range values are constant on each spatiotemporal object in the domain. This coverage function maps each element from the coverage domain to an element in its range. The coverageFunction element describes the mapping function. +This element serves as the head of a substitution group which may contain any discrete coverage whose type is derived from gml:DiscreteCoverageType. + + + + + + + + + + + + + + A continuous coverage as defined in ISO 19123 is a coverage that can return different values for the same feature attribute at different direct positions within a single spatiotemporal object in its spatiotemporal domain. The base type for continuous coverages is AbstractContinuousCoverageType. +The coverageFunction element describes the mapping function. +The abstract element gml:AbstractContinuousCoverage serves as the head of a substitution group which may contain any continuous coverage whose type is derived from gml:AbstractContinuousCoverageType. + + + + + The gml:domainSet property element describes the spatio-temporal region of interest, within which the coverage is defined. Its content model is given by gml:DomainSetType. +The value of the domain is thus a choice between a gml:AbstractGeometry and a gml:AbstractTimeObject. In the instance these abstract elements will normally be substituted by a geometry complex or temporal complex, to represent spatial coverages and time-series, respectively. +The presence of the gml:AssociationAttributeGroup means that domainSet follows the usual GML property model and may use the xlink:href attribute to point to the domain, as an alternative to describing the domain inline. Ownership semantics may be provided using the gml:OwnershipAttributeGroup. + + + + + + + + + + + + + + + + The gml:rangeSet property element contains the values of the coverage (sometimes called the attribute values). Its content model is given by gml:RangeSetType. +This content model supports a structural description of the range. The semantic information describing the range set is embedded using a uniform method, as part of the explicit values, or as a template value accompanying the representation using gml:DataBlock and gml:File. +The values from each component (or "band") in the range may be encoded within a gml:ValueArray element or a concrete member of the gml:AbstractScalarValueList substitution group . Use of these elements satisfies the value-type homogeneity requirement. + + + + + + + + + + + + + gml:DataBlock describes the Range as a block of text encoded values similar to a Common Separated Value (CSV) representation. +The range set parameterization is described by the property gml:rangeParameters. + + + + + + + + + + + + + + + gml:CoordinatesType consists of a list of coordinate tuples, with each coordinate tuple separated by the ts or tuple separator (whitespace), and each coordinate in the tuple by the cs or coordinate separator (comma). +The gml:tupleList encoding is effectively "band-interleaved". + + + + + gml:doubleOrNilReasonList consists of a list of gml:doubleOrNilReason values, each separated by a whitespace. The gml:doubleOrNilReason values are grouped into tuples where the dimension of each tuple in the list is equal to the number of range parameters. + + + + + for efficiency reasons, GML also provides a means of encoding the range set in an arbitrary external encoding, such as a binary file. This encoding may be "well-known" but this is not required. This mode uses the gml:File element. +The values of the coverage (attribute values in the range set) are transmitted in a external file that is referenced from the XML structure described by gml:FileType. The external file is referenced by the gml:fileReference property that is an anyURI (the gml:fileName property has been deprecated). This means that the external file may be located remotely from the referencing GML instance. +The gml:compression property points to a definition of a compression algorithm through an anyURI. This may be a retrievable, computable definition or simply a reference to an unambiguous name for the compression method. +The gml:mimeType property points to a definition of the file mime type. +The gml:fileStructure property is defined by a codelist. Note further that all values shall be enclosed in a single file. Multi-file structures for values are not supported in GML. +The semantics of the range set is described as above using the gml:rangeParameters property. +Note that if any compression algorithm is applied, the structure above applies only to the pre-compression or post-decompression structure of the file. +Note that the fields within a record match the gml:valueComponents of the gml:CompositeValue in document order. + + + + + + + + + deprecated + + + + + + + + + + + + The gml:coverageFunction property describes the mapping function from the domain to the range of the coverage. +The value of the CoverageFunction is one of gml:CoverageMappingRule and gml:GridFunction. +If the gml:coverageFunction property is omitted for a gridded coverage (including rectified gridded coverages) the gml:startPoint is assumed to be the value of the gml:low property in the gml:Grid geometry, and the gml:sequenceRule is assumed to be linear and the gml:axisOrder property is assumed to be "+1 +2". + + + + + + + + + + + + gml:CoverageMappingRule provides a formal or informal description of the coverage function. +The mapping rule may be defined as an in-line string (gml:ruleDefinition) or via a remote reference through xlink:href (gml:ruleReference). +If no rule name is specified, the default is 'Linear' with respect to members of the domain in document order. + + + + + + + + + + + gml:GridFunction provides an explicit mapping rule for grid geometries, i.e. the domain shall be a geometry of type grid. It describes the mapping of grid posts (discrete point grid coverage) or grid cells (discrete surface coverage) to the values in the range set. +The gml:startPoint is the index position of a point in the grid that is mapped to the first point in the range set (this is also the index position of the first grid post). If the gml:startPoint property is omitted the gml:startPoint is assumed to be equal to the value of gml:low in the gml:Grid geometry. Subsequent points in the mapping are determined by the value of the gml:sequenceRule. + + + + + + + + + + + The gml:SequenceRuleType is derived from the gml:SequenceRuleEnumeration through the addition of an axisOrder attribute. The gml:SequenceRuleEnumeration is an enumerated type. The rule names are defined in ISO 19123. If no rule name is specified the default is "Linear". + + + + + + deprecated + + + + + + + + + + + + + + + + + + + The different values in a gml:AxisDirectionList indicate the incrementation order to be used on all axes of the grid. Each axis shall be mentioned once and only once. + + + + + + The value of a gml:AxisDirection indicates the incrementation order to be used on an axis of the grid. + + + + + + + + In a gml:MultiPointCoverage the domain set is a gml:MultiPoint, that is a collection of arbitrarily distributed geometric points. +The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiPoint. +In a gml:MultiPointCoverage the mapping from the domain to the range is straightforward. +- For gml:DataBlock encodings the points of the gml:MultiPoint are mapped in document order to the tuples of the data block. +- For gml:CompositeValue encodings the points of the gml:MultiPoint are mapped to the members of the composite value in document order. +- For gml:File encodings the points of the gml:MultiPoint are mapped to the records of the file in sequential order. + + + + + + In a gml:MultiCurveCoverage the domain is partioned into a collection of curves comprising a gml:MultiCurve. The coverage function then maps each curve in the collection to a value in the range set. +The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiCurve. +In a gml:MultiCurveCoverage the mapping from the domain to the range is straightforward. +- For gml:DataBlock encodings the curves of the gml:MultiCurve are mapped in document order to the tuples of the data block. +- For gml:CompositeValue encodings the curves of the gml:MultiCurve are mapped to the members of the composite value in document order. +- For gml:File encodings the curves of the gml:MultiCurve are mapped to the records of the file in sequential order. + + + + + + In a gml:MultiSurfaceCoverage the domain is partioned into a collection of surfaces comprising a gml:MultiSurface. The coverage function than maps each surface in the collection to a value in the range set. +The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSurface. +In a gml:MultiSurfaceCoverage the mapping from the domain to the range is straightforward. +- For gml:DataBlock encodings the surfaces of the gml:MultiSurface are mapped in document order to the tuples of the data block. +- For gml:CompositeValue encodings the surfaces of the gml:MultiSurface are mapped to the members of the composite value in document order. +- For gml:File encodings the surfaces of the gml:MultiSurface are mapped to the records of the file in sequential order. + + + + + + In a gml:MultiSolidCoverage the domain is partioned into a collection of solids comprising a gml:MultiSolid. The coverage function than maps each solid in the collection to a value in the range set. +The content model is identical with gml:DiscreteCoverageType, but that gml:domainSet shall have values gml:MultiSolid. +In a gml:MultiSolidCoverage the mapping from the domain to the range is straightforward. +- For gml:DataBlock encodings the solids of the gml:MultiSolid are mapped in document order to the tuples of the data block. +- For gml:CompositeValue encodings the solids of the gml:MultiSolid are mapped to the members of the composite value in document order. +- For gml:File encodings the solids of the gml:MultiSolid are mapped to the records of the file in sequential order. + + + + + + A gml:GriddedCoverage is a discrete point coverage in which the domain set is a geometric grid of points. +Note that this is the same as the gml:MultiPointCoverage except that we have a gml:Grid to describe the domain. +The simple gridded coverage is not geometrically referenced and hence no geometric positions are assignable to the points in the grid. Such geometric positioning is introduced in the gml:RectifiedGridCoverage. + + + + + The gml:RectifiedGridCoverage is a discrete point coverage based on a rectified grid. It is similar to the grid coverage except that the points of the grid are geometrically referenced. The rectified grid coverage has a domain that is a gml:RectifiedGrid geometry. + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/datums.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/datums.xsd new file mode 100644 index 000000000..771d452ab --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/datums.xsd @@ -0,0 +1,281 @@ + + + + + datums.xsd + See ISO/DIS 19136 13.5 +The datums schema components can be divided into three logical parts, which define elements and types for XML encoding of the definitions of: +- Abstract datum +- Geodetic datums, including ellipsoid and prime meridian +- Multiple other concrete types of spatial or temporal datums +These schema components encode the Datum packages of the UML Models of ISO 19111 Clause 10 and ISO/DIS 19136 D.3.10. + + + + + + A gml:AbstractDatum specifies the relationship of a coordinate system to the earth, thus creating a coordinate reference system. A datum uses a parameter or set of parameters that determine the location of the origin of the coordinate reference system. Each datum subtype may be associated with only specific types of coordinate systems. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document. + + + + + + + + + + + + + + + + + gml:anchorDefinition is a description, possibly including coordinates, of the definition used to anchor the datum to the Earth. Also known as the "origin", especially for engineering and image datums. The codeSpace attribute may be used to reference a source of more detailed on this point or surface, or on a set of such descriptions. +- For a geodetic datum, this point is also known as the fundamental point, which is traditionally the point where the relationship between geoid and ellipsoid is defined. In some cases, the "fundamental point" may consist of a number of points. In those cases, the parameters defining the geoid/ellipsoid relationship have been averaged for these points, and the averages adopted as the datum definition. +- For an engineering datum, the anchor definition may be a physical point, or it may be a point with defined coordinates in another CRS.may +- For an image datum, the anchor definition is usually either the centre of the image or the corner of the image. +- For a temporal datum, this attribute is not defined. Instead of the anchor definition, a temporal datum carries a separate time origin of type DateTime. + + + + + gml:realizationEpoch is the time after which this datum definition is valid. See ISO 19111 Table 32 for details. + + + + + gml:DatumPropertyType is a property type for association roles to a datum, either referencing or containing the definition of that datum. + + + + + + + + + gml:GeodeticDatum is a geodetic datum defines the precise location and orientation in 3-dimensional space of a defined ellipsoid (or sphere), or of a Cartesian coordinate system centered in this ellipsoid (or sphere). + + + + + + + + + + + + + + + gml:primeMeridian is an association role to the prime meridian used by this geodetic datum. + + + + + gml:ellipsoid is an association role to the ellipsoid used by this geodetic datum. + + + + + gml:GeodeticDatumPropertyType is a property type for association roles to a geodetic datum, either referencing or containing the definition of that datum. + + + + + + + + + A gml:Ellipsoid is a geometric figure that may be used to describe the approximate shape of the earth. In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis. + + + + + + + + + + + + + + + gml:semiMajorAxis specifies the length of the semi-major axis of the ellipsoid, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet. + + + + + gml:secondDefiningParameter is a property containing the definition of the second parameter that defines the shape of an ellipsoid. An ellipsoid requires two defining parameters: semi-major axis and inverse flattening or semi-major axis and semi-minor axis. When the reference body is a sphere rather than an ellipsoid, only a single defining parameter is required, namely the radius of the sphere; in that case, the semi-major axis "degenerates" into the radius of the sphere. +The inverseFlattening element contains the inverse flattening value of the ellipsoid. This value is a scale factor (or ratio). It uses gml:LengthType with the restriction that the unit of measure referenced by the uom attribute must be suitable for a scale factor, such as percent, permil, or parts-per-million. +The semiMinorAxis element contains the length of the semi-minor axis of the ellipsoid. When the isSphere element is included, the ellipsoid is degenerate and is actually a sphere. The sphere is completely defined by the semi-major axis, which is the radius of the sphere. + + + + + + + + + + + + + + + + + + + gml:EllipsoidPropertyType is a property type for association roles to an ellipsoid, either referencing or containing the definition of that ellipsoid. + + + + + + + + + A gml:PrimeMeridian defines the origin from which longitude values are determined. The default value for the prime meridian gml:identifier value is "Greenwich". + + + + + + + + + + + + + + gml:greenwichLongitude is the longitude of the prime meridian measured from the Greenwich meridian, positive eastward. If the value of the prime meridian "name" is "Greenwich" then the value of greenwichLongitude shall be 0 degrees. + + + + + gml:PrimeMeridianPropertyType is a property type for association roles to a prime meridian, either referencing or containing the definition of that meridian. + + + + + + + + + gml:EngineeringDatum defines the origin of an engineering coordinate reference system, and is used in a region around that origin. This origin may be fixed with respect to the earth (such as a defined point at a construction site), or be a defined point on a moving vehicle (such as on a ship or satellite). + + + + + + + + + + gml:EngineeringDatumPropertyType is a property type for association roles to an engineering datum, either referencing or containing the definition of that datum. + + + + + + + + + gml:ImageDatum defines the origin of an image coordinate reference system, and is used in a local context only. For an image datum, the anchor definition is usually either the centre of the image or the corner of the image. For more information, see ISO 19111 B.3.5. + + + + + + + + + + + + + + gml:pixelInCell is a specification of the way an image grid is associated with the image data attributes. The required codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property. + + + + + gml:ImageDatumPropertyType is a property type for association roles to an image datum, either referencing or containing the definition of that datum. + + + + + + + + + gml:VerticalDatum is a textual description and/or a set of parameters identifying a particular reference level surface used as a zero-height surface, including its position with respect to the Earth for any of the height types recognized by this International Standard. + + + + + + + + + + gml:VerticalDatumPropertyType is property type for association roles to a vertical datum, either referencing or containing the definition of that datum. + + + + + + + + + A gml:TemporalDatum defines the origin of a Temporal Reference System. This type omits the "anchorDefinition" and "realizationEpoch" elements and adds the "origin" element with the dateTime type. + + + + + + + + + + + + + + The TemporalDatumBaseType partially defines the origin of a temporal coordinate reference system. This type restricts the AbstractDatumType to remove the "anchorDefinition" and "realizationEpoch" elements. + + + + + + + + + + + + + + + + + + + + gml:origin is the date and time origin of this temporal datum. + + + + + gml:TemporalDatumPropertyType is a property type for association roles to a temporal datum, either referencing or containing the definition of that datum. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/defaultStyle.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/defaultStyle.xsd new file mode 100644 index 000000000..0b1771227 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/defaultStyle.xsd @@ -0,0 +1,447 @@ + + + + defaultStyle.xsd + + + + + + + + Top-level property. Used in application schemas to "attach" the styling information to GML data. The link between the data and the style should be established through this property only. + + + + + + [complexType of] Top-level property. Used in application schemas to "attach" the styling information to GML data. The link between the data and the style should be established through this property only. + + + + + + + + + + + The value of the top-level property. It is an abstract element. Used as the head element of the substitution group for extensibility purposes. + + + + + + [complexType of] The value of the top-level property. It is an abstract element. Used as the head element of the substitution group for extensibility purposes. + + + + + + + + + Predefined concrete value of the top-level property. Encapsulates all other styling information. + + + + + + [complexType of] Predefined concrete value of the top-level property. Encapsulates all other styling information. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The style descriptor for features. + + + + + + [complexType of] The style descriptor for features. + + + + + + + + + + + + + + + + + + + Used to specify the grammar of the feature query mechanism. + + + + + + + + + + + Base complex type for geometry, topology, label and graph styles. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The style descriptor for geometries of a feature. + + + + + + [complexType of] The style descriptor for geometries of a feature. + + + + + + + + + deprecated + Deprecated in GML version 3.1.0. Use symbol with inline content instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The style descriptor for topologies of a feature. Describes individual topology elements styles. + + + + + + [complexType of] The style descriptor for topologies of a feature. Describes individual topology elements styles. + + + + + + + + + deprecated + Deprecated in GML version 3.1.0. Use symbol with inline content instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The style descriptor for labels of a feature, geometry or topology. + + + + + + [complexType of] The style descriptor for labels of a feature, geometry or topology. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The style descriptor for a graph consisting of a number of features. Describes graph-specific style attributes. + + + + + + [complexType of] The style descriptor for a graph consisting of a number of features. Describes graph-specific style attributes. + + + + + + + + + + + + + + + + + + + + + The symbol property. Extends the gml:AssociationType to allow for remote referencing of symbols. + + + + + + [complexType of] The symbol property. Allows for remote referencing of symbols. + + + + + + + + + + + + + Used to specify the type of the symbol used. + + + + + + + + + + + Label is mixed -- composed of text and XPath expressions used to extract the useful information from the feature. + + + + + + + + + + Defines the geometric transformation of entities. There is no particular grammar defined for this value. + + + + + + Used to vary individual graphic parameters and attributes of the style, symbol or text. + + + + + + + + + + + + Graph-specific styling property. + + + + + + + + + + Graph-specific styling property. + + + + + + + + + + Graph-specific styling property. + + + + + + + + + + Graph-specific styling property. + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/deprecatedTypes.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/deprecatedTypes.xsd new file mode 100644 index 000000000..b334e738b --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/deprecatedTypes.xsd @@ -0,0 +1,1128 @@ + + + + deprecatedTypes.xsd + All global schema components that are part of the GML schema, but were deprecated. See Annex I. + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + + + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + deprecated + + + + + + + + + + deprecated + + + + + deprecated + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + deprecated + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + + + + + + + + + + + + + + + + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + + + deprecated + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/dictionary.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/dictionary.xsd new file mode 100644 index 000000000..53e347940 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/dictionary.xsd @@ -0,0 +1,84 @@ + + + + dictionary.xsd + See ISO/DIS 19136 Clause 16. +Many applications require definitions of terms which are used within instance documents as the values of certain properties or as reference information to tie properties to standard information values in some way. Units of measure and descriptions of measurable phenomena are two particular examples. +It will often be convenient to use definitions provided by external authorities. These may already be packaged for delivery in various ways, both online and offline. In order that they may be referred to from GML documents it is generally necessary that a URI be available for each definition. Where this is the case then it is usually preferable to refer to these directly. +Alternatively, it may be convenient or necessary to capture definitions in XML, either embedded within an instance document containing features or as a separate document. The definitions may be transcriptions from an external source, or may be new definitions for a local purpose. In order to support this case, some simple components are provided in GML in the form of +- a generic gml:Definition, which may serve as the basis for more specialized definitions +- a generic gml:Dictionary, which allows a set of definitions or references to definitions to be collected +These components may be used directly, but also serve as the basis for more specialised definition elements in GML, in particular: coordinate operations, coordinate reference systems, datums, temporal reference systems, and units of measure. +Note that the GML definition and dictionary components implement a simple nested hierarchy of definitions with identifiers. The latter provide handles which may be used in the description of more complex relationships between terms. However, the GML dictionary components are not intended to provide direct support for complex taxonomies, ontologies or thesauri. Specialised XML tools are available to satisfy the more sophisticated requirements. + + + + + The basic gml:Definition element specifies a definition, which can be included in or referenced by a dictionary. +The content model for a generic definition is a derivation from gml:AbstractGMLType. +The gml:description property element shall hold the definition if this can be captured in a simple text string, or the gml:descriptionReference property element may carry a link to a description elsewhere. +The gml:identifier element shall provide one identifier identifying this definition. The identifier shall be unique within the dictionaries using this definition. +The gml:name elements shall provide zero or more terms and synonyms for which this is the definition. +The gml:remarks element shall be used to hold additional textual information that is not conceptually part of the definition but is useful in understanding the definition. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sets of definitions may be collected into dictionaries or collections. +A gml:Dictionary is a non-abstract collection of definitions. +The gml:Dictionary content model adds a list of gml:dictionaryEntry properties that contain or reference gml:Definition objects. A database handle (gml:id attribute) is required, in order that this collection may be referred to. The standard gml:identifier, gml:description, gml:descriptionReference and gml:name properties are available to reference or contain more information about this dictionary. The gml:description and gml:descriptionReference property elements may be used for a description of this dictionary. The derived gml:name element may be used for the name(s) of this dictionary. for remote definiton references gml:dictionaryEntry shall be used. If a Definition object contained within a Dictionary uses the descriptionReference property to refer to a remote definition, then this enables the inclusion of a remote definition in a local dictionary, giving a handle and identifier in the context of the local dictionary. + + + + + + + + + + + + + + + + This property element contains or refers to the definitions which are members of a dictionary. +The content model follows the standard GML property pattern, so a gml:dictionaryEntry may either contain or refer to a single gml:Definition. Since gml:Dictionary is substitutable for gml:Definition, the content of an entry may itself be a lower level dictionary. +Note that if the value is provided by reference, this definition does not carry a handle (gml:id) in this context, so does not allow external references to this specific definition in this context. When used in this way the referenced definition will usually be in a dictionary in the same XML document. + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/direction.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/direction.xsd new file mode 100644 index 000000000..fbfc714b3 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/direction.xsd @@ -0,0 +1,78 @@ + + + + direction.xsd + See ISO/DIS 19136 Clause 18. +The direction schema components provide the GML Application Schema developer with a standard property element to describe direction, and associated objects that may be used to express orientation, direction, heading, bearing or other directional aspects of geographic features. + + + + + The property gml:direction is intended as a pre-defined property expressing a direction to be assigned to features defined in a GML application schema. + + + + + + + + + + + + + + + + Direction vectors are specified by providing components of a vector. + + + + + + deprecated + + + + + + + + + direction descriptions are specified by a compass point code, a keyword, a textual description or a reference to a description. +A gml:compassPoint is specified by a simple enumeration. +In addition, thre elements to contain text-based descriptions of direction are provided. +If the direction is specified using a term from a list, gml:keyword should be used, and the list indicated using the value of the codeSpace attribute. +if the direction is decribed in prose, gml:direction or gml:reference should be used, allowing the value to be included inline or by reference. + + + + + + + + + + + These directions are necessarily approximate, giving direction with a precision of 22.5°. It is thus generally unnecessary to specify the reference frame, though this may be detailed in the definition of a GML application language. + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/dynamicFeature.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/dynamicFeature.xsd new file mode 100644 index 000000000..d8e287e9f --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/dynamicFeature.xsd @@ -0,0 +1,103 @@ + + + + dynamicFeature.xsd + See ISO/DIS 19136 15.6. +A number of types and relationships are defined to represent the time-varying properties of geographic features. +In a comprehensive treatment of spatiotemporal modeling, Langran (see Bibliography) distinguished three principal temporal entities: states, events, and evidence; the schema specified in the following Subclauses incorporates elements for each. + + + + + + Evidence is represented by a simple gml:dataSource or gml:dataSourceReference property that indicates the source of the temporal data. The remote link attributes of the gml:dataSource element have been deprecated along with its current type. + + + + + Evidence is represented by a simple gml:dataSource or gml:dataSourceReference property that indicates the source of the temporal data. + + + + + A convenience group. This allows an application schema developer to include dynamic properties in a content model in a standard fashion. + + + + + + + + + + + States are captured by time-stamped instances of a feature. The content model extends the standard gml:AbstractFeatureType with the gml:dynamicProperties model group. +Each time-stamped instance represents a 'snapshot' of a feature. The dynamic feature classes will normally be extended to suit particular applications. A dynamic feature bears either a time stamp or a history. + + + + + + + + + + + + A gml:DynamicFeatureCollection is a feature collection that has a gml:validTime property (i.e. is a snapshot of the feature collection) or which has a gml:history property that contains one or more gml:AbstractTimeSlices each of which contain values of the time varying properties of the feature collection. Note that the gml:DynamicFeatureCollection may be one of the following: +1. A feature collection which consists of static feature members (members do not change in time) but which has properties of the collection object as a whole that do change in time . +2. A feature collection which consists of dynamic feature members (the members are gml:DynamicFeatures) but which also has properties of the collection as a whole that vary in time. + + + + + + + + + + + + + + + + + + + + + + + + + To describe an event — an action that occurs at an instant or over an interval of time — GML provides the gml:AbtractTimeSlice element. A timeslice encapsulates the time-varying properties of a dynamic feature -- it shall be extended to represent a time stamped projection of a specific feature. The gml:dataSource property describes how the temporal data was acquired. +A gml:AbstractTimeSlice instance is a GML object that encapsulates updates of the dynamic—or volatile—properties that reflect some change event; it thus includes only those feature properties that have actually changed due to some process. +gml:AbstractTimeSlice basically provides a facility for attribute-level time stamping, in contrast to the object-level time stamping of dynamic feature instances. +The time slice can thus be viewed as event or process-oriented, whereas a snapshot is more state or structure-oriented. A timeslice has richer causality, whereas a snapshot merely portrays the status of the whole. + + + + + + + + + + + + + + + + A generic sequence of events constitute a gml:history of an object. +The gml:history element contains a set of elements in the substitution group headed by the abstract element gml:AbstractTimeSlice, representing the time-varying properties of interest. The history property of a dynamic feature associates a feature instance with a sequence of time slices (i.e. change events) that encapsulate the evolution of the feature. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/feature.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/feature.xsd new file mode 100644 index 000000000..a06383d89 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/feature.xsd @@ -0,0 +1,88 @@ + + + + feature.xsd + See ISO/DIS 19136 Clause 9. +A GML feature is a (representation of a) identifiable real-world object in a selected domain of discourse. The feature schema provides a framework for the creation of GML features and feature collections. + + + + + + The basic feature model is given by the gml:AbstractFeatureType. +The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. +The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. +The value of the gml:location property describes the extent, position or relative location of the feature. + + + + + + + + + + + + + This abstract element serves as the head of a substitution group which may contain any elements whose content model is derived from gml:AbstractFeatureType. This may be used as a variable in the construction of content models. +gml:AbstractFeature may be thought of as "anything that is a GML feature" and may be used to define variables or templates in which the value of a GML property is "any feature". This occurs in particular in a GML feature collection where the feature member properties contain one or multiple copies of gml:AbstractFeature respectively. + + + + + + + + + + + + This property describes the minimum bounding box or rectangle that encloses the entire feature. + + + + + + + + + + + + + + gml:EnvelopeWithTimePeriod is provided for envelopes that include a temporal extent. It adds two time position properties, gml:beginPosition and gml:endPosition, which describe the extent of a time-envelope. +Since gml:EnvelopeWithTimePeriod is assigned to the substitution group headed by gml:Envelope, it may be used whenever gml:Envelope is valid. + + + + + + + + + + + + + + + + The gml:locationName property element is a convenience property where the text value describes the location of the feature. If the location names are selected from a controlled list, then the list shall be identified in the codeSpace attribute. + + + + + The gml:locationReference property element is a convenience property where the text value referenced by the xlink:href attribute describes the location of the feature. + + + + + To create a collection of GML features, a property type shall be derived by extension from gml:AbstractFeatureMemberType. +By default, this abstract property type does not imply any ownership of the features in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of a feature in the collection. A collection shall not own a feature already owned by another object. + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryAggregates.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryAggregates.xsd new file mode 100644 index 000000000..98f05f469 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryAggregates.xsd @@ -0,0 +1,191 @@ + + + + geometryAggregates.xsd + See ISO/DIS 19136 12.3. +Geometric aggregates (i.e. instances of a subtype of gml:AbstractGeometricAggregateType) are arbitrary aggregations of geometry elements. They are not assumed to have any additional internal structure and are used to "collect" pieces of geometry of a specified type. Application schemas may use aggregates for features that use multiple geometric objects in their representations. + + + + + + + + + + + + gml:AbstractGeometricAggregate is the abstract head of the substitution group for all geometric aggregates. + + + + + + + + + + + + + + + gml:MultiGeometry is a collection of one or more GML geometry objects of arbitrary type. +The members of the geometric aggregate may be specified either using the "standard" property (gml:geometryMember) or the array property (gml:geometryMembers). It is also valid to use both the "standard" and the array properties in the same collection. + + + + + This property element either references a geometry element via the XLink-attributes or contains the geometry element. + + + + + This property element contains a list of geometry elements. The order of the elements is significant and shall be preserved when processing the array. + + + + + A property that has a geometric aggregate as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiPoint consists of one or more gml:Points. +The members of the geometric aggregate may be specified either using the "standard" property (gml:pointMember) or the array property (gml:pointMembers). It is also valid to use both the "standard" and the array properties in the same collection. + + + + + This property element either references a Point via the XLink-attributes or contains the Point element. + + + + + This property element contains a list of points. The order of the elements is significant and shall be preserved when processing the array. + + + + + A property that has a collection of points as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiCurve is defined by one or more gml:AbstractCurves. +The members of the geometric aggregate may be specified either using the "standard" property (gml:curveMember) or the array property (gml:curveMembers). It is also valid to use both the "standard" and the array properties in the same collection. + + + + + This property element contains a list of curves. The order of the elements is significant and shall be preserved when processing the array. + + + + + A property that has a collection of curves as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiSurface is defined by one or more gml:AbstractSurfaces. +The members of the geometric aggregate may be specified either using the "standard" property (gml:surfaceMember) or the array property (gml:surfaceMembers). It is also valid to use both the "standard" and the array properties in the same collection. + + + + + This property element contains a list of surfaces. The order of the elements is significant and shall be preserved when processing the array. + + + + + A property that has a collection of surfaces as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + A gml:MultiSolid is defined by one or more gml:AbstractSolids. +The members of the geometric aggregate may be specified either using the "standard" property (gml:solidMember) or the array property (gml:solidMembers). It is also valid to use both the "standard" and the array properties in the same collection. + + + + + This property element either references a solid via the XLink-attributes or contains the solid element. A solid element is any element, which is substitutable for gml:AbstractSolid. + + + + + This property element contains a list of solids. The order of the elements is significant and shall be preserved when processing the array. + + + + + A property that has a collection of solids as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryBasic0d1d.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryBasic0d1d.xsd new file mode 100644 index 000000000..263b7468a --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryBasic0d1d.xsd @@ -0,0 +1,271 @@ + + + + geometryBasic0d1d.xsd + See ISO/DIS 19136 Clause 10. +Any geometry element that inherits the semantics of AbstractGeometryType may be viewed as a set of direct positions. +All of the classes derived from AbstractGeometryType inherit an optional association to a coordinate reference system. All direct positions shall directly or indirectly be associated with a coordinate reference system. When geometry elements are aggregated in another geometry element (such as a MultiGeometry or GeometricComplex), which already has a coordinate reference system specified, then these elements are assumed to be in that same coordinate reference system unless otherwise specified. +The geometry model distinguishes geometric primitives, aggregates and complexes. +Geometric primitives, i.e. instances of a subtype of AbstractGeometricPrimitiveType, will be open, that is, they will not contain their boundary points; curves will not contain their end points, surfaces will not contain their boundary curves, and solids will not contain their bounding surfaces. + + + + + All geometry elements are derived directly or indirectly from this abstract supertype. A geometry element may have an identifying attribute (gml:id), one or more names (elements identifier and name) and a description (elements description and descriptionReference) . It may be associated with a spatial reference system (attribute group gml:SRSReferenceGroup). +The following rules shall be adhered to: +- Every geometry type shall derive from this abstract type. +- Every geometry element (i.e. an element of a geometry type) shall be directly or indirectly in the substitution group of AbstractGeometry. + + + + + + + + + + The attribute group SRSReferenceGroup is an optional reference to the CRS used by this geometry, with optional additional information to simplify the processing of the coordinates when a more complete definition of the CRS is not needed. +In general the attribute srsName points to a CRS instance of gml:AbstractCoordinateReferenceSystem. For well-known references it is not required that the CRS description exists at the location the URI points to. +If no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of. + + + + + + + + The attributes uomLabels and axisLabels, defined in the SRSInformationGroup attribute group, are optional additional and redundant information for a CRS to simplify the processing of the coordinate values when a more complete definition of the CRS is not needed. This information shall be the same as included in the complete definition of the CRS, referenced by the srsName attribute. When the srsName attribute is included, either both or neither of the axisLabels and uomLabels attributes shall be included. When the srsName attribute is omitted, both of these attributes shall be omitted. +The attribute axisLabels is an ordered list of labels for all the axes of this CRS. The gml:axisAbbrev value should be used for these axis labels, after spaces and forbidden characters are removed. When the srsName attribute is included, this attribute is optional. When the srsName attribute is omitted, this attribute shall also be omitted. +The attribute uomLabels is an ordered list of unit of measure (uom) labels for all the axes of this CRS. The value of the string in the gml:catalogSymbol should be used for this uom labels, after spaces and forbidden characters are removed. When the axisLabels attribute is included, this attribute shall also be included. When the axisLabels attribute is omitted, this attribute shall also be omitted. + + + + + + + The AbstractGeometry element is the abstract head of the substitution group for all geometry elements of GML. This includes pre-defined and user-defined geometry elements. Any geometry element shall be a direct or indirect extension/restriction of AbstractGeometryType and shall be directly or indirectly in the substitution group of AbstractGeometry. + + + + + A geometric property may either be any geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same or another document). Note that either the reference or the contained element shall be given, but not both or none. +If a feature has a property that takes a geometry element as its value, this is called a geometry property. A generic type for such a geometry property is GeometryPropertyType. + + + + + + + + + + If a feature has a property which takes an array of geometry elements as its value, this is called a geometry array property. A generic type for such a geometry property is GeometryArrayPropertyType. +The elements are always contained inline in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported. + + + + + + + + + Direct position instances hold the coordinates for a position within some coordinate reference system (CRS). Since direct positions, as data types, will often be included in larger objects (such as geometry elements) that have references to CRS, the srsName attribute will in general be missing, if this particular direct position is included in a larger element with such a reference to a CRS. In this case, the CRS is implicitly assumed to take on the value of the containing object's CRS. +if no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of, typically a geometric object like a point, curve, etc. + + + + + + + + + + + posList instances (and other instances with the content model specified by DirectPositionListType) hold the coordinates for a sequence of direct positions within the same coordinate reference system (CRS). +if no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of, typically a geometric object like a point, curve, etc. +The optional attribute count specifies the number of direct positions in the list. If the attribute count is present then the attribute srsDimension shall be present, too. +The number of entries in the list is equal to the product of the dimensionality of the coordinate reference system (i.e. it is a derived value of the coordinate reference system definition) and the number of direct positions. + + + + + + + + + + + + GML supports two different ways to specify a geometric position: either by a direct position (a data type) or a point (a geometric object). +pos elements are positions that are "owned" by the geometric primitive encapsulating this geometric position. +pointProperty elements contain a point that may be referenced from other geometry elements or reference another point defined elsewhere (reuse of existing points). + + + + + + + + + GML supports two different ways to specify a list of geometric positions: either by a sequence of geometric positions (by reusing the group definition) or a sequence of direct positions (element posList). +The posList element allows for a compact way to specify the coordinates of the positions, if all positions are represented in the same coordinate reference system. + + + + + + + + + For some applications the components of the position may be adjusted to yield a unit vector. + + + + + + + + + + + + + + + deprecated + + + + + + + + + Envelope defines an extent using a pair of positions defining opposite corners in arbitrary dimensions. The first direct position is the "lower corner" (a coordinate position consisting of all the minimal ordinates for each dimension for all points within the envelope), the second one the "upper corner" (a coordinate position consisting of all the maximal ordinates for each dimension for all points within the envelope). +The use of the properties "coordinates" and "pos" has been deprecated. The explicitly named properties "lowerCorner" and "upperCorner" shall be used instead. + + + + + gml:AbstractGeometricPrimitiveType is the abstract root type of the geometric primitives. A geometric primitive is a geometric object that is not decomposed further into other primitives in the system. All primitives are oriented in the direction implied by the sequence of their coordinate tuples. + + + + + + + + The AbstractGeometricPrimitive element is the abstract head of the substitution group for all (pre- and user-defined) geometric primitives. + + + + + A property that has a geometric primitive as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + + + A Point is defined by a single coordinate tuple. The direct position of a point is specified by the pos element which is of type DirectPositionType. + + + + + A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + This property element either references a point via the XLink-attributes or contains the point element. pointProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for Point. + + + + + gml:PointArrayPropertyType is a container for an array of points. The elements are always contained inline in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported. + + + + + + + + + gml:AbstractCurveType is an abstraction of a curve to support the different levels of complexity. The curve may always be viewed as a geometric primitive, i.e. is continuous. + + + + + + + + The AbstractCurve element is the abstract head of the substitution group for all (continuous) curve elements. + + + + + A property that has a curve as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + This property element either references a curve via the XLink-attributes or contains the curve element. curveProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractCurve. + + + + + A container for an array of curves. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported. + + + + + + + + + + + + + + + + + + + + + + + + + + A LineString is a special curve that consists of a single segment with linear interpolation. It is defined by two or more coordinate tuples, with linear interpolation between them. The number of direct positions in the list shall be at least two. + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryBasic2d.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryBasic2d.xsd new file mode 100644 index 000000000..32deb9d9a --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryBasic2d.xsd @@ -0,0 +1,118 @@ + + + + geometryBasic2d.xsd + See ISO/DIS 19136 Clause 10. + + + + + gml:AbstractSurfaceType is an abstraction of a surface to support the different levels of complexity. A surface is always a continuous region of a plane. + + + + + + + + The AbstractSurface element is the abstract head of the substitution group for all (continuous) surface elements. + + + + + A property that has a surface as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + This property element either references a surface via the XLink-attributes or contains the surface element. surfaceProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractSurface. + + + + + gml:SurfaceArrayPropertyType is a container for an array of surfaces. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported. + + + + + + + + + + + + + + + + + + + A Polygon is a special surface that is defined by a single surface patch (see D.3.6). The boundary of this patch is coplanar and the polygon uses planar interpolation in its interior. +The elements exterior and interior describe the surface boundary of the polygon. + + + + + A boundary of a surface consists of a number of rings. In the normal 2D case, one of these rings is distinguished as being the exterior boundary. In a general manifold this is not always possible, in which case all boundaries shall be listed as interior boundaries, and the exterior will be empty. + + + + + A boundary of a surface consists of a number of rings. The "interior" rings separate the surface / surface patch from the area enclosed by the rings. + + + + + + + + An abstraction of a ring to support surface boundaries of different complexity. +The AbstractRing element is the abstract head of the substituition group for all closed boundaries of a surface patch. + + + + + A property with the content model of gml:AbstractRingPropertyType encapsulates a ring to represent the surface boundary property of a surface. + + + + + + + + + + + + + + + + + + + + + + + + + A LinearRing is defined by four or more coordinate tuples, with linear interpolation between them; the first and last coordinates shall be coincident. The number of direct positions in the list shall be at least four. + + + + + A property with the content model of gml:LinearRingPropertyType encapsulates a linear ring to represent a component of a surface boundary. + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryComplexes.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryComplexes.xsd new file mode 100644 index 000000000..9f26cb0cb --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryComplexes.xsd @@ -0,0 +1,89 @@ + + + + geometryComplexes.xsd + See ISO/DIS 19136 12.2. +Geometric complexes (i.e. instances of gml:GeometricComplexType) are closed collections of geometric primitives, i.e. they will contain their boundaries. +A geometric complex (gml:GeometricComplex) is defined by ISO 19107:2003, 6.6.1 as "a set of primitive geometric objects (in a common coordinate system) whose interiors are disjoint. Further, if a primitive is in a geometric complex, then there exists a set of primitives in that complex whose point-wise union is the boundary of this first primitive." +A geometric composite (gml:CompositeCurve, gml:CompositeSurface and gml:CompositeSolid) represents a geometric complex with an underlying core geometry that is isomorphic to a primitive, i.e. it can be viewed as a primitive and as a complex. See ISO 19107:2003, 6.1 and 6.6.3 for more details on the nature of composite geometries. +Geometric complexes and composites are intended to be used in application schemas where the sharing of geometry is important. + + + + + + + + + + + + + + + + A property that has a geometric complex as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + + + + + + + + + + + + + + + + A gml:CompositeCurve is represented by a sequence of (orientable) curves such that each curve in the sequence terminates at the start point of the subsequent curve in the list. +curveMember references or contains inline one curve in the composite curve. +The curves are contiguous, the collection of curves is ordered. Therefore, if provided, the aggregationType attribute shall have the value "sequence". + + + + + + + + + + + + + + + A gml:CompositeSurface is represented by a set of orientable surfaces. It is geometry type with all the geometric properties of a (primitive) surface. Essentially, a composite surface is a collection of surfaces that join in pairs on common boundary curves and which, when considered as a whole, form a single surface. +surfaceMember references or contains inline one surface in the composite surface. +The surfaces are contiguous. + + + + + + + + + + + + + + + gml:CompositeSolid implements ISO 19107 GM_CompositeSolid (see ISO 19107:2003, 6.6.7) as specified in D.2.3.6. +A gml:CompositeSolid is represented by a set of orientable surfaces. It is a geometry type with all the geometric properties of a (primitive) solid. Essentially, a composite solid is a collection of solids that join in pairs on common boundary surfaces and which, when considered as a whole, form a single solid. +solidMember references or contains one solid in the composite solid. The solids are contiguous. + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryPrimitives.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryPrimitives.xsd new file mode 100644 index 000000000..3113ea6e2 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/geometryPrimitives.xsd @@ -0,0 +1,841 @@ + + + + geometryPrimitives.xsd + See ISO/DIS 19136 Clause 11. +Beside the "simple" geometric primitives specified in the previous Clause, this Clause specifies additional primitives to describe real world situations which require a more expressive geometry model. + + + + + + + + + + + + + + + A curve is a 1-dimensional primitive. Curves are continuous, connected, and have a measurable length in terms of the coordinate system. +A curve is composed of one or more curve segments. Each curve segment within a curve may be defined using a different interpolation method. The curve segments are connected to one another, with the end point of each segment except the last being the start point of the next segment in the segment list. +The orientation of the curve is positive. +The element segments encapsulates the segments of the curve. + + + + + + + + + + + + + + + The property baseCurve references or contains the base curve, i.e. it either references the base curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for AbstractCurve. The base curve has positive orientation. + + + + + OrientableCurve consists of a curve and an orientation. If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another AbstractCurve with a parameterization that reverses the sense of the curve traversal. + + + + + + + + + + A curve segment defines a homogeneous segment of a curve. +The attributes numDerivativesAtStart, numDerivativesAtEnd and numDerivativesInterior specify the type of continuity as specified in ISO 19107:2003, 6.4.9.3. +The AbstractCurveSegment element is the abstract head of the substituition group for all curve segment elements, i.e. continuous segments of the same interpolation mechanism. +All curve segments shall have an attribute interpolation with type gml:CurveInterpolationType specifying the curve interpolation mechanism used for this segment. This mechanism uses the control points and control parameters to determine the position of this curve segment. + + + + + gml:CurveSegmentArrayPropertyType is a container for an array of curve segments. + + + + + + + + This property element contains a list of curve segments. The order of the elements is significant and shall be preserved when processing the array. + + + + + gml:CurveInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an application schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A LineStringSegment is a curve segment that is defined by two or more control points including the start and end point, with linear interpolation between them. +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + + An ArcString is a curve segment that uses three-point circular arc interpolation ("circularArc3Points"). The number of arcs in the arc string may be explicitly stated in the attribute numArc. The number of control points in the arc string shall be 2 * numArc + 1. +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + An Arc is an arc string with only one arc unit, i.e. three control points including the start and end point. As arc is an arc string consisting of a single arc, the attribute "numArc" is fixed to "1". + + + + + + + + + + A Circle is an arc whose ends coincide to form a simple closed loop. The three control points shall be distinct non-co-linear points for the circle to be unambiguously defined. The arc is simply extended past the third control point until the first control point is encountered. + + + + + + + + + + + + + + + + + + + + + + + + + + This variant of the arc computes the mid points of the arcs instead of storing the coordinates directly. The control point sequence consists of the start and end points of each arc plus the bulge (see ISO 19107:2003, 6.4.17.2). The normal is a vector normal (perpendicular) to the chord of the arc (see ISO 19107:2003, 6.4.17.4). +The interpolation is fixed as "circularArc2PointWithBulge". +The number of arcs in the arc string may be explicitly stated in the attribute numArc. The number of control points in the arc string shall be numArc + 1. +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + + + An ArcByBulge is an arc string with only one arc unit, i.e. two control points, one bulge and one normal vector. +As arc is an arc string consisting of a single arc, the attribute "numArc" is fixed to "1". + + + + + + + + + + + + + + + + + + + + + + + + + + + This variant of the arc requires that the points on the arc shall be computed instead of storing the coordinates directly. The single control point is the center point of the arc plus the radius and the bearing at start and end. This representation can be used only in 2D. +The element radius specifies the radius of the arc. +The element startAngle specifies the bearing of the arc at the start. +The element endAngle specifies the bearing of the arc at the end. +The interpolation is fixed as "circularArcCenterPointWithRadius". +Since this type describes always a single arc, the attribute "numArc" is fixed to "1". +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + A gml:CircleByCenterPoint is an gml:ArcByCenterPoint with identical start and end angle to form a full circle. Again, this representation can be used only in 2D. + + + + + + + + + + + + + + + + + + + + + + + + + + The number of control points shall be at least three. +vectorAtStart is the unit tangent vector at the start point of the spline. vectorAtEnd is the unit tangent vector at the end point of the spline. Only the direction of the vectors shall be used to determine the shape of the cubic spline, not their length. +interpolation is fixed as "cubicSpline". +degree shall be the degree of the polynomial used for the interpolation in this spline. Therefore the degree for a cubic spline is fixed to "3". +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + + + + + + + + A B-Spline is a piecewise parametric polynomial or rational curve described in terms of control points and basis functions as specified in ISO 19107:2003, 6.4.30. Therefore, interpolation may be either "polynomialSpline" or "rationalSpline" depending on the interpolation type; default is "polynomialSpline". +degree shall be the degree of the polynomial used for interpolation in this spline. +knot shall be the sequence of distinct knots used to define the spline basis functions (see ISO 19107:2003, 6.4.26.2). +The attribute isPolynomial shall be set to "true" if this is a polynomial spline (see ISO 19107:2003, 6.4.30.5). +The attribute knotType shall provide the type of knot distribution used in defining this spline (see ISO 19107:2003, 6.4.30.4). +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + gml:KnotPropertyType encapsulates a knot to use it in a geometric type. + + + + + A knot is a breakpoint on a piecewise spline curve. +value is the value of the parameter at the knot of the spline (see ISO 19107:2003, 6.4.24.2). +multiplicity is the multiplicity of this knot used in the definition of the spline (with the same weight). +weight is the value of the averaging weight used for this knot of the spline. + + + + + + + This enumeration type specifies values for the knots' type (see ISO 19107:2003, 6.4.25). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bezier curves are polynomial splines that use Bezier or Bernstein polynomials for interpolation purposes. It is a special case of the B-Spline curve with two knots. +degree shall be the degree of the polynomial used for interpolation in this spline. +knot shall be the sequence of distinct knots used to define the spline basis functions. +interpolation is fixed as "polynomialSpline". +isPolynomial is fixed as "true". +knotType is not relevant for Bezier curve segments. + + + + + + + + + + + + + + + + + An offset curve is a curve at a constant distance from the basis curve. offsetBase is the base curve from which this curve is defined as an offset. distance and refDirection have the same meaning as specified in ISO 19107:2003, 6.4.23. +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + location, refDirection, inDimension and outDimension have the same meaning as specified in ISO 19107:2003, 6.4.21. + + + + + + + + + + + + + + + + + + + + + + + + A clothoid, or Cornu's spiral, is plane curve whose curvature is a fixed function of its length. +refLocation, startParameter, endParameter and scaleFactor have the same meaning as specified in ISO 19107:2003, 6.4.22. +interpolation is fixed as "clothoid". +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + A sequence of geodesic segments. +The number of control points shall be at least two. +interpolation is fixed as "geodesic". +The content model follows the general pattern for the encoding of curve segments. + + + + + + + + + + + + + + + + + + + + A Surface is a 2-dimensional primitive and is composed of one or more surface patches as specified in ISO 19107:2003, 6.3.17.1. The surface patches are connected to one another. +patches encapsulates the patches of the surface. + + + + + + + + + + + + + + + The property baseSurface references or contains the base surface. The property baseSurface either references the base surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for gml:AbstractSurface. The base surface has positive orientation. + + + + + OrientableSurface consists of a surface and an orientation. If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a gml:AbstractSurface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface". + + + + + + A surface patch defines a homogenuous portion of a surface. +The AbstractSurfacePatch element is the abstract head of the substituition group for all surface patch elements describing a continuous portion of a surface. +All surface patches shall have an attribute interpolation (declared in the types derived from gml:AbstractSurfacePatchType) specifying the interpolation mechanism used for the patch using gml:SurfaceInterpolationType. + + + + + gml:SurfacePatchArrayPropertyType is a container for a sequence of surface patches. + + + + + + + + The patches property element contains the sequence of surface patches. The order of the elements is significant and shall be preserved when processing the array. + + + + + gml:SurfaceInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an application schema. + + + + + + + + + + + + + + + + + + + + + + + + + + + + A gml:PolygonPatch is a surface patch that is defined by a set of boundary curves and an underlying surface to which these curves adhere. The curves shall be coplanar and the polygon uses planar interpolation in its interior. +interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane. + + + + + + + + + + + + + + + gml:Triangle represents a triangle as a surface patch with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring shall be four. +The ring (element exterior) shall be a gml:LinearRing and shall form a triangle, the first and the last position shall be coincident. +interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane. + + + + + + + + + + + + + + + gml:Rectangle represents a rectangle as a surface patch with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring shall be five. +The ring (element exterior) shall be a gml:LinearRing and shall form a rectangle; the first and the last position shall be coincident. +interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane. + + + + + + + + + + + + + + + A ring is used to represent a single connected component of a surface boundary as specified in ISO 19107:2003, 6.3.6. +Every gml:curveMember references or contains one curve, i.e. any element which is substitutable for gml:AbstractCurve. In the context of a ring, the curves describe the boundary of the surface. The sequence of curves shall be contiguous and connected in a cycle. +If provided, the aggregationType attribute shall have the value "sequence". + + + + + + A property with the content model of gml:RingPropertyType encapsulates a ring to represent a component of a surface boundary. + + + + + + + + A gml:PointGrid group contains or references points or positions which are organised into sequences or grids. All rows shall have the same number of positions (columns). + + + + + + + + + + + + + + + + + + + + + + + + + The element provides a substitution group head for the surface patches based on parametric curves. All properties are specified in the derived subtypes. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.40. +If provided, the aggregationType attribute shall have the value "set". + + + + + + + + + + + + + + + + if provided, rows gives the number of rows, columns the number of columns in the parameter grid. The parameter grid is represented by an instance of the gml:PointGrid group. +The element provides a substitution group head for the surface patches based on a grid. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.41. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A polyhedral surface is a surface composed of polygon patches connected along their common boundary curves. This differs from the surface type only in the restriction on the types of surface patches acceptable. +polygonPatches encapsulates the polygon patches of the polyhedral surface. + + + + + A triangulated surface is a polyhedral surface that is composed only of triangles. There is no restriction on how the triangulation is derived. +trianglePatches encapsulates the triangles of the triangulated surface. + + + + + + + + + + + + + + + + + + + + + + + + A tin is a triangulated surface that uses the Delauny algorithm or a similar algorithm complemented with consideration of stoplines (stopLines), breaklines (breakLines), and maximum length of triangle sides (maxLength). controlPoint shall contain a set of the positions (three or more) used as posts for this TIN (corners of the triangles in the TIN). See ISO 19107:2003, 6.4.39 for details. + + + + + gml:LineStringSegmentArrayPropertyType provides a container for line strings. + + + + + + + + gml:AbstractSolidType is an abstraction of a solid to support the different levels of complexity. The solid may always be viewed as a geometric primitive, i.e. is contiguous. + + + + + + + + The AbstractSolid element is the abstract head of the substituition group for all (continuous) solid elements. + + + + + A property that has a solid as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none. + + + + + + + + + + This property element either references a solid via the XLink-attributes or contains the solid element. solidProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractSolid. + + + + + gml:SolidArrayPropertyType is a container for an array of solids. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported. + + + + + + + + + + + + + + + + + + + A solid is the basis for 3-dimensional geometry. The extent of a solid is defined by the boundary surfaces as specified in ISO 19107:2003, 6.3.18. exterior specifies the outer boundary, interior the inner boundary of the solid. + + + + + + + + + + + A shell is used to represent a single connected component of a solid boundary as specified in ISO 19107:2003, 6.3.8. +Every gml:surfaceMember references or contains one surface, i.e. any element which is substitutable for gml:AbstractSurface. In the context of a shell, the surfaces describe the boundary of the solid. +If provided, the aggregationType attribute shall have the value "set". + + + + + + This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element, which is substitutable for gml:AbstractSurface. + + + + + A property with the content model of gml:ShellPropertyType encapsulates a shell to represent a component of a solid boundary. + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/gml.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/gml.xsd new file mode 100644 index 000000000..c7f53cd50 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/gml.xsd @@ -0,0 +1,15 @@ + + + + gml.xsd + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/gmlBase.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/gmlBase.xsd new file mode 100644 index 000000000..2a03fa2ee --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/gmlBase.xsd @@ -0,0 +1,180 @@ + + + + gmlBase.xsd + See ISO/DIS 19136 7.2. +The gmlBase schema components establish the GML model and syntax, in particular +- a root XML type from which XML types for all GML objects should be derived, +- a pattern and components for GML properties, +- patterns for collections and arrays, and components for generic collections and arrays, +- components for associating metadata with GML objects, +- components for constructing definitions and dictionaries. + + + + + + + This element has no type defined, and is therefore implicitly (according to the rules of W3C XML Schema) an XML Schema anyType. It is used as the head of an XML Schema substitution group which unifies complex content and certain simple content elements used for datatypes in GML, including the gml:AbstractGML substitution group. + + + + + The abstract element gml:AbstractGML is "any GML object having identity". It acts as the head of an XML Schema substitution group, which may include any element which is a GML feature, or other object, with identity. This is used as a variable in content models in GML core and application schemas. It is effectively an abstract superclass for all GML objects. + + + + + + + + + + + + + + + + + + + + XLink components are the standard method to support hypertext referencing in XML. An XML Schema attribute group, gml:AssociationAttributeGroup, is provided to support the use of Xlinks as the method for indicating the value of a property by reference in a uniform manner in GML. + + + + + + deprecated + + + + + + Applying this pattern shall restrict the multiplicity of objects in a property element using this content model to exactly one. An instance of this type shall contain an element representing an object, or serve as a pointer to a remote object. +Applying the pattern to define an application schema specific property type allows to restrict +- the inline object to specified object types, +- the encoding to "by-reference only" (see 7.2.3.7), +- the encoding to "inline only" (see 7.2.3.8). + + + + + + + + + + + + Encoding a GML property inline vs. by-reference shall not imply anything about the "ownership" of the contained or referenced GML Object, i.e. the encoding style shall not imply any "deep-copy" or "deep-delete" semantics. To express ownership over the contained or referenced GML Object, the gml:OwnershipAttributeGroup attribute group may be added to object-valued property elements. If the attribute group is not part of the content model of such a property element, then the value may not be "owned". +When the value of the owns attribute is "true", the existence of inline or referenced object(s) depends upon the existence of the parent object. + + + + + + This element shows how an element + declaration may include a Schematron constraint to limit the property to act + in either inline or by-reference mode, but not both. + + + + + gml:abstractReference may be used as the head of a subtitution group of more specific elements providing a value by-reference. + + + + + gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a "by-reference only" encoding. + + + + + + + + gml:abstractInlineProperty may be used as the head of a subtitution group of more specific elements providing a value inline. + + + + + + + + + + + If the value of an object property is another object and that object contains also a property for the association between the two objects, then this name of the reverse property may be encoded in a gml:reversePropertyName element in an appinfo annotation of the property element to document the constraint between the two properties. The value of the element shall contain the qualified name of the property element. + + + + + The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property. + + + + + The value of this property is a remote text description of the object. The xlink:href attribute of the gml:descriptionReference property references the external description. + + + + + The gml:name property provides a label or identifier for the object, commonly a descriptive name. An object may have several names, typically assigned by different authorities. gml:name uses the gml:CodeType content model. The authority for a name is indicated by the value of its (optional) codeSpace attribute. The name may or may not be unique, as determined by the rules of the organization responsible for the codeSpace. In common usage there will be one name per authority, so a processing application may select the name from its preferred codeSpace. + + + + + Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers. + + + + + The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs. + + + + + To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType. +This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects. +By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object. + + + + + + + + A GML Object Collection is any GML Object with a property element in its content model whose content model is derived by extension from gml:AbstractMemberType. +In addition, the complex type describing the content model of the GML Object Collection may also include a reference to the attribute group gml:AggregationAttributeGroup to provide additional information about the semantics of the object collection. This information may be used by applications to group GML objects, and optionally to order and index them. +The allowed values for the aggregationType attribute are defined by gml:AggregationType. See 8.4 of ISO/IEC 11404:1996 for the meaning of the values in the enumeration. + + + + + + + + + + + + + + + + To associate metadata described by any XML Schema with a GML object, a property element shall be defined whose content model is derived by extension from gml:AbstractMetadataPropertyType. +The value of such a property shall be metadata. The content model of such a property type, i.e. the metadata application schema shall be specified by the GML Application Schema. +By default, this abstract property type does not imply any ownership of the metadata. The owns attribute of gml:OwnershipAttributeGroup may be used on a metadata property element instance to assert ownership of the metadata. +If metadata following the conceptual model of ISO 19115 is to be encoded in a GML document, the corresponding Implementation Specification specified in ISO/TS 19139 shall be used to encode the metadata information. + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/grids.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/grids.xsd new file mode 100644 index 000000000..6a2b462c6 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/grids.xsd @@ -0,0 +1,58 @@ + + + + grids.xsd + See ISO/DIS 19136 20.2. +An implicit description of geometry is one in which the items of the geometry do not explicitly appear in the encoding. Instead, a compact notation records a set of parameters, and a set of objects may be generated using a rule with these parameters. This Clause provides grid geometries that are used in the description of gridded coverages and other applications. +In GML two grid structures are defined, namely gml:Grid and gml:RectifiedGrid. + + + + + The gml:Grid implicitly defines an unrectified grid, which is a network composed of two or more sets of curves in which the members of each set intersect the members of the other sets in an algorithmic way. The region of interest within the grid is given in terms of its gml:limits, being the grid coordinates of diagonally opposed corners of a rectangular region. gml:axisLabels is provided with a list of labels of the axes of the grid (gml:axisName has been deprecated). gml:dimension specifies the dimension of the grid. +The gml:limits element contains a single gml:GridEnvelope. The gml:low and gml:high property elements of the envelope are each integerLists, which are coordinate tuples, the coordinates being measured as offsets from the origin of the grid along each axis, of the diagonally opposing corners of a "rectangular" region of interest. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A rectified grid is a grid for which there is an affine transformation between the grid coordinates and the coordinates of an external coordinate reference system. It is defined by specifying the position (in some geometric space) of the grid "origin" and of the vectors that specify the post locations. +Note that the grid limits (post indexes) and axis name properties are inherited from gml:GridType and that gml:RectifiedGrid adds a gml:origin property (contains or references a gml:Point) and a set of gml:offsetVector properties. + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/measures.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/measures.xsd new file mode 100644 index 000000000..b03dce3d9 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/measures.xsd @@ -0,0 +1,63 @@ + + + + measures.xsd + See ISO/DIS 19136 17.3. +gml:MeasureType is defined in the basicTypes schema. The measure types defined here correspond with a set of convenience measure types described in ISO/TS 19103. The XML implementation is based on the XML Schema simple type "double" which supports both decimal and scientific notation, and includes an XML attribute "uom" which refers to the units of measure for the value. Note that, there is no requirement to store values using any particular format, and applications receiving elements of this type may choose to coerce the data to any other type as convenient. + + + + + + The value of a physical quantity, together with its unit. + + + + + This is a prototypical definition for a specific measure type defined as a vacuous extension (i.e. aliases) of gml:MeasureType. In this case, the content model supports the description of a length (or distance) quantity, with its units. The unit of measure referenced by uom shall be suitable for a length, such as metres or feet. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The gml:angle property element is used to record the value of an angle quantity as a single number, with its units. + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/observation.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/observation.xsd new file mode 100644 index 000000000..bb76b28d8 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/observation.xsd @@ -0,0 +1,90 @@ + + + + observation.xsd + See ISO/DIS 19136 Clause 19. +A GML observation models the act of observing, often with a camera, a person or some form of instrument. An observation feature describes the "metadata" associated with an information capture event, together with a value for the result of the observation. This covers a broad range of cases, from a tourist photo (not the photo but the act of taking the photo), to images acquired by space borne sensors or the measurement of a temperature 5 meters below the surfaces of a lake. +The basic structures introduced in this schema are intended to serve as the foundation for more comprehensive schemas for scientific, technical and engineering measurement schemas. + + + + + + + + The content model is a straightforward extension of gml:AbstractFeatureType; it automatically has the gml:identifier, gml:description, gml:descriptionReference, gml:name, and gml:boundedBy properties. +The gml:validTime element describes the time of the observation. Note that this may be a time instant or a time period. +The gml:using property contains or references a description of a sensor, instrument or procedure used for the observation. +The gml:target property contains or references the specimen, region or station which is the object of the observation. This property is particularly useful for remote observations, such as photographs, where a generic location property might apply to the location of the camera or the location of the field of view, and thus may be ambiguous. +The gml:subject element is provided as a convenient synonym for gml:target. This is the term commonly used in phtotography. +The gml:resultOf property indicates the result of the observation. The value may be inline, or a reference to a value elsewhere. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A gml:DirectedObservation is the same as an observation except that it adds an additional gml:direction property. This is the direction in which the observation was acquired. Clearly this applies only to certain types of observations such as visual observations by people, or observations obtained from terrestrial cameras. + + + + + + + + + + + + + + gml:DirectedObservationAtDistance adds an additional distance property. This is the distance from the observer to the subject of the observation. Clearly this applies only to certain types of observations such as visual observations by people, or observations obtained from terrestrial cameras. + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/referenceSystems.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/referenceSystems.xsd new file mode 100644 index 000000000..59629afaf --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/referenceSystems.xsd @@ -0,0 +1,64 @@ + + + + referenceSystems.xsd + See ISO/DIS 19136 13.2. +The reference systems schema components have two logical parts, which define elements and types for XML encoding of the definitions of: +- Identified Object, inherited by the ten types of GML objects used for coordinate reference systems and coordinate operations +- High-level part of the definitions of coordinate reference systems +This schema encodes the Identified Object and Reference System packages of the UML Model for ISO 19111. + + + + + + gml:IdentifiedObjectType provides identification properties of a CRS-related object. In gml:DefinitionType, the gml:identifier element shall be the primary name by which this object is identified, encoding the "name" attribute in the UML model. +Zero or more of the gml:name elements can be an unordered set of "identifiers", encoding the "identifier" attribute in the UML model. Each of these gml:name elements can reference elsewhere the object's defining information or be an identifier by which this object can be referenced. +Zero or more other gml:name elements can be an unordered set of "alias" alternative names by which this CRS related object is identified, encoding the "alias" attributes in the UML model. An object may have several aliases, typically used in different contexts. The context for an alias is indicated by the value of its (optional) codeSpace attribute. +Any needed version information shall be included in the codeSpace attribute of a gml:identifier and gml:name elements. In this use, the gml:remarks element in the gml:DefinitionType shall contain comments on or information about this object, including data source information. + + + + + + + + gml:AbstractCRS specifies a coordinate reference system which is usually single but may be compound. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document. + + + + + + + + + + + + + + + The gml:domainOfValidity property implements an association role to an EX_Extent object as encoded in ISO/TS 19139, either referencing or containing the definition of that extent. + + + + + + + + + + + The gml:scope property provides a description of the usage, or limitations of usage, for which this CRS-related object is valid. If unknown, enter "not known". + + + + + gml:CRSPropertyType is a property type for association roles to a CRS abstract coordinate reference system, either referencing or containing the definition of that CRS. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/temporal.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/temporal.xsd new file mode 100644 index 000000000..5e73a3fb2 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/temporal.xsd @@ -0,0 +1,263 @@ + + + + temporal.xsd + See ISO/DIS 19136 15.2. +The GML temporal schemas include components for describing temporal geometry and topology, temporal reference systems, and the temporal characteristics of geographic data. The model underlying the representation constitutes a profile of the conceptual schema described in ISO 19108. The underlying spatiotemporal model strives to accommodate both feature-level and attribute-level time stamping; basic support for tracking moving objects is also included. +Time is measured on two types of scales: interval and ordinal. An interval scale offers a basis for measuring duration, an ordinal scale provides information only about relative position in time. +Two other ISO standards are relevant to describing temporal objects: ISO 8601 describes encodings for time instants and time periods, as text strings with particular structure and punctuation; ISO 11404 provides a detailed description of time intervals as part of a general discussion of language independent datatypes. +The temporal schemas cover two interrelated topics and provide basic schema components for representing temporal instants and periods, temporal topology, and reference systems; more specialized schema components defines components used for dynamic features. Instances of temporal geometric types are used as values for the temporal properties of geographic features. + + + + + gml:AbstractTimeObject acts as the head of a substitution group for all temporal primitives and complexes. + + + + + + + + + + gml:AbstractTimePrimitive acts as the head of a substitution group for geometric and topological temporal primitives. + + + + + + + + + + + + + + gml:TimePrimitivePropertyType provides a standard content model for associations between an arbitrary member of the substitution group whose head is gml:AbstractTimePrimitive and another object. + + + + + + + + + + gml:validTime is a convenience property element. + + + + + gml:RelatedTimeType provides a content model for indicating the relative position of an arbitrary member of the substitution group whose head is gml:AbstractTimePrimitive. It extends the generic gml:TimePrimitivePropertyType with an XML attribute relativePosition, whose value is selected from the set of 13 temporal relationships identified by Allen (1983) + + + + + + + + + + + + + + + + + + + + + + + + + + + + gml:AbstractTimeComplex is an aggregation of temporal primitives and acts as the head of a substitution group for temporal complexes. + + + + + + + + + + gml:TimeGeometricPrimitive acts as the head of a substitution group for geometric temporal primitives. +A temporal geometry shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. The GPS calendar is an alternative reference systems in common use. +The two geometric primitives in the temporal dimension are the instant and the period. GML components are defined to support these as follows. + + + + + + + + + + + + gml:TimeInstant acts as a zero-dimensional geometric primitive that represents an identifiable position in time. + + + + + + + + + + + + + + gml:TimeInstantPropertyType provides for associating a gml:TimeInstant with an object. + + + + + + + + + + gml:TimePeriod acts as a one-dimensional geometric primitive that represents an identifiable extent in time. +The location in of a gml:TimePeriod is described by the temporal positions of the instants at which it begins and ends. The length of the period is equal to the temporal distance between the two bounding temporal positions. +Both beginning and end may be described in terms of their direct position using gml:TimePositionType which is an XML Schema simple content type, or by reference to an indentifiable time instant using gml:TimeInstantPropertyType. +Alternatively a limit of a gml:TimePeriod may use the conventional GML property model to make a reference to a time instant described elsewhere, or a limit may be indicated as a direct position. + + + + + + + + + + + + + + + + + + + + + + gml:TimePeriodPropertyType provides for associating a gml:TimePeriod with an object. + + + + + + + + + + The method for identifying a temporal position is specific to each temporal reference system. gml:TimePositionType supports the description of temporal position according to the subtypes described in ISO 19108. +Values based on calendars and clocks use lexical formats that are based on ISO 8601, as described in XML Schema Part 2:2001. A decimal value may be used with coordinate systems such as GPS time or UNIX time. A URI may be used to provide a reference to some era in an ordinal reference system . +In common with many of the components modelled as data types in the ISO 19100 series of International Standards, the corresponding GML component has simple content. However, the content model gml:TimePositionType is defined in several steps. +Three XML attributes appear on gml:TimePositionType: +A time value shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. Components for describing temporal reference systems are described in 14.4, but it is not required that the reference system be described in this, as the reference may refer to anything that may be indentified with a URI. +For time values using a calendar containing more than one era, the (optional) calendarEraName attribute provides the name of the calendar era. +Inexact temporal positions may be expressed using the optional indeterminatePosition attribute. This takes a value from an enumeration. + + + + + + + + + + + + These values are interpreted as follows: +- "unknown" indicates that no specific value for temporal position is provided. +- "now" indicates that the specified value shall be replaced with the current temporal position whenever the value is accessed. +- "before" indicates that the actual temporal position is unknown, but it is known to be before the specified value. +- "after" indicates that the actual temporal position is unknown, but it is known to be after the specified value. +A value for indeterminatePosition may +- be used either alone, or +- qualify a specific value for temporal position. + + + + + + + + + + + The simple type gml:TimePositionUnion is a union of XML Schema simple types which instantiate the subtypes for temporal position described in ISO 19108. + An ordinal era may be referenced via URI. A decimal value may be used to indicate the distance from the scale origin . time is used for a position that recurs daily (see ISO 19108:2002 5.4.4.2). + Finally, calendar and clock forms that support the representation of time in systems based on years, months, days, hours, minutes and seconds, in a notation following ISO 8601, are assembled by gml:CalDate + + + + + + + + + This element is used directly as a property of gml:TimeInstant (see 15.2.2.3), and may also be used in application schemas. + + + + + The length of a time period. + + + + + + + + + gml:duration conforms to the ISO 8601 syntax for temporal length as implemented by the XML Schema duration type. + + + + + gml:timeInterval conforms to ISO 11404 which is based on floating point values for temporal length. +ISO 11404 syntax specifies the use of a positiveInteger together with appropriate values for radix and factor. The resolution of the time interval is to one radix ^(-factor) of the specified time unit. +The value of the unit is either selected from the units for time intervals from ISO 31-1:1992, or is another suitable unit. The encoding is defined for GML in gml:TimeUnitType. The second component of this union type provides a method for indicating time units other than the six standard units given in the enumeration. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/temporalReferenceSystems.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/temporalReferenceSystems.xsd new file mode 100644 index 000000000..8f78dee55 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/temporalReferenceSystems.xsd @@ -0,0 +1,183 @@ + + + + temporalReferenceSystems.xsd + See ISO/DIS 19136 15.5. +A value in the time domain is measured relative to a temporal reference system. Common types of reference systems include calendars, ordinal temporal reference systems, and temporal coordinate systems (time elapsed since some epoch). The primary temporal reference system for use with geographic information is the Gregorian Calendar and 24 hour local or Coordinated Universal Time (UTC), but special applications may entail the use of alternative reference systems. The Julian day numbering system is a temporal coordinate system that has an origin earlier than any known calendar, at noon on 1 January 4713 BC in the Julian proleptic calendar, and is useful in transformations between dates in different calendars. +In GML seven concrete elements are used to describe temporal reference systems: gml:TimeReferenceSystem, gml:TimeCoordinateSystem, gml:TimeCalendar, gml:TimeCalendarEra, gml:TimeClock, gml:TimeOrdinalReferenceSystem, and gml:TimeOrdinalEra. + + + + + + A reference system is characterized in terms of its domain of validity: the spatial and temporal extent over which it is applicable. The basic GML element for temporal reference systems is gml:TimeReferenceSystem. Its content model extends gml:DefinitionType with one additional property, gml:domainOfValidity. + + + + + + + + + + + + + + A temporal coordinate system shall be based on a continuous interval scale defined in terms of a single time interval. +The differences to ISO 19108 TM_CoordinateSystem are: +- the origin is specified either using the property gml:originPosition whose value is a direct time position, or using the property gml:origin whose model is gml:TimeInstantPropertyType; this permits more flexibility in representation and also supports referring to a value fixed elsewhere; +- the interval uses gml:TimeIntervalLengthType. + + + + + + + + + + + + + + + + + + + A calendar is a discrete temporal reference system that provides a basis for defining temporal position to a resolution of one day. +gml:TimeCalendar adds one property to those inherited from gml:TimeReferenceSystem. A gml:referenceFrame provides a link to a gml:TimeCalendarEra that it uses. A gml:TimeCalendar may reference more than one calendar era. +The referenceFrame element follows the standard GML property model, allowing the association to be instantiated either using an inline description using the gml:TimeCalendarEra element, or a link to a gml:TimeCalendarEra which is explicit elsewhere. + + + + + + + + + + + + + + gml:TimeCalendarEra inherits basic properties from gml:DefinitionType and has the following additional properties: +- gml:referenceEvent is the name or description of a mythical or historic event which fixes the position of the base scale of the calendar era. This is given as text or using a link to description held elsewhere. +- gml:referenceDate specifies the date of the referenceEvent expressed as a date in the given calendar. In most calendars, this date is the origin (i.e., the first day) of the scale, but this is not always true. +- gml:julianReference specifies the Julian date that corresponds to the reference date. The Julian day number is an integer value; the Julian date is a decimal value that allows greater resolution. Transforming calendar dates to and from Julian dates provides a relatively simple basis for transforming dates from one calendar to another. +- gml:epochOfUse is the period for which the calendar era was used as a basis for dating. + + + + + + + + + + + + + + + + + gml:TimeCalendarPropertyType provides for associating a gml:TimeCalendar with an object. + + + + + + + + + + gml:TimeCalendarEraPropertyType provides for associating a gml:TimeCalendarEra with an object. + + + + + + + + + + A clock provides a basis for defining temporal position within a day. A clock shall be used with a calendar in order to provide a complete description of a temporal position within a specific day. +gml:TimeClock adds the following properties to those inherited from gml:TimeReferenceSystemType: +- gml:referenceEvent is the name or description of an event, such as solar noon or sunrise, which fixes the position of the base scale of the clock. +- gml:referenceTime specifies the time of day associated with the reference event expressed as a time of day in the given clock. The reference time is usually the origin of the clock scale. +- gml:utcReference specifies the 24 hour local or UTC time that corresponds to the reference time. +- gml:dateBasis contains or references the calendars that use this clock. + + + + + + + + + + + + + + + + + gml:TimeClockPropertyType provides for associating a gml:TimeClock with an object. + + + + + + + + + + In some applications of geographic information — such as geology and archaeology — relative position in time is known more precisely than absolute time or duration. The order of events in time can be well established, but the magnitude of the intervals between them cannot be accurately determined; in such cases, the use of an ordinal temporal reference system is appropriate. An ordinal temporal reference system is composed of a sequence of named coterminous eras, which may in turn be composed of sequences of member eras at a finer scale, giving the whole a hierarchical structure of eras of verying resolution. +An ordinal temporal reference system whose component eras are not further subdivided is effectively a temporal topological complex constrained to be a linear graph. An ordinal temporal reference system some or all of whose component eras are subdivided is effectively a temporal topological complex with the constraint that parallel branches may only be constructed in pairs where one is a single temporal ordinal era and the other is a sequence of temporal ordinal eras that are called "members" of the "group". This constraint means that within a single temporal ordinal reference system, the relative position of all temporal ordinal eras is unambiguous. +The positions of the beginning and end of a given era may calibrate the relative time scale. +gml:TimeOrdinalReferenceSystem adds one or more gml:component properties to the generic temporal reference system model. + + + + + + + + + + + + + + Its content model follows the pattern of gml:TimeEdge, inheriting standard properties from gml:DefinitionType, and adding gml:start, gml:end and gml:extent properties, a set of gml:member properties which indicate ordered gml:TimeOrdinalEra elements, and a gml:group property which points to the parent era. +The recursive inclusion of gml:TimeOrdinalEra elements allow the construction of an arbitrary depth hierarchical ordinal reference schema, such that an ordinal era at a given level of the hierarchy includes a sequence of shorter, coterminous ordinal eras. + + + + + + + + + + + + + + + + + + + gml:TimeOrdinalEraPropertyType provides for associating a gml:TimeOrdinalEra with an object. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/temporalTopology.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/temporalTopology.xsd new file mode 100644 index 000000000..6e4b1c641 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/temporalTopology.xsd @@ -0,0 +1,113 @@ + + + + temporalTopology.xsd + See ISO/DIS 19136 15.3. +Temporal topology is described in terms of time complexes, nodes, and edges, and the connectivity between these. Temporal topology does not directly provide information about temporal position. It is used in the case of describing a lineage or a history (e.g. a family tree expressing evolution of species, an ecological cycle, a lineage of lands or buildings, or a history of separation and merger of administrative boundaries). The following Subclauses specifies the temporal topology as temporal characteristics of features in compliance with ISO 19108. + + + + + gml:TimeTopologyPrimitive acts as the head of a substitution group for topological temporal primitives. +Temporal topology primitives shall imply the ordering information between features or feature properties. The temporal connection of features can be examined if they have temporal topology primitives as values of their properties. Usually, an instantaneous feature associates with a time node, and a static feature associates with a time edge. A feature with both modes associates with the temporal topology primitive: a supertype of time nodes and time edges. +A topological primitive is always connected to one or more other topological primitives, and is, therefore, always a member of a topological complex. In a GML instance, this will often be indicated by the primitives being described by elements that are descendents of an element describing a complex. However, in order to support the case where a temporal topological primitive is described in another context, the optional complex property is provided, which carries a reference to the parent temporal topological complex. + + + + + + + + + + + + + + gml:TimeTopologyPrimitivePropertyType provides for associating a gml:AbstractTimeTopologyPrimitive with an object. + + + + + + + + + + A temporal topology complex shall be the connected acyclic directed graph composed of temporal topological primitives, i.e. time nodes and time edges. Because a time edge may not exist without two time nodes on its boundaries, static features have time edges from a temporal topology complex as the values of their temporal properties, regardless of explicit declarations. +A temporal topology complex expresses a linear or a non-linear graph. A temporal linear graph, composed of a sequence of time edges, provides a lineage described only by "substitution" of feature instances or feature element values. A time node as the start or the end of the graph connects with at least one time edge. A time node other than the start and the end shall connect to at least two time edges: one of starting from the node, and another ending at the node. +A temporal topological complex is a set of connected temporal topological primitives. The member primtives are indicated, either by reference or by value, using the primitive property. + + + + + + + + + + + + + + gml:TimeTopologyComplexPropertyType provides for associating a gml:TimeTopologyComplex with an object. + + + + + + + + + + A time node is a zero-dimensional topological primitive that represents an identifiable node in time (it is equivalent to a point in space). A node may act as the termination or initiation of any number of time edges. A time node may be realised as a geometry, its position, whose value is a time instant. + + + + + + + + + + + + + + + + gml:TimeNodePropertyType provides for associating a gml:TimeNode with an object + + + + + + + + + + A time edge is a one-dimensional topological primitive. It is an open interval that starts and ends at a node. The edge may be realised as a geometry whose value is a time period. + + + + + + + + + + + + + + + + gml:TimeEdgePropertyType provides for associating a gml:TimeEdge with an object. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/topology.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/topology.xsd new file mode 100644 index 000000000..a4d265534 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/topology.xsd @@ -0,0 +1,380 @@ + + + + topology.xsd + See ISO/DIS 19136 Clause 14. +Topology is the branch of mathematics describing the properties of objects which are invariant under continuous deformation. For example, a circle is topologically equivalent to an ellipse because one can be transformed into the other by stretching. In geographic modelling, the foremost use of topology is in accelerating computational geometry. The constructs of topology allow characterisation of the spatial relationships between objects using simple combinatorial or algebraic algorithms. Topology, realised by the appropriate geometry, also allows a compact and unambiguous mechanism for expressing shared geometry among geographic features. +There are four instantiable classes of primitive topology objects, one for each dimension up to 3D. In addition, topological complexes are supported, too. +There is strong symmetry in the (topological boundary and coboundary) relationships between topology primitives of adjacent dimensions. Topology primitives are bounded by directed primitives of one lower dimension. The coboundary of each topology primitive is formed from directed topology primitives of one higher dimension. + + + + + This abstract type supplies the root or base type for all topological elements including primitives and complexes. It inherits AbstractGMLType and hence can be identified using the gml:id attribute. + + + + + + + + + + + + + + gml:AbstractTopoPrimitive acts as the base type for all topological primitives. Topology primitives are the atomic (smallest possible) units of a topology complex. +Each topology primitive may contain references to other topology primitives of codimension 2 or more (gml:isolated). Conversely, nodes may have faces as containers and nodes and edges may have solids as containers (gml:container). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In the case of planar topology, a gml:Node must have a clockwise sequence of gml:directedEdge properties, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology IPR). + + + + + + + + + + + gml:Node represents the 0-dimensional primitive. +The optional coboundary of a node (gml:directedEdge) is a sequence of directed edges which are incident on this node. Edges emanating from this node appear in the node coboundary with a negative orientation. +If provided, the aggregationType attribute shall have the value "sequence". +A node may optionally be realised by a 0-dimensional geometric primitive (gml:pointProperty). + + + + + A gml:directedNode property element describes the boundary of topology edges and is used in the support of topological point features via the gml:TopoPoint expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included node is used: start ("-") or end ("+") node. + + + + + + + + + + + + + + + + + + + + + + + + + + gml:Edge represents the 1-dimensional primitive. +The topological boundary of an Edge (gml:directedNode) consists of a negatively directed start Node and a positively directed end Node. +The optional coboundary of an edge (gml:directedFace) is a circular sequence of directed faces which are incident on this edge in document order. In the 2D case, the orientation of the face on the left of the edge is "+"; the orientation of the face on the right on its right is "-". +If provided, the aggregationType attribute shall have the value "sequence". +An edge may optionally be realised by a 1-dimensional geometric primitive (gml:curveProperty). + + + + + A gml:directedEdge property element describes the boundary of topology faces, the coBoundary of topology nodes and is used in the support of topological line features via the gml:TopoCurve expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included edge is used, i.e. forward or reverse. + + + + + + + + + + + + + + + + + + + + + + + If the topological representation exists an unbounded manifold (e.g. Euclidean plane), a gml:Face must indicate whether it is a universal face or not, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology IPR). The optional universal attribute of type boolean is used to indicate this. NOTE The universal face is normally not part of any feature, and is used to represent the unbounded portion of the data set. Its interior boundary (it has no exterior boundary) would normally be considered the exterior boundary of the map represented by the data set. + + + + + + + + gml:Face represents the 2-dimensional topology primitive. +The topological boundary of a face (gml:directedEdge) consists of a sequence of directed edges. If provided, the aggregationType attribute shall have the value "sequence". +The optional coboundary of a face (gml:directedTopoSolid) is a pair of directed solids which are bounded by this face. A positively directed solid corresponds to a solid which lies in the direction of the negatively directed normal to the face in any geometric realisation. +A face may optionally be realised by a 2-dimensional geometric primitive (gml:surfaceProperty). + + + + + The gml:directedFace property element describes the boundary of topology solids, in the coBoundary of topology edges and is used in the support of surface features via the gml:TopoSurface expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included face is used i.e. inward or outward with respect to the surface normal in any geometric realisation. + + + + + + + + + + + + + + + + + + + + + + A gml:TopoSolid must indicate whether it is a universal topo-solid or not, to ensure a lossless topology representation as defined by Kuijpers, et. al. (see OGC 05-102 Topology IPR). The optional universal attribute of type boolean is used to indicate this and the default is fault. NOTE The universal topo-solid is normally not part of any feature, and is used to represent the unbounded portion of the data set. Its interior boundary (it has no exterior boundary) would normally be considered the exterior boundary of the data set. + + + + + + + + gml:TopoSolid represents the 3-dimensional topology primitive. +The topological boundary of a solid (gml:directedFace) consists of a set of directed faces. +A solid may optionally be realised by a 3-dimensional geometric primitive (gml:solidProperty). + + + + + The gml:directedSolid property element describes the coBoundary of topology faces and is used in the support of volume features via the gml:TopoVolume expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included solid appears in the face coboundary. In the context of a gml:TopoVolume the orientation attribute has no meaning. + + + + + + + + + + + + + + + + + + + + + + The intended use of gml:TopoPoint is to appear within a point feature to express the structural and possibly geometric relationships of this feature to other features via shared node definitions. + + + + + + + + + + + The gml:topoPointProperty property element may be used in features to express their relationship to the referenced topology node. + + + + + + + + + + + + + + + gml:TopoCurve represents a homogeneous topological expression, a sequence of directed edges, which if realised are isomorphic to a geometric curve primitive. The intended use of gml:TopoCurve is to appear within a line feature to express the structural and geometric relationships of this feature to other features via the shared edge definitions. +If provided, the aggregationType attribute shall have the value "sequence". + + + + + + + + + + + The gml:topoCurveProperty property element may be used in features to express their relationship to the referenced topology edges. + + + + + + + + + + + + + + + gml:TopoSurface represents a homogeneous topological expression, a set of directed faces, which if realised are isomorphic to a geometric surface primitive. The intended use of gml:TopoSurface is to appear within a surface feature to express the structural and possibly geometric relationships of this surface feature to other features via the shared face definitions. + + + + + + + + + + + The gml:topoSurfaceProperty property element may be used in features to express their relationship to the referenced topology faces. + + + + + + + + + + + + + + + gml:TopoVolume represents a homogeneous topological expression, a set of directed topologic solids, which if realised are isomorphic to a geometric solid primitive. The intended use of gml:TopoVolume is to appear within a solid feature to express the structural and geometric relationships of this solid feature to other features via the shared solid definitions. + + + + + + + + + + + The gml:topoVolumeProperty element may be used in features to express their relationship to the referenced topology volume. + + + + + + + + + + + + + + + + + + + + gml:TopoComplex is a collection of topological primitives. +Each complex holds a reference to its maximal complex (gml:maximalComplex) and optionally to sub- or super-complexes (gml:subComplex, gml:superComplex). +A topology complex contains its primitive and sub-complex members. + + + + + + The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above. + + + + + The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above. + + + + + The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above. + + + + + The gml:topoPrimitiveMember property element encodes for the relationship between a topology complex and a single topology primitive. + + + + + + + + + + + + The gml:topoPrimitiveMembers property element encodes the relationship between a topology complex and an arbitrary number of topology primitives. + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/units.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/units.xsd new file mode 100644 index 000000000..f8205e8ac --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/units.xsd @@ -0,0 +1,156 @@ + + + + units.xsd + See ISO/DIS 17.2. +Several GML Schema components concern or require a reference scale or units of measure. Units are required for quantities that may occur as values of properties of feature types, as the results of observations, in the range parameters of a coverage, and for measures used in Coordinate Reference System definitions. +The basic unit definition is an extension of the general gml:Definition element defined in 16.2.1. Three specialized elements for unit definition are further derived from this. +This model is based on the SI system of units [ISO 1000], which distinguishes between Base Units and Derived Units. +- Base Units are the preferred units for a set of orthogonal fundamental quantities which define the particular system of units, which may not be derived by combination of other base units. +- Derived Units are the preferred units for other quantities in the system, which may be defined by algebraic combination of the base units. +In some application areas Conventional units are used, which may be converted to the preferred units using a scaling factor or a formula which defines a re-scaling and offset. The set of preferred units for all physical quantity types in a particular system of units is composed of the union of its base units and derived units. +Unit definitions are substitutable for the gml:Definition element declared as part of the dictionary model. A dictionary that contains only unit definitions and references to unit definitions is a units dictionary. + + + + + The element gml:unitOfMeasure is a property element to refer to a unit of measure. This is an empty element which carries a reference to a unit of measure definition. + + + + + + + + + A gml:UnitDefinition is a general definition of a unit of measure. This generic element is used only for units for which no relationship with other units or units systems is known. +The content model of gml:UnitDefinition adds three additional properties to gml:Definition, gml:quantityType, gml:quantityTypeReference and gml:catalogSymbol. +The gml:catalogSymbol property optionally gives the short symbol used for this unit. This element is usually used when the relationship of this unit to other units or units systems is unknown. + + + + + + + + + + + + + + + + The gml:quantityType property indicates the phenomenon to which the units apply. This element contains an informal description of the phenomenon or type of physical quantity that is measured or observed. When the physical quantity is the result of an observation or measurement, this term is known as observable type or measurand. +The use of gml:quantityType for references to remote values is deprecated. + + + + + The gml:quantityTypeReference property indicates the phenomenon to which the units apply. The content is a reference to a remote value. + + + + + The catalogSymbol is the preferred lexical symbol used for this unit of measure. +The codeSpace attribute in gml:CodeType identifies a namespace for the catalog symbol value, and might reference the external catalog. The string value in gml:CodeType contains the value of a symbol that should be unique within this catalog namespace. This symbol often appears explicitly in the catalog, but it could be a combination of symbols using a specified algebra of units. + + + + + A base unit is a unit of measure that cannot be derived by combination of other base units within a particular system of units. For example, in the SI system of units, the base units are metre, kilogram, second, Ampere, Kelvin, mole, and candela, for the physical quantity types length, mass, time interval, electric current, thermodynamic temperature, amount of substance and luminous intensity, respectively. +gml:BaseUnit extends generic gml:UnitDefinition with the property gml:unitsSystem, which carries a reference to the units system to which this base unit is asserted to belong. + + + + + + + + + + + + + + Derived units are defined by combination of other units. Derived units are used for quantities other than those corresponding to the base units, such as hertz (s-1) for frequency, Newton (kg.m/s2) for force. Derived units based directly on base units are usually preferred for quantities other than the fundamental quantities within a system. If a derived unit is not the preferred unit, the gml:ConventionalUnit element should be used instead. +The gml:DerivedUnit extends gml:UnitDefinition with the property gml:derivationUnitTerms. + + + + + + + + + + + + + + A set of gml:derivationUnitTerm elements describes a derived unit of measure. Each element carries an integer exponent. The terms are combined by raising each referenced unit to the power of its exponent and forming the product. +This unit term references another unit of measure (uom) and provides an integer exponent applied to that unit in defining the compound unit. The exponent may be positive or negative, but not zero. + + + + + + + + + + + + Conventional units that are neither base units nor defined by direct combination of base units are used in many application domains. For example electronVolt for energy, feet and nautical miles for length. In most cases there is a known, usually linear, conversion to a preferred unit which is either a base unit or derived by direct combination of base units. +The gml:ConventionalUnit extends gml:UnitDefinition with a property that describes a conversion to a preferred unit for this physical quantity. When the conversion is exact, the element gml:conversionToPreferredUnit should be used, or when the conversion is not exact the element gml:roughConversionToPreferredUnit is available. Both of these elements have the same content model. The gml:derivationUnitTerm property defined above is included to allow a user to optionally record how this unit may be derived from other ("more primitive") units. + + + + + + + + + + + + + + + + + + The elements gml:conversionToPreferredUnit and gml:roughConversionToPreferredUnit represent parameters used to convert conventional units to preferred units for this physical quantity type. A preferred unit is either a Base Unit or a Derived Unit that is selected for all values of one physical quantity type. + + + + + The elements gml:conversionToPreferredUnit and gml:roughConversionToPreferredUnit represent parameters used to convert conventional units to preferred units for this physical quantity type. A preferred unit is either a Base Unit or a Derived Unit that is selected for all values of one physical quantity type. + + + + + The inherited attribute uom references the preferred unit that this conversion applies to. The conversion of a unit to the preferred unit for this physical quantity type is specified by an arithmetic conversion (scaling and/or offset). The content model extends gml:UnitOfMeasureType, which has a mandatory attribute uom which identifies the preferred unit for the physical quantity type that this conversion applies to. The conversion is specified by a choice of +- gml:factor, which defines the scale factor, or +- gml:formula, which defines a formula +by which a value using the conventional unit of measure can be converted to obtain the corresponding value using the preferred unit of measure. +The formula defines the parameters of a simple formula by which a value using the conventional unit of measure can be converted to the corresponding value using the preferred unit of measure. The formula element contains elements a, b, c and d, whose values use the XML Schema type double. These values are used in the formula y = (a + bx) / (c + dx), where x is a value using this unit, and y is the corresponding value using the base unit. The elements a and d are optional, and if values are not provided, those parameters are considered to be zero. If values are not provided for both a and d, the formula is equivalent to a fraction with numerator and denominator parameters. + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gml/valueObjects.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gml/valueObjects.xsd new file mode 100644 index 000000000..a8f5ac96b --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gml/valueObjects.xsd @@ -0,0 +1,199 @@ + + + + valueObjects.xsd + See ISO/DIS 19136 17.5. +The elements declared in this Clause build on other GML schema components, in particular gml:AbstractTimeObject, gml:AbstractGeometry, and the following types: gml:MeasureType, gml:MeasureListType, gml:CodeType, gml:CodeOrNilReasonListType, gml:BooleanOrNilReasonListType, gml:IntegerOrNilReasonList. +Of particular interest are elements that are the heads of substitution groups, and one named choice group. These are the primary reasons for the value objects schema, since they may act as variables in the definition of content models, such as Observations, when it is desired to permit alternative value types to occur some of which may have complex content such as arrays, geometry and time objects, and where it is useful not to prescribe the actual value type in advance. The members of the groups include quantities, category classifications, boolean, count, temporal and spatial values, and aggregates of these. +The value objects are defined in a hierarchy. The following relationships are defined: +- Concrete elements gml:Quantity, gml:Category, gml:Count and gml:Boolean are substitutable for the abstract element gml:AbstractScalarValue. +- Concrete elements gml:QuantityList, gml:CategoryList, gml:CountList and gml:BooleanList are substitutable for the abstract element gml:AbstractScalarValueList. +- Concrete element gml:ValueArray is substitutable for the concrete element gml:CompositeValue. +- Abstract elements gml:AbstractScalarValue and gml:AbstractScalarValueList, and concrete elements gml:CompositeValue, gml:ValueExtent, gml:CategoryExtent, gml:CountExtent and gml:QuantityExtent are substitutable for abstract element gml:AbstractValue. +- Abstract elements gml:AbstractValue, gml:AbstractTimeObject and gml:AbstractGeometry are all in a choice group named gml:Value, which is used for compositing in gml:CompositeValue and gml:ValueExtent. +- Schemas which need values may use the abstract element gml:AbstractValue in a content model in order to permit any of the gml:AbstractScalarValues, gml:AbstractScalarValueLists, gml:CompositeValue or gml:ValueExtent to occur in an instance, or the named group gml:Value to also permit gml:AbstractTimeObjects, gml:AbstractGeometrys. + + + + + + + + + + + + + + + + A gml:Category has an optional XML attribute codeSpace, whose value is a URI which identifies a dictionary, codelist or authority for the term. + + + + + + + + + + + + + + + + + + + + + + + An XML attribute uom ("unit of measure") is required, whose value is a URI which identifies the definition of a ratio scale or units by which the numeric value shall be multiplied, or an interval or position scale on which the value occurs. + + + + + + + + + + + + + gml:AbstractValue is an abstract element which acts as the head of a substitution group which contains gml:AbstractScalarValue, gml:AbstractScalarValueList, gml:CompositeValue and gml:ValueExtent, and (transitively) the elements in their substitution groups. +These elements may be used in an application schema as variables, so that in an XML instance document any member of its substitution group may occur. + + + + + gml:AbstractScalarValue is an abstract element which acts as the head of a substitution group which contains gml:Boolean, gml:Category, gml:Count and gml:Quantity, and (transitively) the elements in their substitution groups. + + + + + gml:AbstractScalarValueList is an abstract element which acts as the head of a substitution group which contains gml:BooleanList, gml:CategoryList, gml:CountList and gml:QuantityList, and (transitively) the elements in their substitution groups. + + + + + This is a convenience choice group which unifies generic values defined in this Clause with spatial and temporal objects and the measures described above, so that any of these may be used within aggregate values. + + + + + + + + + + + Property that refers to, or contains, a Value. Convenience element for general use. + + + + + Property that refers to, or contains, a Value. + + + + + + + + + + + + Property that contains Values. + + + + + + + + + + + gml:CompositeValue is an aggregate value built from other values . It contains zero or an arbitrary number of gml:valueComponent elements, and zero or one gml:valueComponents property elements. It may be used for strongly coupled aggregates (vectors, tensors) or for arbitrary collections of values. + + + + + + + + + + + + + + + + A Value Array is used for homogeneous arrays of primitive and aggregate values. +The member values may be scalars, composites, arrays or lists. +ValueArray has the same content model as CompositeValue, but the member values shall be homogeneous. The element declaration contains a Schematron constraint which expresses this restriction precisely. Since the members are homogeneous, the gml:referenceSystem (uom, codeSpace) may be specified on the gml:ValueArray itself and inherited by all the members if desired. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gmx/ReadMe.txt new file mode 100644 index 000000000..1f4f717fd --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/ReadMe.txt @@ -0,0 +1,37 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gmx from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas modified as follows : + +- uomItem.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- uomItem.xsd line9: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" + +- codelistItem.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- codelistItem.xsd line9: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" + +- crsItem.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- crsItem.xsd line8: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/catalogues.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/catalogues.xsd new file mode 100644 index 000000000..6746f226c --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/catalogues.xsd @@ -0,0 +1,112 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-27-2005 17:16:11 ====== Handcrafted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/codelistItem.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/codelistItem.xsd new file mode 100644 index 000000000..ff4e25a77 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/codelistItem.xsd @@ -0,0 +1,168 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 03-15-2005 09:14:50 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Constraints: - 1) metadataProperty.card = 0 - 2) dictionaryEntry.card = 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Constraint: codeEntry.type = ML_CodeListDefinition + + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/crsItem.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/crsItem.xsd new file mode 100644 index 000000000..36ba8c159 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/crsItem.xsd @@ -0,0 +1,1030 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 03-15-2005 09:15:11 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/extendedTypes.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/extendedTypes.xsd new file mode 100644 index 000000000..c1f477389 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/extendedTypes.xsd @@ -0,0 +1,76 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 03-14-2005 12:00:20 ====== Handcrafted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/gmx.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/gmx.xsd new file mode 100644 index 000000000..aa0ab2721 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/gmx.xsd @@ -0,0 +1,2 @@ + +This file was generated from ISO TC/211 UML class diagrams == 03-18-2005 11:12:17 ====== \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/gmxUsage.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/gmxUsage.xsd new file mode 100644 index 000000000..e9b4b7f9a --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/gmxUsage.xsd @@ -0,0 +1,127 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 04-27-2005 17:15:30 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gmx/uomItem.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gmx/uomItem.xsd new file mode 100644 index 000000000..8283692b5 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gmx/uomItem.xsd @@ -0,0 +1,162 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 03-15-2005 09:15:02 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gsr/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gsr/ReadMe.txt new file mode 100644 index 000000000..b9159f792 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gsr/ReadMe.txt @@ -0,0 +1,17 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gsr from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas modified as follows : + +- spatialReferencing.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- spatialReferencing.xsd line9: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gsr/gsr.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gsr/gsr.xsd new file mode 100644 index 000000000..8f7f428dd --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gsr/gsr.xsd @@ -0,0 +1,12 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:24:48 ====== + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gsr/spatialReferencing.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gsr/spatialReferencing.xsd new file mode 100644 index 000000000..524766e6b --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gsr/spatialReferencing.xsd @@ -0,0 +1,24 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:24:48 ====== + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gss/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gss/ReadMe.txt new file mode 100644 index 000000000..7fc97afdb --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gss/ReadMe.txt @@ -0,0 +1,17 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gco from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas modified as follows : + +- geometry.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- geometry.xsd line8: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gss/geometry.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gss/geometry.xsd new file mode 100644 index 000000000..0c920e00f --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gss/geometry.xsd @@ -0,0 +1,35 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:14:37 ====== The geometry packages (Figure 4) contain the various classes for coordinate geometry. All of these classes through the root class GM_Object inherit an optional association to a coordinate reference system. All direct positions exposed through the interfaces defined in this standard shall be in the coordinate reference system of the geometric object accessed. All elements of a geometric complex, composite, or aggregate shall be associated to the same coordinate reference system. When instances of GM_Object are aggregated in another GM_Object (such as a GM_Aggregate, or GM_Complex) which already has a coordinate reference system specified, then these elements are assumed to be in that same coordinate reference system unless otherwise specified. - The geometry package has several internal packages that separate primitive geometric objects, aggregates and complexes, which have a more elaborate internal structure than simple aggregates. Figure 4 shows the dependencies between the geometry packages as well as a list of classes for each package - Figure 5 shows the basic classes defined in the geometry packages. Any object that inherits the semantics of the GM_Object acts as a set of direct positions. Its behavior will be determined by which direct positions it contains. Objects under GM_Primitive will be open, that is, they will not contain their boundary points; curves will not contain their end points, surfaces will not contain their boundary curves, and solids will not contain their bounding surfaces. Objects under GM_Complex will be closed, that is, they will contain their boundary points. This leads to some apparent ambiguity. A representation of a line as a primitive must reference its end points, but will not contain these points as a set of direct positions. A representation of a line as a complex will also reference its end points, and will contain these points as a set of direct positions. This means that identical digital representations will have slightly different semantics depending on whether they are accessed as primitives or complexes. - This difference of semantics is most striking in the GM_CompositeCurve. Composite curves are used to represent features whose geometry could also be represented as curve primitives. From a cartographic point of view, these two representations are not different. From a topological point of view, they are different. This distinction appears in the inheritance diagram (Figure 5) as an inheritance relationship between GM_CompositeCurve and GM_OrientableCurve. The primary semantics of a GM_CompositeCurve (see 6.6.5) is as a closed GM_Object, but it may also act as an open GM_Object under GM_Primitive operations (see 6.3.10). Interface protocols depending upon the topological details of this object will have to be distinguished as to whether they have been inherited from GM_Primitive or GM_Complex, where the distinction first occurs. Even though these protocols have been inherited from the same operations defined at GM_Object, they will act differently depending upon the branch of the inheritance tree from which they have inherited semantics. Creators of implementation profiles may take this into account and use a proxy mechanism for realization relationships that cause semantic dissonance. Such a procedure will be necessary in object-oriented programming and databases in systems that disallow multiple inheritance or make limiting assumptions about method binding. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gss/gss.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gss/gss.xsd new file mode 100644 index 000000000..f8cac1855 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gss/gss.xsd @@ -0,0 +1,12 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:14:37 ====== This package contains the normative (Geometry and Topology) parts of the model for ISO 19107. This document should be referred to as the official description of the Model. If there are any differences, then ISO 19107 takes precedence. - - This packages also contains example (informative) of applications of 19107. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gts/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/gts/ReadMe.txt new file mode 100644 index 000000000..8e314fe10 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gts/ReadMe.txt @@ -0,0 +1,17 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package gts from Eden repository (http://eden.ign.fr/xsd) 2008-06-26 full release of ISO/TC211 schemas modified as follows : + +- temporalObjects.xsd line2: +xmlns:gml="http://www.opengis.net/gml" +replaced by +xmlns:gml="http://www.opengis.net/gml/3.2" + +- temporalObjects.xsd line8: +namespace="http://www.opengis.net/gml" +replaced by +namespace="http://www.opengis.net/gml/3.2" diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gts/gts.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gts/gts.xsd new file mode 100644 index 000000000..a4edb52ce --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gts/gts.xsd @@ -0,0 +1,12 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:18:09 ====== + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/gts/temporalObjects.xsd b/wpsg-xml/src/main/schemas/ISO_19139/gts/temporalObjects.xsd new file mode 100644 index 000000000..e822718dc --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/gts/temporalObjects.xsd @@ -0,0 +1,34 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:18:09 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/ML_gmxCodelists.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/ML_gmxCodelists.xml new file mode 100644 index 000000000..a3d481dad --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/ML_gmxCodelists.xml @@ -0,0 +1,829 @@ + + + + + ML_gmxCodelists + + + Codelists for description of metadata datasets compliant with ISO/TC 211 19115:2003 and 19139 + + + Listes de codes pour la description de lots de métadonnées conforme ISO TC/211 19115:2003 et 19139 + + + + + GMX (and imported) namespace + + + 0.0 + + + 2005-03-18 + + + + + English + + + UTF 8 + + + + + + French + + + France + + + UTF 8 + + + + + + + + + + identification of when a given event occurred + CI_DateTypeCode + + + date identifies when the resource was brought into existence + creation + creation + + + date identifiant la création de la ressource + creation + création + + + + + + + + date identifies when the resource was issued + publication + publication + + + date identifiant la publication de la ressource + publication + publication + + + + + + + + date identifies when the resource was examined or re-examined and imporved or amended + revision + revision + + + amélioration ou amendement de la ressource + revision + révision + + + + + + + + identification de quand un événement s'est produit + CI_DateTypeCode + + + + + + + + + function performed by the resource + CI_OnLineFunctionCode + + + online instructions for transferring data from one storage device or system to another + download + Download + + + transfert de la ressource d'un système à un autre + download + Téléchargement + + + + + + + + online information about the resource + information + Information + + + description de la ressource en ligne + information + Information + + + + + + + + online instructions for requesting the resource from the provider + offlineAccess + Off line access + + + information pour requérir la ressource + offlineAccess + Accès hors ligne + + + + + + + + online order process for obtening the resource + order + Order + + + formulaire pour obtenir la ressource + order + commande en ligne + + + + + + + + online search interface for seeking out information about the resource + search + Search + + + interface de recherche d'information sur la ressource + search + Moteur de recherche + + + + + + + + Fonctionnalité offerte par la ressource + CI_OnLineFunctionCode + + + + + + + + + name of the character coding standard used in the resource + MD_CharacterSetCode + + + 16-bit fixed size Universal Character Set, based on ISO/IEC 10646 + ucs2 + + + 16 bits ISO/IEC 10646 + ucs2 + + + + + + + + 32-bit fixed size Universal Character Set, based on ISO/IEC 10646 + ucs4 + + + 32 bits ISO/IEC 10646 + ucs4 + + + + + + + + 7-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + utf7 + + + 7 bits ISO/IEC 10646 + utf7 + + + + + + + + 8-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + utf8 + + + 8 bits ISO/IEC 10646 + utf8 + + + + + + + + 16-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + utf16 + + + 16 bits ISO/IEC 10646 + utf16 + + + + + + + + ISO/IEC 8859-1, Information technology - 8-bit single byte coded graphic character sets - Part 1 : Latin alphabet No.1 + 8859part1 + + + ISO/IEC 8859-1, alphabet latin 1 + 8859part1 + + + + + + + + ISO/IEC 8859-2, Information technology - 8-bit single byte coded graphic character sets - Part 2 : Latin alphabet No.2 + 8859part2 + + + ISO/IEC 8859-2, alphabet latin 2 + 8859part2 + + + + + + + + ISO/IEC 8859-3, Information technology - 8-bit single byte coded graphic character sets - Part 3 : Latin alphabet No.3 + 8859part3 + + + ISO/IEC 8859-3, alphabet latin 3 + 8859part3 + + + + + + + + ISO/IEC 8859-4, Information technology - 8-bit single byte coded graphic character sets - Part 4 : Latin alphabet No.4 + 8859part4 + + + ISO/IEC 8859-4, alphabet latin 4 + 8859part4 + + + + + + + + ISO/IEC 8859-5, Information technology - 8-bit single byte coded graphic character sets - Part 5 : Latin/Cyrillic alphabet + 8859part5 + + + ISO/IEC 8859-5, alphabet latin/cyrillique + 8859part5 + + + + + + + + ISO/IEC 8859-6, Information technology - 8-bit single byte coded graphic character sets - Part 6 : Latin/Arabic alphabet + 8859part6 + + + ISO/IEC 8859-6, alphabet latin/arabe + 8859part6 + + + + + + + + ISO/IEC 8859-7, Information technology - 8-bit single byte coded graphic character sets - Part 7 : Latin/Greek alphabet + 8859part7 + + + ISO/IEC 8859-7, alphabet latin/grec + 8859part7 + + + + + + + + ISO/IEC 8859-8, Information technology - 8-bit single byte coded graphic character sets - Part 8 : Latin/Hebrew alphabet + 8859part8 + + + ISO/IEC 8859-8, alphabet latin/hébreu + 8859part8 + + + + + + + + ISO/IEC 8859-9, Information technology - 8-bit single byte coded graphic character sets - Part 9 : Latin alphabet No.5 + 8859part9 + + + ISO/IEC 8859-9, alphabet latin 5 + 8859part9 + + + + + + + + ISO/IEC 8859-10, Information technology - 8-bit single byte coded graphic character sets - Part 10 : Latin alphabet No.6 + 8859part10 + + + ISO/IEC 8859-10, alphabet latin 6 + 8859part10 + + + + + + + + ISO/IEC 8859-11, Information technology - 8-bit single byte coded graphic character sets - Part 11 : Latin/Thai alphabet + 8859part11 + + + ISO/IEC 8859-11, alphabet latin/Thaï + 8859part11 + + + + + + + + + ISO/IEC 8859-13, Information technology - 8-bit single byte coded graphic character sets - Part 13 : Latin alphabet No.7 + 8859part13 + + + ISO/IEC 8859-13, alphabet latin 7 + 8859part13 + + + + + + + + ISO/IEC 8859-14, Information technology - 8-bit single byte coded graphic character sets - Part 14 : Latin alphabet No.8 (Celtic) + 8859part14 + + + ISO/IEC 8859-14, alphabet latin 8 (celtique) + 8859part14 + + + + + + + + ISO/IEC 8859-15, Information technology - 8-bit single byte coded graphic character sets - Part 15 : Latin alphabet No.9 + 8859part15 + + + ISO/IEC 8859-15, alphabet latin 9 + 8859part15 + + + + + + + + ISO/IEC 8859-16, Information technology - 8-bit single byte coded graphic character sets - Part 16 : Latin alphabet No.10 + 8859part16 + + + ISO/IEC 8859-16, alphabet latin 10 + 8859part16 + + + + + + + + japanese code set used for electronic transmission + jis + + + Japonais + jis + + + + + + + + japanese code set used on MS-DOS machines + shiftJIS + + + Japonais pour MS-DOS + shiftJIS + + + + + + + + japanese code set used on UNIX based machines + eucJP + + + Japonais pour UNIX + eucJP + + + + + + + + United States ASCII code set (ISO 646 US) + usAscii + + + ISO 646 US + usAscii + + + + + + + + IBM mainframe code set + ebcdic + + + IBM + ebcdic + + + + + + + + Korean code set + eucKR + + + Koréen + eucKR + + + + + + + + traditional Chinese code set used in Taiwan, Hong Kong of China and other areas + big5 + + + Chinois traditionel (Taiwan, Hong Kong, Chine) + big5 + + + + + + + + simplified Chinese code set + GB2312 + + + Chinois simplifié + GB2312 + + + + + + + + Jeu de caractères + MD_CharacterSetCode + + + + + + + + + class of information to which the referencing entity applies + MD_ScopeCode + + + Information applies to the attribute class + attribute + Attribute + + + Information qui s’applique à une classe d’attributs + attribute + Attribut + + + + + + + + Information applies to the characteristic of a feature + attributeType + Attribute type + + + Information qui s’applique à la caractéristique d’une entité géographique + attributeType + Type d’attribut + + + + + + + + Information applies to the dataset + dataset + Dataset + + + Information qui s’applique au jeu de données + dataset + Jeu de données + + + + + + Information applies to the dataset + dataset + 005 + + + + + + + Information applies to the series + series + Series + + + Information qui s’applique à une série + series + Série + + + + + + + + Information applies to non-geographic data + nonGeographicDataset + Non geographic dataset + + + Information qui s’applique à des données non-géographiques + nonGeographicDataset + Jeu de données non géographiques + + + + + + + + Information applies to a feature + feature + Feature + + + Information qui s’applique à un élément (entité géographique) + feature + Elément + + + + + + + + Information applies to a feature type + featureType + Feature type + + + Information qui s’applique à un type d’élément + featureType + Type d’élément + + + + + + + + Information applies to a property type + propertyType + Property type + + + Information qui s’applique à un type de propriété + propertyType + Type de propriété + + + + + + + + Information applies to a tile, a spatial subset of geographic data + tile + Tile + + + Information qui s’applique à une tuile, un sous-ensemble spatial de données géographiques + tile + Tuile + + + + + + + + information sur l'entité sur laquelle les métadonnées s'appliquent + MD_ScopeCode + + + + + + + + + + Language : ISO 639-2 (3 characters) + LanguageCode + + + English + eng + English + + + Anglais + eng + Anglais + + + + + + + + French + fra + French + + + Français + fra + Français + + + + + + + + Langue : ISO 639-2 (3 caractères) + LanguageCode + + + + + + + + + Country : ISO 3166-2 (2 characters) + Country + + + United Kingdom + UK + United Kingdom + + + Royaume-Uni + UK + Royaume-Uni + + + + + + + + France + FR + France + + + France + FR + France + + + + + + + + Pays : ISO 3166-2 (2 caractères) + Country + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/gmxCodelists.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/gmxCodelists.xml new file mode 100644 index 000000000..5195b2354 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/gmxCodelists.xml @@ -0,0 +1,1879 @@ + + + + + + gmxCodelists + + + Codelists for description of metadata datasets compliant with ISO/TC 211 19115:2003 and 19139 + + + GMX (and imported) namespace + + + 0.0 + + + 2005-03-18 + + + + + + + + identification of when a given event occurred + CI_DateTypeCode + + + date identifies when the resource was brought into existence + creation + + + + + date identifies when the resource was issued + publication + + + + + date identifies when the resource was examined or re-examined and imporved or amended + revision + + + + + + + + function performed by the resource + CI_OnLineFunctionCode + + + online instructions for transferring data from one storage device or system to another + download + + + + + online information about the resource + information + + + + + online instructions for requesting the resource from the provider + offlineAccess + + + + + online order process for obtening the resource + order + + + + + online search interface for seeking out information about the resource + search + + + + + + + + mode in which the data is represented + CI_PresentationFormCode + + + digital representation of a primarily textual item (can contain illustrations also) + documentDigital + + + + + representation of a primarily textual item (can contain illustrations also) on paper, photograhic material, or other media + imageDigital + + + + + likeness of natural or man-made features, objects, and activities acquired through the sensing of visual or any other segment of the electromagnetic spectrum by sensors, such as thermal infrared, and high resolution radar and stored in digital format + documentHardcopy + + + + + likeness of natural or man-made features, objects, and activities acquired through the sensing of visual or any other segment of the electromagnetic spectrum by sensors, such as thermal infrared, and high resolution radar and reproduced on paper, photographic material, or other media for use directly by the human user + imageHardcopy + + + + + map represented in raster or vector form + mapDigital + + + + + map printed on paper, photographic material, or other media for use directly by the human user + mapHardcopy + + + + + multi-dimensional digital representation of a feature, process, etc. + modelDigital + + + + + 3-dimensional, physical model + modelHardcopy + + + + + vertical cross-section in digital form + profileDigital + + + + + vertical cross-section printed on paper, etc. + profileHardcopy + + + + + digital representation of facts or figures systematically displayed, especially in columns + tableDigital + + + + + representation of facts or figures systematically displayed, especially in columns, printed onpapers, photographic material, or other media + tableHardcopy + + + + + digital video recording + videoDigital + + + + + video recording on film + videoHardcopy + + + + + + + + function performed by the responsible party + CI_RoleCode + + + party that supplies the resource + resourceProvider + + + + + party that accepts accountability and responsability for the data and ensures appropriate care and maintenance of the resource + custodian + + + + + party that owns the resource + owner + + + + + party who uses the resource + user + + + + + party who distributes the resource + distributor + + + + + party who created the resource + originator + + + + + party who can be contacted for acquiring knowledge about or acquisition of the resource + pointOfContact + + + + + key party responsible for gathering information and conducting research + principalInvestigator + + + + + party wha has processed the data in a manner such that the resource has been modified + processor + + + + + party who published the resource + publisher + + + + + party who authored the resource + author + + + + + + + + type or method for evaluating an identified data quality measure + DQ_EvaluationMethodTypeCode + + + method of evaluating the quality of a dataset based on inspection of items within the dataset, where all data required is internal to the dataset being evaluated + directInternal + + + + + method of evaluating the quality of a dataset based on inspection of items within the dataset, where reference data external to the dataset being evaluated is required + directExternal + + + + + method of evaluating the quality of a dataset based on external knowledge + indirect + + + + + + + + justification for the correlation of two datasets + DS_AssociationTypeCode + + + reference from one dataset to another + crossReference + + + + + reference to a master dataset of which this one is a part + largerWorkCitation + + + + + part of the same structured set of data held in a computer + partOfSeamlessDatabase + + + + + mapping and charting information from which the dataset content originates + source + + + + + part of a set of imagery that when used together, provides three-dimensional images + stereoMate + + + + + + + + type of aggregation activity in which datasets are related + DS_InitiativeTypeCode + + + series of organized planned actions + campaign + + + + + accumulation of datasets assembled for a specific purpose + collection + + + + + specific performance of a function or group of functions + exercise + + + + + process designed to find if something is effective or valid + experiment + + + + + search or systematic inquiry + investigation + + + + + specific operation of a data collection system + mission + + + + + device or piece of equipment which detects or records + sensor + + + + + action that is part of a series of actions + operation + + + + + vehicle or other support base that holds a sensor + platform + + + + + method of doing something involving a number of steps + process + + + + + specific planned activity + program + + + + + organized undertaking, research, or development + project + + + + + examination or investigation + study + + + + + piece of work + task + + + + + process of testing to discover or demonstrate something + trial + + + + + + + + code indicating whether grid data is point or area + MD_CellGeometryCode + + + each cell represents a point + point + + + + + each cell represents an area + area + + + + + + + + name of the character coding standard used in the resource + MD_CharacterSetCode + + + 16-bit fixed size Universal Character Set, based on ISO/IEC 10646 + ucs2 + + + + + 32-bit fixed size Universal Character Set, based on ISO/IEC 10646 + ucs4 + + + + + 7-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + utf7 + + + + + 8-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + utf8 + + + + + 16-bit variable size UCS Transfer Format, based on ISO/IEC 10646 + utf16 + + + + + ISO/IEC 8859-1, Information technology - 8-bit single byte coded graphic character sets - Part 1 : Latin alphabet No.1 + 8859part1 + + + + + ISO/IEC 8859-2, Information technology - 8-bit single byte coded graphic character sets - Part 2 : Latin alphabet No.2 + 8859part2 + + + + + ISO/IEC 8859-3, Information technology - 8-bit single byte coded graphic character sets - Part 3 : Latin alphabet No.3 + 8859part3 + + + + + ISO/IEC 8859-4, Information technology - 8-bit single byte coded graphic character sets - Part 4 : Latin alphabet No.4 + 8859part4 + + + + + ISO/IEC 8859-5, Information technology - 8-bit single byte coded graphic character sets - Part 5 : Latin/Cyrillic alphabet + 8859part5 + + + + + ISO/IEC 8859-6, Information technology - 8-bit single byte coded graphic character sets - Part 6 : Latin/Arabic alphabet + 8859part6 + + + + + ISO/IEC 8859-7, Information technology - 8-bit single byte coded graphic character sets - Part 7 : Latin/Greek alphabet + 8859part7 + + + + + ISO/IEC 8859-8, Information technology - 8-bit single byte coded graphic character sets - Part 8 : Latin/Hebrew alphabet + 8859part8 + + + + + ISO/IEC 8859-9, Information technology - 8-bit single byte coded graphic character sets - Part 9 : Latin alphabet No.5 + 8859part9 + + + + + ISO/IEC 8859-10, Information technology - 8-bit single byte coded graphic character sets - Part 10 : Latin alphabet No.6 + 8859part10 + + + + + ISO/IEC 8859-11, Information technology - 8-bit single byte coded graphic character sets - Part 11 : Latin/Thai alphabet + 8859part11 + + + + + + ISO/IEC 8859-13, Information technology - 8-bit single byte coded graphic character sets - Part 13 : Latin alphabet No.7 + 8859part13 + + + + + ISO/IEC 8859-14, Information technology - 8-bit single byte coded graphic character sets - Part 14 : Latin alphabet No.8 (Celtic) + 8859part14 + + + + + ISO/IEC 8859-15, Information technology - 8-bit single byte coded graphic character sets - Part 15 : Latin alphabet No.9 + 8859part15 + + + + + ISO/IEC 8859-16, Information technology - 8-bit single byte coded graphic character sets - Part 16 : Latin alphabet No.10 + 8859part16 + + + + + japanese code set used for electronic transmission + jis + + + + + japanese code set used on MS-DOS machines + shiftJIS + + + + + japanese code set used on UNIX based machines + eucJP + + + + + United States ASCII code set (ISO 646 US) + usAscii + + + + + IBM mainframe code set + ebcdic + + + + + Korean code set + eucKR + + + + + traditional Chinese code set used in Taiwan, Hong Kong of China and other areas + big5 + + + + + simplified Chinese code set + GB2312 + + + + + + + + name of the handling restrictions on the dataset + MD_ClassificationCode + + + available for general disclosure + unclassified + + + + + not for general disclosure + restricted + + + + + available for someone who can be entrusted with information + confidential + + + + + kept or meant to be kept private, unknown, or hidden from all but a select group of people + secret + + + + + of the highest secrecy + topSecret + + + + + + + + specific type of information represented in the cell + MD_CoverageContentTypeCode + + + meaningful numerical representation of a physical parameter that is not the actual value of the physical parameter + image + + + + + code value with no quantitative meaning, used to represent a physical quantity + thematicClassification + + + + + value in physical units of the quantity being measured + physicalMeasurement + + + + + + + + datatype of element or entity + MD_DatatypeCode + + + descriptor of a set of objects that share the same attributes, operations, methods, relationships, and behavior + class + + + + + descriptor of a set of objects that share the same attributes, operations, methods, relationships, and behavior + codelist + + + + + data type whose instances form a list of named literal values, not extendable + enumeration + + + + + permissible value for a codelist or enumeration + codelistElement + + + + + class that cannot be directly instantiated + abstractClass + + + + + class that is composed of classes it is connected to by an aggregate relationship + aggregateClass + + + + + subclass that may be substituted for its superclass + specifiedClass + + + + + class with few or no operations whose primary purpose is to hold the abstract state of another class for transmittal, storage, encoding or persistent storage + datatypeClass + + + + + named set of operations that characterize the behavior of an element + interfaceClass + + + + + class describing a selection of one of the specified types + unionClass + + + + + class whose instances are classes + metaClass + + + + + class used for specification of a domain of instances (objects), together with the operations applicable to the objects. A type may have attributes and associations + typeClass + + + + + free text field + characterString + + + + + numerical field + integer + + + + + semantic relationship between two classes that involves connections among their instances + association + + + + + + + + name of the dimension + MD_DimensionNameTypeCode + + + ordinate (y) axis + row + + + + + abscissa (x) axis + column + + + + + vertical (z) axis + vertical + + + + + along the direction of motion of the scan point + track + + + + + perpendicular to the direction of motion of the scan point + crossTrack + + + + + scan line of a sensor + line + + + + + element along a scan line + sample + + + + + duration + time + + + + + + + + name of point or vector objects used to locate zero-, one-, two-, or three-dimensional spatial locations in the dataset + MD_GeometricObjectTypeCode + + + set of geometric primitives such that their boundaries can be represented as a union of other primitives + complex + + + + + connected set of curves, solids or surfaces + composite + + + + + bounded, 1-dimensional geometric primitive, representing the continuous image of a line + curve + + + + + zero-dimensional geometric primitive, representing a position but not having an extent + point + + + + + bounded, connected 3-dimensional geometric primitive, representing the continuous image of a region of space + solid + + + + + bounded, connected 2-dimensional geometric primitive, representing the continuous image of a region of a plane + surface + + + + + + + + code which indicates conditions which may affect the image + MD_ImagingConditionCode + + + portion of the image is blurred + blurredImage + + + + + portion of the image is partially obscured by cloud cover + cloud + + + + + acute angle between the plane of the ecliptic (the plane of the Earth s orbit) and the plane of the celestial equator + degradingObliquity + + + + + portion of the image is partially obscured by fog + fog + + + + + portion of the image is partially obscured by heavy smoke or dust + heavySmokeOrDust + + + + + image was taken at night + night + + + + + image was taken during rainfall + rain + + + + + image was taken during semi-dark conditions -- twilight conditions + semiDarkness + + + + + portion of the image is obscured by shadow + shadow + + + + + portion of the image is obscured by snow + snow + + + + + the absence of collection data of a given point or area caused by the relative location of topographic features which obstruct the collection path between the collector(s) and the subject(s) of interest + terrainMasking + + + + + + + + methods used to group similar keywords + MD_KeywordTypeCode + + + keyword identifies a branch of instruction or specialized learning + discipline + + + + + keyword identifies a location + place + + + + + keyword identifies the layer(s) of any deposited substance + stratum + + + + + keyword identifies a time period related to the dataset + temporal + + + + + keyword identifies a particular subject or topic + theme + + + + + + + + frequency with which modifications and deletions are made to the data after it is first produced + MD_MaintenanceFrequencyCode + + + data is repeatedly and frequently updated + continual + + + + + data is updated each day + daily + + + + + data is updated on a weekly basis + weekly + + + + + data is updated every two weeks + fortnightly + + + + + data is updated each month + monthly + + + + + + + data is updated every three months + + quarterly + + + + + + data is updated twice each year + biannually + + + + + data is updated every year + annually + + + + + data is updated as deemed necessary + asNeeded + + + + + data is updated in intervals that are uneven in duration + irregular + + + + + there are no plans to update the data + notPlanned + + + + + frequency of maintenance for the data is not known + + unknown + + + + + + + + + method used to write to the medium + MD_MediumFormatCode + + + CoPy In / Out (UNIX file format and command) + cpio + + + + + Tape ARchive + tar + + + + + high sierra file system + highSierra + + + + + information processing volume and file structure of CD-ROM + iso9660 + + + + + rock ridge interchange protocol (UNIX) + iso9660RockRidge + + + + + hierarchical file system (Macintosh) + iso9660AppleHFS + + + + + + + + name of the medium + MD_MediumNameCode + + + read-only optical disk + cdRom + + + + + digital versatile disk + dvd + + + + + digital versatile disk, read only + dvdRom + + + + + 3,5 inch magnetic disk + 3halfInchFloppy + + + + + 5,25 inch magnetic disk + 5quarterInchFloppy + + + + + 7 track magnetic tape + 7trackTape + + + + + 9 track magnetic tape + 9trackType + + + + + 3480 cartridge tape drive + 3480Cartridge + + + + + 3490 cartridge tape drive + 3490Cartridge + + + + + 3580 cartridge tape drive + 3580Cartridge + + + + + 4 millimetre magnetic tape + 4mmCartridgeTape + + + + + 8 millimetre magnetic tape + 8mmCartridgeTape + + + + + 0,25 inch magnetic tape + 1quarterInchCartridgeTape + + + + + half inch cartridge streaming tape drive + digitalLinearTape + + + + + direct computer linkage + onLine + + + + + linkage through a satellite communication system + satellite + + + + + communication through a telephone network + telephoneLink + + + + + pamphlet or leaflet giving descriptive information + hardcopy + + + + + + + + obligation of the element or entity + MD_ObligationCode + + + element is always required + mandatory + + + + + element is not required + optional + + + + + element is required when a specific condition is met + conditional + + + + + + + + point in a pixel corresponding to the Earth location of the pixel + MD_PixelOrientationCode + + + point halfway between the lower left and the upper right of the pixel + center + + + + + the corner in the pixel closest to the origin of the SRS; if two are at the same distance from the origin, the one with the smallest x-value + lowerLeft + + + + + next corner counterclockwise from the lower left + lowerRight + + + + + next corner counterclockwise from the lower right + upperRight + + + + + next corner counterclockwise from the upper right + upperLeft + + + + + + + + status of the dataset or progress of a review + MD_ProgressCode + + + production of the data has been completed + completed + + + + + data has been stored in an offline storage facility + historicalArchive + + + + + data is no longer relevant + obsolete + + + + + data is continually being updated + onGoing + + + + + fixed date has been established upon or by which the data will be created or updated + planned + + + + + data needs to be generated or updated + required + + + + + data is currently in the process of being created + underDevelopment + + + + + + + + limitation(s) placed upon the access or use of the data + MD_RestrictionCode + + + exclusive right to the publication, production, or sale of the rights to a literary, dramatic, musical, or artistic work, or to the use of a commercial print or label, granted by law for a specified period of time to an author, composer, artist, distributor + copyright + + + + + government has granted exclusive right to make, sell, use or license an invention or discovery + patent + + + + + produced or sold information awaiting a patent + patentPending + + + + + a name, symbol, or other device identifying a product, officially registered and legally restricted to the use of the owner or manufacturer + trademark + + + + + formal permission to do something + license + + + + + rights to financial benefit from and control of distribution of non-tangible property that is a result of creativity + intellectualPropertyRights + + + + + withheld from general circulation or disclosure + restricted + + + + + limitation not listed + otherRestrictions + + + + + + + + class of information to which the referencing entity applies + MD_ScopeCode + + + information applies to the attribute class + attribute + + + + + information applies to the characteristic of a feature + attributeType + + + + + information applies to the collection hardware class + collectionHardware + + + + + information applies to the collection session + collectionSession + + + + + information applies to the dataset + dataset + + + + + information applies to the series + series + + + + + information applies to non-geographic data + nonGeographicDataset + + + + + information applies to a dimension group + dimensionGroup + + + + + information applies to a feature + feature + + + + + information applies to a feature type + featureType + + + + + information applies to a property type + propertyType + + + + + information applies to a field session + fieldSession + + + + + information applies to a computer program or routine + software + + + + + information applies to a capability which a service provider entity makes available to a service user entity through a set of interfaces that define a behaviour, such as a use case + service + + + + + information applies to a copy or imitation of an existing or hypothetical object + model + + + + + information applies to a tile, a spatial subset of geographic data + tile + + + + + + + + method used to represent geographic information in the dataset + MD_SpatialRepresentationTypeCode + + + vector data is used to represent geographic data + vector + + + + + grid data is used to represent geographic data + grid + + + + + textual or tabular data is used to represent geographic data + textTable + + + + + triangulated irregular network + tin + + + + + three-dimensional view formed by the intersecting homologous rays of an overlapping pair of images + stereoModel + + + + + scene from a video recording + video + + + + + + + + high-level geographic data thematic classification to assist in the grouping and search of available geographic data sets. Can be used to group keywords as well. Listed examples are not exhaustive. + MD_TopicCategoryCode + + + rearing of animals and/or cultivation of plants. Examples: agriculture, irrigation, aquaculture, plantations, herding, pests and diseases affecting crops and livestock + farming + + + + + flora and/or fauna in natural environment. Examples: wildlife, vegetation, biological sciences, ecology, wilderness, sealife, wetlands, habitat + biota + + + + + legal land descriptions. Examples: political and administrative boundaries + boundaries + + + + + processes and phenomena of the atmosphere. Examples: cloud cover, weather, climate, atmospheric conditions, climate change, precipitation + climatologyMeteorologyAtmosphere + + + + + economic activities, conditions and employment. Examples: production, labour, revenue, commerce, industry, tourism and ecotourism, forestry, fisheries, commercial or subsistence hunting, exploration and exploitation of resources such as minerals, oil and gas + economy + + + + + height above or below sea level. Examples: altitude, bathymetry, digital elevation models, slope, derived products + elevation + + + + + environmental resources, protection and conservation. Examples: environmental pollution, waste storage and treatment, environmental impact assessment, monitoring environmental risk, nature reserves, landscape + environment + + + + + information pertaining to earth sciences. Examples: geophysical features and processes, geology, minerals, sciences dealing with the composition, structure and origin of the earth s rocks, risks of earthquakes, volcanic activity, landslides, gravity information, soils, permafrost, hydrogeology, erosion + geoscientificInformation + + + + + health, health services, human ecology, and safety. Examples: disease and illness, factors affecting health, hygiene, substance abuse, mental and physical health, health services + health + + + + + base maps. Examples: land cover, topographic maps, imagery, unclassified images, annotations + imageryBaseMapsEarthCover + + + + + military bases, structures, activities. Examples: barracks, training grounds, military transportation, information collection + intelligenceMilitary + + + + + inland water features, drainage systems and their characteristics. Examples: rivers and glaciers, salt lakes, water utilization plans, dams, currents, floods, water quality, hydrographic charts + inlandWaters + + + + + positional information and services. Examples: addresses, geodetic networks, control points, postal zones and services, place names + location + + + + + features and characteristics of salt water bodies (excluding inland waters). Examples: tides, tidal waves, coastal information, reefs + oceans + + + + + information used for appropriate actions for future use of the land. Examples: land use maps, zoning maps, cadastral surveys, land ownership + planningCadastre + + + + + characteristics of society and cultures. Examples: settlements, anthropology, archaeology, education, traditional beliefs, manners and customs, demographic data, recreational areas and activities, social impact assessments, crime and justice, census information + society + + + + + man-made construction. Examples: buildings, museums, churches, factories, housing, monuments, shops, towers + structure + + + + + means and aids for conveying persons and/or goods. Examples: roads, airports/airstrips, shipping routes, tunnels, nautical charts, vehicle or vessel location, aeronautical charts, railways + transportation + + + + + energy, water and waste systems and communications infrastructure and services. Examples: hydroelectricity, geothermal, solar and nuclear sources of energy, water purification and distribution, sewage collection and disposal, electricity and gas distribution, data communication, telecommunication, radio, communication networks + utilitiesCommunication + + + + + + + + degree of complexity of the spatial relationships + MD_TopologyLevelCode + + + geometry objects without any additional structure which describes topology + geometryOnly + + + + + 1-dimensional topological complex -- commonly called chain-node topology + topology1D + + + + + 1-dimensional topological complex that is planar. (A planar graph is a graph that can be drawn in a plane in such a way that no two edges intersect except at a vertex.) + planarGraph + + + + + 2-dimensional topological complex that is planar. (A 2-dimensional topological complex is commonly called full topology in a cartographic 2D environment.) + fullPlanarGraph + + + + + 1-dimensional topological complex that is isomorphic to a subset of a surface. (A geometric complex is isomorphic to a topological complex if their elements are in a one-to-one, dimensional-and boundry-preserving correspondence to one another.) + surfaceGraph + + + + + 2-dimensional topological complex that is isomorphic to a subset of a surface + fullSurfaceGraph + + + + + 3-dimensional topological complex. (A topological complex is a collection of topological primitives that are closed under the boundary operations.) + topology3D + + + + + complete coverage of a 3D Euclidean coordinate space + fullTopology3D + + + + + topological complex without any specified geometric realisation + abstract + + + + + + + + Extension of MD_ScopeCode for the needs of GMX application schemas and in the context of a transfer + MX_ScopeCode + + + + information applies to the attribute class + attribute + + + + + information applies to the characteristic of a feature + attributeType + + + + + information applies to the collection hardware class + collectionHardware + + + + + information applies to the collection session + collectionSession + + + + + information applies to the dataset + dataset + + + + + information applies to the series + series + + + + + information applies to non-geographic data + nonGeographicDataset + + + + + information applies to a dimension group + dimensionGroup + + + + + information applies to a feature + feature + + + + + information applies to a feature type + featureType + + + + + information applies to a property type + propertyType + + + + + information applies to a field session + fieldSession + + + + + information applies to a computer program or routine + software + + + + + information applies to a capability which a service provider entity makes available to a service user entity through a set of interfaces that define a behaviour, such as a use case + service + + + + + information applies to a copy or imitation of an existing or hypothetical object + model + + + + + information applies to a tile, a spatial subset of geographic data + tile + + + + + + The referencing entity applies to a transfer aggregate which was originally identified as an initiative (DS_Initiative) + initiative + + + + + The referencing entity applies to a transfer aggregate which was originally identified as a stereo mate (DS_StereoMate) + stereomate + + + + + The referencing entity applies to a transfer aggregate which was originally identified as a sensor (DS_Sensor) + sensor + + + + + The referencing entity applies to a transfer aggregate which was originally identified as a platform series (DS_PlatformSeries) + platformSeries + + + + + The referencing entity applies to a transfer aggregate which was originally identified as a sensor series (DS_SensorSeries) + sensorSeries + + + + + The referencing entity applies to a transfer aggregate which was originally identified as a production series (DS_ProductionSeries) + productionSeries + + + + + The referencing entity applies to a transfer aggregate which has no existence outside of the transfer context + transferAggregate + + + + + The referencing entity applies to a transfer aggregate which has an existence outside of the transfer context, but which does not pertains to a specific aggregate type. + otherAggregate + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/tcCodelists.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/tcCodelists.xml new file mode 100644 index 000000000..b6fc21f2f --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/Codelist/tcCodelists.xml @@ -0,0 +1,52 @@ + + + + + tcCodelists + + + Codelists used in the type catalogue schema + + + Type catalogues + + + 0.1 + + + 2007-06-14 + + + + + + + specifies aggregation semantics: specifies whether the value of each property is a single value ("noAggregation") which is the default case or if a single property instance has an aggregate value in which case the value specifies the aggregation type ("bag", "set", "sequence"). Note that this value is independent from the cardinality. + TC_AggregationType + + + single value - no aggregation (default) + noAggregation + + + + + aggregation semantics: bag + bag + + + + + aggregation semantics: set + set + + + + + aggregation semantics: sequence (ordered bag) + sequence + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/resources/ReadMe.txt new file mode 100644 index 000000000..b58335f82 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/ReadMe.txt @@ -0,0 +1,16 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package "resources" from the ISO repository (http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/) +downloaded 2009-03-02 and modified as follows: + +schemaLocation http://www.opengis.net/gml/3.2 ../../../ISO_19136_Schemas/gml.xsd +AND http://www.w3.org/1999/xlink http://schemas.opengis.net/xlink/1.0.0/xlinks.xsd +replaced everywhere by +http://www.opengis.net/gml/3.2 ../../gml/gml.xsd +AND http://www.w3.org/1999/xlink ../../xlink/xlinks.xsd + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/crs/ML_gmxCrs.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/crs/ML_gmxCrs.xml new file mode 100644 index 000000000..45e343db0 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/crs/ML_gmxCrs.xml @@ -0,0 +1,166 @@ + + + + + ML_gmxCrs + + + CRS catalogue for description of gmx metadata dataset + + + Catalogue des paramètres géodésiques pour la description de jeux de métadonnées conformes aux schémas gmx + + + + + GMX (and imported) namespace + + + 0.0 + + + 2005-03-29 + + + + + English + + + UTF 8 + + + + + + French + + + France + + + UTF 8 + + + + + + + + + + 4326 + WGS84G + World Geodetic System 1984 + + + + + + + + World + + + + + + + + not known + + + + + + 4326 + WGS84G + WGS 1984 + + + + + + + + Monde + + + + + + + + inconnu + + + + + + + + + + 6422 + ellipsoidal2Ddeg + + + + + + + + + 9901 + Geodetic latitude + Lat + North + + + + + + 9902 + Geodetic longitude + Lon + East + + + + + + + 6326 + World Geodetic System 1984 + not known + + + + + + + + + 7030 + WGS 84 + 6378137 + + + 298.2572 + + + + + + + + + 8901 + Greenwich + 0 + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/crs/gmxCrs.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/crs/gmxCrs.xml new file mode 100644 index 000000000..496e52219 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/crs/gmxCrs.xml @@ -0,0 +1,275 @@ + + + + + gmxCrs + + + CRS parameters dictionary + + + GMX (and imported) namespace + + + 0.0 + + + 2005-03-18 + + + + + + + + 4326 + WGS84G + World Geodetic System 1984 + + + + + + + + World: Afghanistan, Albania, Algeria, American Samoa, Andorra, Angola, Anguilla, Antarctica, Antigua and Barbuda, Argentina, Armenia, Aruba, Australia, + Austria, Azerbaijan, Bahamas, Bahrain, Bangladesh, Barbados, Belgium, Belgium, Belize, Benin, Bermuda, Bhutan, Bolivia, Bosnia and Herzegowina, + Botswana, Bouvet Island, Brazil, British Indian Ocean Territory, British Virgin Islands, Brunei Darussalam, Bulgaria, Burkina Faso, Burundi, Cambodia, + Cameroon, Canada, Cape Verde, Cayman Islands, Central African Republic, Chad, Chile, China, Christmas Island, Cocos (Keeling) Islands, Comoros, + Congo, Cook Islands, Costa Rica, Côte d'Ivoire (Ivory Coast), Croatia, Cuba, Cyprus, Czech Republic, Denmark, Djibouti, Dominica, Dominican Republic, + East Timor, Ecuador, Egypt, El Salvador, Equatorial Guinea, Eritrea, Estonia, Ethiopia, Falkland Islands (Malvinas), Faroe Islands, Fiji, Finland, France, + French Guiana, French Polynesia, French Southern Territories, Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, + Guadeloupe, Guam, Guatemala, Guinea, Guinea-Bissau, Guyana, Haiti, Heard Island and McDonald Islands, Holy See (Vatican City State), Honduras, China + - Hong Kong, Hungary, Iceland, India, Indonesia, Islamic Republic of Iran, Iraq, Ireland, Israel, Italy, Jamaica, Japan, Jordan, Kazakstan, Kenya, Kiribati, + Democratic People's Republic of Korea (North Korea), Republic of Korea (South Korea), Kuwait, Kyrgyzstan, Lao People's Democratic Republic (Laos), + Latvia, Lebanon, Lesotho, Liberia, Libyan Arab Jamahiriya, Liechtenstein, Lithuania, Luxembourg, China - Macau, The Former Yugoslav Republic of + Macedonia, Madagascar, Malawi, Malaysia, Maldives, Mali, Malta, Marshall Islands, Martinique, Mauritania, Mauritius, Mayotte, Mexico, Federated States + of Micronesia, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar (Burma), Namibia, Nauru, Nepal, Netherlands, Netherlands Antilles, New + Caledonia, New Zealand, Nicaragua, Niger, Nigeria, Niue, Norfolk Island, Northern Mariana Islands, Norway, Oman, Pakistan, Palau, Panama, Papua New + Guinea (PNG), Paraguay, Peru, Philippines, Pitcairn, Poland, Portugal, Puerto Rico, Qatar, Reunion, Romania, Russian Federation, Rwanda, Saint Kitts and + Nevis, Saint Lucia, Saint Vincent and the Grenadines, Samoa, San Marino, Sao Tome and Principe, Saudi Arabia, Senegal, Seychelles, Sierra Leone, + Singapore, Slovakia (Slovak Republic), Slovenia, Solomon Islands, Somalia, South Africa, South Georgia and the South Sandwich Islands, Spain, Sri Lanka, + Saint Helena, Saint Pierre and Miquelon, Sudan, Suriname, Svalbard and Jan Mayen, Swaziland, Sweden, Switzerland, Syrian Arab Republic, Taiwan, + Tajikistan, United Republic of Tanzania, Thailand, The Democratic Republic of the Congo (Zaire), Togo, Tokelau, Tonga, Trinidad and Tobago, Tunisia, + Turkey, Turkmenistan, Turks and Caicos Islands, Tuvalu, Uganda, Ukraine, United Arab Emirates (UAE), United Kingdom (UK), United States (USA), + United States Minor Outlying Islands, Uruguay, Uzbekistan, Vanuatu, Venezuela, Vietnam, US Virgin Islands, Wallis and Futuna, Western Sahara, Yemen, + Yugoslavia - Union of Serbia and Montenegro, Zambia, Zimbabwe. + + + + + + + + not known + + + + + + + + 32638 + UTM38W84 + WGS 84 / UTM zone 38N + + + + + + + + Between 42 and 48 deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Islamic Republic of Iran. Iraq. Kazakstan. Kuwait. Russian Federation. Saudi Arabia. Somalia. Tukey. Yemen. + + + + + + + + not known + + + + + + + + + + + Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: north, east. UoM: deg + 6422 + CS ellipsoidal2D + + + + + + + + Cartesian 2D CS. Axes: easting, northing (E,N). Orientations: east, north. UoM: m. + 4400 + Cs cartesian2D + + + + + + + + + 9901 + Geodetic latitude + Lat + North + + + + + + 9902 + Geodetic longitude + Lon + East + + + + + + 9907 + Northing + N + North + + + + + + 9906 + Easting + E + east + + + + + + + 6326 + World Geodetic System 1984 + not known + + + + + + + + + 7030 + WGS 84 + 6378137 + + + 298.2572 + + + + + + + + + 8901 + Greenwich + 0 + + + + + + 16038 + UTM Zone 38 N + not known + + + + 0 + + + + + + 45 + + + + + + 0.9996 + + + + + + 500000 + + + + + + 0 + + + + + + + + + 9807 + PRCM040 + Transverse Mercator + Transverse Mercator + 2 + 2 + + + + + + + + + + + 8801 + Latitude of natural origin + + + + + 8802 + Longitude of natural origin + + + + + 8805 + Scale factor at natural origin + + + + + 8806 + False Easting + + + + + 8807 + False Northing + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/uom/ML_gmxUom.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/uom/ML_gmxUom.xml new file mode 100644 index 000000000..3067759eb --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/uom/ML_gmxUom.xml @@ -0,0 +1,113 @@ + + + + + uom + + + units of measure dictionary compliant with SI definitions + + + dictionnaire d'unités de mesure conforme avec les définitions du Système International (SI) + + + + + GMX (and imported) namespace + + + 0.0 + + + 2005-06-18 + + + + + English + + + UTF 8 + + + + + + French + + + France + + + UTF 8 + + + + + + + + + + The metre is the length of the path travelled by ligth in vaccum during a time interval of 1/299 792 458 of a second + metre + length + m + + + + + unité de longueur de référence dans le système international, correspond à la distance parcourue par la lumière dans le vide pendant 1/299 792 458 seconde + metre + mètre + longueur + + + + + + + + + + Measure of angle equal to Pi/180 radians, widely used in geography + degree + angle + + 1.74532925199433E-02 + + + + + Unité d'angle de référence en géographie égale à Pi/180 radians. + degree + degré + angle + + + + + + + + + Radian is an unit of angle measure. It is defined as the ratio of arc length to the radius of the circle. + radian + plane angle + rad + + + + + + Le radian est une unité de mesaure angulaire définie comme le ratio entre le rayon et la longueur de l'arc. + radian + radian + angle planaire + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/resources/uom/gmxUom.xml b/wpsg-xml/src/main/schemas/ISO_19139/resources/uom/gmxUom.xml new file mode 100644 index 000000000..df520a1ff --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/resources/uom/gmxUom.xml @@ -0,0 +1,55 @@ + + + + + gmxUom + + + units of measure dictionary compliant with SI definitions + + + ISO/TC 211 GMX (and imported) namespace + + + 0.0 + + + 2005-03-18 + + + + + + + + The metre is the length of the path travelled by ligth in vaccum during a time interval of 1/299 792 458 of a second + metre + length + m + + + + + + + Measure of angle equal to Pi/180 radians, widely used in geography + degree + angle + + 1.74532925199433E-02 + + + + + + + Radian is an unit of angle measure. It is defined as the ratio of arc length to the radius of the circle. + radian + plane angle + rad + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/srv/ReadMe.txt b/wpsg-xml/src/main/schemas/ISO_19139/srv/ReadMe.txt new file mode 100644 index 000000000..d164467cd --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/srv/ReadMe.txt @@ -0,0 +1,26 @@ + +Validated with XSV 2.10, Xerces J 2.7.1 and XML Spy 2009 (2009-03-02, IGN / France - Nicolas Lesage / Marcellin Prudham) + + +************************** + +Package srv from Eden repository (http://eden.ign.fr/xsd/isotc211/iso19119/20071126) modified as follows : + +- serviceMetadata.xsd line75/76: + + +REPLACED BY: + + + +- serviceMetadata.xsd line141: + + + + +REPLACED BY: + + + + + \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/ISO_19139/srv/serviceMetadata.xsd b/wpsg-xml/src/main/schemas/ISO_19139/srv/serviceMetadata.xsd new file mode 100644 index 000000000..4734d080b --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/srv/serviceMetadata.xsd @@ -0,0 +1,197 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 11-15-2006 15:20:33 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/srv/serviceModel.xsd b/wpsg-xml/src/main/schemas/ISO_19139/srv/serviceModel.xsd new file mode 100644 index 000000000..912604203 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/srv/serviceModel.xsd @@ -0,0 +1,230 @@ + + + + + This file was generated from ISO TC/211 UML class diagrams == 11-15-2006 15:33:57 ====== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/srv/srv.xsd b/wpsg-xml/src/main/schemas/ISO_19139/srv/srv.xsd new file mode 100644 index 000000000..4a41a2f50 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/srv/srv.xsd @@ -0,0 +1,13 @@ + + + + + + This file was generated from ISO TC/211 UML class diagrams == 10-13-2006 11:14:05 ====== + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ISO_19139/xlink/xlinks.xsd b/wpsg-xml/src/main/schemas/ISO_19139/xlink/xlinks.xsd new file mode 100644 index 000000000..eb7caed87 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ISO_19139/xlink/xlinks.xsd @@ -0,0 +1,118 @@ + + + + xlinks.xsd + see GML 7.2 + + + + + + + + + + + + + The 'show' attribute is used to communicate the desired presentation + of the ending resource on traversal from the starting resource; it's + value should be treated as follows: + new - load ending resource in a new window, frame, pane, or other + presentation context + replace - load the resource in the same window, frame, pane, or + other presentation context + embed - load ending resource in place of the presentation of the + starting resource + other - behavior is unconstrained; examine other markup in the + link for hints + none - behavior is unconstrained + + + + + + + + + + + + + + + + The 'actuate' attribute is used to communicate the desired timing + of traversal from the starting resource to the ending resource; + it's value should be treated as follows: + onLoad - traverse to the ending resource immediately on loading + the starting resource + onRequest - traverse from the starting resource to the ending + resource only on a post-loading event triggered for + this purpose + other - behavior is unconstrained; examine other markup in link + for hints + none - behavior is unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/WPSG-SSEGRID-soapui-project.xml b/wpsg-xml/src/main/schemas/WPSG-SSEGRID-soapui-project.xml new file mode 100644 index 000000000..5964bd4e1 --- /dev/null +++ b/wpsg-xml/src/main/schemas/WPSG-SSEGRID-soapui-project.xml @@ -0,0 +1,6377 @@ + +file:/D:/schemas/WPSG.wsdl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]>http://schemas.xmlsoap.org/wsdl/file:\D:\schemas\wsa\ws-addr.xsd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsAll.xsd + + $Id: wpsAll.xsd 2007-10-09 $ + + This XML Schema includes and imports, directly and indirectly, all the XML Schemas defined by the WPS Implemetation Specification. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDescribeProcess_request.xsd + + $Id: wpsDescribeProcess_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeProcess operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS DescribeProcess operation request. + + + + + + + + Unordered list of one or more identifiers of the processes for which the client is requesting detailed descriptions. This element shall be repeated for each process for which a description is requested. These Identifiers are unordered, but the WPS shall return the process descriptions in the order in which they were requested. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsAll.xsd + + owsAll.xsd 2010-01-30 + This XML Schema Document includes and imports, directly and indirectly, all the XML Schemas defined by the OWS Common Implemetation Specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsGetResourceByID.xsd + + owsGetResourceByID.xsd 2010-01-30 + This XML Schema Document encodes the GetResourceByID operation request message. This typical operation is specified as a base for profiling in specific OWS specifications. For information on the allowed changes and limitations in such profiling, see Subclause 9.4.1 of the OWS Common specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + XML encoded GetResourceByID operation response. The complexType used by this element shall be specified by each specific OWS. + + + + + + + + Request to a service to perform the GetResourceByID operation. This operation allows a client to retrieve one or more identified resources, including datasets and resources that describe datasets or parameters. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. + + + + + Unordered list of zero or more resource identifiers. These identifiers can be listed in the Contents section of the service metadata (Capabilities) document. For more information on this parameter, see Subclause 9.4.2.1 of the OWS Common specification. + + + + + Optional reference to the data format to be used for response to this operation request. This element shall be included when multiple output formats are available for the selected resource(s), and the client desires a format other than the specified default, if any. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsDataIdentification.xsd + + owsDataIdentification.xsd 2010-01-30 + This XML Schema Document encodes the parts of the MD_DataIdentification class of ISO 19115 (OGC Abstract Specification Topic 11) which are expected to be used for most datasets. This Schema also encodes the parts of this class that are expected to be useful for other metadata. Both may be used within the Contents section of OWS service metadata (Capabilities) documents. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Human-readable descriptive information for the object it is included within. +This type shall be extended if needed for specific OWS use to include additional metadata for each type of information. This type shall not be restricted for a specific OWS to change the multiplicity (or optionality) of some elements. + If the xml:lang attribute is not included in a Title, Abstract or Keyword element, then no language is specified for that element unless specified by another means. All Title, Abstract and Keyword elements in the same Description that share the same xml:lang attribute value represent the description of the parent object in that language. Multiple Title or Abstract elements shall not exist in the same Description with the same xml:lang attribute value unless otherwise specified. + + + + + + + + + + + Basic metadata identifying and describing a set of data. + + + + + + + Optional unique identifier or name of this dataset. + + + + + Optional unordered list of additional metadata about this data(set). A list of optional metadata elements for this data identification could be specified in the Implementation Specification for this service. + + + + + + + + + + Extended metadata identifying and describing a set of data. This type shall be extended if needed for each specific OWS to include additional metadata for each type of dataset. If needed, this type should first be restricted for each specific OWS to change the multiplicity (or optionality) of some elements. + + + + + + + Unordered list of zero or more bounding boxes whose union describes the extent of this dataset. + + + + + Unordered list of zero or more references to data formats supported for server outputs. + + + + + Unordered list of zero or more available coordinate reference systems. + + + + + + + + + + Unique identifier or name of this dataset. + + + + + + Reference to a format in which this data can be encoded and transferred. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. + + + + + + + Coordinate reference system in which data from this data(set) or resource is available or supported. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. + + + + + + Access constraint applied to assure the protection of privacy or intellectual property, or any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. + + + + + + Fees and terms for retrieving data from or otherwise using this server, including the monetary units as specified in ISO 4217. The reserved value NONE (case insensitive) shall be used to mean no fees or terms. + + + + + + Identifier of a language used by the data(set) contents. This language identifier shall be as specified in IETF RFC 4646. When this element is omitted, the language used is not identified. + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsCommon.xsd + + owsCommon.xsd 2010-01-30 + This XML Schema Document encodes various parameters and parameter types that can be used in OWS operation requests and responses. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + XML encoded identifier of a standard MIME type, possibly a parameterized MIME type. + + + + + + + + + Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XML Schemas against which an XML encoded operation response must conform and should be validated. See Version negotiation subclause for more information. + + + + + + + + + + + This element either references or contains more metadata about the element that includes this element. To reference metadata stored remotely, at least the xlinks:href attribute in xlink:simpleLink shall be included. Either at least one of the attributes in xlink:simpleLink or a substitute for the AbstractMetaData element shall be included, but not both. An Implementation Specification can restrict the contents of this element to always be a reference or always contain metadata. (Informative: This element was adapted from the metaDataProperty element in GML 3.0.) + + + + + + + Reference to metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, the xlink:href attribute with type anyURI should include a URL from which this metadata can be electronically retrieved. + + + + + Optional reference to the aspect of the element which includes this "metadata" element that this metadata provides more information about. + + + + + + + Abstract element containing more metadata about the element that includes the containing "metadata" element. A specific server implementation, or an Implementation Specification, can define concrete elements in the AbstractMetaData substitution group. + + + + + + + + + XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. + This type is adapted from the EnvelopeType of GML 3.1, with modified contents and documentation for encoding a MINIMUM size box SURROUNDING all associated data. + + + + + Position of the bounding box corner at which the value of each coordinate normally is the algebraic minimum within this bounding box. In some cases, this position is normally displayed at the top, such as the top left for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. + + + + + Position of the bounding box corner at which the value of each coordinate normally is the algebraic maximum within this bounding box. In some cases, this position is normally displayed at the bottom, such as the bottom right for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. + + + + + + Usually references the definition of a CRS, as specified in [OGC Topic 2]. Such a CRS definition can be XML encoded using the gml:CoordinateReferenceSystemType in [GML 3.1]. For well known references, it is not required that a CRS definition exist at the location the URI points to. If no anyURI value is included, the applicable CRS must be either: +a) Specified outside the bounding box, but inside a data structure that includes this bounding box, as specified for a specific OWS use of this bounding box type. +b) Fixed and specified in the Implementation Specification for a specific OWS use of the bounding box type. + + + + + The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. + + + + + + + Position instances hold the coordinates of a position in a coordinate reference system (CRS) referenced by the related "crs" attribute or elsewhere. For an angular coordinate axis that is physically continuous for multiple revolutions, but whose recorded values can be discontinuous, special conditions apply when the bounding box is continuous across the value discontinuity: +a) If the bounding box is continuous clear around this angular axis, then ordinate values of minus and plus infinity shall be used. +b) If the bounding box is continuous across the value discontinuity but is not continuous clear around this angular axis, then some non-normal value can be used if specified for a specific OWS use of the BoundingBoxType. For more information, see Subclauses 10.2.5 and C.13. + This type is adapted from DirectPositionType and doubleList of GML 3.1. The adaptations include omission of all the attributes, since the needed information is included in the BoundingBoxType. + + + + + + + + + XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. This box is specialized for use with the 2D WGS 84 coordinate reference system with decimal values of longitude and latitude. + This type is adapted from the general BoundingBoxType, with modified contents and documentation for use with the 2D WGS 84 coordinate reference system. + + + + + + + Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. + + + + + Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. + + + + + + This attribute can be included when considered useful. When included, this attribute shall reference the 2D WGS 84 coordinate reference system with longitude before latitude and decimal values of longitude and latitude. + + + + + The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. + + + + + + + + + Two-dimensional position instances hold the longitude and latitude coordinates of a position in the 2D WGS 84 coordinate reference system. The longitude value shall be listed first, followed by the latitude value, both in decimal degrees. Latitude values shall range from -90 to +90 degrees, and longitude values shall normally range from -180 to +180 degrees. For the longitude axis, special conditions apply when the bounding box is continuous across the +/- 180 degrees meridian longitude value discontinuity: +a) If the bounding box is continuous clear around the Earth, then longitude values of minus and plus infinity shall be used. +b) If the bounding box is continuous across the value discontinuity but is not continuous clear around the Earth, then some non-normal value can be used if specified for a specific OWS use of the WGS84BoundingBoxType. For more information, see Subclauses 10.4.5 and C.13. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\xlink\1.0.0\xlinks.xsd + + + xlinks.xsd v3.0b2 2001-07 + GML 3.0 candidate xlinks schema. Copyright (c) 2001 OGC, All Rights Reserved. + + + + + + + + + + + + The 'show' attribute is used to communicate the desired presentation + of the ending resource on traversal from the starting resource; it's + value should be treated as follows: + new - load ending resource in a new window, frame, pane, or other + presentation context + replace - load the resource in the same window, frame, pane, or + other presentation context + embed - load ending resource in place of the presentation of the + starting resource + other - behavior is unconstrained; examine other markup in the + link for hints + none - behavior is unconstrained + + + + + + + + + + + + + + The 'actuate' attribute is used to communicate the desired timing + of traversal from the starting resource to the ending resource; + it's value should be treated as follows: + onLoad - traverse to the ending resource immediately on loading + the starting resource + onRequest - traverse from the starting resource to the ending + resource only on a post-loading event triggered for + this purpose + other - behavior is unconstrained; examine other markup in link + for hints + none - behavior is unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\ows19115subset.xsd + + ows19115subset.xsd 2010-01-30 + This XML Schema Document encodes the parts of ISO 19115 used by the common "ServiceIdentification" and "ServiceProvider" sections of the GetCapabilities operation response, known as the service metadata XML document. The parts encoded here are the MD_Keywords, CI_ResponsibleParty, and related classes. The UML package prefixes were omitted from XML names, and the XML element names were all capitalized, for consistency with other OWS Schemas. This document also provides a simple coding of text in multiple languages, simplified from Annex J of ISO 19115. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Text string with the language of the string identified as recommended in the XML 1.0 W3C Recommendation, section 2.12. + + + + + + + + + Title of this resource, normally used for display to a human. + + + + + + Brief narrative description of this resource, normally used for display to a human. + + + + + + + + Unordered list of one or more commonly used or formalised word(s) or phrase(s) used to describe the subject. When needed, the optional "type" can name the type of the associated list of keywords that shall all have the same type. Also when needed, the codeSpace attribute of that "type" can reference the type name authority and/or thesaurus. + If the xml:lang attribute is not included in a Keyword element, then no language is specified for that element unless specified by another means. All Keyword elements in the same Keywords element that share the same xml:lang attribute value represent different keywords in that language. + For OWS use, the optional thesaurusName element was omitted as being complex information that could be referenced by the codeSpace attribute of the Type element. + + + + + + + + + + Name or code with an (optional) authority. If the codeSpace attribute is present, its value shall reference a dictionary, thesaurus, or authority for the name or code, such as the organisation who assigned the value, or the dictionary from which it is taken. + Type copied from basicTypes.xsd of GML 3 with documentation edited, for possible use outside the ServiceIdentification section of a service metadata document. + + + + + + + + + + + Identification of, and means of communication with, person(s) responsible for the resource(s). + For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The optional individualName element was made mandatory, since either the organizationName or individualName element is mandatory. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider section. + + + + + + Identification of, and means of communication with, person responsible for the server. At least one of IndividualName, OrganisationName, or PositionName shall be included. + + + + + + + + + + + + + + Identification of, and means of communication with, person responsible for the server. + For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider section. + + + + + + + + + + + + Name of the responsible person: surname, given name, title separated by a delimiter. + + + + + + Name of the responsible organization. + + + + + + Role or position of the responsible person. + + + + + + Function performed by the responsible party. Possible values of this Role shall include the values and the meanings listed in Subclause B.5.5 of ISO 19115:2003. + + + + + + Address of the responsible party. + + + + + + Information required to enable contact with the responsible person and/or organization. + For OWS use in the service metadata document, the optional hoursOfService and contactInstructions elements were retained, as possibly being useful in the ServiceProvider section. + + + + + Telephone numbers at which the organization or individual may be contacted. + + + + + Physical and email address at which the organization or individual may be contacted. + + + + + On-line information that can be used to contact the individual or organization. OWS specifics: The xlink:href attribute in the xlink:simpleLink attribute group shall be used to reference this resource. Whenever practical, the xlink:href attribute with type anyURI should be a URL from which more contact information can be electronically retrieved. The xlink:title attribute with type "string" can be used to name this set of information. The other attributes in the xlink:simpleLink attribute group should not be used. + + + + + Time period (including time zone) when individuals can contact the organization or individual. + + + + + Supplemental instructions on how or when to contact the individual or organization. + + + + + + + + Reference to on-line resource from which data can be obtained. + For OWS use in the service metadata document, the CI_OnlineResource class was XML encoded as the attributeGroup "xlink:simpleLink", as used in GML. + + + + + + + Telephone numbers for contacting the responsible individual or organization. + + + + + Telephone number by which individuals can speak to the responsible organization or individual. + + + + + Telephone number of a facsimile machine for the responsible +organization or individual. + + + + + + + + Location of the responsible individual or organization. + + + + + Address line for the location. + + + + + City of the location. + + + + + State or province of the location. + + + + + ZIP or other postal code. + + + + + Country of the physical address. + + + + + Address of the electronic mailbox of the responsible organization or individual. + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsGetCapabilities.xsd + + owsGetCapabilities.xsd 2010-01-30 + This XML Schema Document defines the GetCapabilities operation request and response XML elements and types, which are common to all OWSs. This XML Schema shall be edited by each OWS, for example, to specify a specific value for the "service" attribute. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + XML encoded GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, usually including metadata about the tightly-coupled data served. If the server does not implement the updateSequence parameter, the server shall always return the complete Capabilities document, without the updateSequence parameter. When the server implements the updateSequence parameter and the GetCapabilities operation request included the updateSequence parameter with the current value, the server shall return this element with only the "version" and "updateSequence" attributes. Otherwise, all optional elements shall be included or not depending on the actual value of the Contents parameter in the GetCapabilities operation request. This base type shall be extended by each specific OWS to include the additional contents needed. + + + + + + + + + + Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. When not supported by server, server shall not return this attribute. + + + + + + + + + XML encoded GetCapabilities operation request. This operation allows clients to retrieve service metadata about a specific service instance. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. This base type shall be extended by each specific OWS to include the additional required "service" attribute, with the correct value for that OWS. + + + + + When omitted, server shall return latest supported version. + + + + + When omitted or not supported by server, server shall return complete service metadata (Capabilities) document. + + + + + When omitted or not supported by server, server shall return service metadata document using the MIME type "text/xml". + + + + + + When omitted or not supported by server, server shall return latest complete service metadata document. + + + + + + + + Service type identifier, where the string value is the OWS type abbreviation, such as "WMS" or "WFS". + + + + + + + Prioritized sequence of one or more specification versions accepted by client, with preferred versions listed first. See Version negotiation subclause for more information. + + + + + + + + + Unordered list of zero or more names of requested sections in complete service metadata document. Each Section value shall contain an allowed section name as specified by each OWS specification. See Sections parameter subclause for more information. + + + + + + + + + Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. See updateSequence parameter use subclause for more information. + + + + + + + Prioritized sequence of zero or more GetCapabilities operation response formats desired by client, with preferred formats listed first. Each response format shall be identified by its MIME type. See AcceptFormats parameter use subclause for more information. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsServiceIdentification.xsd + + owsServiceIdentification.xsd 2010-01-30 + This XML Schema Document encodes the common "ServiceIdentification" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceIdentification class of ISO 19119 (OGC Abstract Specification Topic 12). + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + General metadata for this specific server. This XML Schema of this section shall be the same for all OWS. + + + + + + + + A service type name from a registry of services. For example, the values of the codeSpace URI and name and code string may be "OGC" and "catalogue." This type name is normally used for machine-to-machine communication. + + + + + Unordered list of one or more versions of this service type implemented by this server. This information is not adequate for version negotiation, and shall not be used for that purpose. + + + + + Unordered list of identifiers of Application Profiles that are implemented by this server. This element should be included for each specified application profile implemented by this server. The identifier value should be specified by each Application Profile. If this element is omitted, no meaning is implied. + + + + + If this element is omitted, no meaning is implied. + + + + + Unordered list of access constraints applied to assure the protection of privacy or intellectual property, and any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. When this element is omitted, no meaning is implied. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsServiceProvider.xsd + + owsServiceProvider.xsd 2010-01-30 + This XML Schema Document encodes the common "ServiceProvider" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceProvider class of ISO 19119 (OGC Abstract Specification Topic 12). + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Metadata about the organization that provides this specific service instance or server. + + + + + + A unique identifier for the service provider organization. + + + + + Reference to the most relevant web site of the service provider. + + + + + Information for contacting the service provider. The OnlineResource element within this ServiceContact element should not be used to reference a web site of the service provider. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsOperationsMetadata.xsd + + owsOperationsMetadata.xsd 2010-01-30 + This XML Schema Document encodes the basic contents of the "OperationsMetadata" section of the GetCapabilities operation response, also known as the Capabilities XML document. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + Metadata about the operations and related abilities specified by this service and implemented by this server, including the URLs for operation requests. The basic contents of this section shall be the same for all OWS types, but individual services can add elements and/or change the optionality of optional elements. + + + + + + Metadata for unordered list of all the (requests for) operations that this server interface implements. The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of parameter valid domains that each apply to one or more operations which this server interface implements. The list of required and optional parameter domain limitations shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this server. The list of required and optional constraints shall be specified in the Implementation Specification for this service. + + + + + + + + + + Individual software vendors and servers can use this element to provide metadata about any additional server abilities. + + + + + + Metadata for one operation that this server implements. + + + + + + Unordered list of Distributed Computing Platforms (DCPs) supported for this operation. At present, only the HTTP DCP is defined, so this element will appear only once. + + + + + Optional unordered list of parameter domains that each apply to this operation which this server implements. If one of these Parameter elements has the same "name" attribute as a Parameter element in the OperationsMetadata element, this Parameter element shall override the other one for this operation. The list of required and optional parameter domain limitations for this operation shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this operation shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of additional metadata about this operation and its' implementation. A list of required and optional metadata elements for this operation should be specified in the Implementation Specification for this service. (Informative: This metadata might specify the operation request parameters or provide the XML Schemas for the operation request.) + + + + + + Name or identifier of this operation (request) (for example, GetCapabilities). The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. + + + + + + + + Information for one distributed Computing Platform (DCP) supported for this operation. At present, only the HTTP DCP is defined, so this element only includes the HTTP element. + + + + + + + + + + + Connect point URLs for the HTTP Distributed Computing Platform (DCP). Normally, only one Get and/or one Post is included in this element. More than one Get and/or Post is allowed to support including alternative URLs for uses such as load balancing or backup. + + + + + + Connect point URL prefix and any constraints for the HTTP "Get" request method for this operation request. + + + + + Connect point URL and any constraints for the HTTP "Post" request method for this operation request. + + + + + + + + + Connect point URL and any constraints for this HTTP request method for this operation request. In the OnlineResourceType, the xlink:href attribute in the xlink:simpleLink attribute group shall be used to contain this URL. The other attributes in the xlink:simpleLink attribute group should not be used. + + + + + + + Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this request method for this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata or Operation element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this request method for this operation shall be specified in the Implementation Specification for this service. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsDomainType.xsd + + owsDomainType.xsd 2010-01-30 + This XML Schema Document encodes the allowed values (or domain) of a quantity, often for an input or output parameter to an OWS. Such a parameter is sometimes called a variable, quantity, literal, or typed literal. Such a parameter can use one of many data types, including double, integer, boolean, string, or URI. The allowed values can also be encoded for a quantity that is not explicit or not transferred, but is constrained by a server implementation. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Valid domain (or allowed set of values) of one quantity, with its name or identifier. + + + + + + Name or identifier of this quantity. + + + + + + + + + Valid domain (or allowed set of values) of one quantity, with needed metadata but without a quantity name or identifier. + + + + + + Optional default value for this quantity, which should be included when this quantity has a default value. + + + + + Meaning metadata should be referenced or included for each quantity. + + + + + This data type metadata should be referenced or included for each quantity. + + + + + Unit of measure, which should be included when this set of PossibleValues has units or a more complete reference system. + + + + + Optional unordered list of other metadata about this quantity. A list of required and optional other metadata elements for this quantity should be specified in the Implementation Specification for this service. + + + + + + + + Specifies the possible values of this quantity. + + + + + + + + + + + + Specifies that any value is allowed for this parameter. + + + + + + + Specifies that no values are allowed for this parameter or quantity. + + + + + + + Reference to externally specified list of all the valid values and/or ranges of values for this quantity. (Informative: This element was simplified from the metaDataProperty element in GML 3.0.) + + + + + + Human-readable name of the list of values provided by the referenced document. Can be empty string when this list has no name. + + + + + + + + + + Indicates that this quantity has units or a reference system, and identifies the unit or reference system used by the AllowedValues or ValuesReference. + + + + + Identifier of unit of measure of this set of values. Should be included then this set of values has units (and not a more complete reference system). + + + + + Identifier of reference system used by this set of values. Should be included then this set of values has a reference system (not just units). + + + + + + + + + List of all the valid values and/or ranges of values for this quantity. For numeric quantities, signed values should be ordered from negative infinity to positive infinity. + + + + + + + + + + + + + + A single value, encoded as a string. This type can be used for one value, for a spacing between allowed values, or for the default value of a parameter. + + + + + + + + + The default value for a quantity for which multiple values are allowed. + + + + + + + + A range of values of a numeric parameter. This range can be continuous or discrete, defined by a fixed spacing between adjacent valid values. If the MinimumValue or MaximumValue is not included, there is no value limit in that direction. Inclusion of the specified minimum and maximum values in the range shall be defined by the rangeClosure. + + + + + + + Shall be included when the allowed values are NOT continuous in this range. Shall not be included when the allowed values are continuous in this range. + + + + + + Shall be included unless the default value applies. + + + + + + + Minimum value of this numeric parameter. + + + + + + Maximum value of this numeric parameter. + + + + + + The regular distance or spacing between the allowed values in a range. + + + + + + Specifies which of the minimum and maximum values are included in the range. Note that plus and minus infinity are considered closed bounds. + + + + + + The specified minimum and maximum values are included in this range. + + + + + The specified minimum and maximum values are NOT included in this range. + + + + + The specified minimum value is NOT included in this range, and the specified maximum value IS included in this range. + + + + + The specified minimum value IS included in this range, and the specified maximum value is NOT included in this range. + + + + + + + + + + References metadata about a quantity, and provides a name for this metadata. (Informative: This element was simplified from the metaDataProperty element in GML 3.0.) + + + + + Human-readable name of the metadata described by associated referenced document. + + + + + + + + + Reference to data or metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, this attribute should be a URL from which this metadata can be electronically retrieved. Alternately, this attribute can reference a URN for well-known metadata. For example, such a URN could be a URN defined in the "ogc" URN namespace. + + + + + + Definition of the meaning or semantics of this set of values. This Meaning can provide more specific, complete, precise, machine accessible, and machine understandable semantics about this quantity, relative to other available semantic information. For example, other semantic information is often provided in "documentation" elements in XML Schemas or "description" elements in GML objects. + + + + + + Definition of the data type of this set of values. In this case, the xlink:href attribute can reference a URN for a well-known data type. For example, such a URN could be a data type identification URN defined in the "ogc" URN namespace. + + + + + + Definition of the reference system used by this set of values, including the unit of measure whenever applicable (as is normal). In this case, the xlink:href attribute can reference a URN for a well-known reference system, such as for a coordinate reference system (CRS). For example, such a URN could be a CRS identification URN defined in the "ogc" URN namespace. + + + + + + Definition of the unit of measure of this set of values. In this case, the xlink:href attribute can reference a URN for a well-known unit of measure (uom). For example, such a URN could be a UOM identification URN defined in the "ogc" URN namespace. + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsExceptionReport.xsd + + + owsExceptionReport.xsd 2010-01-30 + This XML Schema Document encodes the Exception Report response to all OWS operations. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + Report message returned to the client that requested any OWS operation when the server detects an error while processing that operation request. + + + + + + Unordered list of one or more Exception elements that each describes an error. These Exception elements shall be interpreted by clients as being independent of one another (not hierarchical). + + + + + + Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XML Schemas against which an XML encoded operation response must conform and should be validated. See Version negotiation subclause for more information. + + + + + + + + + + + + + + + An Exception element describes one detected error that a server chooses to convey to the client. + + + + + Ordered sequence of text strings that describe this specific exception or error. The contents of these strings are left open to definition by each server implementation. A server is strongly encouraged to include at least one ExceptionText value, to provide more information about the detected error than provided by the exceptionCode. When included, multiple ExceptionText values shall provide hierarchical information about one detected error, with the most significant information listed first. + + + + + + A code representing the type of this exception, which shall be selected from a set of exceptionCode values specified for the specific service operation and server. + + + + + When included, this locator shall indicate to the client where an exception was encountered in servicing the client's operation request. This locator should be included whenever meaningful information can be provided by the server. The contents of this locator will depend on the specific exceptionCode and OWS service, and shall be specified in the OWS Implementation Specification. + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsContents.xsd + + owsContents.xsd 2010-01-30 + This XML Schema Document encodes the typical Contents section of an OWS service metadata (Capabilities) document. This Schema can be built upon to define the Contents section for a specific OWS. If the ContentsBaseType in this XML Schema cannot be restricted and extended to define the Contents section for a specific OWS, all other relevant parts defined in owsContents.xsd shall be used by the "ContentsType" in the wxsContents.xsd prepared for the specific OWS. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Contents of typical Contents section of an OWS service metadata (Capabilities) document. This type shall be extended and/or restricted if needed for specific OWS use to include the specific metadata needed. + + + + + Unordered set of summary descriptions for the datasets available from this OWS server. This set shall be included unless another source is referenced and all this metadata is available from that source. + + + + + Unordered set of references to other sources of metadata describing the coverage offerings available from this server. + + + + + + + + Reference to a source of metadata describing coverage offerings available from this server. This parameter can reference a catalogue server from which dataset metadata is available. This ability is expected to be used by servers with thousands or millions of datasets, for which searching a catalogue is more feasible than fetching a long Capabilities XML document. When no DatasetDescriptionSummaries are included, and one or more catalogue servers are referenced, this set of catalogues shall contain current metadata summaries for all the datasets currently available from this OWS server, with the metadata for each such dataset referencing this OWS server. + + + + + + + + Typical dataset metadata in typical Contents section of an OWS service metadata (Capabilities) document. This type shall be extended and/or restricted if needed for specific OWS use, to include the specific Dataset description metadata needed. + + + + + + + Unordered list of zero or more minimum bounding rectangles surrounding coverage data, using the WGS 84 CRS with decimal degrees and longitude before latitude. If no WGS 84 bounding box is recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall apply to this coverage. If WGS 84 bounding box(es) are recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall be ignored. For each lowest-level coverage in a hierarchy, at least one applicable WGS84BoundingBox shall be either recorded or inherited, to simplify searching for datasets that might overlap a specified region. If multiple WGS 84 bounding boxes are included, this shall be interpreted as the union of the areas of these bounding boxes. + + + + + Unambiguous identifier or name of this coverage, unique for this server. + + + + + Unordered list of zero or more minimum bounding rectangles surrounding coverage data, in AvailableCRSs. Zero or more BoundingBoxes are allowed in addition to one or more WGS84BoundingBoxes to allow more precise specification of the Dataset area in AvailableCRSs. These Bounding Boxes shall not use any CRS not listed as an AvailableCRS. However, an AvailableCRS can be listed without a corresponding Bounding Box. If no such bounding box is recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall apply to this coverage. If such bounding box(es) are recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall be ignored. If multiple bounding boxes are included with the same CRS, this shall be interpreted as the union of the areas of these bounding boxes. + + + + + Optional unordered list of additional metadata about this dataset. A list of optional metadata elements for this dataset description could be specified in the Implementation Specification for this service. + + + + + Metadata describing zero or more unordered subsidiary datasets available from this server. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsInputOutputData.xsd + + owsInputOutputData.xsd 2010-01-30 + This XML Schema Document specifies types and elements for input and output of operation data, allowing including multiple data items with each data item either included or referenced. The contents of each type and element specified here can be restricted and/or extended for each use in a specific OWS specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Response from an OWS operation, allowing including multiple output data items with each item either included or referenced. This OperationResponse element, or an element using the ManifestType with a more specific element name, shall be used whenever applicable for responses from OWS operations. + This element is specified for use where the ManifestType contents are needed for an operation response, but the Manifest element name is not fully applicable. This element or the ManifestType shall be used instead of using the ows:ReferenceType proposed in OGC 04-105. + + + + + + Input data in a XML-encoded OWS operation request, allowing including multiple data items with each data item either included or referenced. This InputData element, or an element using the ManifestType with a more-specific element name (TBR), shall be used whenever applicable within XML-encoded OWS operation requests. + + + + + + + + Complete reference to a remote resource that needs to be retrieved from an OWS using an XML-encoded operation request. This element shall be used, within an InputData or Manifest element that is used for input data, when that input data needs to be retrieved from another web service using a XML-encoded OWS operation request. This element shall not be used for local payload input data or for requesting the resource from a web server using HTTP Get. + + + + + + + The XML-encoded operation request message to be sent to request this input data from another web server using HTTP Post. + + + + + Reference to the XML-encoded operation request message to be sent to request this input data from another web server using HTTP Post. The referenced message shall be attached to the same message (using the cid scheme), or be accessible using a URL. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\ows\1.1.0\owsManifest.xsd + + owsManifest.xsd 2010-01-30 + This XML Schema Document specifies types and elements for document or resource references and for package manifests that contain multiple references. The contents of each type and element specified here can be restricted and/or extended for each use in a specific OWS specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + Base for a reference to a remote or local resource. + This type contains only a restricted and annotated set of the attributes from the xlink:simpleLink attributeGroup. + + + + + Reference to a remote resource or local payload. A remote resource is typically addressed by a URL. For a local payload (such as a multipart mime message), the xlink:href must start with the prefix cid:. + + + + + Reference to a resource that describes the role of this reference. When no value is supplied, no particular role value is to be inferred. + + + + + Although allowed, this attribute is not expected to be useful in this application of xlink:simpleLink. + + + + + Describes the meaning of the referenced resource in a human-readable fashion. + + + + + Although allowed, this attribute is not expected to be useful in this application of xlink:simpleLink. + + + + + Although allowed, this attribute is not expected to be useful in this application of xlink:simpleLink. + + + + + + + + + Complete reference to a remote or local resource, allowing including metadata about that resource. + + + + + + + Optional unique identifier of the referenced resource. + + + + + + The format of the referenced resource. This element is omitted when the mime type is indicated in the http header of the reference. + + + + + Optional unordered list of additional metadata about this resource. A list of optional metadata elements for this ReferenceType could be specified in the Implementation Specification for each use of this type in a specific OWS. + + + + + + + + + + + + + Logical group of one or more references to remote and/or local resources, allowing including metadata about that group. A Group can be used instead of a Manifest that can only contain one group. + + + + + + + + + + + + + + + Unordered list of one or more groups of references to remote and/or local resources. + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\RequestBaseType.xsd + + $Id: RequestBaseType.xsd 2007-10-09 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + WPS operation request base, for all WPS operations except GetCapabilities. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. + + + + Service type identifier (WPS) + + + + + Version of the WPS interface specification implemented by the server (1.0.0) + + + + + RFC 4646 language code of the human-readable text (e.g. "en-CA"). + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDescribeProcess_response.xsd + + $Id: wpsDescribeProcess_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeProcess operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS DescribeProcess operation response. + + + + + + + + Ordered list of one or more full Process descriptions, listed in the order in which they were requested in the DescribeProcess operation request. + + + + + + + + + + + Full description of a process. + + + + + + + List of the inputs to this process. In almost all cases, at least one process input is required. However, no process inputs may be identified when all the inputs are predetermined fixed resources. In this case, those resources shall be identified in the ows:Abstract element that describes the process. + + + + + + Unordered list of one or more descriptions of the inputs that can be accepted by this process, including all required and optional inputs. Where an input is optional because a default value exists, that default value must be identified in the "ows:Abstract" element for that input, except in the case of LiteralData, where the default must be indicated in the corresponding ows:DefaultValue element. Where an input is optional because it depends on the value(s) of other inputs, this must be indicated in the ows:Abstract element for that input. + + + + + + + + List of outputs which will or can result from executing the process. + + + + + + Unordered list of one or more descriptions of all the outputs that can result from executing this process. At least one output is required from each process. + + + + + + + + + Indicates if ComplexData outputs from this process can be stored by the WPS server as web-accessible resources. If "storeSupported" is "true", the Execute operation request may include "asReference" equals "true" for any complex output, directing that the output of the process be stored so that the client can retrieve it as required. By default for this process, storage is not supported and all outputs are returned encoded in the Execute response. + + + + + Indicates if ongoing status information can be provided for this process. If "true", the Status element of the stored Execute response document shall be kept up to date. If "false" then the Status element shall not be updated until processing is complete. By default, status information is not provided for this process. + + + + + + + + + + Description of an input to a process. + + + + + In this use, the DescriptionType shall describe this process input. + + + + + + + The minimum number of times that values for this parameter are required in an Execute request. If "0", this data input is optional. If greater than "0" then this process input is required. + + + + + The maximum number of times that values for this parameter are permitted in an Execute request. If "1" then this parameter may appear only once in an Execute request. If greater than "1", then this input parameter may appear that many times in an Execute request. + + + + + + + + + Identifies the form of this input and provides supporting information. + + + + + Indicates that this Input shall be a complex data structure (such as a GML document), and provides a list of Formats, Encodings, and Schemas supported for this Input. The value of this ComplexData structure can be input either embedded in the Execute request or remotely accessible to the server. The client can select from among the identified combinations of Formats, Encodings, and Schemas to specify the form of the Input. This allows for complete specification of particular versions of GML, or image formats. + + + + + Indicates that this Input shall be a simple numeric value or character string that is embedded in the execute request, and describes the possible values. + + + + + Indicates that this Input shall be a BoundingBox data structure that is embedded in the execute request, and provides a list of the Coordinate Reference System support for this Bounding Box. + + + + + + + + Description of a process input that consists of a simple literal value (e.g., "2.1"). (Informative: This type is a subset of the ows:UnNamedDomainType defined in owsDomaintype.xsd.) + + + + + + + Identifies the type of this literal input and provides supporting information. For literal values with a defined Unit of Measure, the contents of these sub-elements shall be understood to be consistent with the default Unit of Measure. + + + + + Optional default value for this quantity, which should be included when this quantity has a default value. The DefaultValue shall be understood to be consistent with the unit of measure selected in the Execute request. + + + + + + + + + + Identifies the type of this literal input and provides supporting information. + + + + + Indicates that there are a finite set of values and ranges allowed for this input, and contains list of all the valid values and/or ranges of values. Notice that these values and ranges can be displayed to a human client. + + + + + Indicates that any value is allowed for this input. This element shall be included when there are no restrictions, except for data type, on the allowable value of this input. + + + + + Indicates that there are a finite set of values and ranges allowed for this input, which are specified in the referenced list. + + + + + + + + References an externally defined finite set of values and ranges for this input. + + + + + Reference to a description of the mimetype, encoding, and schema used for this set of values and ranges. + + + + + + + + + + + + + The maximum file size, in megabytes, of this input. If the input exceeds this size, the server will return an error instead of processing the inputs. + + + + + + + + + + Listing of the Unit of Measure (U0M) support for this process input or output. + + + + + Reference to the default UOM supported for this input or output, if UoM is applicable. The process shall expect input in or produce output in this UOM unless the Execute request specifies another supported UOM. + + + + + + Reference to the default UOM supported for this Input/Output + + + + + + + + Unordered list of references to all of the UOMs supported for this input or output, if UOM is applicable. The default UOM shall be included in this list. + + + + + + + + Identifies a UOM supported for this input or output. + + + + + Reference to a UOM supported for this input or output. + + + + + + + + Listing of the Coordinate Reference System (CRS) support for this process input or output. + + + + + Identifies the default CRS that will be used unless the Execute operation request specifies another supported CRS. + + + + + + Reference to the default CRS supported for this Input/Output + + + + + + + + Unordered list of references to all of the CRSs supported for this Input/Output. The default CRS shall be included in this list. + + + + + + + + Identifies a Coordinate Reference System (CRS) supported for this input or output. + + + + + Reference to a CRS supported for this Input/Output. + + + + + + + + Formats, encodings, and schemas supported by a process input or output. + + + + + Identifies the default combination of Format, Encoding, and Schema supported for this Input/Output. The process shall expect input in or produce output in this combination of MimeType/Encoding/Schema unless the Execute request specifies otherwise. + + + + + Unordered list of combinations of format, encoding, and schema supported for this Input/Output. This element shall be repeated for each combination of MimeType/Encoding/Schema that is supported for this Input/Output. This list shall include the default MimeType/Encoding/Schema. + + + + + + + + Identifies the default Format, Encoding, and Schema supported for this input or output. The process shall expect input in or produce output in this combination of Format/Encoding/Schema unless the Execute request specifies otherwise.. + + + + + The default combination of MimeType/Encoding/Schema supported for this Input/Output. + + + + + + + + Identifies valid combinations of Format, Encoding, and Schema supported for this input or output. The process shall expect input in or produce output in this combination of Format/Encoding/Schema unless the Execute request specifies otherwise.. + + + + + A valid combination of MimeType/Encoding/Schema supported for this Input/Output. + + + + + + + + A combination of format, encoding, and/or schema supported by a process input or output. + + + + + Mime type supported for this input or output (e.g., text/xml). + + + + + Reference to an encoding supported for this input or output (e.g., UTF-8). This element shall be omitted if Encoding does not apply to this Input/Output. + + + + + Reference to a definition of XML elements or types supported for this Input/Output (e.g., GML 2.1 Application Schema). Each of these XML elements or types shall be defined in a separate XML Schema Document. This parameter shall be included when this input/output is XML encoded using an XML schema. When included, the input/output shall validate against the referenced XML Schema. This element shall be omitted if Schema does not apply to this Input/Output. Note: If the Input/Output uses a profile of a larger schema, the server administrator should provide that schema profile for validation purposes. + + + + + + + + + Description of a process Output. + + + + + In this use, the DescriptionType shall describe this process output. + + + + + + + + + Identifies the form of this output, and provides supporting information. + + + + + Indicates that this Output shall be a complex data structure (such as a GML fragment) that is returned by the execute operation response. The value of this complex data structure can be output either embedded in the execute operation response or remotely accessible to the client. When this output form is indicated, the process produces only a single output, and "store" is "false, the output shall be returned directly, without being embedded in the XML document that is otherwise provided by execute operation response. + This element also provides a list of format, encoding, and schema combinations supported for this output. The client can select from among the identified combinations of formats, encodings, and schemas to specify the form of the output. This allows for complete specification of particular versions of GML, or image formats. + + + + + Indicates that this output shall be a simple literal value (such as an integer) that is embedded in the execute response, and describes that output. + + + + + Indicates that this output shall be a BoundingBox data structure, and provides a list of the CRSs supported in these Bounding Boxes. This element shall be included when this process output is an ows:BoundingBox element. + + + + + + + + Description of a literal output (or input). + + + + + Data type of this set of values (e.g. integer, real, etc). This data type metadata should be included for each quantity whose data type is not a string. + + + + + List of supported units of measure for this input or output. This element should be included when this literal has a unit of measure (e.g., "meters", without a more complete reference system). Not necessary for a count, which has no units. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\ResponseBaseType.xsd + + $Id: wpsCommon.xsd 2007-10-09 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS operation response base, for all WPS operations except GetCapabilities. + + + + Service type identifier (WPS) + + + + + Version of the WPS interface specification implemented by the server (1.0.0) + + + + + RFC 4646 language code of the human-readable text (e.g. "en-CA"). + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\xml\xml.xsd + + + +
+

About the XML namespace

+
+

This schema document describes the XML namespace, in a form + suitable for import by other schema documents.

+

+ See + http://www.w3.org/XML/1998/namespace.html + and + http://www.w3.org/TR/REC-xml + for information + about this namespace. +

+

Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance.

+

+ See further below in this document for more information about + how to refer to this schema document from your own + XSD schema documents + and about + the + namespace-versioning policy governing this schema document + . +

+
+
+
+
+ + + +
+

lang (as an attribute name)

+

denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.

+
+
+

Notes

+

Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility.

+

+ See BCP 47 at + http://www.rfc-editor.org/rfc/bcp/bcp47.txt + and the IANA language subtag registry at + http://www.iana.org/assignments/language-subtag-registry + for further information. +

+

The union allows for the 'un-declaration' of xml:lang with + the empty string.

+
+
+
+ + + + + + + + + +
+ + + +
+

space (as an attribute name)

+

denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.

+
+
+
+ + + + + + +
+ + + +
+

base (as an attribute name)

+

denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.

+

+ See + http://www.w3.org/TR/xmlbase/ + for information about this attribute. +

+
+
+
+
+ + + +
+

id (as an attribute name)

+

denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.

+

+ See + http://www.w3.org/TR/xml-id/ + for information about this attribute. +

+
+
+
+
+ + + + + + + + +
+

Father (in any context at all)

+
+

denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups:

+
+

In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father".

+
+
+
+
+
+ + +
+

+ About this schema document +

+
+

+ This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow + xml:base + , + xml:lang + , + xml:space + or + xml:id + attributes on elements they define. +

+

To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows:

+
<schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+

or

+
<import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+

Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g.

+
<type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+

will define a type which will schema-validate an instance element + with any of those attributes.

+
+
+
+
+ + +
+

+ Versioning policy for this schema document +

+
+

+ In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2009/01/xml.xsd + . +

+

+ At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd + . +

+

+ The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at + http://www.w3.org/2001/xml.xsd + will change accordingly; the version at + http://www.w3.org/2009/01/xml.xsd + will not change. +

+

Previous dated (and unchanging) versions of this schema + document are at:

+ +
+
+
+
+
]]>
http://www.w3.org/2001/XMLSchema
file:\D:\schemas\wps\common\DescriptionType.xsd + + $Id: wpsCommon.xsd 2007-10-09 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Description of a WPS process or output object. + + + + + Unambiguous identifier or name of a process, unique for this server, or unambiguous identifier or name of an output, unique for this process. + + + + + Title of a process or output, normally available for display to a human. + + + + + Brief narrative description of a process or output, normally available for display to a human. + + + + + Optional unordered list of additional metadata about this process/input/output. A list of optional and/or required metadata elements for this process/input/output could be specified in an Application Profile for this service. + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\ProcessBriefType.xsd + + $Id: ProcessBriefType.xsd 2007-10-09 $ + + Brief description of a Process, designed for Process discovery. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + + Optional unordered list of application profiles to which this process complies. + + + + + Location of a WSDL document which describes this process. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\ProcessVersion.xsd + + $Id: wpsCommon.xsd 2007-03-03 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Release version of this Process, included when a process version needs to be included for clarification about the process to be used. It is possible that a WPS supports a process with different versions due to reasons such as modifications of process algorithms. Notice that this is the version identifier for the process, not the version of the WPS interface. The processVersion is informative only. Version negotiation for processVersion is not available. Requests to Execute a process do not include a processVersion identifier. + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\WSDL.xsd + + $Id: WSDL.xsd 2007-05-01 $ + + Location of a WSDL document. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Location of a WSDL document. + + + + + The URL from which the WSDL document can be retrieved. + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsExecute_request.xsd + + $Id: wpsExecute_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS Execute operation request, to execute one identified Process. If a process is to be run multiple times, each run shall be submitted as a separate Execute request. + + + + + + + + Identifier of the Process to be executed. This Process identifier shall be as listed in the ProcessOfferings section of the WPS Capabilities document. + + + + + List of input (or parameter) values provided to the process, including each of the Inputs needed to execute the process. It is possible to have no inputs provided only when all the inputs are predetermined fixed resources. In all other cases, at least one input is required. + + + + + Defines the response type of the WPS, either raw data or XML document. If absent, the response shall be a response document which includes all outputs encoded in the response. + + + + + + + + + + + List of the Inputs provided as part of the Execute Request. + + + + + Unordered list of one or more inputs to be used by the process, including each of the Inputs needed to execute the process. + + + + + + + + Defines the response type of the WPS, either raw data or XML document + + + + + Indicates that the outputs shall be returned as part of a WPS response document. + + + + + Indicates that the output shall be returned directly as raw data, without a WPS response document. + + + + + + + + + + Unordered list of definitions of the outputs (or parameters) requested from the process. These outputs are not normally identified, unless the client is specifically requesting a limited subset of outputs, and/or is requesting output formats and/or schemas and/or encodings different from the defaults and selected from the alternatives identified in the process description, or wishes to customize the descriptive information about the output. + + + + + + Indicates if the execute response document shall be stored. If "true" then the executeResponseLocation attribute in the execute response becomes mandatory, which will point to the location where the executeResponseDocument is stored. The service shall respond immediately to the request and return an executeResponseDocument containing the executeResponseLocation and the status element which has five possible subelements (choice):ProcessAccepted, ProcessStarted, ProcessPaused, ProcessFailed and ProcessSucceeded, which are chosen and populated as follows: 1) If the process is completed when the initial executeResponseDocument is returned, the element ProcessSucceeded is populated with the process results. 2) If the process already failed when the initial executeResponseDocument is returned, the element ProcessFailed is populated with the Exception. 3) If the process has been paused when the initial executeResponseDocument is returned, the element ProcessPaused is populated. 4) If the process has been accepted when the initial executeResponseDocument is returned, the element ProcessAccepted is populated, including percentage information. 5) If the process execution is ongoing when the initial executeResponseDocument is returned, the element ProcessStarted is populated. In case 3, 4, and 5, if status updating is requested, updates are made to the executeResponseDocument at the executeResponseLocation until either the process completes successfully or fails. Regardless, once the process completes successfully, the ProcessSucceeded element is populated, and if it fails, the ProcessFailed element is populated. + Specifies if the Execute operation response shall be returned quickly with status information, or not returned until process execution is complete. This parameter shall not be included unless the corresponding "statusSupported" parameter is included and is "true" in the ProcessDescription for this process. + + + + + Indicates if the Execute operation response shall include the DataInputs and OutputDefinitions elements. If lineage is "true" the server shall include in the execute response a complete copy of the DataInputs and OutputDefinition elements as received in the execute request. If lineage is "false" then these elements shall be omitted from the response. + + + + + Indicates if the stored execute response document shall be updated to provide ongoing reports on the status of execution. If status is "true" and storeExecuteResponse is "true" (and the server has indicated that both storeSupported and statusSupported are "true") then the Status element of the execute response document stored at executeResponseLocation is kept up to date by the process. While the execute response contains ProcessAccepted, ProcessStarted, or ProcessPaused, updates shall be made to the executeResponse document until either the process completes successfully (in which case ProcessSucceeded is populated), or the process fails (in which case ProcessFailed is populated). If status is "false" then the Status element shall not be updated until the process either completes successfully or fails. If status="true" and storeExecuteResponse is "false" then the service shall raise an exception. + + + + + + + Definition of a format, encoding, schema, and unit-of-measure for an output to be returned from a process. + + + + + In this use, the DescriptionType shall describe this process input or output. + + + + + Title of the process output, normally available for display to a human. This element should be used if the client wishes to customize the Title in the execute response. This element should not be used if the Title provided for this output in the ProcessDescription is adequate. + + + + + Brief narrative description of a process output, normally available for display to a human. This element should be used if the client wishes to customize the Abstract in the execute response. This element should not be used if the Abstract provided for this output in the ProcessDescription is adequate. + + + + + + Specifies if this output should be stored by the process as a web-accessible resource. If asReference is "true", the server shall store this output so that the client can retrieve it as required. If store is "false", all the output shall be encoded in the Execute operation response document. This parameter only applies to ComplexData outputs. This parameter shall not be included unless the corresponding "storeSupported" parameter is included and is "true" in the ProcessDescription for this process. + + + + + + + + + Definition of a format, encoding, schema, and unit-of-measure for an output to be returned from a process. + + + + + Unambiguous identifier or name of an output, unique for this process. + + + + + + Reference to the unit of measure (if any) requested for this output. A uom can be referenced when a client wants to specify one of the units of measure supported for this output. This uom shall be a unit of measure referenced for this output of this process in the Process full description. + + + + + + + + References the XML schema, format, and encoding of a complex value. + + + + The Format of this input or requested for this output (e.g., text/xml). This element shall be omitted when the Format is indicated in the http header of the output. When included, this format shall be one published for this output or input in the Process full description. + + + + + The encoding of this input or requested for this output (e.g., UTF-8). This "encoding" shall be included whenever the encoding required is not the default encoding indicated in the Process full description. When included, this encoding shall be one published for this output or input in the Process full description. + + + + + Web-accessible XML Schema Document that defines the content model of this complex resource (e.g., encoded using GML 2.2 Application Schema). This reference should be included for XML encoded complex resources to facilitate validation. + PS I changed the name of this attribute to be consistent with the ProcessDescription. The original was giving me validation troubles in XMLSpy. + + + + + + + + Value of one input to a process. + + + + + Unambiguous identifier or name of a process, unique for this server, or unambiguous identifier or name of an output, unique for this process. + + + + + Title of a process or output, normally available for display to a human. + + + + + Brief narrative description of a process or output, normally available for display to a human. + + + + + Identifies the form of this input, and provides supporting information. + + + + + + + + Identifies the form of this input or output value, and provides supporting information. + + + + + Identifies this input value as a web accessible resource, and references that resource. + + + + + Identifies this input value as a data embedded in this request, and includes that data. + + + + + + + + Identifies the form of this input or output value, and provides supporting information. + + + + + Identifies this input or output value as a complex data structure encoded in XML (e.g., using GML), and provides that complex data structure. For an input, this element may be used by a client for any process input coded as ComplexData in the ProcessDescription. For an output, this element shall be used by a server when "store" in the Execute request is "false". + + + + + Identifies this input or output data as literal data of a simple quantity (e.g., one number), and provides that data. + + + + + Identifies this input or output data as an ows:BoundingBox data structure, and provides that ows:BoundingBox data. + + + + + + + + + Reference to an input or output value that is a web accessible resource. + + + + + Extra HTTP request headers needed by the service identified in ../Reference/@href. For example, an HTTP SOAP request requires a SOAPAction header. This permits the creation of a complete and valid POST request. + + + + + Key portion of the Key-Value pair in the HTTP request header. + + + + + Value portion of the Key-Value pair in the HTTP request header. + + + + + + + + The contents of this element to be used as the body of the HTTP request message to be sent to the service identified in ../Reference/@href. For example, it could be an XML encoded WFS request using HTTP POST + + + + + Reference to a remote document to be used as the body of the an HTTP POST request message to the service identified in ../Reference/@href. + + + + + Reference to a remote document to be used as the body of the an HTTP POST request message. This attribute shall contain a URL from which this input can be electronically retrieved. + + + + + + + + + Reference to a web-accessible resource that can be used as input, or is provided by the process as output. This attribute shall contain a URL from which this input/output can be electronically retrieved. + + + + + Identifies the HTTP method. Allows a choice of GET or POST. Default is GET. + + + + + + + + + + + + + + Complex data (such as an image), including a definition of the complex value data structure (i.e., schema, format, and encoding). May be an ows:Manifest data structure. + + + + + + + + + + + One simple literal value (such as an integer or real number) that is embedded in the Execute operation request or response. + + + + + String containing the Literal value (e.g., "49"). + + + + Identifies the data type of this literal input or output. This dataType should be included for each quantity whose value is not a simple string. + + + + + Identifies the unit of measure of this literal input or output. This unit of measure should be referenced for any numerical value that has units (e.g., "meters", but not a more complete reference system). Shall be a UOM identified in the Process description for this input or output. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsExecute_response.xsd + + + $Id: wpsExecute_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + WPS Execute operation response. By default, this XML document is delivered to the client in response to an Execute request. If "status" is "false" in the Execute operation request, this document is normally returned when process execution has been completed. + If "status" in the Execute request is "true", this response shall be returned as soon as the Execute request has been accepted for processing. In this case, the same XML document is also made available as a web-accessible resource from the URL identified in the statusLocation, and the WPS server shall repopulate it once the process has completed. It may repopulate it on an ongoing basis while the process is executing. + However, the response to an Execute request will not include this element in the special case where the output is a single complex value result and the Execute request indicates that "store" is "false". Instead, the server shall return the complex result (e.g., GIF image or GML) directly, without encoding it in the ExecuteResponse. If processing fails in this special case, the normal ExecuteResponse shall be sent, with the error condition indicated. This option is provided to simplify the programming required for simple clients and for service chaining. + + + + + + + + Process description from the ProcessOfferings section of the GetCapabilities response. + + + + + Execution status of this process. + + + + + Inputs that were provided as part of the execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + Complete list of Output data types that were requested as part of the Execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + List of values of the Process output parameters. Normally there would be at least one output when the process has completed successfully. If the process has not finished executing, the implementer can choose to include whatever final results are ready at the time the Execute response is provided. If the reference locations of outputs are known in advance, these URLs may be provided before they are populated. + + + + + + Unordered list of values of all the outputs produced by this process. It is not necessary to include an output until the Status is ProcessSucceeded. + + + + + + + + + + This attribute shall contain the GetCapabilities URL of the WPS service which was invoked + + + + + The URL referencing the location from which the ExecuteResponse can be retrieved. If "status" is "true" in the Execute request, the ExecuteResponse should also be found here as soon as the process returns the initial response to the client. It should persist at this location as long as the outputs are accessible from the server. The outputs may be stored for as long as the implementer of the server decides. If the process takes a long time, this URL can be repopulated on an ongoing basis in order to keep the client updated on progress. Before the process has succeeded, the ExecuteResponse contains information about the status of the process, including whether or not processing has started, and the percentage completed. It may also optionally contain the inputs and any ProcessStartedType interim results. When the process has succeeded, the ExecuteResponse found at this URL shall contain the output values or references to them. + + + + + + + + + + Definition of a format, encoding, schema, and unit-of-measure for an output to be returned from a process. + + + + + Output definition as provided in the execute request + + + + + + + + Value of one output from a process. + + + + + In this use, the DescriptionType shall describe this process output. + + + + Identifies the form of this output, and provides supporting information. + + + + + + + + + Identifies the form of this input or output value, and provides supporting information. + + + + + Identifies this output as a web accessible resource, and references that resource. This element shall only be used for complex data. This element shall be used by a server when "store" in the Execute request is "true". + + + + + Identifies this output value as a data embedded in this response, and includes that data. This element shall be used by a server when "store" in the Execute request is "false". + + + + + + + + Reference to an output value that is a web accessible resource. + + + + Reference to a web-accessible resource that is provided by the process as output. This attribute shall contain a URL from which this output can be electronically retrieved. + + + + + + + + + Description of the status of process execution. + + + + + Indicates that this process has been accepted by the server, but is in a queue and has not yet started to execute. The contents of this human-readable text string is left open to definition by each server implementation, but is expected to include any messages the server may wish to let the clients know. Such information could include how long the queue is, or any warning conditions that may have been encountered. The client may display this text to a human user. + + + + + Indicates that this process has been accepted by the server, and processing has begun. + + + + + Indicates that this process has been accepted by the server, and processing has started but subsequently been paused by the server. + + + + + Indicates that this process has successfully completed execution. The contents of this human-readable text string is left open to definition by each server, but is expected to include any messages the server may wish to let the clients know, such as how long the process took to execute, or any warning conditions that may have been encountered. The client may display this text string to a human user. The client should make use of the presence of this element to trigger automated or manual access to the results of the process. If manual access is intended, the client should use the presence of this element to present the results as downloadable links to the user. + + + + + Indicates that execution of this process has failed, and includes error information. + + + + + Indicates the process was cancelled. + + + + + + The time (UTC) that the process finished. If the process is still executing or awaiting execution, this element shall contain the creation time of this document. + + + + + + + Indicates that this process has been has been accepted by the server, and processing has begun. + + + + + A human-readable text string whose contents are left open to definition by each WPS server, but is expected to include any messages the server may wish to let the clients know. Such information could include how much longer the process may take to execute, or any warning conditions that may have been encountered to date. The client may display this text to a human user. + + + + Percentage of process that has been completed, where 0 means the process has just started, and 99 means the process is almost complete. This value is expected to be accurate to within ten percent. + + + + + + + + + + + + + + + Indicator that the process has failed to execute successfully. The reason for failure is given in the exception report. + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\ProcessInstanceType.xsd + + + + + + Process instance identifier. + + + + Unique identifier of the Process instance. This could be set to the statusLocation attribute found in the Execute response. + + + + + + + Process instance identifier. + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsGetCapabilities_request.xsd + + $Id: wpsGetCapabilities_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetCapabilities operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + When omitted, server shall return latest supported version. + + + + + + OGC service type identifier (WPS). + + + + + RFC 4646 language code of the human-readable text (e.g. "en-CA"). + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsGetCapabilities_response.xsd + + + $Id: wpsGetCapabilities_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetCapabilities operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + WPS GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, including metadata about the processes that can be executed. Since the server does not implement the updateSequence and Sections parameters, the server shall always return the complete Capabilities document, without the updateSequence parameter. + + + + + + + + + + + List of the default and other languages supported by this service. + + + + + Location of a WSDL document which describes the entire service. + + + + + + + + + + + + + + Listing of the default and other languages supported by this service. + + + + + + Identifies the default language that will be used unless the operation request specifies another supported language. + + + + + + Identifier of the default language supported by the service. This language identifier shall be as specified in IETF RFC 4646. + + + + + + + + Unordered list of references to all of the languages supported by this service. The default language shall be included in this list. + + + + + + + + + Identifies a list of languages supported by this service. + + + + + Identifier of a language supported by the service. This language identifier shall be as specified in IETF RFC 4646. + + + + + + + + List of brief descriptions of the processes offered by this WPS server. + + + + + + Unordered list of one or more brief descriptions of all the processes offered by this WPS server. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\ExtraCapabilities.xsd + + + + + + + + + List of default and other schemas profiles supported for deployement and execution, i.e. ApacheOdeBPEL, GridProfile, ... + + + + + + Identifies the default profile that will be used unless the operation request specifies another supported profile. + + + + + + Default deployment schema + + + + + + + + Unordered list of references to all of the profile schemas supported by this service. The default profile shall be included in this list. + + + + + + + + + + + + + + List of brief descriptions of the data offered by this WPS server. + + + + + + Unordered list of one or more brief descriptions of all the data offered by this WPS server. + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\DataBriefType.xsd + + + $Id: DataBriefType.xsd 2007-10-09 $ + + Brief description of a Data, designed for Data discovery. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + Optional unordered list of application profiles to which this Data complies. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\DataVersion.xsd + + $Id: wpsCommon.xsd 2007-03-03 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Release version of this Data, included when a data version needs to be included for clarification about the data to be used. It is possible that a WPS supports a Data with different versions due to reasons such as modifications of data content. The dataVersion is informative only. Version negotiation for dataVersion is not available. + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\DeploymentProfiles.xsd + + + + + + + + + + + + + + + + + + + + + Tar or Zipped file to be deployed on the Grid. + + + + + Reference (URL) to an archive file to be deployed on the Grid. + + + + + + + + + + Reference (URL) to an archive file to be deployed. + + + + Reference to a web-accessible archive file to be deployed. This attribute shall contain a URL from which this archive can be electronically retrieved. + + + + + + + + + + + Tar or Zipped file to be deployed on Apache ODE server. + + + + + Reference (URL) to an archive file to be deployed on Apache ODE server. + + + + + + + + + + + + + + Tar or Zipped file to be deployed on the Grid. + + + + + Reference (URL) to an archive file to be deployed on the Grid. + + + + + + JSDL template containing substitution variables. + + + + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\jsdl\jsdl.xsd + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDeployProcess_request.xsd + + + $Id: wpsExecute_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS DeployProcess operation request. + + + + + + + + + Process deployment profile. This can be a Apache ODE deployment profile or a SAGA deployment profile. + + + + + + + + + + + Full Process description. + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDeployProcess_response.xsd + + + $Id: wpsExecute_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS DeployProcess operation response. + + + + + + + + DeployProcess request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the deployed process. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsUndeployProcess_request.xsd + + + $Id: wpsUndeployProcess_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS UndeployProcess operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS UndeployProcess operation request. + + + + + + + + Identifier of the process to be undeployed. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsUndeployProcess_response.xsd + + + $Id: wpsUndeployProcess_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS UndeployProcess operation response. + + + + + + + + UndeployProcess request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the undeployed process. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDeployData_request.xsd + + + $Id: wpsExecute_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS DeployData operation request. + + + + + + + + + Data deployment profile. + + + + + + + + + + Full Data description. + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDescribeData_response.xsd + + + $Id: wpsDescribeData_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeData operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS DescribeData operation response. + + + + + + + + Ordered list of one or more full Data descriptions, listed in the order in which they were requested in the DescribeData operation request. + + + + + + + + + + + + + + + Full description of a data. + + + + + + + TBD ... + + + + + + TBD ... + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDeployData_response.xsd + + + $Id: wpsDeployData_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DeployData operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS DeployData operation response. + + + + + + + + DeployData request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the deployed data. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsUndeployData_request.xsd + + + $Id: wpsUndeployData_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS UndeployData operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS UndeployData operation request. + + + + + + + + Identifier of the auxiliary data to be undeployed. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsUndeployData_response.xsd + + + $Id: wpsUndeployData_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DeployData operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS UndeployData operation response. + + + + + + + + UndeployData request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the undeployed data. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsDescribeData_request.xsd + + + $Id: wpsDescribeData_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeData operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS DescribeData operation request. + + + + + + + + Unordered list of one or more identifiers of the data for which the client is requesting detailed descriptions. This element shall be repeated for each data for which a description is requested. These Identifiers are unordered, but the WPS shall return the Data descriptions in the order in which they were requested. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsGetStatus_request.xsd + + + $Id: wpsGetStatus_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetStatus operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS GetStatus operation request. + + + + + + + + Process instance identifier. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsGetStatus_response.xsd + + + $Id: wpsGetStatus_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS GetStatus operation response. + + + + + + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\StatusDocumentType.xsd + + + $Id: StatusDocumentType.xsd 2007-10-09 $ + + Status document type. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + Process description from the ProcessOfferings section of the GetCapabilities response. + + + + + Execution status of this process. + + + + + Inputs that were provided as part of the execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + Complete list of Output data types that were requested as part of the Execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + List of values of the Process output parameters. Normally there would be at least one output when the process has completed successfully. If the process has not finished executing, the implementer can choose to include whatever final results are ready at the time the Execute response is provided. If the reference locations of outputs are known in advance, these URLs may be provided before they are populated. + + + + + + Unordered list of values of all the outputs produced by this process. It is not necessary to include an output until the Status is ProcessSucceeded. + + + + + + + + + + This attribute shall contain the GetCapabilities URL of the WPS service which was invoked + + + + + The URL referencing the location from which the ExecuteResponse can be retrieved. If "status" is "true" in the Execute request, the ExecuteResponse should also be found here as soon as the process returns the initial response to the client. It should persist at this location as long as the outputs are accessible from the server. The outputs may be stored for as long as the implementer of the server decides. If the process takes a long time, this URL can be repopulated on an ongoing basis in order to keep the client updated on progress. Before the process has succeeded, the ExecuteResponse contains information about the status of the process, including whether or not processing has started, and the percentage completed. It may also optionally contain the inputs and any ProcessStartedType interim results. When the process has succeeded, the ExecuteResponse found at this URL shall contain the output values or references to them. + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsCancel_request.xsd + + + $Id: wpsCancel_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Cancel operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS Cancel operation request. + + + + + + + + Process instance identifier. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsCancel_response.xsd + + + $Id: wpsCancel_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + WPS Cancel operation response. + + + + + + + + Cancel request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Process instance identifier. Useful when success is false. + + + + + Required if success is true. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsGetAudit_request.xsd + + + $Id: wpsGetAudit_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetAudit operation request. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS GetAudit operation request. + + + + + + + + Process instance identifier. + + + + + + The short form (default) provides the execution processing flow. The long form provides the full execution trace. + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\wpsGetAudit_response.xsd + + + $Id: wpsGetAudit_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + WPS GetAudit operation response. + + + + + + + + GetAudit request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Process instance identifier. Useful when success is false. + + + + + Required id success is true. + + + + + + + + +]]>http://www.w3.org/2001/XMLSchemafile:\D:\schemas\wps\common\ProcessAuditType.xsd + + + + + + Process Audit trace. + + + + + The audit trace. + + + + + + The short form (default) provides the execution processing flow. The long form provides the full execution trace. + + + + +]]>http://www.w3.org/2001/XMLSchema
http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpointhttp://l-pccnl:8080/ode/processes/FaparVGThttp://mpi-vito.spacebel.be:8080/ode/processes/FaparVGThttp://localhost:8080/ode/processes/FaparVGThttp://mpi-vito.spacebel.be:8080/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpointhttp://mpi-vito.spacebel.be/wps/services/WPS.WPSHttpSoap11Endpointhttp://ssegrid.vgt.vito.be:8080/ode/processes/FaparVGThttp://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpointhttp://localhost:8080/wps/services/WPS.WPSHttpSoap11EndpointUTF-8http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4 + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + + TestData + String + String + + http://www.altova.com + String + + + + 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GwAAJwAAAAAAAAAAAAAAAADUagAAcHJvY2Vzc2VzLm9kZS9vd3MvMS4xLjAvb3dzQ29udGVudHMueHNkUEsBAhQAFAAIAAgAqljrPokpW2PKBwAA/R0AADEAAAAAAAAAAAAAAAAAYHIAAHByb2Nlc3Nlcy5vZGUvb3dzLzEuMS4wL293c0RhdGFJZGVudGlmaWNhdGlvbi54c2RQSwECFAAUAAgACACqWOs+Lvmwx1YLAAAbOAAAKQAAAAAAAAAAAAAAAACJegAAcHJvY2Vzc2VzLm9kZS9vd3MvMS4xLjAvb3dzRG9tYWluVHlwZS54c2RQSwECFAAUAAgACACqWOs+v1qUPTsGAADEEQAALgAAAAAAAAAAAAAAAAA2hgAAcHJvY2Vzc2VzLm9kZS9vd3MvMS4xLjAvb3dzRXhjZXB0aW9uUmVwb3J0LnhzZFBLAQIUABQACAAIAKpY6z5mbnRo4gYAAGEcAAAuAAAAAAAAAAAAAAAAAM2MAABwcm9jZXNzZXMub2RlL293cy8xLjEuMC9vd3NHZXRDYXBhYmlsaXRpZXMueHNkUEsBAhQAFAAIAAgAqljrPknVeKp3BAAA3wwAAC4AAAAAAAAAAAAAAAAAC5QAAHByb2Nlc3Nlcy5vZGUvb3dzLzEuMS4wL293c0dldFJlc291cmNlQnlJRC54c2RQSwECFAAUAAgACACqWOs+gqxWcMkEAABeEAAALgAAAAAAAAAAAAAAAADemAAAcHJvY2Vzc2VzLm9kZS9vd3MvMS4xLjAvb3dzSW5wdXRPdXRwdXREYXRhLnhzZFBLAQIUABQACAAIAKpY6z7ITgGTIgYAADgZAAAnAAAAAAAAAAAAAAAAAAOeAABwcm9jZXNzZXMub2RlL293cy8xLjEuMC9vd3NNYW5pZmVzdC54c2RQSwECFAAUAAgACACqWOs+JRFmFh4HAADeIgAAMQAAAAAAAAAAAAAAAAB6pAAAcHJvY2Vzc2VzLm9kZS9vd3MvMS4xLjAvb3dzT3BlcmF0aW9uc01ldGFkYXRhLnhzZFBLAQIUABQACAAIAKpY6z4UkNuPwAQAAPUNAAA0AAAAAAAAAAAAAAAAAPerAABwcm9jZXNzZXMub2RlL293cy8xLjEuMC9vd3NTZXJ2aWNlSWRlbnRpZmljYXRpb24ueHNkUEsBAhQAFAAIAAgAqljrPhFVuVVUAwAA5wgAAC4AAAAAAAAAAAAAAAAAGbEAAHByb2Nlc3Nlcy5vZGUvb3dzLzEuMS4wL293c1NlcnZpY2VQcm92aWRlci54c2RQSwECFAAUAAgACACqWOs+mR8k/oIDAADYCAAAKgAAAAAAAAAAAAAAAADJtAAAcHJvY2Vzc2VzLm9kZS93cHMvY29tbW9uL0RhdGFCcmllZlR5cGUueHNkUEsBAhQAFAAIAAgAqljrPv13pty2AgAAQAYAACgAAAAAAAAAAAAAAAAAo7gAAHByb2Nlc3Nlcy5vZGUvd3BzL2NvbW1vbi9EYXRhVmVyc2lvbi54c2RQSwECFAAUAAgACACqWOs+lRiFFpYDAAB/EAAALwAAAAAAAAAAAAAAAACvuwAAcHJvY2Vzc2VzLm9kZS93cHMvY29tbW9uL0RlcGxveW1lbnRQcm9maWxlcy54c2RQSwECFAAUAAgACACqWOs++W3fz1UDAACLCQAALAAAAAAAAAAAAAAAAACivwAAcHJvY2Vzc2VzLm9kZS93cHMvY29tbW9uL0Rlc2NyaXB0aW9uVHlwZS54c2RQSwECFAAUAAgACACqWOs+VMaMDCcDAABnCwAALgAAAAAAAAAAAAAAAABRwwAAcHJvY2Vzc2VzLm9kZS93cHMvY29tbW9uL0V4dHJhQ2FwYWJpbGl0aWVzLnhzZFBLAQIUABQACAAIAKpY6z4c3xZv5wEAADYFAAAtAAAAAAAAAAAAAAAAANTGAABwcm9jZXNzZXMub2RlL3dwcy9jb21tb24vUHJvY2Vzc0F1ZGl0VHlwZS54c2RQSwECFAAUAAgACACqWOs+QC2NugEDAADyBwAALQAAAAAAAAAAAAAAAAAWyQAAcHJvY2Vzc2VzLm9kZS93cHMvY29tbW9uL1Byb2Nlc3NCcmllZlR5cGUueHNkUEsBAhQAFAAIAAgAqljrPlqqO43gAQAAQAUAADAAAAAAAAAAAAAAAAAAcswAAHByb2Nlc3Nlcy5vZGUvd3BzL2NvbW1vbi9Qcm9jZXNzSW5zdGFuY2VUeXBlLnhzZFBLAQIUABQACAAIAKpY6z6F4olJ+wIAAAgHAAArAAAAAAAAAAAAAAAAALDOAABwcm9jZXNzZXMub2RlL3dwcy9jb21tb24vUHJvY2Vzc1ZlcnNpb24ueHNkUEsBAhQAFAAIAAgAqljrPomcZRw3AwAAdwgAACwAAAAAAAAAAAAAAAAABNIAAHByb2Nlc3Nlcy5vZGUvd3BzL2NvbW1vbi9SZXF1ZXN0QmFzZVR5cGUueHNkUEsBAhQAFAAIAAgAqljrPkwcR8cqAwAApwgAAC0AAAAAAAAAAAAAAAAAldUAAHByb2Nlc3Nlcy5vZGUvd3BzL2NvbW1vbi9SZXNwb25zZUJhc2VUeXBlLnhzZFBLAQIUABQACAAIAKpY6z6IC4v+bAYAAC4TAAAvAAAAAAAAAAAAAAAAABrZAABwcm9jZXNzZXMub2RlL3dwcy9jb21tb24vU3RhdHVzRG9jdW1lbnRUeXBlLnhzZFBLAQIUABQACAAIAKpY6z7ZKRquOgIAADgFAAAhAAAAAAAAAAAAAAAAAOPfAABwcm9jZXNzZXMub2RlL3dwcy9jb21tb24vV1NETC54c2RQSwECFAAUAAgACACqWOs+eHYwjq4CAAB0BQAAKgAAAAAAAAAAAAAAAABs4gAAcHJvY2Vzc2VzLm9kZS93cHMvb2RlL2FjdGl2aXR5UmVjb3ZlcnkueHNkUEsBAhQAFAAIAAgAqljrPtXvxcajBwAA6CoAABwAAAAAAAAAAAAAAAAAcuUAAHByb2Nlc3Nlcy5vZGUvd3BzL29kZS9kZC54c2RQSwECFAAUAAgACACqWOs+cYicZyYRAAAukwAAHwAAAAAAAAAAAAAAAABf7QAAcHJvY2Vzc2VzLm9kZS93cHMvb2RlL3BtYXBpLnhzZFBLAQIUABQACAAIAKpY6z4X4QFJLAMAAIUHAAAjAAAAAAAAAAAAAAAAANL+AABwcm9jZXNzZXMub2RlL3dwcy9vZGUvc2NoZWR1bGVzLnhzZFBLAQIUABQACAAIAKpY6z5a4evdjQIAAE4JAAAcAAAAAAAAAAAAAAAAAE8CAQBwcm9jZXNzZXMub2RlL3dwcy93cHNBbGwueHNkUEsBAhQAFAAIAAgAqljrPuKFbbu9AgAAOAcAACcAAAAAAAAAAAAAAAAAJgUBAHByb2Nlc3Nlcy5vZGUvd3BzL3dwc0NhbmNlbF9yZXF1ZXN0LnhzZFBLAQIUABQACAAIAKpY6z6chYJEkwMAABoLAAAoAAAAAAAAAAAAAAAAADgIAQBwcm9jZXNzZXMub2RlL3dwcy93cHNDYW5jZWxfcmVzcG9uc2UueHNkUEsBAhQAFAAIAAgAqljrPtcyVhvbAgAAwgcAACsAAAAAAAAAAAAAAAAAIQwBAHByb2Nlc3Nlcy5vZGUvd3BzL3dwc0RlcGxveURhdGFfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+Kw+97lIDAABmCQAALAAAAAAAAAAAAAAAAABVDwEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzRGVwbG95RGF0YV9yZXNwb25zZS54c2RQSwECFAAUAAgACACqWOs+RHE40AYDAABrCAAALgAAAAAAAAAAAAAAAAABEwEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzRGVwbG95UHJvY2Vzc19yZXF1ZXN0LnhzZFBLAQIUABQACAAIAKpY6z5q3RVUXgMAAG0JAAAvAAAAAAAAAAAAAAAAAGMWAQBwcm9jZXNzZXMub2RlL3dwcy93cHNEZXBsb3lQcm9jZXNzX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z7751w2VgMAAIAIAAAtAAAAAAAAAAAAAAAAAB4aAQBwcm9jZXNzZXMub2RlL3dwcy93cHNEZXNjcmliZURhdGFfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+W3yR6H4DAACbCgAALgAAAAAAAAAAAAAAAADPHQEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzRGVzY3JpYmVEYXRhX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z7tm/wUIQMAAD0IAAAwAAAAAAAAAAAAAAAAAKkhAQBwcm9jZXNzZXMub2RlL3dwcy93cHNEZXNjcmliZVByb2Nlc3NfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+dQzbSo4QAABmWQAAMQAAAAAAAAAAAAAAAAAoJQEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzRGVzY3JpYmVQcm9jZXNzX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z5VD3Dj2BEAAEBUAAAoAAAAAAAAAAAAAAAAABU2AQBwcm9jZXNzZXMub2RlL3dwcy93cHNFeGVjdXRlX3JlcXVlc3QueHNkUEsBAhQAFAAIAAgAqljrPvJJB0thDQAAmzYAACkAAAAAAAAAAAAAAAAAQ0gBAHByb2Nlc3Nlcy5vZGUvd3BzL3dwc0V4ZWN1dGVfcmVzcG9uc2UueHNkUEsBAhQAFAAIAAgAqljrPpMwwPwgAwAAUQgAACkAAAAAAAAAAAAAAAAA+1UBAHByb2Nlc3Nlcy5vZGUvd3BzL3dwc0dldEF1ZGl0X3JlcXVlc3QueHNkUEsBAhQAFAAIAAgAqljrPnas1BKfAwAATQsAACoAAAAAAAAAAAAAAAAAclkBAHByb2Nlc3Nlcy5vZGUvd3BzL3dwc0dldEF1ZGl0X3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z4jgyU08AIAAH4HAAAwAAAAAAAAAAAAAAAAAGldAQBwcm9jZXNzZXMub2RlL3dwcy93cHNHZXRDYXBhYmlsaXRpZXNfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+M5J1oaoFAAAFFQAAMQAAAAAAAAAAAAAAAAC3YAEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzR2V0Q2FwYWJpbGl0aWVzX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z4zdT98vgIAAEQHAAAqAAAAAAAAAAAAAAAAAMBmAQBwcm9jZXNzZXMub2RlL3dwcy93cHNHZXRTdGF0dXNfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+FY9bIBQDAABrCAAAKwAAAAAAAAAAAAAAAADWaQEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzR2V0U3RhdHVzX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z57cjvh2QIAAF4HAAAtAAAAAAAAAAAAAAAAAENtAQBwcm9jZXNzZXMub2RlL3dwcy93cHNVbmRlcGxveURhdGFfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+gkyHpFsDAABwCQAALgAAAAAAAAAAAAAAAAB3cAEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzVW5kZXBsb3lEYXRhX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z54b6s81QIAAGMHAAAwAAAAAAAAAAAAAAAAAC50AQBwcm9jZXNzZXMub2RlL3dwcy93cHNVbmRlcGxveVByb2Nlc3NfcmVxdWVzdC54c2RQSwECFAAUAAgACACqWOs+eJoQmGEDAAB9CQAAMQAAAAAAAAAAAAAAAABhdwEAcHJvY2Vzc2VzLm9kZS93cHMvd3BzVW5kZXBsb3lQcm9jZXNzX3Jlc3BvbnNlLnhzZFBLAQIUABQACAAIAKpY6z77NHnEXQUAAMYVAAAdAAAAAAAAAAAAAAAAACF7AQBwcm9jZXNzZXMub2RlL3dzYS93cy1hZGRyLnhzZFBLAQIUABQACAAIAKpY6z4rCv+EiQQAAIEUAAAkAAAAAAAAAAAAAAAAAMmAAQBwcm9jZXNzZXMub2RlL3hsaW5rLzEuMC4wL3hsaW5rcy54c2RQSwECFAAUAAgACACqWOs+4n+0V2gJAACEIgAAGQAAAAAAAAAAAAAAAACkhQEAcHJvY2Vzc2VzLm9kZS94bWwveG1sLnhzZFBLAQIUABQACAAIAKpY6z7rsubbcwAAAJQAAAATAAAAAAAAAAAAAAAAAFOPAQBhc3NlbWJseS5wcm9wZXJ0aWVzUEsFBgAAAABEAEQAIBcAAAeQAQAAAA== + + + +]]><xml-fragment/>UTF-8http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4 + + + + + SuperData + Sample Data given as reference + Description + + http://www.altova.com + String + + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + + Geodata + Auxiliary geo data library + + http://www.altova.com + String + + + + + + + + +]]><xml-fragment/>UTF-8http://mpi-vito.spacebel.be/wps/services/WPS.WPSHttpSoap11Endpoint + + + + multipleJob + Delay + + + roiTopLeftLat + roiTopLeftLat + + + + + + + roiTopLeftLon + roiTopLeftLon + + + + + + + roiTopLeftLon + roiTopLeftLon + + + + + + + roiBottomRightLon + roiBottomRightLon + + + + + + inputURLs + inputURLs + + + + text/xml + UTF-8 + http://ssegrid.esa.int/wps/JavaSAGAProfile + + + + + text/xml + UTF-8 + http://ssegrid.esa.int/wps/JavaSAGAProfile + + + + + + + + exitMessage + exitMessage + + + text/xml + UTF-8 + http://ssegrid.esa.int/wps/JavaSAGAProfile + + + + + text/xml + UTF-8 + http://ssegrid.esa.int/wps/JavaSAGAProfile + + + + + stdout + stdout + + + text/xml + UTF-8 + http://ssegrid.esa.int/wps/JavaSAGAProfile + + + + + text/xml + UTF-8 + http://ssegrid.esa.int/wps/JavaSAGAProfile + + + + + + + + + + + + + multipleJob + Multiple job for testing + SSEGrid + + + multipleJob + + ${GAI_JOB_WORKING_DIR}/multipleJob4GRID.sh + ${WPS_INPUT_roiTopLeftLat} + ${WPS_INPUT_roiTopLeftLon} + ${WPS_INPUT_roiBottomRightLat} + ${WPS_INPUT_roiBottomRightLon} + inputURLs.${GAI_TASK_ID} + ${GAI_JOB_WORKING_DIR}/job.${GAI_TASK_ID}.stdout + $${GAI_JOB_WORKING_DIR}/job.${GAI_TASK_ID}.stderr + ${GAI_JOB_WORKING_DIR} + 5 + + http://ssegrid.esa.int/jsdl-spmd/multiTasks + + + + + + + globus:rsl + PBS + infinite + + + inputURLs.${GAI_TASK_ID} + + ${WPS_JOB_INPUTS_DIR}/inputURLs.${GAI_TASK_ID} + + + + ${GAI_JOB_WORKING_DIR}/multipleJob4GRID.sh + + ${WPS_DEPLOY_PROCESS_DIR}/multipleJob/multipleJob4GRID.sh + + + + ${GAI_JOB_WORKING_DIR}/Application.tgz + + ${WPS_DEPLOY_PROCESS_DIR}/multipleJob/Application.tgz + + + + ${GAI_JOB_WORKING_DIR}/exitMessage.${GAI_TASK_ID} + + ${WPS_JOB_OUTPUTS_DIR}/exitMessage.${GAI_TASK_ID} + + + + ${GAI_JOB_WORKING_DIR}/job.${GAI_TASK_ID}.stdout + + ${WPS_JOB_AUDITS_DIR}/stdout.${GAI_TASK_ID} + + + + ${GAI_JOB_WORKING_DIR}/job.${GAI_TASK_ID}.stderr + + ${WPS_JOB_AUDITS_DIR}/stderr.${GAI_TASK_ID} + + + + importedList.${GAI_TASK_ID} + + ${WPS_JOB_OUTPUTS_DIR}/importedList.${GAI_TASK_ID} + + + + ${GAI_JOB_WORKING_DIR}/dropbox + + ${WPS_JOB_OUTPUTS_DIR}/dropbox + + + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpoint + + + + VITOCAFCollectData + + VITOCAFCollectData + + + platformShortName + platformShortName + + + + + + + productType + productType + + + + + + + roiTopLeftLat + roiTopLeftLat + + + + + + + roiTopLeftLon + roiTopLeftLon + + + + + + + roiBottomRightLat + roiBottomRightLat + + + + + + + roiBottomRightLon + roiBottomRightLon + + + + + + + startDate + startDate + + + + + + + stopDate + stopDate + + + + + + + stopOnError + stopOnError + + + + + + + disableCache + disableCache + + + + + + + + + importedList + importedList + + + + text/xml + UTF-8 + http://schemas.spacebel.be/wps/urllist.xsd + + + + + + + + + + + + + + VITOCAFCollectData + Data retrieval from the VITO CVB Archive Facili + + + VITOCAFCollectData + + $${GAI_JOB_WORKING_DIR}/VITOCAFCollectData4GRID.sh + + $${WPS_INPUT_platformShortName} + $${WPS_INPUT_productType} + $${WPS_INPUT_roiTopLeftLat} + $${WPS_INPUT_roiTopLeftLon} + $${WPS_INPUT_roiBottomRightLat} + $${WPS_INPUT_roiBottomRightLon} + $${WPS_INPUT_startDate} + $${WPS_INPUT_stopDate} + $${WPS_INPUT_stopOnError} + $${WPS_INPUT_disableCache} + + $${GAI_JOB_WORKING_DIR}/lib + + $${GAI_JOB_WORKING_DIR} + $${GAI_JOB_WORKING_DIR}/CollectData.stdout.${GAI_TASK_ID} + $${GAI_JOB_WORKING_DIR}/CollectData.stderr.${GAI_TASK_ID} + + + + + + + globus:rsl + PBS + infinite + + + + $${GAI_JOB_WORKING_DIR}/VITOCAFCollectData4GRID.sh + + + $${WPS_DEPLOY_PROCESS_DIR}/VITOCAFCollectData/VITOCAFCollectData4GRID.sh + + + + + + $${GAI_JOB_WORKING_DIR}/Application.tgz + + + $${WPS_DEPLOY_PROCESS_DIR}/VITOCAFCollectData/Application.tgz + + + + $${GAI_JOB_WORKING_DIR}/CollectData.stdout.${GAI_TASK_ID} + + $${WPS_JOB_AUDITS_DIR}/CollectData.stdout + + + + $${GAI_JOB_WORKING_DIR}/CollectData.stderr.${GAI_TASK_ID} + + $${WPS_JOB_AUDITS_DIR}/CollectData.stderr + + + + $${GAI_JOB_WORKING_DIR}/Application.unpack.log + + $${WPS_JOB_AUDITS_DIR}/Application.unpack.log + + + + $${GAI_JOB_WORKING_DIR}/queryResults + + $${WPS_JOB_AUDITS_DIR}/queryResults + + + + + ${GAI_JOB_WORKING_DIR}/importedList + + + $${WPS_JOB_OUTPUTS_DIR}/importedList + + + + + + $${GAI_JOB_WORKING_DIR}/ErrorTickets + + + $${WPS_JOB_OUTPUTS_DIR}/ErrorTickets + + + + $${GAI_JOB_WORKING_DIR}/exitMessage + + $${WPS_JOB_OUTPUTS_DIR}/exitMessage + + + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpoint + + + + + ImportVGT + ImportVGT + + + roiTlx + roiTlx + + + + + + + roiTly + roiTly + + + + + + + roiBrx + roiBrx + + + + + + + roiBry + roiBry + + + + + + + inputURLs + + + + text/xml + UTF-8 + http://schemas.spacebel.be/wps/urllist.xsd + + + + + + + + importedList + importedList + + + + text/xml + UTF-8 + http://schemas.spacebel.be/wps/urllist.xsd + + + + + + resultsDirectory + + + + + + + + + + + + + ImportVGT + Import VGT + + + ImportVGT + + import4Grid.sh + $${GAI_JOB_WORKING_DIR}/bin + $${GAI_JOB_WORKING_DIR}/aux-data + $${GAI_JOB_WORKING_DIR}/dat + $${GAI_JOB_WORKING_DIR}/aux-data/geodef/gdsoft + $${GAI_JOB_WORKING_DIR}/aux-data/geodef/gdsoft/bibli/gdlib233/data + $${GAI_JOB_WORKING_DIR}/aux-data/geodef/gdsoft + $${WPS_INPUT_roiTlx} + $${WPS_INPUT_roiTly} + $${WPS_INPUT_roiBrx} + $${WPS_INPUT_roiBry} + inputURLs.$${GAI_TASK_ID} + $${GAI_JOB_WORKING_DIR}/job.$${GAI_TASK_ID}.stdout + $${GAI_JOB_WORKING_DIR}/job.$${GAI_TASK_ID}.stderr + $${GAI_JOB_WORKING_DIR} + 3 + + http://ssegrid.esa.int/jsdl-spmd/multiTasks + + + + + + + globus:rsl + PBS + infinite + + + inputURLs.$${GAI_TASK_ID} + + $${WPS_JOB_INPUTS_DIR}/inputURLs.$${GAI_TASK_ID} + + + + $${GAI_JOB_WORKING_DIR}/import4Grid.sh + + $${WPS_DEPLOY_PROCESS_DIR}/ImportVGT/import4Grid.sh + + + + $${GAI_JOB_WORKING_DIR}/gridcommon.sh + + $${WPS_DEPLOY_PROCESS_DIR}/ImportVGT/gridcommon.sh + + + + $${GAI_JOB_WORKING_DIR}/application.tgz + + $${WPS_DEPLOY_PROCESS_DIR}/ImportVGT/application.tgz + + + + $${GAI_JOB_WORKING_DIR}/geodata.tgz + + $${WPS_DEPLOY_AUXDATA_DIR}/Geodata/geodata.tgz + + + + $${GAI_JOB_WORKING_DIR}/exitMessage.$${GAI_TASK_ID} + + $${WPS_JOB_OUTPUTS_DIR}/exitMessage.$${GAI_TASK_ID} + + + + $${GAI_JOB_WORKING_DIR}/job.$${GAI_TASK_ID}.stdout + + $${WPS_JOB_AUDITS_DIR}/stdout.$${GAI_TASK_ID} + + + + $${GAI_JOB_WORKING_DIR}/job.$${GAI_TASK_ID}.stderr + + $${WPS_JOB_AUDITS_DIR}/stderr.$${GAI_TASK_ID} + + + + importedList.$${GAI_TASK_ID} + + $${WPS_JOB_OUTPUTS_DIR}/importedList.$${GAI_TASK_ID} + + + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + TestData + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpoint + + + + Geodata + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpoint + + + FaparVGT +test + + +]]><xml-fragment/>UTF-8http://localhost:8080/wps/services/WPS.WPSHttpSoap11Endpoint + + urn:execute + + http://localhost:8080/dingue + + a4dfb94a-593b-1dc1-36d2-000000000000 + + + + ValidationWorkflow1 + + + roiTopLeftLat + ROI Top Left Latitude + + 90 + + + + roiTopLeftLon + ROI Top Left Longitude + + -180 + + + + roiBottomRightLat + ROI Bottom Right Latitude + + -90 + + + + roiBottomRightLon + ROI Bottom Right Longitude + + 180 + + + + numberOfTasks + Number of tasks in job + + 3 + + + + inputURLs + List of URLS + + + + http://www.perdu.com/ + + + + + + + + + importedList + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + VITOCAFCollectData + + + roiTopLeftLat + + 72 + + + + roiTopLeftLon + + -15 + + + + roiBottomRightLat + + 22 + + + + roiBottomRightLon + + 70 + + + + platformShortName + + SPOT5 + + + + productType + + FreeP + + + + stopOnError + + false + + + + startDate + + 01/05/2010 00:00:00 + + + + stopDate + + 02/05/2010 23:59:59 + + + + disableCache + + false + + + + + + + importedList + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + ImportVGT + + + roiTlx + + -15 + + + + roiTly + + 72 + + + + roiBrx + + 60 + + + + roiBry + + 28 + + + + inputURLs + + + + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F168.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F177.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F179.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F180.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F181.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F183.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F184.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F185.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F188.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F209.ZIP + /EODATA/RESULTS_DIRS/5aa40cb3-f05b-49c8-8cd6-e98fbfbc0143/V2KRNP____20100501F210.ZIP + + + + + + + + + + + +]]><xml-fragment/>trueUTF-8http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4 + + http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT + ? + + http://l-pccnl:8080/cnl + + + + + + + + + + + + + + VITOCAFCollectData + + + + + + roiTopLeftLat + + + + 72 + + + + + + + + roiTopLeftLon + + + + -15 + + + + + + + + roiBottomRightLat + + + + 28 + + + + + + + + roiBottomRightLon + + + + 60 + + + + + + + + platformShortName + + + + SPOT5 + + + + + + + + productType + + + + FreeP + + + + + + + + stopOnError + + + + false + + + + + + + + startDate + + + + 01/05/2010 00:00:00 + + + + + + + + stopDate + + + + 02/05/2010 00:00:00 + + + + + + + + disableCache + + + + false + + + + + + + + + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + urn:execute + + + + http://localhost:8080/dingue + + + + a4dfb94a-593b-1dc1-36d2-000000000000 + + + + + + + VITOCAFCollectData + + + + + + roiTopLeftLat + + + + 72 + + + + + + + + roiTopLeftLon + + + + -15 + + + + + + + + roiBottomRightLat + + + + 28 + + + + + + + + roiBottomRightLon + + + + 60 + + + + + + + + platformShortName + + + + SPOT5 + + + + + + + + productType + + + + FreeP + + + + + + + + stopOnError + + + + false + + + + + + + + startDate + + + + 01/05/2010 00:00:00 + + + + + + + + stopDate + + + + 02/05/2010 00:00:00 + + + + + + + + disableCache + + + + false + + + + + + + + + + + + ]]><xml-fragment/>UTF-8http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4 + + http://mpi-vito.spacebel.be:8080/ode/processes/Fapar + 3 + + http://l-pccnl:8080 + + + + + + + FaparVGT + + + inputURLs + + + + /EODATA/RESULTS_DIRS/c96c2e71-6c1c-4dbb-a3e1-bf2dc8baf23a/1/import/20100501/Segment_Vgt_20100501_F180.dat + /EODATA/RESULTS_DIRS/c96c2e71-6c1c-4dbb-a3e1-bf2dc8baf23a/1/import/20100501/Segment_Vgt_20100501_F184.dat + /EODATA/RESULTS_DIRS/c96c2e71-6c1c-4dbb-a3e1-bf2dc8baf23a/1/import/20100502/Segment_Vgt_20100502_F227.dat + + + + + + + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpoint + + urn:execute + + http://localhost:8080/dingue + + a4dfb94a-593b-1dc1-36d2-000000000000 + + + + GAIProcess + + + sampleAllowedValues + Example of allowed Values + + TerraDue + + + + sampleDate + Example of Date + + 2010-05-01T00:00:00.000Z + + + + sampleFloat + Float in interval + + 90 + + + + sampleString + Simple String + + SSEGRID + + + + numberOfTasks + Number of tasks in job + + 3 + + + + inputURLs + List of URLS + + + + http://www.esa.int/SSEGRID1 + http://www.esa.int/SSEGRID2 + http://www.esa.int/SSEGRID3 + http://www.esa.int/SSEGRID4 + http://www.esa.int/SSEGRID5 + + + + + + + + + importedList + + + unsupportedIdentifier + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/GAIWPS/services/WPS.WPSHttpSoap11Endpoint + + + + + 1.0.0 + + + +]]>UTF-8http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4 + + + + + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + TestData + + +]]><xml-fragment/>UTF-8http://mpi-vito.spacebel.be:8080/ode/processes/FaparVGT4 + + + + SuperData + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + +0<xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + multipleJob + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + ImportVGT + + +]]><xml-fragment/>UTF-8http://ssegrid.vgt.vito.be:8081/52n-wps-webapp-2.0-RC8-SNAPSHOT/services/WPS.WPSHttpSoap11Endpoint + + + + ValidationGrid1 + + +]]>
\ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/WPSG-Service.wsdl b/wpsg-xml/src/main/schemas/WPSG-Service.wsdl new file mode 100644 index 000000000..a756f127d --- /dev/null +++ b/wpsg-xml/src/main/schemas/WPSG-Service.wsdl @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/WPSG-Workflow.wsdl b/wpsg-xml/src/main/schemas/WPSG-Workflow.wsdl new file mode 100644 index 000000000..357aeebae --- /dev/null +++ b/wpsg-xml/src/main/schemas/WPSG-Workflow.wsdl @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/WPSG.wsdl b/wpsg-xml/src/main/schemas/WPSG.wsdl new file mode 100644 index 000000000..6a6c25325 --- /dev/null +++ b/wpsg-xml/src/main/schemas/WPSG.wsdl @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/WPSG2.wsdl b/wpsg-xml/src/main/schemas/WPSG2.wsdl new file mode 100644 index 000000000..f19245cb6 --- /dev/null +++ b/wpsg-xml/src/main/schemas/WPSG2.wsdl @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/jsdl/jsdl.xsd b/wpsg-xml/src/main/schemas/jsdl/jsdl.xsd new file mode 100644 index 000000000..d54a19bed --- /dev/null +++ b/wpsg-xml/src/main/schemas/jsdl/jsdl.xsd @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ode/pmapi.xsd b/wpsg-xml/src/main/schemas/ode/pmapi.xsd new file mode 100644 index 000000000..88ad464aa --- /dev/null +++ b/wpsg-xml/src/main/schemas/ode/pmapi.xsd @@ -0,0 +1,821 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about a BPEL process. + + + + + The unique name/id of the process. + + + + + Process status. + + + + + Process version. + + + + + Information about the process + definition. + + + + + Information about the process + deployment. + + + + + Summary of the instances belonging to this + process. + + + + + Process properties. + + + + + Endpoint references. + + + + + Process documents + + + + + + + + + + + + + + Enumeration of process status. + + + + + Process is accepting new + requests. + + + + + Process is NOT accepting new + requests. + + + + + + + Enumeration of scope status. + + + + + Activity is enabled, but not necessarily ready to execute. + + + + + Activity has started execution. + + + + + Activity has finished execution. + + + + + Activity is in failure state, recovery required. + + + + + + + Enumeration of scope status. + + + + + Scope is active. + + + + + Scope has completed. + + + + + Scope has faulted. + + + + + Scope is executing its fault + handler. + + + + + Scope is executing its compensation + handler. + + + + + Scope has been compensated. + + + + + + + Information about the process definition. + + + + + The qualified name of the BPEL + process. + + + + + + + Information about a document. + + + + + Name of the document. + + + + + Type of document (e.g. + WSDL/BPEL/etc...). + + + + + URL where the document can be + retrieved. + + + + + + + Information about a BPEL process + deployment. + + + + + Deployment package the process was deployed into. + + + + + File name of BPEL document. + + + + + Date the process was deployed. + + + + + The user that deployed this + process. + + + + + + + + + Process property (name-value pair). + + + + + + + + Name of the property. + + + + + + + + + + + Endpoint references associated with the process partner links roles. + + + + + + + + Name of the partner link this endpoint reference is associated with. + + + + + Name of the partner role this endpoint reference is associated with. + + + + + + + + + Enumeration of instant status. + + + + + Instance is active. + + + + + Instance has completed. + + + + + Instance was terminated. + + + + + Instance failed (with a fault). + + + + + Instance has been suspended. + + + + + Instance is..... + + + + + + + A summary of the number of instances in each state. + + + + + + + + + + + + + + + + + Scope instance identifier. + + + + + Scope name. + + + + + Scope instance identifier. + + + + + Parent scope reference. + + + + + + + + + + + + + + + + + + + + + + + + + + Lists all correlation correlation sets associated with + this scope with their valued correlation properties. + + + + + + + + + + + + + + + + + + Endpoint references. + + + + + + + Information about an activity. + + + + + + + + + + ID for scope in which this activity is executing. + + + + + The date/time when the activity was enabled. + + + + + The date/time when the activity was + started. + + + + + The date/time when the activity was + completed. + + + + + Indicates activity is in the failure state and requires recovery. + + + + + + + Indicates activity is in the failure state and requires recovery. + + + + + The date/time when failure occurred. + + + + + Number of retries. + + + + + Reason for failure. + + + + + Allowed recovery actions (space separated list of action names). + + + + + + + Information about a variable (basically the value) + + + + + + + + + + + + + + + + + + The unique instance identifier. + + + + + Process id of the process to which this instance + belongs. + + + + + + Root scope id (might not exist). + + + + + Status of ths instance. + + + + + The date/time when the instance was + started. + + + + + The date/time when the last activity + occured. + + + + + If present, indicates the date/time since which the + instance has been in an error state. + + + + + Lists all correlation properties with their values that + are associated with this process instance. + + + + + + Instance correlation property. + + + + + + + + Information about the events for this instance. If + absent, indicates events are not available. + + + + + + Indicates the datetime of the first event + + + + + + Indicates the datetime of the first event + + + + + + Indicates the datetime of the last event. + + + + + + + + + If present, indicates the fault with which this + instance failed. + + + + + + + + Reference to a scope. + + + + + + + + + Reference to a variable. + + + + + + + + Type used for reporting faults. + + + + + + + + + + + + + + + + + + Indicates one or more activities are in the failure + state and require recovery. + + + + + Date/time of last failure. + + + + + Number of activities in failure state. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about an activity. + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/ows19115subset.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/ows19115subset.xsd new file mode 100644 index 000000000..77c3cf0ab --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/ows19115subset.xsd @@ -0,0 +1,229 @@ + + + + ows19115subset.xsd 2010-01-30 + This XML Schema Document encodes the parts of ISO 19115 used by the common "ServiceIdentification" and "ServiceProvider" sections of the GetCapabilities operation response, known as the service metadata XML document. The parts encoded here are the MD_Keywords, CI_ResponsibleParty, and related classes. The UML package prefixes were omitted from XML names, and the XML element names were all capitalized, for consistency with other OWS Schemas. This document also provides a simple coding of text in multiple languages, simplified from Annex J of ISO 19115. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Text string with the language of the string identified as recommended in the XML 1.0 W3C Recommendation, section 2.12. + + + + + + + + + + Title of this resource, normally used for display to a human. + + + + + + Brief narrative description of this resource, normally used for display to a human. + + + + + + + + Unordered list of one or more commonly used or formalised word(s) or phrase(s) used to describe the subject. When needed, the optional "type" can name the type of the associated list of keywords that shall all have the same type. Also when needed, the codeSpace attribute of that "type" can reference the type name authority and/or thesaurus. + If the xml:lang attribute is not included in a Keyword element, then no language is specified for that element unless specified by another means. All Keyword elements in the same Keywords element that share the same xml:lang attribute value represent different keywords in that language. + For OWS use, the optional thesaurusName element was omitted as being complex information that could be referenced by the codeSpace attribute of the Type element. + + + + + + + + + + Name or code with an (optional) authority. If the codeSpace attribute is present, its value shall reference a dictionary, thesaurus, or authority for the name or code, such as the organisation who assigned the value, or the dictionary from which it is taken. + Type copied from basicTypes.xsd of GML 3 with documentation edited, for possible use outside the ServiceIdentification section of a service metadata document. + + + + + + + + + + + Identification of, and means of communication with, person(s) responsible for the resource(s). + For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The optional individualName element was made mandatory, since either the organizationName or individualName element is mandatory. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider section. + + + + + + Identification of, and means of communication with, person responsible for the server. At least one of IndividualName, OrganisationName, or PositionName shall be included. + + + + + + + + + + + + + + Identification of, and means of communication with, person responsible for the server. + For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider section. + + + + + + + + + + + + Name of the responsible person: surname, given name, title separated by a delimiter. + + + + + + Name of the responsible organization. + + + + + + Role or position of the responsible person. + + + + + + Function performed by the responsible party. Possible values of this Role shall include the values and the meanings listed in Subclause B.5.5 of ISO 19115:2003. + + + + + + Address of the responsible party. + + + + + + Information required to enable contact with the responsible person and/or organization. + For OWS use in the service metadata document, the optional hoursOfService and contactInstructions elements were retained, as possibly being useful in the ServiceProvider section. + + + + + Telephone numbers at which the organization or individual may be contacted. + + + + + Physical and email address at which the organization or individual may be contacted. + + + + + On-line information that can be used to contact the individual or organization. OWS specifics: The xlink:href attribute in the xlink:simpleLink attribute group shall be used to reference this resource. Whenever practical, the xlink:href attribute with type anyURI should be a URL from which more contact information can be electronically retrieved. The xlink:title attribute with type "string" can be used to name this set of information. The other attributes in the xlink:simpleLink attribute group should not be used. + + + + + Time period (including time zone) when individuals can contact the organization or individual. + + + + + Supplemental instructions on how or when to contact the individual or organization. + + + + + + + + Reference to on-line resource from which data can be obtained. + For OWS use in the service metadata document, the CI_OnlineResource class was XML encoded as the attributeGroup "xlink:simpleLink", as used in GML. + + + + + + + Telephone numbers for contacting the responsible individual or organization. + + + + + Telephone number by which individuals can speak to the responsible organization or individual. + + + + + Telephone number of a facsimile machine for the responsible +organization or individual. + + + + + + + + Location of the responsible individual or organization. + + + + + Address line for the location. + + + + + City of the location. + + + + + State or province of the location. + + + + + ZIP or other postal code. + + + + + Country of the physical address. + + + + + Address of the electronic mailbox of the responsible organization or individual. + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsAll.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsAll.xsd new file mode 100644 index 000000000..4cb17192e --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsAll.xsd @@ -0,0 +1,23 @@ + + + + owsAll.xsd 2010-01-30 + This XML Schema Document includes and imports, directly and indirectly, all the XML Schemas defined by the OWS Common Implemetation Specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsCommon.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsCommon.xsd new file mode 100644 index 000000000..8db5b729f --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsCommon.xsd @@ -0,0 +1,157 @@ + + + + owsCommon.xsd 2010-01-30 + This XML Schema Document encodes various parameters and parameter types that can be used in OWS operation requests and responses. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + XML encoded identifier of a standard MIME type, possibly a parameterized MIME type. + + + + + + + + + Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XML Schemas against which an XML encoded operation response must conform and should be validated. See Version negotiation subclause for more information. + + + + + + + + + + + This element either references or contains more metadata about the element that includes this element. To reference metadata stored remotely, at least the xlinks:href attribute in xlink:simpleLink shall be included. Either at least one of the attributes in xlink:simpleLink or a substitute for the AbstractMetaData element shall be included, but not both. An Implementation Specification can restrict the contents of this element to always be a reference or always contain metadata. (Informative: This element was adapted from the metaDataProperty element in GML 3.0.) + + + + + + + Reference to metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, the xlink:href attribute with type anyURI should include a URL from which this metadata can be electronically retrieved. + + + + + Optional reference to the aspect of the element which includes this "metadata" element that this metadata provides more information about. + + + + + + + Abstract element containing more metadata about the element that includes the containing "metadata" element. A specific server implementation, or an Implementation Specification, can define concrete elements in the AbstractMetaData substitution group. + + + + + + + + + XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. + This type is adapted from the EnvelopeType of GML 3.1, with modified contents and documentation for encoding a MINIMUM size box SURROUNDING all associated data. + + + + + Position of the bounding box corner at which the value of each coordinate normally is the algebraic minimum within this bounding box. In some cases, this position is normally displayed at the top, such as the top left for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. + + + + + Position of the bounding box corner at which the value of each coordinate normally is the algebraic maximum within this bounding box. In some cases, this position is normally displayed at the bottom, such as the bottom right for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. + + + + + + Usually references the definition of a CRS, as specified in [OGC Topic 2]. Such a CRS definition can be XML encoded using the gml:CoordinateReferenceSystemType in [GML 3.1]. For well known references, it is not required that a CRS definition exist at the location the URI points to. If no anyURI value is included, the applicable CRS must be either: +a) Specified outside the bounding box, but inside a data structure that includes this bounding box, as specified for a specific OWS use of this bounding box type. +b) Fixed and specified in the Implementation Specification for a specific OWS use of the bounding box type. + + + + + The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. + + + + + + + Position instances hold the coordinates of a position in a coordinate reference system (CRS) referenced by the related "crs" attribute or elsewhere. For an angular coordinate axis that is physically continuous for multiple revolutions, but whose recorded values can be discontinuous, special conditions apply when the bounding box is continuous across the value discontinuity: +a) If the bounding box is continuous clear around this angular axis, then ordinate values of minus and plus infinity shall be used. +b) If the bounding box is continuous across the value discontinuity but is not continuous clear around this angular axis, then some non-normal value can be used if specified for a specific OWS use of the BoundingBoxType. For more information, see Subclauses 10.2.5 and C.13. + This type is adapted from DirectPositionType and doubleList of GML 3.1. The adaptations include omission of all the attributes, since the needed information is included in the BoundingBoxType. + + + + + + + + + XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. This box is specialized for use with the 2D WGS 84 coordinate reference system with decimal values of longitude and latitude. + This type is adapted from the general BoundingBoxType, with modified contents and documentation for use with the 2D WGS 84 coordinate reference system. + + + + + + + Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. + + + + + Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. + + + + + + This attribute can be included when considered useful. When included, this attribute shall reference the 2D WGS 84 coordinate reference system with longitude before latitude and decimal values of longitude and latitude. + + + + + The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. + + + + + + + + + Two-dimensional position instances hold the longitude and latitude coordinates of a position in the 2D WGS 84 coordinate reference system. The longitude value shall be listed first, followed by the latitude value, both in decimal degrees. Latitude values shall range from -90 to +90 degrees, and longitude values shall normally range from -180 to +180 degrees. For the longitude axis, special conditions apply when the bounding box is continuous across the +/- 180 degrees meridian longitude value discontinuity: +a) If the bounding box is continuous clear around the Earth, then longitude values of minus and plus infinity shall be used. +b) If the bounding box is continuous across the value discontinuity but is not continuous clear around the Earth, then some non-normal value can be used if specified for a specific OWS use of the WGS84BoundingBoxType. For more information, see Subclauses 10.4.5 and C.13. + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsContents.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsContents.xsd new file mode 100644 index 000000000..77b6c84ea --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsContents.xsd @@ -0,0 +1,86 @@ + + + + owsContents.xsd 2010-01-30 + This XML Schema Document encodes the typical Contents section of an OWS service metadata (Capabilities) document. This Schema can be built upon to define the Contents section for a specific OWS. If the ContentsBaseType in this XML Schema cannot be restricted and extended to define the Contents section for a specific OWS, all other relevant parts defined in owsContents.xsd shall be used by the "ContentsType" in the wxsContents.xsd prepared for the specific OWS. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Contents of typical Contents section of an OWS service metadata (Capabilities) document. This type shall be extended and/or restricted if needed for specific OWS use to include the specific metadata needed. + + + + + Unordered set of summary descriptions for the datasets available from this OWS server. This set shall be included unless another source is referenced and all this metadata is available from that source. + + + + + Unordered set of references to other sources of metadata describing the coverage offerings available from this server. + + + + + + + + Reference to a source of metadata describing coverage offerings available from this server. This parameter can reference a catalogue server from which dataset metadata is available. This ability is expected to be used by servers with thousands or millions of datasets, for which searching a catalogue is more feasible than fetching a long Capabilities XML document. When no DatasetDescriptionSummaries are included, and one or more catalogue servers are referenced, this set of catalogues shall contain current metadata summaries for all the datasets currently available from this OWS server, with the metadata for each such dataset referencing this OWS server. + + + + + + + + Typical dataset metadata in typical Contents section of an OWS service metadata (Capabilities) document. This type shall be extended and/or restricted if needed for specific OWS use, to include the specific Dataset description metadata needed. + + + + + + + Unordered list of zero or more minimum bounding rectangles surrounding coverage data, using the WGS 84 CRS with decimal degrees and longitude before latitude. If no WGS 84 bounding box is recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall apply to this coverage. If WGS 84 bounding box(es) are recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall be ignored. For each lowest-level coverage in a hierarchy, at least one applicable WGS84BoundingBox shall be either recorded or inherited, to simplify searching for datasets that might overlap a specified region. If multiple WGS 84 bounding boxes are included, this shall be interpreted as the union of the areas of these bounding boxes. + + + + + Unambiguous identifier or name of this coverage, unique for this server. + + + + + Unordered list of zero or more minimum bounding rectangles surrounding coverage data, in AvailableCRSs. Zero or more BoundingBoxes are allowed in addition to one or more WGS84BoundingBoxes to allow more precise specification of the Dataset area in AvailableCRSs. These Bounding Boxes shall not use any CRS not listed as an AvailableCRS. However, an AvailableCRS can be listed without a corresponding Bounding Box. If no such bounding box is recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall apply to this coverage. If such bounding box(es) are recorded for a coverage, any such bounding boxes recorded for a higher level in a hierarchy of datasets shall be ignored. If multiple bounding boxes are included with the same CRS, this shall be interpreted as the union of the areas of these bounding boxes. + + + + + Optional unordered list of additional metadata about this dataset. A list of optional metadata elements for this dataset description could be specified in the Implementation Specification for this service. + + + + + Metadata describing zero or more unordered subsidiary datasets available from this server. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsDataIdentification.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsDataIdentification.xsd new file mode 100644 index 000000000..dde83e14c --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsDataIdentification.xsd @@ -0,0 +1,127 @@ + + + + owsDataIdentification.xsd 2010-01-30 + This XML Schema Document encodes the parts of the MD_DataIdentification class of ISO 19115 (OGC Abstract Specification Topic 11) which are expected to be used for most datasets. This Schema also encodes the parts of this class that are expected to be useful for other metadata. Both may be used within the Contents section of OWS service metadata (Capabilities) documents. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + Human-readable descriptive information for the object it is included within. +This type shall be extended if needed for specific OWS use to include additional metadata for each type of information. This type shall not be restricted for a specific OWS to change the multiplicity (or optionality) of some elements. + If the xml:lang attribute is not included in a Title, Abstract or Keyword element, then no language is specified for that element unless specified by another means. All Title, Abstract and Keyword elements in the same Description that share the same xml:lang attribute value represent the description of the parent object in that language. Multiple Title or Abstract elements shall not exist in the same Description with the same xml:lang attribute value unless otherwise specified. + + + + + + + + + + + Basic metadata identifying and describing a set of data. + + + + + + + Optional unique identifier or name of this dataset. + + + + + Optional unordered list of additional metadata about this data(set). A list of optional metadata elements for this data identification could be specified in the Implementation Specification for this service. + + + + + + + + + + Extended metadata identifying and describing a set of data. This type shall be extended if needed for each specific OWS to include additional metadata for each type of dataset. If needed, this type should first be restricted for each specific OWS to change the multiplicity (or optionality) of some elements. + + + + + + + Unordered list of zero or more bounding boxes whose union describes the extent of this dataset. + + + + + Unordered list of zero or more references to data formats supported for server outputs. + + + + + Unordered list of zero or more available coordinate reference systems. + + + + + + + + + + Unique identifier or name of this dataset. + + + + + + Reference to a format in which this data can be encoded and transferred. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. + + + + + + + Coordinate reference system in which data from this data(set) or resource is available or supported. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. + + + + + + Access constraint applied to assure the protection of privacy or intellectual property, or any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. + + + + + + Fees and terms for retrieving data from or otherwise using this server, including the monetary units as specified in ISO 4217. The reserved value NONE (case insensitive) shall be used to mean no fees or terms. + + + + + + Identifier of a language used by the data(set) contents. This language identifier shall be as specified in IETF RFC 4646. When this element is omitted, the language used is not identified. + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsDomainType.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsDomainType.xsd new file mode 100644 index 000000000..4d0a54cb9 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsDomainType.xsd @@ -0,0 +1,279 @@ + + + + owsDomainType.xsd 2010-01-30 + This XML Schema Document encodes the allowed values (or domain) of a quantity, often for an input or output parameter to an OWS. Such a parameter is sometimes called a variable, quantity, literal, or typed literal. Such a parameter can use one of many data types, including double, integer, boolean, string, or URI. The allowed values can also be encoded for a quantity that is not explicit or not transferred, but is constrained by a server implementation. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + Valid domain (or allowed set of values) of one quantity, with its name or identifier. + + + + + + Name or identifier of this quantity. + + + + + + + + + Valid domain (or allowed set of values) of one quantity, with needed metadata but without a quantity name or identifier. + + + + + + Optional default value for this quantity, which should be included when this quantity has a default value. + + + + + Meaning metadata should be referenced or included for each quantity. + + + + + This data type metadata should be referenced or included for each quantity. + + + + + Unit of measure, which should be included when this set of PossibleValues has units or a more complete reference system. + + + + + Optional unordered list of other metadata about this quantity. A list of required and optional other metadata elements for this quantity should be specified in the Implementation Specification for this service. + + + + + + + + Specifies the possible values of this quantity. + + + + + + + + + + + + Specifies that any value is allowed for this parameter. + + + + + + + Specifies that no values are allowed for this parameter or quantity. + + + + + + + Reference to externally specified list of all the valid values and/or ranges of values for this quantity. (Informative: This element was simplified from the metaDataProperty element in GML 3.0.) + + + + + + Human-readable name of the list of values provided by the referenced document. Can be empty string when this list has no name. + + + + + + + + + + + Indicates that this quantity has units or a reference system, and identifies the unit or reference system used by the AllowedValues or ValuesReference. + + + + + Identifier of unit of measure of this set of values. Should be included then this set of values has units (and not a more complete reference system). + + + + + Identifier of reference system used by this set of values. Should be included then this set of values has a reference system (not just units). + + + + + + + + + List of all the valid values and/or ranges of values for this quantity. For numeric quantities, signed values should be ordered from negative infinity to positive infinity. + + + + + + + + + + + + + + A single value, encoded as a string. This type can be used for one value, for a spacing between allowed values, or for the default value of a parameter. + + + + + + + + + The default value for a quantity for which multiple values are allowed. + + + + + + + + A range of values of a numeric parameter. This range can be continuous or discrete, defined by a fixed spacing between adjacent valid values. If the MinimumValue or MaximumValue is not included, there is no value limit in that direction. Inclusion of the specified minimum and maximum values in the range shall be defined by the rangeClosure. + + + + + + + Shall be included when the allowed values are NOT continuous in this range. Shall not be included when the allowed values are continuous in this range. + + + + + + Shall be included unless the default value applies. + + + + + + + Minimum value of this numeric parameter. + + + + + + Maximum value of this numeric parameter. + + + + + + The regular distance or spacing between the allowed values in a range. + + + + + + Specifies which of the minimum and maximum values are included in the range. Note that plus and minus infinity are considered closed bounds. + + + + + + The specified minimum and maximum values are included in this range. + + + + + The specified minimum and maximum values are NOT included in this range. + + + + + The specified minimum value is NOT included in this range, and the specified maximum value IS included in this range. + + + + + The specified minimum value IS included in this range, and the specified maximum value is NOT included in this range. + + + + + + + + + + References metadata about a quantity, and provides a name for this metadata. (Informative: This element was simplified from the metaDataProperty element in GML 3.0.) + + + + + Human-readable name of the metadata described by associated referenced document. + + + + + + + + + Reference to data or metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, this attribute should be a URL from which this metadata can be electronically retrieved. Alternately, this attribute can reference a URN for well-known metadata. For example, such a URN could be a URN defined in the "ogc" URN namespace. + + + + + + Definition of the meaning or semantics of this set of values. This Meaning can provide more specific, complete, precise, machine accessible, and machine understandable semantics about this quantity, relative to other available semantic information. For example, other semantic information is often provided in "documentation" elements in XML Schemas or "description" elements in GML objects. + + + + + + Definition of the data type of this set of values. In this case, the xlink:href attribute can reference a URN for a well-known data type. For example, such a URN could be a data type identification URN defined in the "ogc" URN namespace. + + + + + + Definition of the reference system used by this set of values, including the unit of measure whenever applicable (as is normal). In this case, the xlink:href attribute can reference a URN for a well-known reference system, such as for a coordinate reference system (CRS). For example, such a URN could be a CRS identification URN defined in the "ogc" URN namespace. + + + + + + Definition of the unit of measure of this set of values. In this case, the xlink:href attribute can reference a URN for a well-known unit of measure (uom). For example, such a URN could be a UOM identification URN defined in the "ogc" URN namespace. + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsExceptionReport.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsExceptionReport.xsd new file mode 100644 index 000000000..dcec95239 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsExceptionReport.xsd @@ -0,0 +1,68 @@ + + + + + owsExceptionReport.xsd 2010-01-30 + This XML Schema Document encodes the Exception Report response to all OWS operations. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + Report message returned to the client that requested any OWS operation when the server detects an error while processing that operation request. + + + + + + Unordered list of one or more Exception elements that each describes an error. These Exception elements shall be interpreted by clients as being independent of one another (not hierarchical). + + + + + + Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XML Schemas against which an XML encoded operation response must conform and should be validated. See Version negotiation subclause for more information. + + + + + + + + + + + + + + + An Exception element describes one detected error that a server chooses to convey to the client. + + + + + Ordered sequence of text strings that describe this specific exception or error. The contents of these strings are left open to definition by each server implementation. A server is strongly encouraged to include at least one ExceptionText value, to provide more information about the detected error than provided by the exceptionCode. When included, multiple ExceptionText values shall provide hierarchical information about one detected error, with the most significant information listed first. + + + + + + A code representing the type of this exception, which shall be selected from a set of exceptionCode values specified for the specific service operation and server. + + + + + When included, this locator shall indicate to the client where an exception was encountered in servicing the client's operation request. This locator should be included whenever meaningful information can be provided by the server. The contents of this locator will depend on the specific exceptionCode and OWS service, and shall be specified in the OWS Implementation Specification. + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsGetCapabilities.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsGetCapabilities.xsd new file mode 100644 index 000000000..dbb71d331 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsGetCapabilities.xsd @@ -0,0 +1,112 @@ + + + + owsGetCapabilities.xsd 2010-01-30 + This XML Schema Document defines the GetCapabilities operation request and response XML elements and types, which are common to all OWSs. This XML Schema shall be edited by each OWS, for example, to specify a specific value for the "service" attribute. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + XML encoded GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, usually including metadata about the tightly-coupled data served. If the server does not implement the updateSequence parameter, the server shall always return the complete Capabilities document, without the updateSequence parameter. When the server implements the updateSequence parameter and the GetCapabilities operation request included the updateSequence parameter with the current value, the server shall return this element with only the "version" and "updateSequence" attributes. Otherwise, all optional elements shall be included or not depending on the actual value of the Contents parameter in the GetCapabilities operation request. This base type shall be extended by each specific OWS to include the additional contents needed. + + + + + + + + + + Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. When not supported by server, server shall not return this attribute. + + + + + + + + + XML encoded GetCapabilities operation request. This operation allows clients to retrieve service metadata about a specific service instance. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. This base type shall be extended by each specific OWS to include the additional required "service" attribute, with the correct value for that OWS. + + + + + When omitted, server shall return latest supported version. + + + + + When omitted or not supported by server, server shall return complete service metadata (Capabilities) document. + + + + + When omitted or not supported by server, server shall return service metadata document using the MIME type "text/xml". + + + + + + When omitted or not supported by server, server shall return latest complete service metadata document. + + + + + + + + Service type identifier, where the string value is the OWS type abbreviation, such as "WMS" or "WFS". + + + + + + + Prioritized sequence of one or more specification versions accepted by client, with preferred versions listed first. See Version negotiation subclause for more information. + + + + + + + + + Unordered list of zero or more names of requested sections in complete service metadata document. Each Section value shall contain an allowed section name as specified by each OWS specification. See Sections parameter subclause for more information. + + + + + + + + + Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. See updateSequence parameter use subclause for more information. + + + + + + + Prioritized sequence of zero or more GetCapabilities operation response formats desired by client, with preferred formats listed first. Each response format shall be identified by its MIME type. See AcceptFormats parameter use subclause for more information. + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsGetResourceByID.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsGetResourceByID.xsd new file mode 100644 index 000000000..f15b22fd3 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsGetResourceByID.xsd @@ -0,0 +1,51 @@ + + + + owsGetResourceByID.xsd 2010-01-30 + This XML Schema Document encodes the GetResourceByID operation request message. This typical operation is specified as a base for profiling in specific OWS specifications. For information on the allowed changes and limitations in such profiling, see Subclause 9.4.1 of the OWS Common specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + XML encoded GetResourceByID operation response. The complexType used by this element shall be specified by each specific OWS. + + + + + + + + Request to a service to perform the GetResourceByID operation. This operation allows a client to retrieve one or more identified resources, including datasets and resources that describe datasets or parameters. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. + + + + + Unordered list of zero or more resource identifiers. These identifiers can be listed in the Contents section of the service metadata (Capabilities) document. For more information on this parameter, see Subclause 9.4.2.1 of the OWS Common specification. + + + + + Optional reference to the data format to be used for response to this operation request. This element shall be included when multiple output formats are available for the selected resource(s), and the client desires a format other than the specified default, if any. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsInputOutputData.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsInputOutputData.xsd new file mode 100644 index 000000000..e8f28b644 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsInputOutputData.xsd @@ -0,0 +1,59 @@ + + + + owsInputOutputData.xsd 2010-01-30 + This XML Schema Document specifies types and elements for input and output of operation data, allowing including multiple data items with each data item either included or referenced. The contents of each type and element specified here can be restricted and/or extended for each use in a specific OWS specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Response from an OWS operation, allowing including multiple output data items with each item either included or referenced. This OperationResponse element, or an element using the ManifestType with a more specific element name, shall be used whenever applicable for responses from OWS operations. + This element is specified for use where the ManifestType contents are needed for an operation response, but the Manifest element name is not fully applicable. This element or the ManifestType shall be used instead of using the ows:ReferenceType proposed in OGC 04-105. + + + + + + Input data in a XML-encoded OWS operation request, allowing including multiple data items with each data item either included or referenced. This InputData element, or an element using the ManifestType with a more-specific element name (TBR), shall be used whenever applicable within XML-encoded OWS operation requests. + + + + + + + + Complete reference to a remote resource that needs to be retrieved from an OWS using an XML-encoded operation request. This element shall be used, within an InputData or Manifest element that is used for input data, when that input data needs to be retrieved from another web service using a XML-encoded OWS operation request. This element shall not be used for local payload input data or for requesting the resource from a web server using HTTP Get. + + + + + + + The XML-encoded operation request message to be sent to request this input data from another web server using HTTP Post. + + + + + Reference to the XML-encoded operation request message to be sent to request this input data from another web server using HTTP Post. The referenced message shall be attached to the same message (using the cid scheme), or be accessible using a URL. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsManifest.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsManifest.xsd new file mode 100644 index 000000000..d5c0ceebc --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsManifest.xsd @@ -0,0 +1,125 @@ + + + + owsManifest.xsd 2010-01-30 + This XML Schema Document specifies types and elements for document or resource references and for package manifests that contain multiple references. The contents of each type and element specified here can be restricted and/or extended for each use in a specific OWS specification. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + Base for a reference to a remote or local resource. + This type contains only a restricted and annotated set of the attributes from the xlink:simpleLink attributeGroup. + + + + + Reference to a remote resource or local payload. A remote resource is typically addressed by a URL. For a local payload (such as a multipart mime message), the xlink:href must start with the prefix cid:. + + + + + Reference to a resource that describes the role of this reference. When no value is supplied, no particular role value is to be inferred. + + + + + Although allowed, this attribute is not expected to be useful in this application of xlink:simpleLink. + + + + + Describes the meaning of the referenced resource in a human-readable fashion. + + + + + Although allowed, this attribute is not expected to be useful in this application of xlink:simpleLink. + + + + + Although allowed, this attribute is not expected to be useful in this application of xlink:simpleLink. + + + + + + + + + Complete reference to a remote or local resource, allowing including metadata about that resource. + + + + + + + Optional unique identifier of the referenced resource. + + + + + + The format of the referenced resource. This element is omitted when the mime type is indicated in the http header of the reference. + + + + + Optional unordered list of additional metadata about this resource. A list of optional metadata elements for this ReferenceType could be specified in the Implementation Specification for each use of this type in a specific OWS. + + + + + + + + + + + + + Logical group of one or more references to remote and/or local resources, allowing including metadata about that group. A Group can be used instead of a Manifest that can only contain one group. + + + + + + + + + + + + + + + Unordered list of one or more groups of references to remote and/or local resources. + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsOperationsMetadata.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsOperationsMetadata.xsd new file mode 100644 index 000000000..7e0ef74a9 --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsOperationsMetadata.xsd @@ -0,0 +1,140 @@ + + + + owsOperationsMetadata.xsd 2010-01-30 + This XML Schema Document encodes the basic contents of the "OperationsMetadata" section of the GetCapabilities operation response, also known as the Capabilities XML document. + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + Metadata about the operations and related abilities specified by this service and implemented by this server, including the URLs for operation requests. The basic contents of this section shall be the same for all OWS types, but individual services can add elements and/or change the optionality of optional elements. + + + + + + Metadata for unordered list of all the (requests for) operations that this server interface implements. The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of parameter valid domains that each apply to one or more operations which this server interface implements. The list of required and optional parameter domain limitations shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this server. The list of required and optional constraints shall be specified in the Implementation Specification for this service. + + + + + + + + + + Individual software vendors and servers can use this element to provide metadata about any additional server abilities. + + + + + + Metadata for one operation that this server implements. + + + + + + Unordered list of Distributed Computing Platforms (DCPs) supported for this operation. At present, only the HTTP DCP is defined, so this element will appear only once. + + + + + Optional unordered list of parameter domains that each apply to this operation which this server implements. If one of these Parameter elements has the same "name" attribute as a Parameter element in the OperationsMetadata element, this Parameter element shall override the other one for this operation. The list of required and optional parameter domain limitations for this operation shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this operation shall be specified in the Implementation Specification for this service. + + + + + Optional unordered list of additional metadata about this operation and its' implementation. A list of required and optional metadata elements for this operation should be specified in the Implementation Specification for this service. (Informative: This metadata might specify the operation request parameters or provide the XML Schemas for the operation request.) + + + + + + Name or identifier of this operation (request) (for example, GetCapabilities). The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. + + + + + + + + Information for one distributed Computing Platform (DCP) supported for this operation. At present, only the HTTP DCP is defined, so this element only includes the HTTP element. + + + + + + + + + + + + Connect point URLs for the HTTP Distributed Computing Platform (DCP). Normally, only one Get and/or one Post is included in this element. More than one Get and/or Post is allowed to support including alternative URLs for uses such as load balancing or backup. + + + + + + Connect point URL prefix and any constraints for the HTTP "Get" request method for this operation request. + + + + + Connect point URL and any constraints for the HTTP "Post" request method for this operation request. + + + + + + + + + Connect point URL and any constraints for this HTTP request method for this operation request. In the OnlineResourceType, the xlink:href attribute in the xlink:simpleLink attribute group shall be used to contain this URL. The other attributes in the xlink:simpleLink attribute group should not be used. + + + + + + + Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this request method for this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata or Operation element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this request method for this operation shall be specified in the Implementation Specification for this service. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsServiceIdentification.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsServiceIdentification.xsd new file mode 100644 index 000000000..520a2b82e --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsServiceIdentification.xsd @@ -0,0 +1,60 @@ + + + + owsServiceIdentification.xsd 2010-01-30 + This XML Schema Document encodes the common "ServiceIdentification" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceIdentification class of ISO 19119 (OGC Abstract Specification Topic 12). + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + General metadata for this specific server. This XML Schema of this section shall be the same for all OWS. + + + + + + + + A service type name from a registry of services. For example, the values of the codeSpace URI and name and code string may be "OGC" and "catalogue." This type name is normally used for machine-to-machine communication. + + + + + Unordered list of one or more versions of this service type implemented by this server. This information is not adequate for version negotiation, and shall not be used for that purpose. + + + + + Unordered list of identifiers of Application Profiles that are implemented by this server. This element should be included for each specified application profile implemented by this server. The identifier value should be specified by each Application Profile. If this element is omitted, no meaning is implied. + + + + + If this element is omitted, no meaning is implied. + + + + + Unordered list of access constraints applied to assure the protection of privacy or intellectual property, and any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. When this element is omitted, no meaning is implied. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/ows/1.1.0/owsServiceProvider.xsd b/wpsg-xml/src/main/schemas/ows/1.1.0/owsServiceProvider.xsd new file mode 100644 index 000000000..b15f621fe --- /dev/null +++ b/wpsg-xml/src/main/schemas/ows/1.1.0/owsServiceProvider.xsd @@ -0,0 +1,47 @@ + + + + owsServiceProvider.xsd 2010-01-30 + This XML Schema Document encodes the common "ServiceProvider" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceProvider class of ISO 19119 (OGC Abstract Specification Topic 12). + + OWS is an OGC Standard. + Copyright (c) 2006,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Metadata about the organization that provides this specific service instance or server. + + + + + + A unique identifier for the service provider organization. + + + + + Reference to the most relevant web site of the service provider. + + + + + Information for contacting the service provider. The OnlineResource element within this ServiceContact element should not be used to reference a web site of the service provider. + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/aoifeatures.xsd b/wpsg-xml/src/main/schemas/wps/aoifeatures.xsd new file mode 100644 index 000000000..e4985b231 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/aoifeatures.xsd @@ -0,0 +1,84 @@ + + + + + + aoifeatures.xsd v4.4.0 2007-08-21 + GML v3 Schema for AOI features. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/DataBriefType.xsd b/wpsg-xml/src/main/schemas/wps/common/DataBriefType.xsd new file mode 100644 index 000000000..4257572d8 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/DataBriefType.xsd @@ -0,0 +1,45 @@ + + + + + $Id: DataBriefType.xsd 2007-10-09 $ + + Brief description of a Data, designed for Data discovery. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + + Optional unordered list of application profiles to which this Data complies. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/DataVersion.xsd b/wpsg-xml/src/main/schemas/wps/common/DataVersion.xsd new file mode 100644 index 000000000..8f647a3b1 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/DataVersion.xsd @@ -0,0 +1,25 @@ + + + + $Id: wpsCommon.xsd 2007-03-03 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Release version of this Data, included when a data version needs to be included for clarification about the data to be used. It is possible that a WPS supports a Data with different versions due to reasons such as modifications of data content. The dataVersion is informative only. Version negotiation for dataVersion is not available. + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/DeploymentProfiles.xsd b/wpsg-xml/src/main/schemas/wps/common/DeploymentProfiles.xsd new file mode 100644 index 000000000..a94895b2f --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/DeploymentProfiles.xsd @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + Tar or Zipped file to be deployed on the Grid. + + + + + Reference (URL) to an archive file to be deployed on the Grid. + + + + + + + + + + Reference (URL) to an archive file to be deployed. + + + + Reference to a web-accessible archive file to be deployed. This attribute shall contain a URL from which this archive can be electronically retrieved. + + + + + + + + + + + Tar or Zipped file to be deployed on Apache ODE server. + + + + + Reference (URL) to an archive file to be deployed on Apache ODE server. + + + + + + + + + + + + + Tar or Zipped file to be deployed on Oozie server. + + + + + Reference (URL) to an archive file to be deployed on Oozie server. + + + + + + + + + + + + + Java JAR file to be deployed. + + + + + Reference (URL) to JAR file to be deployed on the WPS server. + + + + + + + + + + + + + + Tar or Zipped file to be deployed on the Grid. + + + + + Reference (URL) to an archive file to be deployed on the Grid. + + + + + + JSDL template containing substitution variables. + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/DescriptionType.xsd b/wpsg-xml/src/main/schemas/wps/common/DescriptionType.xsd new file mode 100644 index 000000000..905f88737 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/DescriptionType.xsd @@ -0,0 +1,48 @@ + + + + $Id: wpsCommon.xsd 2007-10-09 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + Description of a WPS process or output object. + + + + + Unambiguous identifier or name of a process, unique for this server, or unambiguous identifier or name of an output, unique for this process. + + + + + Title of a process or output, normally available for display to a human. + + + + + Brief narrative description of a process or output, normally available for display to a human. + + + + + Optional unordered list of additional metadata about this process/input/output. A list of optional and/or required metadata elements for this process/input/output could be specified in an Application Profile for this service. + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/ExtraCapabilities.xsd b/wpsg-xml/src/main/schemas/wps/common/ExtraCapabilities.xsd new file mode 100644 index 000000000..3b488a50e --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/ExtraCapabilities.xsd @@ -0,0 +1,67 @@ + + + + + + + + + + + List of default and other schemas profiles supported for deployement and execution, i.e. ApacheOdeBPEL, GridProfile, ... + + + + + + Identifies the default profile that will be used unless the operation request specifies another supported profile. + + + + + + Default deployment schema + + + + + + + + Unordered list of references to all of the profile schemas supported by this service. The default profile shall be included in this list. + + + + + + + + + + + + + + List of brief descriptions of the data offered by this WPS server. + + + + + + Unordered list of one or more brief descriptions of all the data offered by this WPS server. + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/ProcessAuditType.xsd b/wpsg-xml/src/main/schemas/wps/common/ProcessAuditType.xsd new file mode 100644 index 000000000..107210a7f --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/ProcessAuditType.xsd @@ -0,0 +1,25 @@ + + + + + + + + Process Audit trace. + + + + + + + The short form (default) provides the execution processing flow. The long form provides the full execution trace. + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/ProcessBriefType.xsd b/wpsg-xml/src/main/schemas/wps/common/ProcessBriefType.xsd new file mode 100644 index 000000000..3a701969a --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/ProcessBriefType.xsd @@ -0,0 +1,43 @@ + + + + $Id: ProcessBriefType.xsd 2007-10-09 $ + + Brief description of a Process, designed for Process discovery. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + + + Optional unordered list of application profiles to which this process complies. + + + + + Location of a WSDL document which describes this process. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/ProcessInstanceType.xsd b/wpsg-xml/src/main/schemas/wps/common/ProcessInstanceType.xsd new file mode 100644 index 000000000..2410c77a1 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/ProcessInstanceType.xsd @@ -0,0 +1,30 @@ + + + + + + + + Process instance identifier. + + + + + + Unique identifier of the Process instance. This could be set to the statusLocation attribute found in the Execute response. + + + + + + + + + Process instance identifier. + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/ProcessVersion.xsd b/wpsg-xml/src/main/schemas/wps/common/ProcessVersion.xsd new file mode 100644 index 000000000..2ae18e663 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/ProcessVersion.xsd @@ -0,0 +1,25 @@ + + + + $Id: wpsCommon.xsd 2007-03-03 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + Release version of this Process, included when a process version needs to be included for clarification about the process to be used. It is possible that a WPS supports a process with different versions due to reasons such as modifications of process algorithms. Notice that this is the version identifier for the process, not the version of the WPS interface. The processVersion is informative only. Version negotiation for processVersion is not available. Requests to Execute a process do not include a processVersion identifier. + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/RequestBaseType.xsd b/wpsg-xml/src/main/schemas/wps/common/RequestBaseType.xsd new file mode 100644 index 000000000..eb6d38d68 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/RequestBaseType.xsd @@ -0,0 +1,41 @@ + + + + $Id: RequestBaseType.xsd 2007-10-09 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + WPS operation request base, for all WPS operations except GetCapabilities. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. + + + + Service type identifier (WPS) + + + + + Version of the WPS interface specification implemented by the server (1.0.0) + + + + + RFC 4646 language code of the human-readable text (e.g. "en-CA"). + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/ResponseBaseType.xsd b/wpsg-xml/src/main/schemas/wps/common/ResponseBaseType.xsd new file mode 100644 index 000000000..56ec5290e --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/ResponseBaseType.xsd @@ -0,0 +1,43 @@ + + + + $Id: wpsCommon.xsd 2007-10-09 $ + + This XML Schema Document encodes elements and types that are shared by multiple WPS operations. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS operation response base, for all WPS operations except GetCapabilities. + + + + Service type identifier (WPS) + + + + + Version of the WPS interface specification implemented by the server (1.0.0) + + + + + RFC 4646 language code of the human-readable text (e.g. "en-CA"). + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/StatusDocumentType.xsd b/wpsg-xml/src/main/schemas/wps/common/StatusDocumentType.xsd new file mode 100644 index 000000000..012ec70d7 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/StatusDocumentType.xsd @@ -0,0 +1,76 @@ + + + + + $Id: StatusDocumentType.xsd 2007-10-09 $ + + Status document type. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + Process description from the ProcessOfferings section of the GetCapabilities response. + + + + + Execution status of this process. + + + + + Inputs that were provided as part of the execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + Complete list of Output data types that were requested as part of the Execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + List of values of the Process output parameters. Normally there would be at least one output when the process has completed successfully. If the process has not finished executing, the implementer can choose to include whatever final results are ready at the time the Execute response is provided. If the reference locations of outputs are known in advance, these URLs may be provided before they are populated. + + + + + + Unordered list of values of all the outputs produced by this process. It is not necessary to include an output until the Status is ProcessSucceeded. + + + + + + + + + + This attribute shall contain the GetCapabilities URL of the WPS service which was invoked + + + + + The URL referencing the location from which the ExecuteResponse can be retrieved. If "status" is "true" in the Execute request, the ExecuteResponse should also be found here as soon as the process returns the initial response to the client. It should persist at this location as long as the outputs are accessible from the server. The outputs may be stored for as long as the implementer of the server decides. If the process takes a long time, this URL can be repopulated on an ongoing basis in order to keep the client updated on progress. Before the process has succeeded, the ExecuteResponse contains information about the status of the process, including whether or not processing has started, and the percentage completed. It may also optionally contain the inputs and any ProcessStartedType interim results. When the process has succeeded, the ExecuteResponse found at this URL shall contain the output values or references to them. + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/common/WSDL.xsd b/wpsg-xml/src/main/schemas/wps/common/WSDL.xsd new file mode 100644 index 000000000..6b3d63feb --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/common/WSDL.xsd @@ -0,0 +1,29 @@ + + + + $Id: WSDL.xsd 2007-05-01 $ + + Location of a WSDL document. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + Location of a WSDL document. + + + + + The URL from which the WSDL document can be retrieved. + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/ode/activityRecovery.xsd b/wpsg-xml/src/main/schemas/wps/ode/activityRecovery.xsd new file mode 100644 index 000000000..625217290 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/ode/activityRecovery.xsd @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wpsg-xml/src/main/schemas/wps/ode/dd.xsd b/wpsg-xml/src/main/schemas/wps/ode/dd.xsd new file mode 100644 index 000000000..d75d78ed6 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/ode/dd.xsd @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + Active flag, if set process will be activated once + deployed. + + + + + Retired flag, if set process will be retired once + deployed. + + + + + Should the process be persistent or only execute + in-memory. + + + + + + + A user-defined property that will be attached to a process upon + deployment. + + + + + + + + + + + + + + + + + + + List of message exchange interceptors that should be registered for this process. + + + + + + + + + + + Process type -- indicates which process defintion should be used + for the process. + + + + + + + + + + + + + + Allows you to specify a WSDL for BPEL 1.1 processes which do not support an "import" element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Message exchange interceptor configuration. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/ode/pmapi.xsd b/wpsg-xml/src/main/schemas/wps/ode/pmapi.xsd new file mode 100644 index 000000000..19fab88d3 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/ode/pmapi.xsd @@ -0,0 +1,849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about a BPEL process. + + + + + The unique name/id of the process. + + + + + Process status. + + + + + Process version. + + + + + Information about the process + definition. + + + + + Information about the process + deployment. + + + + + Summary of the instances belonging to this + process. + + + + + Process properties. + + + + + Endpoint references. + + + + + Process documents + + + + + + + + + + + + + + Enumeration of process status. + + + + + Process is accepting new + requests. + + + + + Process is NOT accepting new + requests. + + + + + Process is NOT accepting new + requests and old requests. + + + + + + + Enumeration of scope status. + + + + + Activity is enabled, but not necessarily ready to execute. + + + + + Activity has started execution. + + + + + Activity has finished execution. + + + + + Activity is in failure state, recovery required. + + + + + + + Enumeration of scope status. + + + + + Scope is active. + + + + + Scope has completed. + + + + + Scope has faulted. + + + + + Scope is executing its fault + handler. + + + + + Scope is executing its compensation + handler. + + + + + Scope has been compensated. + + + + + + + Information about the process definition. + + + + + The qualified name of the BPEL + process. + + + + + + + Information about a document. + + + + + Name of the document. + + + + + Type of document (e.g. + WSDL/BPEL/etc...). + + + + + URL where the document can be + retrieved. + + + + + + + Information about a BPEL process + deployment. + + + + + Deployment package the process was deployed into. + + + + + File name of BPEL document. + + + + + Date the process was deployed. + + + + + The user that deployed this + process. + + + + + + + + + Process property (name-value pair). + + + + + + + + Name of the property. + + + + + + + + + + + Endpoint references associated with the process partner links roles. + + + + + + + + Name of the partner link this endpoint reference is associated with. + + + + + Name of the partner role this endpoint reference is associated with. + + + + + + + + + Enumeration of instant status. + + + + + Instance is active. + + + + + Instance has completed. + + + + + Instance was terminated. + + + + + Instance failed (with a fault). + + + + + Instance has been suspended. + + + + + Instance is..... + + + + + + + A summary of the number of instances in each state. + + + + + + + + + + + + + + + + + Scope instance identifier. + + + + + Scope name. + + + + + Scope instance identifier. + + + + + Parent scope reference. + + + + + + + + + + + + + + + + + + + + + + + + + + Lists all correlation correlation sets associated with + this scope with their valued correlation properties. + + + + + + + + + + + + + + + + + + Endpoint references. + + + + + + + Information about an activity. + + + + + + + + + + ID for scope in which this activity is executing. + + + + + The date/time when the activity was enabled. + + + + + The date/time when the activity was + started. + + + + + The date/time when the activity was + completed. + + + + + Indicates activity is in the failure state and requires recovery. + + + + + + + Indicates activity is in the failure state and requires recovery. + + + + + The date/time when failure occurred. + + + + + Number of retries. + + + + + Reason for failure. + + + + + Allowed recovery actions (space separated list of action names). + + + + + + + Information about a variable (basically the value) + + + + + + + + + + + + + + + + + + The unique instance identifier. + + + + + Process id of the process to which this instance + belongs. + + + + + + Root scope id (might not exist). + + + + + Status of ths instance. + + + + + The date/time when the instance was + started. + + + + + The date/time when the last activity + occured. + + + + + If present, indicates the date/time since which the + instance has been in an error state. + + + + + Lists all correlation properties with their values that + are associated with this process instance. + + + + + + Instance correlation property. + + + + + + + + Information about the events for this instance. If + absent, indicates events are not available. + + + + + + Indicates the datetime of the first event + + + + + + Indicates the datetime of the first event + + + + + + Indicates the datetime of the last event. + + + + + + + + + If present, indicates the fault with which this + instance failed. + + + + + + + + Reference to a scope. + + + + + + + + + Reference to a variable. + + + + + + + + Type used for reporting faults. + + + + + + + + + + + + + + + + + + Indicates one or more activities are in the failure + state and require recovery. + + + + + Date/time of last failure. + + + + + Number of activities in failure state. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Information about an activity. + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/ode/schedules.xsd b/wpsg-xml/src/main/schemas/wps/ode/schedules.xsd new file mode 100644 index 000000000..b4e895f5a --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/ode/schedules.xsd @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsAll.xsd b/wpsg-xml/src/main/schemas/wps/wpsAll.xsd new file mode 100644 index 000000000..aaa8e6bad --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsAll.xsd @@ -0,0 +1,44 @@ + + + + + $Id: wpsAll.xsd 2007-10-09 $ + + This XML Schema includes and imports, directly and indirectly, all the XML Schemas defined by the WPS Implemetation Specification. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsCancel_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsCancel_request.xsd new file mode 100644 index 000000000..dec4d6793 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsCancel_request.xsd @@ -0,0 +1,42 @@ + + + + + $Id: wpsCancel_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Cancel operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS Cancel operation request. + + + + + + + + Process instance identifier. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsCancel_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsCancel_response.xsd new file mode 100644 index 000000000..e0c82e637 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsCancel_response.xsd @@ -0,0 +1,65 @@ + + + + + $Id: wpsCancel_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + WPS Cancel operation response. + + + + + + + + Cancel request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Process instance identifier. Useful when success is false. + + + + + Required if success is true. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDeployData_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsDeployData_request.xsd new file mode 100644 index 000000000..6cfef4f8d --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDeployData_request.xsd @@ -0,0 +1,48 @@ + + + + + $Id: wpsExecute_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS DeployData operation request. + + + + + + + + + Data deployment profile. + + + + + + + + + + Full Data description. + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDeployData_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsDeployData_response.xsd new file mode 100644 index 000000000..1d7e2c350 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDeployData_response.xsd @@ -0,0 +1,57 @@ + + + + + $Id: wpsDeployData_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DeployData operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS DeployData operation response. + + + + + + + + DeployData request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the deployed data. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDeployProcess_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsDeployProcess_request.xsd new file mode 100644 index 000000000..de10210db --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDeployProcess_request.xsd @@ -0,0 +1,49 @@ + + + + + $Id: wpsExecute_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS DeployProcess operation request. + + + + + + + + + Process deployment profile. This can be a Apache ODE deployment profile or a SAGA deployment profile. + + + + + + + + + + + Full Process description. + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDeployProcess_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsDeployProcess_response.xsd new file mode 100644 index 000000000..374ae5b3b --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDeployProcess_response.xsd @@ -0,0 +1,57 @@ + + + + + $Id: wpsExecute_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS DeployProcess operation response. + + + + + + + + DeployProcess request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the deployed process. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDescribeData_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsDescribeData_request.xsd new file mode 100644 index 000000000..18f9052ab --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDescribeData_request.xsd @@ -0,0 +1,42 @@ + + + + + $Id: wpsDescribeData_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeData operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS DescribeData operation request. + + + + + + + + Unordered list of one or more identifiers of the data for which the client is requesting detailed descriptions. This element shall be repeated for each data for which a description is requested. These Identifiers are unordered, but the WPS shall return the Data descriptions in the order in which they were requested. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDescribeData_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsDescribeData_response.xsd new file mode 100644 index 000000000..079a9c3c1 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDescribeData_response.xsd @@ -0,0 +1,56 @@ + + + + + $Id: wpsDescribeData_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeData operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS DescribeData operation response. + + + + + + + + Ordered list of one or more full Data descriptions, listed in the order in which they were requested in the DescribeData operation request. + + + + + + + + + + + + Full description of a data. + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDescribeProcess_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsDescribeProcess_request.xsd new file mode 100644 index 000000000..9953ca2c5 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDescribeProcess_request.xsd @@ -0,0 +1,41 @@ + + + + $Id: wpsDescribeProcess_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeProcess operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS DescribeProcess operation request. + + + + + + + + Unordered list of one or more identifiers of the processes for which the client is requesting detailed descriptions. This element shall be repeated for each process for which a description is requested. These Identifiers are unordered, but the WPS shall return the process descriptions in the order in which they were requested. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsDescribeProcess_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsDescribeProcess_response.xsd new file mode 100644 index 000000000..241ccb1d7 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsDescribeProcess_response.xsd @@ -0,0 +1,420 @@ + + + + $Id: wpsDescribeProcess_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DescribeProcess operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + WPS DescribeProcess operation response. + + + + + + + + Ordered list of one or more full Process descriptions, listed in the order in which they were requested in the DescribeProcess operation request. + + + + + + + + + + + Full description of a process. + + + + + + + List of the inputs to this process. In almost all cases, at least one process input is required. However, no process inputs may be identified when all the inputs are predetermined fixed resources. In this case, those resources shall be identified in the ows:Abstract element that describes the process. + + + + + + Unordered list of one or more descriptions of the inputs that can be accepted by this process, including all required and optional inputs. Where an input is optional because a default value exists, that default value must be identified in the "ows:Abstract" element for that input, except in the case of LiteralData, where the default must be indicated in the corresponding ows:DefaultValue element. Where an input is optional because it depends on the value(s) of other inputs, this must be indicated in the ows:Abstract element for that input. + + + + + + + + List of outputs which will or can result from executing the process. + + + + + + Unordered list of one or more descriptions of all the outputs that can result from executing this process. At least one output is required from each process. + + + + + + + + + Indicates if ComplexData outputs from this process can be stored by the WPS server as web-accessible resources. If "storeSupported" is "true", the Execute operation request may include "asReference" equals "true" for any complex output, directing that the output of the process be stored so that the client can retrieve it as required. By default for this process, storage is not supported and all outputs are returned encoded in the Execute response. + + + + + Indicates if ongoing status information can be provided for this process. If "true", the Status element of the stored Execute response document shall be kept up to date. If "false" then the Status element shall not be updated until processing is complete. By default, status information is not provided for this process. + + + + + + + + + + Description of an input to a process. + + + + + In this use, the DescriptionType shall describe this process input. + + + + + + + The minimum number of times that values for this parameter are required in an Execute request. If "0", this data input is optional. If greater than "0" then this process input is required. + + + + + The maximum number of times that values for this parameter are permitted in an Execute request. If "1" then this parameter may appear only once in an Execute request. If greater than "1", then this input parameter may appear that many times in an Execute request. + + + + + + + + + Identifies the form of this input and provides supporting information. + + + + + Indicates that this Input shall be a complex data structure (such as a GML document), and provides a list of Formats, Encodings, and Schemas supported for this Input. The value of this ComplexData structure can be input either embedded in the Execute request or remotely accessible to the server. The client can select from among the identified combinations of Formats, Encodings, and Schemas to specify the form of the Input. This allows for complete specification of particular versions of GML, or image formats. + + + + + Indicates that this Input shall be a simple numeric value or character string that is embedded in the execute request, and describes the possible values. + + + + + Indicates that this Input shall be a BoundingBox data structure that is embedded in the execute request, and provides a list of the Coordinate Reference System support for this Bounding Box. + + + + + + + + Description of a process input that consists of a simple literal value (e.g., "2.1"). (Informative: This type is a subset of the ows:UnNamedDomainType defined in owsDomaintype.xsd.) + + + + + + + Identifies the type of this literal input and provides supporting information. For literal values with a defined Unit of Measure, the contents of these sub-elements shall be understood to be consistent with the default Unit of Measure. + + + + + Optional default value for this quantity, which should be included when this quantity has a default value. The DefaultValue shall be understood to be consistent with the unit of measure selected in the Execute request. + + + + + + + + + + Identifies the type of this literal input and provides supporting information. + + + + + Indicates that there are a finite set of values and ranges allowed for this input, and contains list of all the valid values and/or ranges of values. Notice that these values and ranges can be displayed to a human client. + + + + + Indicates that any value is allowed for this input. This element shall be included when there are no restrictions, except for data type, on the allowable value of this input. + + + + + Indicates that there are a finite set of values and ranges allowed for this input, which are specified in the referenced list. + + + + + + + + References an externally defined finite set of values and ranges for this input. + + + + + Reference to a description of the mimetype, encoding, and schema used for this set of values and ranges. + + + + + + + + + + + + + The maximum file size, in megabytes, of this input. If the input exceeds this size, the server will return an error instead of processing the inputs. + + + + + + + + + + Listing of the Unit of Measure (U0M) support for this process input or output. + + + + + Reference to the default UOM supported for this input or output, if UoM is applicable. The process shall expect input in or produce output in this UOM unless the Execute request specifies another supported UOM. + + + + + + Reference to the default UOM supported for this Input/Output + + + + + + + + Unordered list of references to all of the UOMs supported for this input or output, if UOM is applicable. The default UOM shall be included in this list. + + + + + + + + Identifies a UOM supported for this input or output. + + + + + Reference to a UOM supported for this input or output. + + + + + + + + Listing of the Coordinate Reference System (CRS) support for this process input or output. + + + + + Identifies the default CRS that will be used unless the Execute operation request specifies another supported CRS. + + + + + + Reference to the default CRS supported for this Input/Output + + + + + + + + Unordered list of references to all of the CRSs supported for this Input/Output. The default CRS shall be included in this list. + + + + + + + + Identifies a Coordinate Reference System (CRS) supported for this input or output. + + + + + Reference to a CRS supported for this Input/Output. + + + + + + + + Formats, encodings, and schemas supported by a process input or output. + + + + + Identifies the default combination of Format, Encoding, and Schema supported for this Input/Output. The process shall expect input in or produce output in this combination of MimeType/Encoding/Schema unless the Execute request specifies otherwise. + + + + + Unordered list of combinations of format, encoding, and schema supported for this Input/Output. This element shall be repeated for each combination of MimeType/Encoding/Schema that is supported for this Input/Output. This list shall include the default MimeType/Encoding/Schema. + + + + + + + + Identifies the default Format, Encoding, and Schema supported for this input or output. The process shall expect input in or produce output in this combination of Format/Encoding/Schema unless the Execute request specifies otherwise.. + + + + + The default combination of MimeType/Encoding/Schema supported for this Input/Output. + + + + + + + + Identifies valid combinations of Format, Encoding, and Schema supported for this input or output. The process shall expect input in or produce output in this combination of Format/Encoding/Schema unless the Execute request specifies otherwise.. + + + + + A valid combination of MimeType/Encoding/Schema supported for this Input/Output. + + + + + + + + A combination of format, encoding, and/or schema supported by a process input or output. + + + + + Mime type supported for this input or output (e.g., text/xml). + + + + + Reference to an encoding supported for this input or output (e.g., UTF-8). This element shall be omitted if Encoding does not apply to this Input/Output. + + + + + Reference to a definition of XML elements or types supported for this Input/Output (e.g., GML 2.1 Application Schema). Each of these XML elements or types shall be defined in a separate XML Schema Document. This parameter shall be included when this input/output is XML encoded using an XML schema. When included, the input/output shall validate against the referenced XML Schema. This element shall be omitted if Schema does not apply to this Input/Output. Note: If the Input/Output uses a profile of a larger schema, the server administrator should provide that schema profile for validation purposes. + + + + + + + + + Description of a process Output. + + + + + In this use, the DescriptionType shall describe this process output. + + + + + + + + + Identifies the form of this output, and provides supporting information. + + + + + Indicates that this Output shall be a complex data structure (such as a GML fragment) that is returned by the execute operation response. The value of this complex data structure can be output either embedded in the execute operation response or remotely accessible to the client. When this output form is indicated, the process produces only a single output, and "store" is "false, the output shall be returned directly, without being embedded in the XML document that is otherwise provided by execute operation response. + This element also provides a list of format, encoding, and schema combinations supported for this output. The client can select from among the identified combinations of formats, encodings, and schemas to specify the form of the output. This allows for complete specification of particular versions of GML, or image formats. + + + + + Indicates that this output shall be a simple literal value (such as an integer) that is embedded in the execute response, and describes that output. + + + + + Indicates that this output shall be a BoundingBox data structure, and provides a list of the CRSs supported in these Bounding Boxes. This element shall be included when this process output is an ows:BoundingBox element. + + + + + + + + Description of a literal output (or input). + + + + + Data type of this set of values (e.g. integer, real, etc). This data type metadata should be included for each quantity whose data type is not a string. + + + + + List of supported units of measure for this input or output. This element should be included when this literal has a unit of measure (e.g., "meters", without a more complete reference system). Not necessary for a count, which has no units. + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsESEMetadata.xsd b/wpsg-xml/src/main/schemas/wps/wpsESEMetadata.xsd new file mode 100644 index 000000000..efe92535c --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsESEMetadata.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + Number of CPUs + + + + + Number of GB + + + + + Number of GB + + + + + Required Mbits/s + + + + + + + Processing Service URL + + + + + Process identifier + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsESEQoS.xsd b/wpsg-xml/src/main/schemas/wps/wpsESEQoS.xsd new file mode 100644 index 000000000..d39f304e7 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsESEQoS.xsd @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsExecute_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsExecute_request.xsd new file mode 100644 index 000000000..ef89f885b --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsExecute_request.xsd @@ -0,0 +1,345 @@ + + + + $Id: wpsExecute_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + WPS Execute operation request, to execute one identified Process. If a process is to be run multiple times, each run shall be submitted as a separate Execute request. + + + + + + + + Identifier of the Process to be executed. This Process identifier shall be as listed in the ProcessOfferings section of the WPS Capabilities document. + + + + + List of input (or parameter) values provided to the process, including each of the Inputs needed to execute the process. It is possible to have no inputs provided only when all the inputs are predetermined fixed resources. In all other cases, at least one input is required. + + + + + Defines the response type of the WPS, either raw data or XML document. If absent, the response shall be a response document which includes all outputs encoded in the response. + + + + + + + + + + + List of the Inputs provided as part of the Execute Request. + + + + + Unordered list of one or more inputs to be used by the process, including each of the Inputs needed to execute the process. + + + + + + + + Defines the response type of the WPS, either raw data or XML document + + + + + Indicates that the outputs shall be returned as part of a WPS response document. + + + + + Indicates that the output shall be returned directly as raw data, without a WPS response document. + + + + + + + + + + Unordered list of definitions of the outputs (or parameters) requested from the process. These outputs are not normally identified, unless the client is specifically requesting a limited subset of outputs, and/or is requesting output formats and/or schemas and/or encodings different from the defaults and selected from the alternatives identified in the process description, or wishes to customize the descriptive information about the output. + + + + + + Indicates if the execute response document shall be stored. If "true" then the executeResponseLocation attribute in the execute response becomes mandatory, which will point to the location where the executeResponseDocument is stored. The service shall respond immediately to the request and return an executeResponseDocument containing the executeResponseLocation and the status element which has five possible subelements (choice):ProcessAccepted, ProcessStarted, ProcessPaused, ProcessFailed and ProcessSucceeded, which are chosen and populated as follows: 1) If the process is completed when the initial executeResponseDocument is returned, the element ProcessSucceeded is populated with the process results. 2) If the process already failed when the initial executeResponseDocument is returned, the element ProcessFailed is populated with the Exception. 3) If the process has been paused when the initial executeResponseDocument is returned, the element ProcessPaused is populated. 4) If the process has been accepted when the initial executeResponseDocument is returned, the element ProcessAccepted is populated, including percentage information. 5) If the process execution is ongoing when the initial executeResponseDocument is returned, the element ProcessStarted is populated. In case 3, 4, and 5, if status updating is requested, updates are made to the executeResponseDocument at the executeResponseLocation until either the process completes successfully or fails. Regardless, once the process completes successfully, the ProcessSucceeded element is populated, and if it fails, the ProcessFailed element is populated. + Specifies if the Execute operation response shall be returned quickly with status information, or not returned until process execution is complete. This parameter shall not be included unless the corresponding "statusSupported" parameter is included and is "true" in the ProcessDescription for this process. + + + + + Indicates if the Execute operation response shall include the DataInputs and OutputDefinitions elements. If lineage is "true" the server shall include in the execute response a complete copy of the DataInputs and OutputDefinition elements as received in the execute request. If lineage is "false" then these elements shall be omitted from the response. + + + + + Indicates if the stored execute response document shall be updated to provide ongoing reports on the status of execution. If status is "true" and storeExecuteResponse is "true" (and the server has indicated that both storeSupported and statusSupported are "true") then the Status element of the execute response document stored at executeResponseLocation is kept up to date by the process. While the execute response contains ProcessAccepted, ProcessStarted, or ProcessPaused, updates shall be made to the executeResponse document until either the process completes successfully (in which case ProcessSucceeded is populated), or the process fails (in which case ProcessFailed is populated). If status is "false" then the Status element shall not be updated until the process either completes successfully or fails. If status="true" and storeExecuteResponse is "false" then the service shall raise an exception. + + + + + + + Definition of a format, encoding, schema, and unit-of-measure for an output to be returned from a process. + + + + + In this use, the DescriptionType shall describe this process input or output. + + + + + Title of the process output, normally available for display to a human. This element should be used if the client wishes to customize the Title in the execute response. This element should not be used if the Title provided for this output in the ProcessDescription is adequate. + + + + + Brief narrative description of a process output, normally available for display to a human. This element should be used if the client wishes to customize the Abstract in the execute response. This element should not be used if the Abstract provided for this output in the ProcessDescription is adequate. + + + + + + Specifies if this output should be stored by the process as a web-accessible resource. If asReference is "true", the server shall store this output so that the client can retrieve it as required. If store is "false", all the output shall be encoded in the Execute operation response document. This parameter only applies to ComplexData outputs. This parameter shall not be included unless the corresponding "storeSupported" parameter is included and is "true" in the ProcessDescription for this process. + + + + + + + + + Definition of a format, encoding, schema, and unit-of-measure for an output to be returned from a process. + + + + + Unambiguous identifier or name of an output, unique for this process. + + + + + + Reference to the unit of measure (if any) requested for this output. A uom can be referenced when a client wants to specify one of the units of measure supported for this output. This uom shall be a unit of measure referenced for this output of this process in the Process full description. + + + + + + + + References the XML schema, format, and encoding of a complex value. + + + + The Format of this input or requested for this output (e.g., text/xml). This element shall be omitted when the Format is indicated in the http header of the output. When included, this format shall be one published for this output or input in the Process full description. + + + + + The encoding of this input or requested for this output (e.g., UTF-8). This "encoding" shall be included whenever the encoding required is not the default encoding indicated in the Process full description. When included, this encoding shall be one published for this output or input in the Process full description. + + + + + Web-accessible XML Schema Document that defines the content model of this complex resource (e.g., encoded using GML 2.2 Application Schema). This reference should be included for XML encoded complex resources to facilitate validation. + PS I changed the name of this attribute to be consistent with the ProcessDescription. The original was giving me validation troubles in XMLSpy. + + + + + + + + Value of one input to a process. + + + + + Unambiguous identifier or name of a process, unique for this server, or unambiguous identifier or name of an output, unique for this process. + + + + + Title of a process or output, normally available for display to a human. + + + + + Brief narrative description of a process or output, normally available for display to a human. + + + + + Identifies the form of this input, and provides supporting information. + + + + + + + + Identifies the form of this input or output value, and provides supporting information. + + + + + Identifies this input value as a web accessible resource, and references that resource. + + + + + Identifies this input value as a data embedded in this request, and includes that data. + + + + + + + + Identifies the form of this input or output value, and provides supporting information. + + + + + Identifies this input or output value as a complex data structure encoded in XML (e.g., using GML), and provides that complex data structure. For an input, this element may be used by a client for any process input coded as ComplexData in the ProcessDescription. For an output, this element shall be used by a server when "store" in the Execute request is "false". + + + + + Identifies this input or output data as literal data of a simple quantity (e.g., one number), and provides that data. + + + + + Identifies this input or output data as an ows:BoundingBox data structure, and provides that ows:BoundingBox data. + + + + + + + + + Reference to an input or output value that is a web accessible resource. + + + + + Extra HTTP request headers needed by the service identified in ../Reference/@href. For example, an HTTP SOAP request requires a SOAPAction header. This permits the creation of a complete and valid POST request. + + + + + Key portion of the Key-Value pair in the HTTP request header. + + + + + Value portion of the Key-Value pair in the HTTP request header. + + + + + + + + The contents of this element to be used as the body of the HTTP request message to be sent to the service identified in ../Reference/@href. For example, it could be an XML encoded WFS request using HTTP POST + + + + + Reference to a remote document to be used as the body of the an HTTP POST request message to the service identified in ../Reference/@href. + + + + + Reference to a remote document to be used as the body of the an HTTP POST request message. This attribute shall contain a URL from which this input can be electronically retrieved. + + + + + + + + + Reference to a web-accessible resource that can be used as input, or is provided by the process as output. This attribute shall contain a URL from which this input/output can be electronically retrieved. + + + + + Identifies the HTTP method. Allows a choice of GET or POST. Default is GET. + + + + + + + + + + + + + + Complex data (such as an image), including a definition of the complex value data structure (i.e., schema, format, and encoding). May be an ows:Manifest data structure. + + + + + + + + + + + One simple literal value (such as an integer or real number) that is embedded in the Execute operation request or response. + + + + + String containing the Literal value (e.g., "49"). + + + + Identifies the data type of this literal input or output. This dataType should be included for each quantity whose value is not a simple string. + + + + + Identifies the unit of measure of this literal input or output. This unit of measure should be referenced for any numerical value that has units (e.g., "meters", but not a more complete reference system). Shall be a UOM identified in the Process description for this input or output. + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsExecute_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsExecute_response.xsd new file mode 100644 index 000000000..e93bd9a2c --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsExecute_response.xsd @@ -0,0 +1,225 @@ + + + + + $Id: wpsExecute_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + WPS Execute operation response. By default, this XML document is delivered to the client in response to an Execute request. If "status" is "false" in the Execute operation request, this document is normally returned when process execution has been completed. + If "status" in the Execute request is "true", this response shall be returned as soon as the Execute request has been accepted for processing. In this case, the same XML document is also made available as a web-accessible resource from the URL identified in the statusLocation, and the WPS server shall repopulate it once the process has completed. It may repopulate it on an ongoing basis while the process is executing. + However, the response to an Execute request will not include this element in the special case where the output is a single complex value result and the Execute request indicates that "store" is "false". Instead, the server shall return the complex result (e.g., GIF image or GML) directly, without encoding it in the ExecuteResponse. If processing fails in this special case, the normal ExecuteResponse shall be sent, with the error condition indicated. This option is provided to simplify the programming required for simple clients and for service chaining. + + + + + + + + Process description from the ProcessOfferings section of the GetCapabilities response. + + + + + Execution status of this process. + + + + + Inputs that were provided as part of the execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + Complete list of Output data types that were requested as part of the Execute request. This element shall be omitted unless the lineage attribute of the execute request is set to "true". + + + + + List of values of the Process output parameters. Normally there would be at least one output when the process has completed successfully. If the process has not finished executing, the implementer can choose to include whatever final results are ready at the time the Execute response is provided. If the reference locations of outputs are known in advance, these URLs may be provided before they are populated. + + + + + + Unordered list of values of all the outputs produced by this process. It is not necessary to include an output until the Status is ProcessSucceeded. + + + + + + + + + + This attribute shall contain the GetCapabilities URL of the WPS service which was invoked + + + + + The URL referencing the location from which the ExecuteResponse can be retrieved. If "status" is "true" in the Execute request, the ExecuteResponse should also be found here as soon as the process returns the initial response to the client. It should persist at this location as long as the outputs are accessible from the server. The outputs may be stored for as long as the implementer of the server decides. If the process takes a long time, this URL can be repopulated on an ongoing basis in order to keep the client updated on progress. Before the process has succeeded, the ExecuteResponse contains information about the status of the process, including whether or not processing has started, and the percentage completed. It may also optionally contain the inputs and any ProcessStartedType interim results. When the process has succeeded, the ExecuteResponse found at this URL shall contain the output values or references to them. + + + + + + + + + + Definition of a format, encoding, schema, and unit-of-measure for an output to be returned from a process. + + + + + Output definition as provided in the execute request + + + + + + + + Value of one output from a process. + + + + + In this use, the DescriptionType shall describe this process output. + + + + Identifies the form of this output, and provides supporting information. + + + + + + + + + Identifies the form of this input or output value, and provides supporting information. + + + + + Identifies this output as a web accessible resource, and references that resource. This element shall only be used for complex data. This element shall be used by a server when "store" in the Execute request is "true". + + + + + Identifies this output value as a data embedded in this response, and includes that data. This element shall be used by a server when "store" in the Execute request is "false". + + + + + + + + Reference to an output value that is a web accessible resource. + + + + Reference to a web-accessible resource that is provided by the process as output. This attribute shall contain a URL from which this output can be electronically retrieved. + + + + + + + + + Description of the status of process execution. + + + + + Indicates that this process has been accepted by the server, but is in a queue and has not yet started to execute. The contents of this human-readable text string is left open to definition by each server implementation, but is expected to include any messages the server may wish to let the clients know. Such information could include how long the queue is, or any warning conditions that may have been encountered. The client may display this text to a human user. + + + + + Indicates that this process has been accepted by the server, and processing has begun. + + + + + Indicates that this process has been accepted by the server, and processing has started but subsequently been paused by the server. + + + + + Indicates that this process has successfully completed execution. The contents of this human-readable text string is left open to definition by each server, but is expected to include any messages the server may wish to let the clients know, such as how long the process took to execute, or any warning conditions that may have been encountered. The client may display this text string to a human user. The client should make use of the presence of this element to trigger automated or manual access to the results of the process. If manual access is intended, the client should use the presence of this element to present the results as downloadable links to the user. + + + + + Indicates that execution of this process has failed, and includes error information. + + + + + Indicates the process was cancelled. + + + + + + The time (UTC) that the process finished. If the process is still executing or awaiting execution, this element shall contain the creation time of this document. + + + + + + + Indicates that this process has been has been accepted by the server, and processing has begun. + + + + + A human-readable text string whose contents are left open to definition by each WPS server, but is expected to include any messages the server may wish to let the clients know. Such information could include how much longer the process may take to execute, or any warning conditions that may have been encountered to date. The client may display this text to a human user. + + + + Percentage of process that has been completed, where 0 means the process has just started, and 99 means the process is almost complete. This value is expected to be accurate to within ten percent. + + + + + + + + + + + + + + + Indicator that the process has failed to execute successfully. The reason for failure is given in the exception report. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsGetAudit_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsGetAudit_request.xsd new file mode 100644 index 000000000..7681fbede --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsGetAudit_request.xsd @@ -0,0 +1,47 @@ + + + + + $Id: wpsGetAudit_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetAudit operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS GetAudit operation request. + + + + + + + + Process instance identifier. + + + + + + The short form (default) provides the execution processing flow. The long form provides the full execution trace. + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsGetAudit_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsGetAudit_response.xsd new file mode 100644 index 000000000..4e89596bd --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsGetAudit_response.xsd @@ -0,0 +1,80 @@ + + + + + $Id: wpsGetAudit_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + WPS GetAudit operation response. + + + + + + + + GetAudit request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Process instance identifier. Useful when success is false. + + + + + Required id success is true. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsGetCapabilities_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsGetCapabilities_request.xsd new file mode 100644 index 000000000..d905002e3 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsGetCapabilities_request.xsd @@ -0,0 +1,42 @@ + + + + $Id: wpsGetCapabilities_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetCapabilities operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + When omitted, server shall return latest supported version. + + + + + + OGC service type identifier (WPS). + + + + + RFC 4646 language code of the human-readable text (e.g. "en-CA"). + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsGetCapabilities_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsGetCapabilities_response.xsd new file mode 100644 index 000000000..3df75a322 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsGetCapabilities_response.xsd @@ -0,0 +1,115 @@ + + + + + $Id: wpsGetCapabilities_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetCapabilities operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + + + + WPS GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, including metadata about the processes that can be executed. Since the server does not implement the updateSequence and Sections parameters, the server shall always return the complete Capabilities document, without the updateSequence parameter. + + + + + + + + + + + List of the default and other languages supported by this service. + + + + + Location of a WSDL document which describes the entire service. + + + + + + + + + + + + + + Listing of the default and other languages supported by this service. + + + + + + Identifies the default language that will be used unless the operation request specifies another supported language. + + + + + + Identifier of the default language supported by the service. This language identifier shall be as specified in IETF RFC 4646. + + + + + + + + Unordered list of references to all of the languages supported by this service. The default language shall be included in this list. + + + + + + + + + Identifies a list of languages supported by this service. + + + + + Identifier of a language supported by the service. This language identifier shall be as specified in IETF RFC 4646. + + + + + + + + List of brief descriptions of the processes offered by this WPS server. + + + + + + Unordered list of one or more brief descriptions of all the processes offered by this WPS server. + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsGetStatus_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsGetStatus_request.xsd new file mode 100644 index 000000000..eb065e811 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsGetStatus_request.xsd @@ -0,0 +1,42 @@ + + + + + $Id: wpsGetStatus_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS GetStatus operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS GetStatus operation request. + + + + + + + + Process instance identifier. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsGetStatus_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsGetStatus_response.xsd new file mode 100644 index 000000000..d23ac0037 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsGetStatus_response.xsd @@ -0,0 +1,48 @@ + + + + + $Id: wpsGetStatus_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + + + WPS GetStatus operation response. + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsUndeployData_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsUndeployData_request.xsd new file mode 100644 index 000000000..2d804c224 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsUndeployData_request.xsd @@ -0,0 +1,42 @@ + + + + + $Id: wpsUndeployData_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS UndeployData operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS UndeployData operation request. + + + + + + + + Identifier of the auxiliary data to be undeployed. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsUndeployData_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsUndeployData_response.xsd new file mode 100644 index 000000000..bd914d169 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsUndeployData_response.xsd @@ -0,0 +1,57 @@ + + + + + $Id: wpsUndeployData_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS DeployData operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS UndeployData operation response. + + + + + + + + UndeployData request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the undeployed data. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsUndeployProcess_request.xsd b/wpsg-xml/src/main/schemas/wps/wpsUndeployProcess_request.xsd new file mode 100644 index 000000000..a7ffc6d41 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsUndeployProcess_request.xsd @@ -0,0 +1,42 @@ + + + + + $Id: wpsUndeployProcess_request.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS UndeployProcess operation request. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS UndeployProcess operation request. + + + + + + + + Identifier of the process to be undeployed. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wpsUndeployProcess_response.xsd b/wpsg-xml/src/main/schemas/wps/wpsUndeployProcess_response.xsd new file mode 100644 index 000000000..45352d4d0 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wpsUndeployProcess_response.xsd @@ -0,0 +1,57 @@ + + + + + $Id: wpsUndeployProcess_response.xsd 2007-10-09 $ + + This XML Schema Document encodes the WPS Execute operation response. + + WPS is an OGC Standard. + Copyright (c) 2007,2010 Open Geospatial Consortium, Inc. All Rights Reserved. + To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ . + + + + + + + + + + WPS UndeployProcess operation response. + + + + + + + + UndeployProcess request result. + + + + + + Result message. Required if success is false. + + + + + + + + + Identifier of the undeployed process. + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wps_cachelist.xsd b/wpsg-xml/src/main/schemas/wps/wps_cachelist.xsd new file mode 100644 index 000000000..6752ae828 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wps_cachelist.xsd @@ -0,0 +1,26 @@ + + + + + A list of cache entries + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wps_datalist.xsd b/wpsg-xml/src/main/schemas/wps/wps_datalist.xsd new file mode 100644 index 000000000..e695a355a --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wps_datalist.xsd @@ -0,0 +1,18 @@ + + + + + A list of data entries + + + + + + + + Number of data elements + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wps_urllist.xsd b/wpsg-xml/src/main/schemas/wps/wps_urllist.xsd new file mode 100644 index 000000000..b6dddb0a1 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wps_urllist.xsd @@ -0,0 +1,18 @@ + + + + + A list of urls + + + + + + + + Number of url elements + + + + + diff --git a/wpsg-xml/src/main/schemas/wps/wps_vito.xsd b/wpsg-xml/src/main/schemas/wps/wps_vito.xsd new file mode 100644 index 000000000..949d03892 --- /dev/null +++ b/wpsg-xml/src/main/schemas/wps/wps_vito.xsd @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/wsa/ws-addr.xsd b/wpsg-xml/src/main/schemas/wsa/ws-addr.xsd new file mode 100644 index 000000000..47362edbe --- /dev/null +++ b/wpsg-xml/src/main/schemas/wsa/ws-addr.xsd @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/xlink/1.0.0/xlinks.xsd b/wpsg-xml/src/main/schemas/xlink/1.0.0/xlinks.xsd new file mode 100644 index 000000000..faef81dab --- /dev/null +++ b/wpsg-xml/src/main/schemas/xlink/1.0.0/xlinks.xsd @@ -0,0 +1,122 @@ + + + + + xlinks.xsd v3.0b2 2001-07 + + GML 3.0 candidate xlinks schema. Copyright (c) 2001 OGC, All Rights Reserved. + + + + + + + + + + + + + + The 'show' attribute is used to communicate the desired presentation + of the ending resource on traversal from the starting resource; it's + value should be treated as follows: + new - load ending resource in a new window, frame, pane, or other + presentation context + replace - load the resource in the same window, frame, pane, or + other presentation context + embed - load ending resource in place of the presentation of the + starting resource + other - behavior is unconstrained; examine other markup in the + link for hints + none - behavior is unconstrained + + + + + + + + + + + + + + + + The 'actuate' attribute is used to communicate the desired timing + of traversal from the starting resource to the ending resource; + it's value should be treated as follows: + onLoad - traverse to the ending resource immediately on loading + the starting resource + onRequest - traverse from the starting resource to the ending + resource only on a post-loading event triggered for + this purpose + other - behavior is unconstrained; examine other markup in link + for hints + none - behavior is unconstrained + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wpsg-xml/src/main/schemas/xml/xml.xsd b/wpsg-xml/src/main/schemas/xml/xml.xsd new file mode 100644 index 000000000..aea7d0db0 --- /dev/null +++ b/wpsg-xml/src/main/schemas/xml/xml.xsd @@ -0,0 +1,287 @@ + + + + + + +
+

About the XML namespace

+ +
+

+ This schema document describes the XML namespace, in a form + suitable for import by other schema documents. +

+

+ See + http://www.w3.org/XML/1998/namespace.html and + + http://www.w3.org/TR/REC-xml for information + about this namespace. +

+

+ Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance. +

+

+ See further below in this document for more information about how to refer to this schema document from your own + XSD schema documents and about the + namespace-versioning policy governing this schema document. +

+
+
+
+
+ + + + +
+ +

lang (as an attribute name)

+

+ denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.

+ +
+
+

Notes

+

+ Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. +

+

+ See BCP 47 at + http://www.rfc-editor.org/rfc/bcp/bcp47.txt + and the IANA language subtag registry at + + http://www.iana.org/assignments/language-subtag-registry + for further information. +

+

+ The union allows for the 'un-declaration' of xml:lang with + the empty string. +

+
+
+
+ + + + + + + + + +
+ + + + +
+ +

space (as an attribute name)

+

+ denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.

+ +
+
+
+ + + + + + +
+ + + +
+ +

base (as an attribute name)

+

+ denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.

+ +

+ See http://www.w3.org/TR/xmlbase/ + for information about this attribute. +

+
+
+
+
+ + + + +
+ +

id (as an attribute name)

+

+ denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.

+ +

+ See http://www.w3.org/TR/xml-id/ + for information about this attribute. +

+
+
+
+
+ + + + + + + + + + +
+ +

Father (in any context at all)

+ +
+

+ denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: +

+
+

+ In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father". +

+
+
+
+
+
+ + + +
+

About this schema document

+ +
+

+ This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow xml:base, + xml:lang, xml:space or + xml:id attributes on elements they define. +

+

+ To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows: +

+
+          <schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     
+

+ or +

+
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     
+

+ Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g. +

+
+          <type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+     
+

+ will define a type which will schema-validate an instance element + with any of those attributes. +

+
+
+
+
+ + + +
+

Versioning policy for this schema document

+
+

+ In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + + http://www.w3.org/2009/01/xml.xsd. +

+

+ At the date of issue it can also be found at + + http://www.w3.org/2001/xml.xsd. +

+

+ The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at + http://www.w3.org/2001/xml.xsd + + will change accordingly; the version at + + http://www.w3.org/2009/01/xml.xsd + + will not change. +

+

+ Previous dated (and unchanging) versions of this schema + document are at: +

+ +
+
+
+
+ +
+