//========================================================================
//$Id: AndroidWebAppDeployer.java 391 2011-02-08 01:06:04Z janb.webtide $
//Copyright 2008 Mort Bay Consulting Pty. Ltd.
//------------------------------------------------------------------------
//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 cn.ccsu.deployer;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HandlerContainer;
import org.eclipse.jetty.deploy.ContextDeployer;
import org.eclipse.jetty.deploy.WebAppDeployer;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.AttributesMap;
import org.eclipse.jetty.util.URIUtil;
/**
* Web Application Deployer.
*
* The class searches a directory for and deploys standard web application. At
* startup, the directory specified by {@link #setWebAppDir(String)} is searched
* for subdirectories (excluding hidden and CVS) or files ending with ".zip" or
* "*.war". For each webapp discovered is passed to a new instance of
* {@link WebAppContext} (or a subclass specified by {@link #getContexts()}.
* {@link ContextHandlerCollection#getContextClass()}
*
* This deployer does not do hot deployment or undeployment. Nor does it support
* per webapplication configuration. For these features see
* {@link ContextDeployer}.
*
* @see {@link ContextDeployer}
*/
public class AndroidWebAppDeployer extends WebAppDeployer {
private List<? super ServletContextHandler> _deployed;
private AttributesMap _attributes = new AttributesMap();
/* ------------------------------------------------------------ */
/**
* @throws Exception
*/
@Override
public void doStart() throws Exception {
_deployed = new ArrayList<ServletContextHandler>();
scan();
}
@Override
public void doStop() throws Exception {
for (int i = _deployed.size(); i-- > 0;) {
ContextHandler wac = (ContextHandler) _deployed.get(i);
wac.stop();// TODO Multi exception
}
}
public Object getAttribute(String name) {
return _attributes.getAttribute(name);
}
/* ------------------------------------------------------------ */
/**
* Scan for webapplications.
*
* @throws Exception
*/
@Override
public void scan() throws Exception {
if (getContexts() == null) {
throw new IllegalArgumentException("No HandlerContainer");
}
Resource r = Resource.newResource(getWebAppDir());
if (!r.exists()) {
throw new IllegalArgumentException("No such webapps resource " + r);
}
if (!r.isDirectory()) {
throw new IllegalArgumentException("Not directory webapps resource " + r);
}
String[] files = r.list();
files: for (int f = 0; (files != null) && (f < files.length); f++) {
String context = files[f];
if (context.equalsIgnoreCase("CVS/") || context.equalsIgnoreCase("CVS") || context.startsWith(".")) {
continue;
}
Resource app = r.addPath(r.encode(context));
if (context.toLowerCase().endsWith(".war") || context.toLowerCase().endsWith(".jar")) {
context = context.substring(0, context.length() - 4);
Resource unpacked = r.addPath(context);
if ((unpacked != null) && unpacked.exists() && unpacked.isDirectory()) {
Log.debug(context + " already exists.");
continue;
}
} else if (!app.isDirectory()) {
Log.debug(app + " Not directory");
continue;
}
if (context.equalsIgnoreCase("root") || context.equalsIgnoreCase("root/")) {
context = URIUtil.SLASH;
} else {
context = "/" + context;
}
if (context.endsWith("/") && (context.length() > 0)) {
context = context.substring(0, context.length() - 1);
}
// Check the context path has not already been added or the webapp
// itself is not already deployed
if (!getAllowDuplicates()) {
Handler[] installed = getContexts().getChildHandlersByClass(ContextHandler.class);
for (int i = 0; i < installed.length; i++) {
ContextHandler c = (ContextHandler) installed[i];
if (context.equals(c.getContextPath())) {
if (Log.isDebugEnabled()) {
Log.debug(context + " Context were equal; duplicate!");
}
continue files;
}
String path;
if (c instanceof WebAppContext) {
path = Resource.newResource(((WebAppContext) c).getWar()).getFile().getAbsolutePath();
} else {
path = c.getBaseResource().getFile().getAbsolutePath();
}
if ((path != null) && path.equals(app.getFile().getAbsolutePath())) {
if (Log.isDebugEnabled()) {
Log.debug(path + " Paths were equal; duplicate!");
}
continue files;
}
}
}
// create a webapp
WebAppContext wah = null;
HandlerCollection contexts = getContexts();
if ((contexts instanceof ContextHandlerCollection)
&& WebAppContext.class.isAssignableFrom(((ContextHandlerCollection) contexts).getContextClass())) {
try {
wah = (WebAppContext) ((ContextHandlerCollection) contexts).getContextClass().newInstance();
} catch (Exception e) {
throw new Error(e);
}
} else {
wah = new WebAppContext();
}
// configure it
wah.setContextPath(context);
if (getConfigurationClasses() != null) {
wah.setConfigurationClasses(getConfigurationClasses());
}
if (getDefaultsDescriptor() != null) {
wah.setDefaultsDescriptor(getDefaultsDescriptor());
}
wah.setExtractWAR(isExtract());
wah.setWar(app.toString());
wah.setParentLoaderPriority(isParentLoaderPriority());
Enumeration<?> names = _attributes.getAttributeNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
wah.setAttribute(name, _attributes.getAttribute(name));
}
// add it
Log.debug("AndroidWebAppDeployer: prepared " + app.toString());
contexts.addHandler(wah);
_deployed.add(wah);
//jetty-7.3.0 onwards need to start explicitly due to different startup time ordering
wah.start();
}
}
public void setAttribute(String name, Object value) {
_attributes.setAttribute(name, value);
}
}