52n-wps-algorithm-gcube/src/test/java/org/n52/wps/server/ComplexAnnotatedAlgorithm.java

237 lines
9.3 KiB
Java
Raw Normal View History

/**
* Copyright (C) 2007 - 2016 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.n52.wps.server;
import java.net.URI;
import java.util.Date;
import java.util.List;
import org.n52.test.mock.MockBinding;
import org.n52.test.mock.MockEnum;
import org.n52.test.mock.MockComplexObject;
import org.n52.wps.algorithm.annotation.Algorithm;
import org.n52.wps.algorithm.annotation.ComplexDataInput;
import org.n52.wps.algorithm.annotation.ComplexDataOutput;
import org.n52.wps.algorithm.annotation.LiteralDataInput;
import org.n52.wps.algorithm.annotation.LiteralDataOutput;
import org.n52.wps.algorithm.annotation.Execute;
import org.n52.wps.io.data.binding.literal.LiteralByteBinding;
import org.n52.wps.io.data.binding.literal.LiteralShortBinding;
/**
*
* @author tkunicki
*/
@Algorithm(
// identifier="SampleIdentifier" fully qualified class name is used when this is missing
version="0.0.1", // default is "1.0.0"
title="Sample Algorithm Title", // identifier is used if title is not set
abstrakt="Sample Algortihm Abstract", // default is null (not output)
storeSupported=false, // default is true
statusSupported=true) // default is true
public class ComplexAnnotatedAlgorithm extends AbstractAnnotatedAlgorithm {
// EXAMPLES FOR OUTPUTS
@LiteralDataInput(
// binding=LiteralDoubleBinding.class, not needed, can infer type from field type
identifier=Constants.LITERAL_DOUBLE,
title="Sample Input Title",
abstrakt="Sample Input Abstract",
minOccurs=0,
maxOccurs=2)
public List<Double> inputLiteralDouble;
// public List<? extends Double> inputLiteralDouble; OK, but needs explicit binding
// public List<? super Double> inputLiteralDouble; OK, but needs explicit binding
// public List<?> inputLiteralDouble; OK, but needs explicit binding
// public List<? extends Number> inputLiteralDouble; OK, but needs explicit binding
// public List<? super Number> inputLiteralDouble; FAIL, [dD]ouble not superclass of Number
// public [dDouble] inputLiteralDouble; FAIL, maxOccurs is 2, need List!
//
// not an exhaustive list, point is we can autobind literal types. For types
// where autobinding can't be inferred one can explicitly set binding but parser
// will check types to validate assignability between binding payload and field or
// method argument. Methods or fields must be public!
// primitive field
@LiteralDataInput(identifier=Constants.LITERAL_FLOAT)
public float inputLiteralFloat;
private Long inputLiteralLong;
// Primitive wrapper as method argument
@LiteralDataInput(identifier=Constants.LITERAL_LONG)
public void setInputLiteralLong(Long inputLiteralLong) {
this.inputLiteralLong = inputLiteralLong;
}
private int inputLiteralInt;
// Primitive as method argument
@LiteralDataInput(identifier=Constants.LITERAL_INT)
public void setInputLiteralLong(int inputLiteralInt) {
this.inputLiteralInt = inputLiteralInt;
}
private Number inputLiteralShort;
// Number as method argument type
@LiteralDataInput(
binding=LiteralShortBinding.class, // REQUIRED since literal type can't be inferred from method parameter type
identifier=Constants.LITERAL_SHORT)
public void setInputLiteralLong(Number inputLiteralShort) {
this.inputLiteralShort = inputLiteralShort;
}
// Object as field type
@LiteralDataInput(
binding=LiteralByteBinding.class, // REQUIRED since literal type can't be inferred from field type
identifier=Constants.LITERAL_BYTE)
public Object inputLiteralByte;
private boolean inputeLiteralBoolean;
// don't care what method name is, only check it's annotation...
@LiteralDataInput(identifier=Constants.LITERAL_BOOLEAN)
public void setWithSomeRandomName(boolean inputeLiteralBoolean) {
this.inputeLiteralBoolean = inputeLiteralBoolean;
}
private String inputLiteralString;
@LiteralDataInput(
identifier=Constants.LITERAL_STRING,
defaultValue="Some Default Value", // annotation parser will validate this is allowedValues if set
allowedValues= { "Some Default Value", "Not the default Value" } )
public void setInputLiteralString(String inputLiteralString) {
this.inputLiteralString = inputLiteralString;
}
private MockEnum inputLiteralEnum;
@LiteralDataInput(
// binding=LiteralStringBinding.class Not needed! Enums are auto-bound to strings!
identifier=Constants.LITERAL_ENUM,
// defaultValue=MockEnum.VALUE1, Argh, Can't do this!
// defaultValue=MockEnum.VALUE1.name(), Argh, Can't do this either!, only literals or constants! So we settle for String constants
defaultValue="VALUE1", // must be string but annotation parser will validate this is valid constant for MockEnum
// allowedValues= { ... } Already set to Enum constants for MockEnum!
maxOccurs=LiteralDataInput.ENUM_COUNT // special case, set maxOccurs to number of MockEnum constants
)
public void setInputEnumType(MockEnum inputLiteralEnum) {
this.inputLiteralEnum = inputLiteralEnum;
}
// then the rest of the inputs...
private Date inputLiteralDateTime;
private byte[] inputLiteralBase64Binary;
private URI inputLiteralAnyURI;
private MockComplexObject inputComplex;
@LiteralDataInput(identifier=Constants.LITERAL_DATETIME)
public void setInputLiteralDateTime(Date inputLiteralDateTime) {
this.inputLiteralDateTime = inputLiteralDateTime;
}
@LiteralDataInput(identifier=Constants.LITERAL_BASE64BINARY)
public void setInputLiteralDateTime(byte[] inputLiteralBase64Binary) {
this.inputLiteralBase64Binary = inputLiteralBase64Binary;
}
@LiteralDataInput(identifier=Constants.LITERAL_ANYURI)
public void setInputLiteralDateTime(URI inputLiteralAnyURI) {
this.inputLiteralAnyURI = inputLiteralAnyURI;
}
@ComplexDataInput(
identifier=Constants.COMPLEX,
binding=MockBinding.class, // Binding required for complex types!
maximumMegaBytes=16)
public void setInputComplex(MockComplexObject inputComplex) {
this.inputComplex = inputComplex;
}
// EXAMPLES FOR OUTPUTS
@LiteralDataOutput(
identifier=Constants.LITERAL_DOUBLE,
title="Sample Output Title", // identifier is used if title is not set
abstrakt="Sample Output Abstract") // defaults to null (not output)
public Double outputLiteralDouble;
@LiteralDataOutput(identifier=Constants.LITERAL_FLOAT)
public float outputLiteralFloat;
private Long outputLiteralLong;
@LiteralDataOutput(identifier=Constants.LITERAL_LONG)
public Long getOutputLiteralLong() { return outputLiteralLong; }
private int outputLiteralInt;
@LiteralDataOutput(identifier=Constants.LITERAL_INT)
public int getOutputLiteralInt() { return outputLiteralInt; }
@LiteralDataOutput(
binding=LiteralShortBinding.class, // REQUIRED, can't infer binding for type Number
identifier=Constants.LITERAL_SHORT)
public Number outputLiteralShort;
// and the rest...
private byte outputLiteralByte;
private boolean outputLiteralBoolean;
private String outputLiteralString;
private Date outputLiteralDateTime;
private byte[] outputLiteralBase64Binary;
private URI outputLiteralAnyURI;
private MockComplexObject outputComplex;
@LiteralDataOutput(identifier=Constants.LITERAL_BYTE)
public byte getOutputLiteralByte() { return outputLiteralByte; }
@LiteralDataOutput(identifier=Constants.LITERAL_BOOLEAN)
public boolean getOutputLiteralBoolean() { return outputLiteralBoolean; }
@LiteralDataOutput(identifier=Constants.LITERAL_STRING)
public String getOutputLiteralString() { return outputLiteralString; }
@LiteralDataOutput(identifier=Constants.LITERAL_DATETIME)
public Date getOutputLiteralDateTime() { return outputLiteralDateTime; }
@LiteralDataOutput(identifier=Constants.LITERAL_BASE64BINARY)
public byte[] getOutputLiteralBase64Binary() { return outputLiteralBase64Binary; }
@LiteralDataOutput(identifier=Constants.LITERAL_ANYURI)
public URI getOutputLiteralAnyURI() { return outputLiteralAnyURI; }
@ComplexDataOutput(
binding=MockBinding.class, // Binding required for complex types!
identifier=Constants.COMPLEX)
public MockComplexObject getComplex() { return outputComplex; }
@Execute
public void doStuff() {
// values already unbound by setting fields or calling methods
// just access your variables directly...
// output fields or methods will be called and bound after this method call returns
}
}