001: /**
002: * EasyBeans
003: * Copyright (C) 2007 Bull S.A.S.
004: * Contact: easybeans@ow2.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id:WARDeployment.java 2059 2007-11-22 17:22:33Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.deployment;
025:
026: import java.util.LinkedList;
027: import java.util.List;
028:
029: import org.ow2.easybeans.deployment.annotations.analyzer.WarAnnotationDeploymentAnalyzer;
030: import org.ow2.easybeans.deployment.annotations.exceptions.AnalyzerException;
031: import org.ow2.easybeans.deployment.annotations.exceptions.ResolverException;
032: import org.ow2.easybeans.deployment.xml.WARDeploymentDesc;
033: import org.ow2.easybeans.deployment.xml.WARDeploymentDescException;
034: import org.ow2.easybeans.deployment.xml.struct.Listener;
035: import org.ow2.easybeans.deployment.xml.struct.Servlet;
036: import org.ow2.easybeans.deployment.xml.struct.Tag;
037: import org.ow2.easybeans.deployment.xml.struct.WAR;
038: import org.ow2.util.ee.deploy.api.archive.IArchive;
039: import org.ow2.util.log.Log;
040: import org.ow2.util.log.LogFactory;
041:
042: /**
043: * This class will parse given war file and extract meta-data.
044: * @author Florent Benoit
045: */
046: public class WARDeployment {
047:
048: /**
049: * Logger.
050: */
051: private static Log logger = LogFactory.getLog(WARDeployment.class);
052:
053: /**
054: * Web archive that will be analyzed.
055: */
056: private IArchive archive = null;
057:
058: /**
059: * War Deployment analyzer.
060: */
061: private WarAnnotationDeploymentAnalyzer warAnnotationDeploymentAnalyzer = null;
062:
063: /**
064: * Constructor.<br> Archive which will be used when analyzing.
065: * @param archive the archive to analyze.
066: * @param classLoader the given classloader used to read the classes.
067: */
068: public WARDeployment(final IArchive archive,
069: final ClassLoader classLoader) {
070: this .archive = archive;
071: this .warAnnotationDeploymentAnalyzer = new WarAnnotationDeploymentAnalyzer(
072: archive, classLoader);
073: }
074:
075: /**
076: * Analyzes the web application.
077: * @throws AnalyzerException if analyze of war file fails.
078: * @throws ResolverException if resolver fails.
079: * @throws WARDeploymentDescException if parsing fails.
080: */
081: @SuppressWarnings("boxing")
082: public void analyze() throws AnalyzerException,
083: WARDeploymentDescException, ResolverException {
084:
085: // Get WAR DD.
086: WAR war = WARDeploymentDesc.getWAR(archive);
087:
088: // for time debugging
089: long tAnalyzeStart = System.currentTimeMillis();
090:
091: // Build list of class to analyze
092: List<String> classNames = new LinkedList<String>();
093:
094: // Add the servlets
095: for (Servlet servlet : war.getServlets()) {
096: addClassIfNotAlreadyPresent(servlet.getClassName(),
097: classNames);
098: }
099:
100: // Add the listeners
101: for (Listener listener : war.getListeners()) {
102: addClassIfNotAlreadyPresent(
103: listener.getListenerClassName(), classNames);
104: }
105:
106: // Add the tags
107: for (Tag tag : war.getTags()) {
108: addClassIfNotAlreadyPresent(tag.getTagClassName(),
109: classNames);
110: }
111:
112: // Analyze these servlet classes.
113: warAnnotationDeploymentAnalyzer.analyze(classNames);
114:
115: // time if debugging
116: if (logger.isDebugEnabled()) {
117: long tAnalyzeStartEnd = System.currentTimeMillis();
118: if (logger.isDebugEnabled()) {
119: logger.debug("Analyze of file {0} took {1} ms.",
120: archive.getName(),
121: (tAnalyzeStartEnd - tAnalyzeStart));
122: }
123: }
124:
125: }
126:
127: /**
128: * Add a given class in the list only if it is not yet present in the list.
129: * @param className the given name of the class
130: * @param classNames the lsit of existing classes.
131: */
132: protected void addClassIfNotAlreadyPresent(final String className,
133: final List<String> classNames) {
134: // Sometimes, servlet classname is null as it is referenced as a jsp-file
135: if (className == null) {
136: return;
137: }
138: if (!classNames.contains(className)) {
139: classNames.add(className);
140: }
141: }
142:
143: /**
144: * @return annotation deployment analyzer
145: */
146: public WarAnnotationDeploymentAnalyzer getAnnotationDeploymentAnalyzer() {
147: return warAnnotationDeploymentAnalyzer;
148: }
149:
150: /**
151: * @return the archive of this deployment.
152: */
153: public IArchive getArchive() {
154: return archive;
155: }
156:
157: }
|