Package org.apache.tuscany.sca.tomcat

Source Code of org.apache.tuscany.sca.tomcat.TuscanyHostConfig

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

Related Classes of org.apache.tuscany.sca.tomcat.TuscanyHostConfig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.