From c4a6a944e93fa338c196ad5c16d5c844d4b2d09c Mon Sep 17 00:00:00 2001 From: antelder Date: Tue, 17 Mar 2009 12:05:24 +0000 Subject: Copy sca trunk to sandbox area so i can get the release plugin configuration correct without messing up the live trunk git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@755209 13f79535-47bb-0310-9956-ffa450edef68 --- .../runtime/WebImplementationProviderFactory.java | 68 +++++++++++ .../web/runtime/jsp/ReferenceTEI.java | 45 +++++++ .../web/runtime/jsp/ReferenceTag.java | 94 +++++++++++++++ .../web/runtime/utils/ContextHelper.java | 133 +++++++++++++++++++++ .../src/main/resources/META-INF/sca.tld | 49 ++++++++ ...cany.sca.provider.ImplementationProviderFactory | 19 +++ 6 files changed, 408 insertions(+) create mode 100644 sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/WebImplementationProviderFactory.java create mode 100644 sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTEI.java create mode 100644 sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTag.java create mode 100644 sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/utils/ContextHelper.java create mode 100644 sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/sca.tld create mode 100644 sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory (limited to 'sandbox/ant/sca/trunk/modules/implementation-web-runtime/src') diff --git a/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/WebImplementationProviderFactory.java b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/WebImplementationProviderFactory.java new file mode 100644 index 0000000000..663af52877 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/WebImplementationProviderFactory.java @@ -0,0 +1,68 @@ +/* + * 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.web.runtime; + +import java.util.List; + +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint; +import org.apache.tuscany.sca.implementation.web.WebImplementation; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.provider.ImplementationProviderFactory; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +public class WebImplementationProviderFactory implements ImplementationProviderFactory { + + private ServletHost servletHost; + + public WebImplementationProviderFactory(ExtensionPointRegistry extensionPoints) { + ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class); + List hosts = servletHosts.getServletHosts(); + if (!hosts.isEmpty()) { + this.servletHost = hosts.get(0); + } + } + + public ImplementationProvider createImplementationProvider(RuntimeComponent component, WebImplementation implementation) { + servletHost.setAttribute("org.apache.tuscany.sca.implementation.web.RuntimeComponent", component); + + return new ImplementationProvider() { + + public Invoker createInvoker(RuntimeComponentService arg0, Operation arg1) { + throw new UnsupportedOperationException("Components using implementation.web have no services"); + } + public void start() { + } + public void stop() { + } + public boolean supportsOneWayInvocation() { + return false; + } + }; + } + + public Class getModelType() { + return WebImplementation.class; + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTEI.java b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTEI.java new file mode 100644 index 0000000000..95d082a3b4 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTEI.java @@ -0,0 +1,45 @@ +/* + * 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.web.runtime.jsp; + +import javax.servlet.jsp.tagext.TagData; +import javax.servlet.jsp.tagext.TagExtraInfo; +import javax.servlet.jsp.tagext.VariableInfo; + +/** + * TagExtraInfo class for the SCA reference tags + * + * + * @version $Rev: 685532 $ $Date: 2008-08-13 14:03:50 +0100 (Wed, 13 Aug 2008) $ + */ +public class ReferenceTEI extends TagExtraInfo { + + @Override + public VariableInfo[] getVariableInfo(TagData data) { + VariableInfo info1 + = new VariableInfo( + data.getAttributeString("name"), + data.getAttributeString("type"), + true, + VariableInfo.AT_END); + VariableInfo[] info = { info1 } ; + return info; + } +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTag.java b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTag.java new file mode 100644 index 0000000000..a82b33fc2d --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/jsp/ReferenceTag.java @@ -0,0 +1,94 @@ +/* + * 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.web.runtime.jsp; + +import javax.servlet.ServletContext; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.PageContext; +import javax.servlet.jsp.tagext.TagSupport; + +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.oasisopen.sca.ServiceReference; + +/** + * Tag to handle SCA references + * + * + * @version $Rev: 738490 $ $Date: 2009-01-28 14:07:54 +0000 (Wed, 28 Jan 2009) $ + */ +public class ReferenceTag extends TagSupport { + private static final long serialVersionUID = 1L; + + protected String name; + protected String type; + protected Integer scope = PageContext.PAGE_SCOPE; + + @Override + public int doStartTag() throws JspException { + return SKIP_BODY; + } + + @Override + public int doEndTag() throws JspException { + + ServletContext servletContext = pageContext.getServletContext(); + RuntimeComponent component = (RuntimeComponent)servletContext.getAttribute("org.apache.tuscany.sca.implementation.web.RuntimeComponent"); + + Class typeClass; + try { + typeClass = Class.forName(type, true, Thread.currentThread().getContextClassLoader()); + } catch (ClassNotFoundException e) { + throw new JspException("Reference '" + name + "' type class not found: " + type); + } + + ServiceReference sr = component.getComponentContext().getServiceReference(typeClass, name); + if (sr == null) { + throw new JspException("Reference '" + name + "' undefined"); + } + + pageContext.setAttribute(name, sr.getService(), scope); + + return EVAL_PAGE; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getScope() { + return scope; + } + + public void setScope(Integer scope) { + this.scope = scope; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/utils/ContextHelper.java b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/utils/ContextHelper.java new file mode 100644 index 0000000000..a7c03be2ae --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/java/org/apache/tuscany/sca/implementation/web/runtime/utils/ContextHelper.java @@ -0,0 +1,133 @@ +/* + * 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.web.runtime.utils; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import javax.servlet.ServletContext; + +import org.apache.tuscany.sca.assembly.ComponentProperty; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.oasisopen.sca.ComponentContext; +import org.oasisopen.sca.ServiceReference; +import org.oasisopen.sca.ServiceRuntimeException; +import org.oasisopen.sca.annotation.ComponentName; +import org.oasisopen.sca.annotation.Context; +import org.oasisopen.sca.annotation.Property; +import org.oasisopen.sca.annotation.Reference; + +public class ContextHelper { + + public static final String COMPONENT_ATTR = "org.apache.tuscany.sca.implementation.web.RuntimeComponent"; + + public static ComponentContext getComponentContext(ServletContext sc) { + RuntimeComponent rc = (RuntimeComponent)sc.getAttribute(COMPONENT_ATTR); + return rc.getComponentContext(); + } + + public static T getReference(String name, Class type, ServletContext sc) { + ServiceReference sr = getComponentContext(sc).getServiceReference(type, name); + if (sr == null) { + throw new ServiceRuntimeException("Reference '" + name + "' undefined"); + } + return sr.getService(); + } + + public static Object getProperty(String name, ServletContext sc) { + RuntimeComponent rc = (RuntimeComponent)sc.getAttribute(COMPONENT_ATTR); + for (ComponentProperty p : rc.getProperties()) { + if (name.equals(p.getName())) { + return p.getValue(); + } + } + return null; + } + + public static void inject(Object instance, ServletContext sc) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + + Class clazz = instance.getClass(); + for (Field field : clazz.getDeclaredFields()) { + if (field.isAnnotationPresent(Reference.class)) { + Reference ref = field.getAnnotation(Reference.class); + String name = ref.name() != null && !ref.name().equals("") ? ref.name() : field.getName(); + Object value = getReference(name, field.getType(), sc); + setField(instance, field, value); + } else if (field.isAnnotationPresent(Property.class)) { + Property prop = field.getAnnotation(Property.class); + String name = prop.name() != null && !prop.name().equals("") ? prop.name() : field.getName(); + Object value = getProperty(name, sc); + setField(instance, field, value); + } else if (field.isAnnotationPresent(ComponentName.class)) { + RuntimeComponent rc = (RuntimeComponent)sc.getAttribute(COMPONENT_ATTR); + setField(instance, field, rc.getName()); + } else if (field.isAnnotationPresent(Context.class)) { + setField(instance, field, getComponentContext(sc)); + } + } + + for (Method method : clazz.getDeclaredMethods()) { + if (!method.getName().startsWith("set") || method.getParameterTypes().length != 1) { + continue; + } + String targetName = method.getName().substring(3); + Class type = method.getParameterTypes()[0]; + + if (method.isAnnotationPresent(Reference.class)) { + Reference ref = method.getAnnotation(Reference.class); + String name = ref.name() != null && !ref.name().equals("") ? ref.name() : targetName; + Object value = getReference(name, type, sc); + setMethod(instance, method, value); + } else if (method.isAnnotationPresent(Property.class)) { + Property prop = method.getAnnotation(Property.class); + String name = prop.name() != null && !prop.name().equals("") ? prop.name() : targetName; + Object value = getProperty(name, sc); + setMethod(instance, method, value); + } else if (method.isAnnotationPresent(ComponentName.class)) { + RuntimeComponent rc = (RuntimeComponent)sc.getAttribute(COMPONENT_ATTR); + setMethod(instance, method, rc.getName()); + } else if (method.isAnnotationPresent(Context.class)) { + setMethod(instance, method, getComponentContext(sc)); + } + } + } + + private static void setMethod(Object instance, Method method, Object value) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + if (method.isAccessible()) { + method.invoke(instance, new Object[] {value}); + } else { + method.setAccessible(true); + method.invoke(instance, new Object[] {value}); + method.setAccessible(false); + } + } + + private static void setField(Object instance, Field field, Object value) throws IllegalArgumentException, IllegalAccessException { + if (field.isAccessible()) { + field.set(instance, value); + } else { + field.setAccessible(true); + field.set(instance, value); + field.setAccessible(false); + } + } + +} diff --git a/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/sca.tld b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/sca.tld new file mode 100644 index 0000000000..8a9ce93204 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/sca.tld @@ -0,0 +1,49 @@ + + + + + + 1.0 + SCA-JSP + http://www.osoa.org/sca/sca_jsp.tld + A tag library for integrating sca components with jsp + + + + reference + + org.apache.tuscany.sca.implementation.web.runtime.jsp.ReferenceTag + org.apache.tuscany.sca.implementation.web.runtime.jsp.ReferenceTEI + + + name + true + false + java.lang.String + + + + type + true + false + java.lang.String + + + + scope + false + false + java.lang.Integer + + + empty + + + + diff --git a/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory new file mode 100644 index 0000000000..9b769c9b10 --- /dev/null +++ b/sandbox/ant/sca/trunk/modules/implementation-web-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory @@ -0,0 +1,19 @@ +# 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. + +# Implementation class for the implementation extension +org.apache.tuscany.sca.implementation.web.runtime.WebImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.web.WebImplementation -- cgit v1.2.3