/* | |
* 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) { | |
} | |
} | |
} | |
} | |
} |