| /* |
| * 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); |
| } |
| } |
| } |
| } |
| |
| } |