Author: remm Date: Thu Apr 6 16:47:05 2006 New Revision: 392123 URL: http://svn.apache.org/viewcvs?rev=392123&view=rev Log: - Add web.xml style annotations (run as, roles declarations, etc). - Note: commented out EJB and web services (similarly, the Persistence* annotations were not there). - Submitted by Fabien Carrion.
Added: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/WebAnnotationSet.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=392123&r1=392122&r2=392123&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/ContextConfig.java Thu Apr 6 16:47:05 2006 @@ -75,7 +75,7 @@ // ----------------------------------------------------- Instance Variables - /* + /** * Custom mappings of login methods to authenticators */ protected Map customAuthenticators; @@ -287,6 +287,23 @@ /** + * Process the application classes annotations, if it exists. + */ + protected void applicationAnnotationsConfig() { + + long t1=System.currentTimeMillis(); + + WebAnnotationSet.loadApplicationAnnotations(context); + + long t2=System.currentTimeMillis(); + if (context instanceof StandardContext) { + ((StandardContext) context).setStartupTime(t2-t1+ + ((StandardContext) context).getStartupTime()); + } + } + + + /** * Process the application configuration file, if it exists. */ protected void applicationWebConfig() { @@ -1032,6 +1049,9 @@ // Process the default and application web.xml files defaultWebConfig(); applicationWebConfig(); + if (!context.getIgnoreAnnotations()) { + applicationAnnotationsConfig(); + } if (ok) { validateSecurityRoles(); } Added: tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/WebAnnotationSet.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/WebAnnotationSet.java?rev=392123&view=auto ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/WebAnnotationSet.java (added) +++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/WebAnnotationSet.java Thu Apr 6 16:47:05 2006 @@ -0,0 +1,368 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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.catalina.startup; + + +import javax.annotation.Resource; +import javax.annotation.Resources; +import javax.annotation.security.DeclaresRoles; +import javax.annotation.security.RunAs; + +import org.apache.catalina.Container; +import org.apache.catalina.Context; +import org.apache.catalina.core.StandardWrapper; +import org.apache.catalina.deploy.ContextEnvironment; +import org.apache.catalina.deploy.ContextResource; +import org.apache.catalina.deploy.ContextResourceEnvRef; +import org.apache.catalina.deploy.ContextService; +import org.apache.catalina.deploy.FilterDef; +import org.apache.catalina.deploy.MessageDestinationRef; + +//import javax.ejb.EJB; +//import javax.xml.ws.WebServiceRef; + +/** + * <p><strong>AnnotationSet</strong> for processing the annotations of the web application + * classes (<code>/WEB-INF/classes</code> and <code>/WEB-INF/lib</code>).</p> + * + * @author Fabien Carrion + * @version $Revision: 304108 $ $Date: 2006-03-01 10:39:15 -0700 (Wed, 03 Mar 2006) $ + */ + +public class WebAnnotationSet { + + + // --------------------------------------------------------- Public Methods + + + /** + * Process the annotations on a context. + */ + public static void loadApplicationAnnotations(Context context) { + + loadApplicationListenerAnnotations(context); + loadApplicationFilterAnnotations(context); + loadApplicationServletAnnotations(context); + + + } + + + // -------------------------------------------------------- protected Methods + + + /** + * Process the annotations for the listeners. + */ + protected static void loadApplicationListenerAnnotations(Context context) { + String[] applicationListeners = context.findApplicationListeners(); + for (int i = 0; i < applicationListeners.length; i++) { + loadClassAnnotation(context, applicationListeners[i]); + } + } + + + /** + * Process the annotations for the filters. + */ + protected static void loadApplicationFilterAnnotations(Context context) { + FilterDef[] filterDefs = context.findFilterDefs(); + for (int i = 0; i < filterDefs.length; i++) { + loadClassAnnotation(context, (filterDefs[i]).getFilterClass()); + } + } + + + /** + * Process the annotations for the servlets. + */ + protected static void loadApplicationServletAnnotations(Context context) { + + ClassLoader classLoader = context.getLoader().getClassLoader(); + StandardWrapper wrapper = null; + Class classClass = null; + + Container[] children = context.findChildren(); + for (int i = 0; i < children.length; i++) { + if (children[i] instanceof StandardWrapper) { + + wrapper = (StandardWrapper) children[i]; + try { + classClass = classLoader.loadClass(wrapper.getServletClass()); + } catch (ClassNotFoundException e) { + // We do nothing + } catch (NoClassDefFoundError e) { + // We do nothing + } + + if (classClass == null) { + continue; + } + + loadClassAnnotation(context, wrapper.getServletClass()); + /* Process RunAs annotation which can be only on servlets. + * Ref JSR 250, equivalent to the run-as element in + * the deployment descriptor + */ + if (classClass.isAnnotationPresent(RunAs.class)) { + RunAs annotation = (RunAs) + classClass.getAnnotation(RunAs.class); + wrapper.setRunAs(annotation.value()); + } + } + } + + + } + + + /** + * Process the annotations on a context for a given className. + */ + protected static void loadClassAnnotation(Context context, String fileString) { + + ClassLoader classLoader = context.getLoader().getClassLoader(); + Class classClass = null; + + try { + classClass = classLoader.loadClass(fileString); + } catch (ClassNotFoundException e) { + // We do nothing + } catch (NoClassDefFoundError e) { + // We do nothing + } + + if (classClass == null) { + return; + } + + // Initialize the annotations + + if (classClass.isAnnotationPresent(Resource.class)) { + Resource annotation = (Resource) + classClass.getAnnotation(Resource.class); + addResource(context, annotation); + } + /* Process Resources annotation. + * Ref JSR 250 + */ + if (classClass.isAnnotationPresent(Resources.class)) { + Resources annotation = (Resources) + classClass.getAnnotation(Resources.class); + for (int i = 0; annotation.value() != null && i < annotation.value().length; i++) { + addResource(context, annotation.value()[i]); + } + } + /* Process EJB annotation. + * Ref JSR 224, equivalent to the ejb-ref or ejb-local-ref + * element in the deployment descriptor. + if (classClass.isAnnotationPresent(EJB.class)) { + EJB annotation = (EJB) + classClass.getAnnotation(EJB.class); + + if ((annotation.mappedName().length() == 0) || + annotation.mappedName().equals("Local")) { + + ContextLocalEjb ejb = new ContextLocalEjb(); + + ejb.setName(annotation.name()); + ejb.setType(annotation.beanInterface().getCanonicalName()); + ejb.setDescription(annotation.description()); + + ejb.setHome(annotation.beanName()); + + context.getNamingResources().addLocalEjb(ejb); + + } else if (annotation.mappedName().equals("Remote")) { + + ContextEjb ejb = new ContextEjb(); + + ejb.setName(annotation.name()); + ejb.setType(annotation.beanInterface().getCanonicalName()); + ejb.setDescription(annotation.description()); + + ejb.setHome(annotation.beanName()); + + context.getNamingResources().addEjb(ejb); + + } + + } + */ + /* Process WebServiceRef annotation. + * Ref JSR 224, equivalent to the service-ref element in + * the deployment descriptor. + * The service-ref registration is not implemented + if (classClass.isAnnotationPresent(WebServiceRef.class)) { + WebServiceRef annotation = (WebServiceRef) + classClass.getAnnotation(WebServiceRef.class); + + ContextService service = new ContextService(); + + service.setName(annotation.name()); + service.setWsdlfile(annotation.wsdlLocation()); + + service.setType(annotation.type().getCanonicalName()); + + if (annotation.value() == null) + service.setServiceinterface(annotation.type().getCanonicalName()); + + if (annotation.type().getCanonicalName().equals("Service")) + service.setServiceinterface(annotation.type().getCanonicalName()); + + if (annotation.value().getCanonicalName().equals("Endpoint")) + service.setServiceendpoint(annotation.type().getCanonicalName()); + + service.setPortlink(annotation.type().getCanonicalName()); + + context.getNamingResources().addService(service); + + + } + */ + /* Process DeclareRoles annotation. + * Ref JSR 250, equivalent to the security-role element in + * the deployment descriptor + */ + if (classClass.isAnnotationPresent(DeclaresRoles.class)) { + DeclaresRoles annotation = (DeclaresRoles) + classClass.getAnnotation(DeclaresRoles.class); + for (int i = 0; annotation.value() != null && i < annotation.value().length; i++) { + context.addSecurityRole(annotation.value()[i]); + } + } + + + } + + + /** + * Process a Resource annotation to set up a Resource. + * Ref JSR 250, equivalent to the resource-ref, + * message-destination-ref, env-ref, resource-env-ref + * or service-ref element in the deployment descriptor. + */ + protected static void addResource(Context context, Resource annotation) { + + if (annotation.type().getCanonicalName().equals("java.lang.String") || + annotation.type().getCanonicalName().equals("java.lang.Character") || + annotation.type().getCanonicalName().equals("java.lang.Integer") || + annotation.type().getCanonicalName().equals("java.lang.Boolean") || + annotation.type().getCanonicalName().equals("java.lang.Double") || + annotation.type().getCanonicalName().equals("java.lang.Byte") || + annotation.type().getCanonicalName().equals("java.lang.Short") || + annotation.type().getCanonicalName().equals("java.lang.Long") || + annotation.type().getCanonicalName().equals("java.lang.Float")) { + + // env-ref element + ContextEnvironment resource = new ContextEnvironment(); + + resource.setName(annotation.name()); + resource.setType(annotation.type().getCanonicalName()); + + resource.setDescription(annotation.description()); + + resource.setValue(annotation.mappedName()); + + context.getNamingResources().addEnvironment(resource); + + } else if (annotation.type().getCanonicalName().equals("javax.xml.rpc.Service")) { + + // service-ref element + ContextService service = new ContextService(); + + service.setName(annotation.name()); + service.setWsdlfile(annotation.mappedName()); + + service.setType(annotation.type().getCanonicalName()); + service.setDescription(annotation.description()); + + context.getNamingResources().addService(service); + + } else if (annotation.type().getCanonicalName().equals("javax.sql.DataSource") || + annotation.type().getCanonicalName().equals("javax.jms.ConnectionFactory") || + annotation.type().getCanonicalName() + .equals("javax.jms.QueueConnectionFactory") || + annotation.type().getCanonicalName() + .equals("javax.jms.TopicConnectionFactory") || + annotation.type().getCanonicalName().equals("javax.mail.Session") || + annotation.type().getCanonicalName().equals("java.net.URL") || + annotation.type().getCanonicalName() + .equals("javax.resource.cci.ConnectionFactory") || + annotation.type().getCanonicalName().equals("org.omg.CORBA_2_3.ORB") || + annotation.type().getCanonicalName().endsWith("ConnectionFactory")) { + + // resource-ref element + ContextResource resource = new ContextResource(); + + resource.setName(annotation.name()); + resource.setType(annotation.type().getCanonicalName()); + + if (annotation.authenticationType() + == Resource.AuthenticationType.CONTAINER) { + resource.setAuth("Container"); + } + else if (annotation.authenticationType() + == Resource.AuthenticationType.APPLICATION) { + resource.setAuth("Application"); + } + + resource.setScope(annotation.shareable() ? "Shareable" : "Unshareable"); + resource.setProperty("mappedName", annotation.mappedName()); + resource.setDescription(annotation.description()); + + context.getNamingResources().addResource(resource); + + } else if (annotation.type().getCanonicalName().equals("javax.jms.Queue") || + annotation.type().getCanonicalName().equals("javax.jms.Topic")) { + + // message-destination-ref + MessageDestinationRef resource = new MessageDestinationRef(); + + resource.setName(annotation.name()); + resource.setType(annotation.type().getCanonicalName()); + + resource.setUsage(annotation.mappedName()); + resource.setDescription(annotation.description()); + + context.getNamingResources().addMessageDestinationRef(resource); + + } else if (annotation.type().getCanonicalName() + .equals("javax.resource.cci.InteractionSpec") || + annotation.type().getCanonicalName() + .equals("javax.transaction.UserTransaction") || + true) { + + // resource-env-ref + ContextResourceEnvRef resource = new ContextResourceEnvRef(); + + resource.setName(annotation.name()); + resource.setType(annotation.type().getCanonicalName()); + + resource.setProperty("mappedName", annotation.mappedName()); + resource.setDescription(annotation.description()); + + context.getNamingResources().addResourceEnvRef(resource); + + } + + + } + + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]