blob: 1610a2e8ec37fcf5ec1d7c4be199e76543b15890 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.tuscany.sca.interfacedef.java.impl;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.namespace.QName;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.FactoryExtensionPoint;
import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
import org.apache.tuscany.sca.interfacedef.Operation;
import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
import org.apache.tuscany.sca.interfacedef.java.JavaOperation;
import org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceVisitor;
import org.apache.tuscany.sca.policy.Intent;
import org.apache.tuscany.sca.policy.PolicyFactory;
import org.apache.tuscany.sca.policy.PolicySet;
import org.oasisopen.sca.annotation.PolicySets;
import org.oasisopen.sca.annotation.Qualifier;
import org.oasisopen.sca.annotation.Requires;
/**
* Processes an {@link org.oasisopen.sca.annotation.Requires} annotation
*
* @version $Rev$ $Date$
*/
public class PolicyJavaInterfaceVisitor implements JavaInterfaceVisitor {
private PolicyFactory policyFactory;
public PolicyJavaInterfaceVisitor(ExtensionPointRegistry registry) {
super();
this.policyFactory = registry.getExtensionPoint(FactoryExtensionPoint.class).getFactory(PolicyFactory.class);
}
private QName getQName(String intentName) {
QName qname;
if (intentName.startsWith("{")) {
int i = intentName.indexOf('}');
if (i != -1) {
qname = new QName(intentName.substring(1, i), intentName.substring(i + 1));
} else {
qname = new QName("", intentName);
}
} else {
qname = new QName("", intentName);
}
return qname;
}
/**
* Read policy intents on the given interface or class
* @param clazz
* @param requiredIntents
*/
private void readIntentsAndPolicySets(Class<?> clazz, List<Intent> requiredIntents, List<PolicySet> policySets) {
Requires intentAnnotation = clazz.getAnnotation(Requires.class);
if (intentAnnotation != null) {
String[] intentNames = intentAnnotation.value();
if (intentNames.length != 0) {
for (String intentName : intentNames) {
// Add each intent to the list
Intent intent = policyFactory.createIntent();
intent.setName(getQName(intentName));
requiredIntents.add(intent);
}
}
}
readSpecificIntents(clazz.getAnnotations(), requiredIntents);
PolicySets policySetAnnotation = clazz.getAnnotation(PolicySets.class);
if (policySetAnnotation != null) {
String[] policySetNames = policySetAnnotation.value();
if (policySetNames.length != 0) {
for (String policySetName : policySetNames) {
// Add each intent to the list
PolicySet policySet = policyFactory.createPolicySet();
policySet.setName(getQName(policySetName));
policySets.add(policySet);
}
}
}
}
private void readIntents(Requires intentAnnotation, List<Intent> requiredIntents) {
//Requires intentAnnotation = method.getAnnotation(Requires.class);
if (intentAnnotation != null) {
String[] intentNames = intentAnnotation.value();
if (intentNames.length != 0) {
//Operation operation = assemblyFactory.createOperation();
//operation.setName(method.getName());
//operation.setUnresolved(true);
for (String intentName : intentNames) {
// Add each intent to the list, associated with the
// operation corresponding to the annotated method
Intent intent = policyFactory.createIntent();
intent.setName(getQName(intentName));
//intent.getOperations().add(operation);
requiredIntents.add(intent);
}
}
}
}
private void readPolicySets(PolicySets policySetAnnotation, List<PolicySet> policySets) {
if (policySetAnnotation != null) {
String[] policySetNames = policySetAnnotation.value();
if (policySetNames.length != 0) {
//Operation operation = assemblyFactory.createOperation();
//operation.setName(method.getName());
//operation.setUnresolved(true);
for (String policySetName : policySetNames) {
// Add each intent to the list, associated with the
// operation corresponding to the annotated method
PolicySet policySet = policyFactory.createPolicySet();
policySet.setName(getQName(policySetName));
//intent.getOperations().add(operation);
policySets.add(policySet);
}
}
}
}
public void visitInterface(JavaInterface javaInterface) throws InvalidInterfaceException {
if (javaInterface.getJavaClass() != null) {
readIntentsAndPolicySets(javaInterface.getJavaClass(), javaInterface.getRequiredIntents(), javaInterface
.getPolicySets());
// Read intents on the service interface methods
List<Operation> operations = javaInterface.getOperations();
for (Operation op : operations) {
JavaOperation operation = (JavaOperation)op;
Method method = operation.getJavaMethod();
readIntents(method.getAnnotation(Requires.class), op.getRequiredIntents());
readSpecificIntents(method.getAnnotations(), op.getRequiredIntents());
readPolicySets(method.getAnnotation(PolicySets.class), op.getPolicySets());
}
}
}
private void readSpecificIntents(Annotation[] annotations, List<Intent> requiredIntents) {
for (Annotation a : annotations) {
org.oasisopen.sca.annotation.Intent intentAnnotation =
a.annotationType().getAnnotation(org.oasisopen.sca.annotation.Intent.class);
if (intentAnnotation == null) {
continue;
}
QName qname = null;
String value = intentAnnotation.value();
if (!value.equals("")) {
qname = getQName(value);
} else {
qname = new QName(intentAnnotation.targetNamespace(), intentAnnotation.localPart());
}
Set<String> qualifiers = new HashSet<String>();
for(Method m: a.annotationType().getMethods()) {
Qualifier qualifier = m.getAnnotation(Qualifier.class);
if (qualifier != null && m.getReturnType() == String[].class) {
try {
qualifiers.addAll(Arrays.asList((String[]) m.invoke(a)));
} catch (Throwable e) {
e.printStackTrace();
}
}
}
qualifiers.remove("");
if (qualifiers.isEmpty()) {
Intent intent = policyFactory.createIntent();
intent.setUnresolved(true);
intent.setName(qname);
requiredIntents.add(intent);
} else {
for (String q : qualifiers) {
Intent intent = policyFactory.createIntent();
intent.setUnresolved(true);
qname = new QName(qname.getNamespaceURI(), qname.getLocalPart() + "." + q);
intent.setName(qname);
requiredIntents.add(intent);
}
}
}
}
}