blob: e92d7a0bf6aa926817ee3e140939d07a5b0ca7eb [file] [log] [blame]
/*
* 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.tomcat;
import java.io.File;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.catalina.Context;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.startup.HostConfig;
/**
* A Tuscany customized HostConfig that adds support for SCA contributions
* to be deployed along with the usual .war files.
*/
public class TuscanyHostConfig extends HostConfig {
protected File scaBase = null;
@Override
protected void deployApps() {
File appBase = appBase();
File configBase = configBase();
// Deploy XML descriptors from configBase
deployDescriptors(configBase, configBase.list());
// Deploy WARs, and loop if additional descriptors are found
deployWARs(appBase, appBase.list());
// TUSCANY: Deploy any SCA contibutions
deploySCAContributions(appBase, appBase.list());
// Deploy expanded folders
deployDirectories(appBase, appBase.list());
}
protected void deploySCAContributions(File appBase, String[] files) {
if (files == null)
return;
for (int i = 0; i < files.length; i++) {
File scafile = new File(appBase, files[i]);
if (scafile.isFile() && isSCAContribution(scafile)) {
// Calculate the context path and make sure it is unique
String contextPath = "/" + files[i].replace('#','/');
int period = contextPath.lastIndexOf(".");
if (period >= 0)
contextPath = contextPath.substring(0, period);
if (isServiced(contextPath))
continue;
String file = files[i];
deploySCAContribution(contextPath, scafile, file);
}
}
}
protected String tuscanyContextClass = "org.apache.tuscany.sca.tomcat.TuscanyContextConfig";
protected void deploySCAContribution(String contextPath, File dir, String file) {
if (deploymentExists(contextPath))
return;
DeployedApplication deployedApp = new DeployedApplication(contextPath);
// Deploy the application in this WAR file
if(log.isInfoEnabled())
log.info("Deploying SCA contibution: " + file);
// Populate redeploy resources with the WAR file
deployedApp.redeployResources.put(dir.getAbsolutePath(), new Long(dir.lastModified()));
try {
Context context = (Context) Class.forName(contextClass).newInstance();
if (context instanceof Lifecycle) {
// Tuscany: change to use the Tuscany ContextConfig class
Class clazz = Class.forName(tuscanyContextClass);
LifecycleListener listener =
(LifecycleListener) clazz.newInstance();
((Lifecycle) context).addLifecycleListener(listener);
}
context.setPath(contextPath);
context.setDocBase(file);
host.addChild(context);
// If we're unpacking WARs, the docBase will be mutated after
// starting the context
if (unpackWARs && (context.getDocBase() != null)) {
String name = null;
String path = context.getPath();
if (path.equals("")) {
name = "ROOT";
} else {
if (path.startsWith("/")) {
name = path.substring(1);
} else {
name = path;
}
}
name = name.replace('/', '#');
File docBase = new File(name);
if (!docBase.isAbsolute()) {
docBase = new File(appBase(), name);
}
deployedApp.redeployResources.put(docBase.getAbsolutePath(),
new Long(docBase.lastModified()));
addWatchedResources(deployedApp, docBase.getAbsolutePath(), context);
} else {
addWatchedResources(deployedApp, null, context);
}
} catch (Throwable t) {
log.error(sm.getString("hostConfig.deployJar.error", file), t);
}
deployed.put(contextPath, deployedApp);
}
protected boolean isSCAContribution(File file) {
ZipFile zip = null;
ZipEntry entry = null;
try {
try {
zip = new ZipFile(file);
entry = zip.getEntry("META-INF/sca-contribution.xml");
} catch (Exception e) {
}
return (entry != null);
} finally {
if (zip != null) {
try {
zip.close();
} catch (Throwable t) {
}
}
}
}
}