JavaAtomicGroundingImpl.java revision 26
2ronwalf/*
2ronwalf * Created on 13.04.2005
2ronwalf */
2ronwalfpackage impl.owls.grounding;
2ronwalf
2ronwalfimport java.lang.reflect.InvocationTargetException;
2ronwalfimport java.lang.reflect.Method;
2ronwalfimport java.net.URI;
2ronwalfimport java.net.URL;
2ronwalf
2ronwalfimport org.mindswap.exceptions.ExecutionException;
2ronwalfimport org.mindswap.owl.EntityFactory;
2ronwalfimport org.mindswap.owl.OWLDataValue;
2ronwalfimport org.mindswap.owl.OWLFactory;
2ronwalfimport org.mindswap.owl.OWLIndividual;
2ronwalfimport org.mindswap.owl.OWLIndividualList;
2ronwalfimport org.mindswap.owl.OWLKnowledgeBase;
2ronwalfimport org.mindswap.owl.OWLObject;
2ronwalfimport org.mindswap.owl.OWLValue;
23daenzeroramaimport org.mindswap.owls.grounding.AtomicGrounding;
2ronwalfimport org.mindswap.owls.grounding.JavaAtomicGrounding;
24daenzeroramaimport org.mindswap.owls.grounding.JavaParameter;
24daenzeroramaimport org.mindswap.owls.grounding.JavaVariable;
2ronwalfimport org.mindswap.owls.grounding.MessageMapList;
2ronwalfimport org.mindswap.owls.process.Input;
2ronwalfimport org.mindswap.owls.process.Output;
2ronwalfimport org.mindswap.owls.process.Parameter;
2ronwalfimport org.mindswap.owls.vocabulary.MoreGroundings;
2ronwalfimport org.mindswap.owls.vocabulary.OWLS;
2ronwalfimport org.mindswap.query.ValueMap;
3daenzeroramaimport org.mindswap.utils.ReflectionHelpers;
2ronwalfimport org.mindswap.utils.XSLTEngine;
2ronwalf
2ronwalf/**
2ronwalf * A JavaAtomicGrounding grounds an OWL-S Service to a Java method invocation. The method call
2ronwalf * is specified by its method signature in an OWL-S Ontology. The driving parts are:
2ronwalf * <ul>
2ronwalf * <li>fully qualified class name</li>
2ronwalf * <li>method name</li>
2ronwalf * <li>a map of all input parameters (at the time only primitive datatypes and their adapter classes)</li>
2ronwalf * <li>an output type (at the time only primitive datatypes and their adapter classes)</li>
2ronwalf * </ul>
2ronwalf *
2ronwalf * @author Michael Daenzer, University of Z�rich
2ronwalf *
2ronwalf * @see <a href="http://www.ifi.unizh.ch/ddis/ont/owl_s/MoreGroundings.owl">Grounding Ontology</a>
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding
2ronwalf * @see org.mindswap.owls.vocabulary.NextOnt
2ronwalf * @see impl.owls.grounding.AtomicGroundingImpl
2ronwalf */
2ronwalfpublic class JavaAtomicGroundingImpl extends AtomicGroundingImpl implements JavaAtomicGrounding {
2ronwalf OWLIndividualList inParamList = null;
2ronwalf
2ronwalf /**
2ronwalf * @param ind
2ronwalf */
2ronwalf public JavaAtomicGroundingImpl(OWLIndividual ind) {
2ronwalf super(ind);
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.JavaAtomicGrounding#setClaz(java.lang.String)
2ronwalf */
2ronwalf public void setClaz(String claz) {
2ronwalf setProperty(MoreGroundings.javaClass, claz);
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.JavaAtomicGrounding#getClaz()
2ronwalf */
2ronwalf public String getClaz() {
2ronwalf return getPropertyAsString(MoreGroundings.javaClass);
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.JavaAtomicGrounding#setMethod(java.lang.String)
2ronwalf */
2ronwalf public void setMethod(String method) {
2ronwalf setProperty(MoreGroundings.javaMethod, method);
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.JavaAtomicGrounding#getMethod()
2ronwalf */
2ronwalf public String getMethod() {
2ronwalf return getPropertyAsString(MoreGroundings.javaMethod);
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding#getDescriptionURL()
2ronwalf */
2ronwalf public URL getDescriptionURL() {
2ronwalf return null;
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding#addMessageMap(org.mindswap.owls.process.Parameter, java.lang.String, java.lang.String)
2ronwalf */
2ronwalf public void addMessageMap(Parameter owlsParameter,
2ronwalf String groundingParameter, String xsltTransformation) {
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding#getInputMap()
2ronwalf */
2ronwalf public MessageMapList getInputMap() {
2ronwalf return null;
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding#getOutputMap()
2ronwalf */
2ronwalf public MessageMapList getOutputMap() {
2ronwalf return null;
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding#invoke(org.mindswap.query.ValueMap)
2ronwalf */
2ronwalf public ValueMap invoke(ValueMap values) throws ExecutionException {
2ronwalf return invoke(values, OWLFactory.createKB());
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.AtomicGrounding#invoke(org.mindswap.query.ValueMap, org.mindswap.owl.OWLKnowledgeBase)
2ronwalf */
2ronwalf public ValueMap invoke(ValueMap values, OWLKnowledgeBase kb) throws ExecutionException {
2ronwalf Class claz = null;
2ronwalf Method method = null;
2ronwalf Class params[] = null;
2ronwalf Object paramValues[] = null;
2ronwalf ValueMap results = new ValueMap();
2ronwalf Object result = null;
2ronwalf
2ronwalf // get and check class
2ronwalf String strClaz = getClaz();
2ronwalf if ((strClaz == null) || (strClaz.equals("")))
2ronwalf throw new ExecutionException("JavaAtomicGrounding: No Java Class defined in Grounding!");
2ronwalf // get and check method
2ronwalf String strMethod = getMethod();
2ronwalf if ((strMethod == null) || (strMethod.equals("")))
2ronwalf throw new ExecutionException("JavaAtomicGrounding: No Java Method defined in Grounding!");
2ronwalf
2ronwalf // TODO dmi get types from owl paramtype
2ronwalf // prepare parameters
2ronwalf params = new Class[getInputOWLSParamsSize()];
2ronwalf for (int i = 0; i < getInputOWLSParamsSize(); i++) {
2ronwalf params[i] = getInputJavaParamAt(i);
2ronwalf }
2ronwalf
2ronwalf // get class and method reference
2ronwalf try {
2ronwalf claz = Class.forName(strClaz);
2ronwalf method = claz.getDeclaredMethod(strMethod, params);
2ronwalf } catch (ClassNotFoundException e){
2ronwalf throw new ExecutionException("JavaAtomicGrounding: Class " + strClaz + " defined in Grounding not found." );
2ronwalf } catch (NoSuchMethodException e) {
2ronwalf throw new ExecutionException("JavaAtomicGrounding: Method " + strMethod + " defined in Grounding not found." );
2ronwalf } catch (Exception e) {
2ronwalf throw new ExecutionException("JavaAtomicGrounding: " + e.getClass().toString() + " ocurred: " + e.getMessage());
2ronwalf }
2ronwalf
2ronwalf // prepare inputs
2ronwalf paramValues = new Object[getInputOWLSParamsSize()];
2ronwalf for (int i = 0; i < params.length; i++) {
2ronwalf OWLValue owlValue = values.getValue(getInputOWLSParamAt(i));
2ronwalf if (owlValue.isDataValue())
2ronwalf paramValues[i] = ReflectionHelpers.getCastedObjectFromStringValue(((OWLDataValue) owlValue).getLexicalValue(), params[i]);
2ronwalf else {
2ronwalf String xslt = getTransformationAt(i);
2ronwalf if(xslt != null) {
2ronwalf String rdf = ((OWLIndividual) owlValue).toRDF();
2ronwalf String xsltResult = XSLTEngine.transform(rdf, xslt, values);
2ronwalf paramValues[i] = xsltResult.trim();
2ronwalf }
2ronwalf else
2ronwalf paramValues[i] = ((OWLIndividual) owlValue).toString();
2ronwalf }
3daenzerorama //System.out.println( "Parameter " + i + " " + paramValues[i] );
2ronwalf }
2ronwalf
2ronwalf // invoke java method
2ronwalf try {
2ronwalf Object obj = claz.newInstance();
2ronwalf if (method.getReturnType().toString().equalsIgnoreCase("void"))
2ronwalf method.invoke(obj, paramValues);
2ronwalf else
2ronwalf result = method.invoke(obj, paramValues);
2ronwalf } catch (InvocationTargetException e) {
2ronwalf throw new ExecutionException("JavaAtomicGrounding: Error in executed method\n" + e.getTargetException().toString() + " ocurred: ");
2ronwalf } catch (Exception e) {
2ronwalf throw new ExecutionException("JavaAtomicGrounding: Error while executing method\n" + e.getClass().toString() + " ocurred: ");
2ronwalf }
2ronwalf
2ronwalf // set output
2ronwalf if (result != null) {
2ronwalf Parameter param = getOutputOWLSParam();
2ronwalf if (param == null)
3daenzerorama throw new ExecutionException("JavaAtomicGrounding: Output in Grounding not specified although method provides a return value.");
2ronwalf if(param.getParamType().isDataType())
2ronwalf results.setValue(param, EntityFactory.createDataValue(result));
2ronwalf else
2ronwalf results.setValue(param, kb.getBaseOntology().parseLiteral(result.toString()));
2ronwalf }
2ronwalf
2ronwalf return results;
2ronwalf }
2ronwalf
2ronwalf // returns the OWL-S Output Parameter
3daenzerorama private Parameter getOutputOWLSParam() {
2ronwalf OWLObject owlsParam = getProperty(MoreGroundings.javaOutput).getProperty(MoreGroundings.owlsParameter);
2ronwalf return (owlsParam == null) ? null : (Parameter) owlsParam.castTo(Parameter.class);
2ronwalf }
3daenzerorama
2ronwalf // Implements the Singleton Pattern for the private field inParamList
2ronwalf private void createInputOWLSParamList() {
2ronwalf if (inParamList == null)
2ronwalf inParamList = getProperties(MoreGroundings.hasJavaParameter);
2ronwalf }
2ronwalf
2ronwalf // returns the n-th OWL-S Input Parameter
2ronwalf private Parameter getInputOWLSParamAt(int index) {
2ronwalf createInputOWLSParamList();
2ronwalf
2ronwalf // TODO dmi throw exception
2ronwalf if (index >= getInputOWLSParamsSize())
2ronwalf return null;
2ronwalf
2ronwalf for (int i = 0; i < getInputOWLSParamsSize(); i++) {
2ronwalf OWLDataValue paramIndex = inParamList.individualAt(i).getProperty(MoreGroundings.paramIndex);
2ronwalf if (paramIndex.getLexicalValue().equals(Integer.toString(index + 1))) {
2ronwalf OWLObject owlsParam = inParamList.individualAt(i).getProperty(MoreGroundings.owlsParameter);
2ronwalf return (owlsParam == null) ? null : (Parameter) owlsParam.castTo(Parameter.class);
2ronwalf }
2ronwalf }
2ronwalf return null;
2ronwalf }
2ronwalf
2ronwalf // returns the n-th XSLT transformtion
2ronwalf private String getTransformationAt(int index) {
2ronwalf createInputOWLSParamList();
2ronwalf
2ronwalf // TODO dmi throw exception
2ronwalf if (index >= getInputOWLSParamsSize())
2ronwalf return null;
2ronwalf
2ronwalf for (int i = 0; i < getInputOWLSParamsSize(); i++) {
2ronwalf OWLDataValue paramIndex = inParamList.individualAt(i).getProperty(MoreGroundings.paramIndex);
2ronwalf if (paramIndex.getLexicalValue().equals(Integer.toString(index + 1))) {
2ronwalf OWLDataValue xslt = inParamList.individualAt(i).getProperty(OWLS.Grounding.xsltTransformationString);
2ronwalf return (xslt == null) ? null : xslt.toString();
2ronwalf }
2ronwalf }
2ronwalf return null;
2ronwalf }
2ronwalf
2ronwalf // returns the n-th Parameter of the Java Method specified in the OWL-S JavaAtomicProcessGrounding
2ronwalf private Class getInputJavaParamAt(int index) {
2ronwalf createInputOWLSParamList();
2ronwalf
2ronwalf // TODO dmi throw exception
2ronwalf if (index >= getInputOWLSParamsSize())
2ronwalf return null;
2ronwalf
2ronwalf for (int i = 0; i < getInputOWLSParamsSize(); i++) {
2ronwalf OWLDataValue paramIndex = inParamList.individualAt(i).getProperty(MoreGroundings.paramIndex);
2ronwalf if (paramIndex.getLexicalValue().equals(Integer.toString(index + 1))) {
2ronwalf String javaType = inParamList.individualAt(i).getProperty(MoreGroundings.javaType).getValue().toString();
2ronwalf return ReflectionHelpers.getClassFromString(javaType);
2ronwalf }
2ronwalf }
2ronwalf return null;
2ronwalf
2ronwalf
2ronwalf }
2ronwalf
2ronwalf // returns the number of OWL-S Input Parameters
2ronwalf private int getInputOWLSParamsSize() {
2ronwalf createInputOWLSParamList();
2ronwalf return inParamList.size();
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.JavaAtomicGrounding#setOutputVar(java.lang.String, java.lang.String, org.mindswap.owls.process.Output)
2ronwalf */
2ronwalf public void setOutputVar(String name, String type, Output owlsParameter) {
2ronwalf OWLIndividual ind = getOntology().createInstance(MoreGroundings.JavaVariable, URI.create(name));
2ronwalf ind.setProperty(MoreGroundings.javaType, type);
2ronwalf ind.setProperty(MoreGroundings.owlsParameter, owlsParameter);
2ronwalf setProperty(MoreGroundings.javaOutput, ind);
2ronwalf }
2ronwalf
2ronwalf /* (non-Javadoc)
2ronwalf * @see org.mindswap.owls.grounding.JavaAtomicGrounding#setInputVar(java.lang.String, java.lang.String, int, org.mindswap.owls.process.Input)
2ronwalf */
24daenzerorama public void setInputParameter(String name, String type, int index, Input owlsParameter) {
2ronwalf OWLIndividual ind = getOntology().createInstance(MoreGroundings.JavaParameter, URI.create(name));
2ronwalf ind.setProperty(MoreGroundings.javaType, type);
2ronwalf ind.setProperty(MoreGroundings.owlsParameter, owlsParameter);
2ronwalf ind.setProperty(MoreGroundings.paramIndex, Integer.toString(index));
2ronwalf addProperty(MoreGroundings.hasJavaParameter, ind);
2ronwalf }
23daenzerorama
23daenzerorama @Override
23daenzerorama public String getGroundingType() {
23daenzerorama return AtomicGrounding.GROUNDING_JAVA;
23daenzerorama }
23daenzerorama
23daenzerorama @Override
23daenzerorama public String toString() {
23daenzerorama return getClaz() + "." + getMethod();
23daenzerorama }
24daenzerorama
24daenzerorama private void removeAll() {
24daenzerorama if (hasProperty(MoreGroundings.javaClass))
24daenzerorama removeProperties(MoreGroundings.javaClass);
24daenzerorama if (hasProperty(MoreGroundings.javaMethod))
24daenzerorama removeProperties(MoreGroundings.javaMethod);
24daenzerorama
24daenzerorama // TODO an rdf:type property of the related input stays persistent. why????
24daenzerorama if (hasProperty(MoreGroundings.hasJavaParameter)) {
24daenzerorama OWLIndividualList indList = getProperties(MoreGroundings.hasJavaParameter);
24daenzerorama for (int i = 0; i < indList.size(); i++) {
24daenzerorama OWLIndividual ind = indList.individualAt(i);
24daenzerorama if (ind.hasProperty(MoreGroundings.javaType))
24daenzerorama ind.removeProperties(MoreGroundings.javaType);
24daenzerorama if (ind.hasProperty(MoreGroundings.owlsParameter))
24daenzerorama ind.removeProperties(MoreGroundings.owlsParameter);
24daenzerorama if (ind.hasProperty(MoreGroundings.paramIndex))
24daenzerorama ind.removeProperties(MoreGroundings.paramIndex);
24daenzerorama removeProperty(MoreGroundings.hasJavaParameter, ind);
24daenzerorama ind.delete();
24daenzerorama }
24daenzerorama }
24daenzerorama
24daenzerorama if (hasProperty(MoreGroundings.javaOutput)) {
24daenzerorama OWLIndividual ind = getProperty(MoreGroundings.javaOutput);
24daenzerorama if (ind.hasProperty(MoreGroundings.javaType))
24daenzerorama ind.removeProperties(MoreGroundings.javaType);
24daenzerorama if (ind.hasProperty(MoreGroundings.owlsParameter))
24daenzerorama ind.removeProperties(MoreGroundings.owlsParameter);
24daenzerorama removeProperties(MoreGroundings.javaOutput);
24daenzerorama ind.delete();
24daenzerorama }
24daenzerorama
24daenzerorama if (hasProperty(MoreGroundings.owlsProcess))
24daenzerorama removeProperties(MoreGroundings.owlsProcess);
24daenzerorama if (hasProperty(OWLS.Grounding.owlsProcess))
24daenzerorama removeProperties(OWLS.Grounding.owlsProcess);
24daenzerorama }
24daenzerorama
24daenzerorama @Override
24daenzerorama public void delete() {
24daenzerorama removeAll();
24daenzerorama
24daenzerorama super.delete();
24daenzerorama }
24daenzerorama
24daenzerorama public JavaParameter getInputParamter(Input input) {
24daenzerorama OWLIndividualList list = getPropertiesAs(MoreGroundings.hasJavaParameter, JavaParameter.class);
24daenzerorama for (int i = 0; i < list.size(); i++) {
25daenzerorama OWLIndividual ind = list.individualAt(i).getProperty(MoreGroundings.owlsParameter);
25daenzerorama if (ind.getURI().equals(input.getURI()))
24daenzerorama return (JavaParameter) list.individualAt(i);
24daenzerorama }
24daenzerorama return null;
24daenzerorama }
24daenzerorama
24daenzerorama public JavaVariable getOutputVariable() {
24daenzerorama return (JavaVariable) getPropertyAs(MoreGroundings.javaOutput, JavaVariable.class);
26daenzerorama }
26daenzerorama
26daenzerorama public OWLIndividualList getInputParameters() {
26daenzerorama OWLIndividualList list = getPropertiesAs(MoreGroundings.hasJavaParameter, JavaParameter.class);
26daenzerorama
26daenzerorama list.add("tempPlaceForSwap");
26daenzerorama // loop through every element
26daenzerorama for (int i = 0; i < list.size() - 2; i++) {
26daenzerorama int element = Integer.parseInt(list.individualAt(i).getProperty(
26daenzerorama MoreGroundings.paramIndex).getLexicalValue());
26daenzerorama int min = Integer.MAX_VALUE;
26daenzerorama int pos = i;
26daenzerorama // find the minimal element in the rest
26daenzerorama for (int j = i + 1; j < list.size() - 1; j++) {
26daenzerorama int temp = Integer.parseInt(list.individualAt(j).getProperty(
26daenzerorama MoreGroundings.paramIndex).getLexicalValue());
26daenzerorama if (temp < min) {
26daenzerorama min = temp;
26daenzerorama pos = j;
26daenzerorama }
26daenzerorama }
26daenzerorama // swap it to the front
26daenzerorama if (min < element) {
26daenzerorama list.set(list.size() -1, list.get(i));
26daenzerorama list.set(i, list.get(pos));
26daenzerorama list.set(pos, list.get(list.size() - 1));
26daenzerorama }
26daenzerorama }
26daenzerorama
26daenzerorama list.remove(list.size() - 1);
26daenzerorama return list;
24daenzerorama }
2ronwalf}
2ronwalf
2ronwalf