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]