From d02579ef284a315b4c0ba0339497707d4e4798d3 Mon Sep 17 00:00:00 2001 From: rsivaram Date: Tue, 21 Oct 2008 10:26:17 +0000 Subject: Event prototype: initial model changes git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@706572 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/introspect/impl/ConsumerProcessor.java | 97 ++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 sandbox/event/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConsumerProcessor.java (limited to 'sandbox/event/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConsumerProcessor.java') diff --git a/sandbox/event/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConsumerProcessor.java b/sandbox/event/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConsumerProcessor.java new file mode 100644 index 0000000000..f2488a6fa5 --- /dev/null +++ b/sandbox/event/modules/implementation-java/src/main/java/org/apache/tuscany/sca/implementation/java/introspect/impl/ConsumerProcessor.java @@ -0,0 +1,97 @@ +/* + * 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.implementation.java.introspect.impl; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.logging.Logger; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.implementation.java.IntrospectionException; +import org.apache.tuscany.sca.implementation.java.JavaImplementation; +import org.apache.tuscany.sca.implementation.java.impl.JavaElementImpl; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; + +/** + * Processes an {@link org.osoa.sca.annotations.Service} annotation and updates + * the component type with corresponding {@link Service}s. Also processes + * related {@link org.osoa.sca.annotations.Callback} annotations. + * + * @version $$ + */ +public class ConsumerProcessor extends BaseJavaClassVisitor { + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(ConsumerProcessor.class.getName()); + + private JavaInterfaceFactory javaFactory; + + public ConsumerProcessor(AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory) { + super(assemblyFactory); + this.javaFactory = javaFactory; + } + + @Override + public void visitMethod(Method method, JavaImplementation type) throws IntrospectionException { + + org.osoa.sca.annotations.Consumer annotation = method.getAnnotation(org.osoa.sca.annotations.Consumer.class); + if (annotation == null) { + return; + } + if(Modifier.isPrivate(method.getModifiers())) { + throw new IllegalConsumerException("Illegal annotation @Consumer found on "+method, method); + } + if (method.getParameterTypes().length != 1) { + throw new IllegalConsumerException("Consumer must have one parameter", method); + } + JavaElementImpl element = new JavaElementImpl(method.getDeclaringClass()); + try { + createConsumer(type, element, annotation.name(), method.getName()); + } catch (InvalidInterfaceException e) { + throw new IntrospectionException(e); + } + } + + /** + * @param type + * @param element + * @throws IllegalConsumerException + */ + private void createConsumer(JavaImplementation type, JavaElementImpl element, String consumerName, String operationName) + throws IllegalConsumerException, InvalidInterfaceException { + + Class consumerClass = element.getType(); + + org.apache.tuscany.sca.assembly.Consumer consumer = assemblyFactory.createConsumer(); + JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract(); + consumer.setInterfaceContract(interfaceContract); + consumer.setName(consumerName); + JavaInterface consumerInterface = javaFactory.createJavaInterface(); + consumerInterface.setRemotable(true); + javaFactory.createJavaInterface(consumerInterface, consumerClass); + consumer.getInterfaceContract().setInterface(consumerInterface); + consumer.setOperationName(operationName); + + type.getConsumers().add(consumer); + } + + +} -- cgit v1.2.3