HostConfig.deployDirectories

来源:互联网 发布:英雄无敌 mac 10.10 编辑:程序博客网 时间:2024/06/05 20:54

代码

    /**     * Deploy directories.     */    protected void deployDirectories(File appBase, String[] files) {        if (files == null)            return;        ExecutorService es = host.getStartStopExecutor();        List<Future<?>> results = new ArrayList<>();        for (int i = 0; i < files.length; i++) {            if (files[i].equalsIgnoreCase("META-INF"))                continue;            if (files[i].equalsIgnoreCase("WEB-INF"))                continue;            File dir = new File(appBase, files[i]);            if (dir.isDirectory()) {                ContextName cn = new ContextName(files[i], false);                if (isServiced(cn.getName()) || deploymentExists(cn.getName()))                    continue;                results.add(es.submit(new DeployDirectory(this, cn, dir)));            }        }        for (Future<?> result : results) {            try {                result.get();            } catch (Exception e) {                log.error(sm.getString(                        "hostConfig.deployDir.threaded.error"), e);            }        }    }
    private static class DeployDirectory implements Runnable {        private HostConfig config;        private ContextName cn;        private File dir;        public DeployDirectory(HostConfig config, ContextName cn, File dir) {            this.config = config;            this.cn = cn;            this.dir = dir;        }        @Override        public void run() {            config.deployDirectory(cn, dir);        }    }
    /**     * @param cn     * @param dir     */    protected void deployDirectory(ContextName cn, File dir) {        long startTime = 0;        // Deploy the application in this directory        if( log.isInfoEnabled() ) {            startTime = System.currentTimeMillis();            log.info(sm.getString("hostConfig.deployDir",                    dir.getAbsolutePath()));        }        Context context = null;        File xml = new File(dir, Constants.ApplicationContextXml);        File xmlCopy =                new File(host.getConfigBaseFile(), cn.getBaseName() + ".xml");        DeployedApplication deployedApp;        boolean copyThisXml = copyXML;        try {            if (deployXML && xml.exists()) {                synchronized (digesterLock) {                    try {                        context = (Context) digester.parse(xml);                    } catch (Exception e) {                        log.error(sm.getString(                                "hostConfig.deployDescriptor.error",                                xml), e);                        context = new FailedContext();                    } finally {                        if (context == null) {                            context = new FailedContext();                        }                        digester.reset();                    }                }                if (copyThisXml == false && context instanceof StandardContext) {                    // Host is using default value. Context may override it.                    copyThisXml = ((StandardContext) context).getCopyXML();                }                if (copyThisXml) {                    try (InputStream is = new FileInputStream(xml);                            OutputStream os = new FileOutputStream(xmlCopy)) {                        IOTools.flow(is, os);                        // Don't catch IOE - let the outer try/catch handle it                    }                    context.setConfigFile(xmlCopy.toURI().toURL());                } else {                    context.setConfigFile(xml.toURI().toURL());                }            } else if (!deployXML && xml.exists()) {                // Block deployment as META-INF/context.xml may contain security                // configuration necessary for a secure deployment.                log.error(sm.getString("hostConfig.deployDescriptor.blocked",                        cn.getPath(), xml, xmlCopy));                context = new FailedContext();            } else {                context = (Context) Class.forName(contextClass).newInstance();            }            Class<?> clazz = Class.forName(host.getConfigClass());            LifecycleListener listener =                (LifecycleListener) clazz.newInstance();            context.addLifecycleListener(listener);            context.setName(cn.getName());            context.setPath(cn.getPath());            context.setWebappVersion(cn.getVersion());            context.setDocBase(cn.getBaseName());            host.addChild(context);        } catch (Throwable t) {            ExceptionUtils.handleThrowable(t);            log.error(sm.getString("hostConfig.deployDir.error",                    dir.getAbsolutePath()), t);        } finally {            deployedApp = new DeployedApplication(cn.getName(),                    xml.exists() && deployXML && copyThisXml);            // Fake re-deploy resource to detect if a WAR is added at a later            // point            deployedApp.redeployResources.put(dir.getAbsolutePath() + ".war",                    Long.valueOf(0));            deployedApp.redeployResources.put(dir.getAbsolutePath(),                    Long.valueOf(dir.lastModified()));            if (deployXML && xml.exists()) {                if (copyThisXml) {                    deployedApp.redeployResources.put(                            xmlCopy.getAbsolutePath(),                            Long.valueOf(xmlCopy.lastModified()));                } else {                    deployedApp.redeployResources.put(                            xml.getAbsolutePath(),                            Long.valueOf(xml.lastModified()));                    // Fake re-deploy resource to detect if a context.xml file is                    // added at a later point                    deployedApp.redeployResources.put(                            xmlCopy.getAbsolutePath(),                            Long.valueOf(0));                }            } else {                // Fake re-deploy resource to detect if a context.xml file is                // added at a later point                deployedApp.redeployResources.put(                        xmlCopy.getAbsolutePath(),                        Long.valueOf(0));                if (!xml.exists()) {                    deployedApp.redeployResources.put(                            xml.getAbsolutePath(),                            Long.valueOf(0));                }            }            addWatchedResources(deployedApp, dir.getAbsolutePath(), context);            // Add the global redeploy resources (which are never deleted) at            // the end so they don't interfere with the deletion process            addGlobalRedeployResources(deployedApp);        }

解析

把需要部署的目录加入线程池,最终调用deployDirectory进行部署。

0 0