Java tutorial
/* * Copyright 2005-2011 WSO2, Inc. (http://wso2.com) * * 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 org.jaggeryjs.jaggery.app.mgt; import org.apache.axis2.context.ConfigurationContext; import org.apache.catalina.*; import org.apache.catalina.core.StandardContext; import org.apache.catalina.deploy.*; import org.apache.catalina.startup.Tomcat; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jaggeryjs.hostobjects.log.LogHostObject; import org.jaggeryjs.jaggery.core.JaggeryCoreConstants; import org.jaggeryjs.jaggery.core.ScriptReader; import org.jaggeryjs.jaggery.core.manager.CommonManager; import org.jaggeryjs.jaggery.core.manager.JaggerySecurityDomain; import org.jaggeryjs.jaggery.core.manager.WebAppManager; import org.jaggeryjs.scriptengine.cache.ScriptCachingContext; import org.jaggeryjs.scriptengine.engine.JaggeryContext; import org.jaggeryjs.scriptengine.engine.RhinoEngine; import org.jaggeryjs.scriptengine.exceptions.ScriptException; import org.jaggeryjs.scriptengine.util.HostObjectUtil; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; import org.mozilla.javascript.ScriptableObject; import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.CarbonException; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.core.session.CarbonTomcatClusterableSessionManager; import org.wso2.carbon.webapp.mgt.*; import org.wso2.carbon.utils.FileManipulator; import org.wso2.carbon.utils.deployment.GhostDeployerUtils; import org.wso2.carbon.webapp.mgt.utils.WebAppUtils; import javax.servlet.ServletContext; import java.io.*; import java.util.*; //import org.wso2.carbon.context.ApplicationContext; //import org.wso2.carbon.tomcat.ext.utils.URLMappingHolder; /** * This deployer is responsible for deploying/undeploying/updating those Jaggery apps. */ public class TomcatJaggeryWebappsDeployer extends TomcatGenericWebappsDeployer { private static Log log = LogFactory.getLog(TomcatJaggeryWebappsDeployer.class); /** * Constructor * * @param webContextPrefix The Web context prefix * @param tenantId The tenant ID of the tenant to whom this deployer belongs to * @param tenantDomain The tenant domain of the tenant to whom this deployer belongs to * @param webApplicationsHolderMap JaggeryApplicationsHolder */ public TomcatJaggeryWebappsDeployer(String webContextPrefix, int tenantId, String tenantDomain, Map<String, WebApplicationsHolder> webApplicationsHolderMap, ConfigurationContext configurationContext) { super(webContextPrefix, tenantId, tenantDomain, webApplicationsHolderMap, configurationContext); } /** * Deploy webapps * * @param webappFile The webapp file to be deployed * @param webContextParams context-params for this webapp * @param applicationEventListeners Application event listeners * @throws CarbonException If a deployment error occurs */ public void deploy(File webappFile, List<WebContextParameter> webContextParams, List<Object> applicationEventListeners) throws CarbonException { try { PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId); PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain); long lastModifiedTime = webappFile.lastModified(); long configLastModified = 0; if (JaggeryDeploymentUtil.getConfig(webappFile) != null) { configLastModified = JaggeryDeploymentUtil.getConfig(webappFile).lastModified(); } JaggeryApplication deployedWebapp = (JaggeryApplication) (WebAppUtils .getWebappHolder(webappFile.getAbsolutePath(), configurationContext)).getStartedWebapps() .get(webappFile.getName()); JaggeryApplication undeployedWebapp = (JaggeryApplication) (WebAppUtils .getWebappHolder(webappFile.getAbsolutePath(), configurationContext)).getStoppedWebapps() .get(webappFile.getName()); JaggeryApplication faultyWebapp = (JaggeryApplication) (WebAppUtils .getWebappHolder(webappFile.getAbsolutePath(), configurationContext)).getFaultyWebapps() .get(webappFile.getName()); if (deployedWebapp == null && faultyWebapp == null && undeployedWebapp == null) { handleHotDeployment(webappFile, webContextParams, applicationEventListeners); } else if (deployedWebapp != null && deployedWebapp.getLastModifiedTime() != lastModifiedTime && (configLastModified != 0 && deployedWebapp.getConfigDirLastModifiedTime() != configLastModified)) { undeploy(webappFile); handleHotDeployment(webappFile, webContextParams, applicationEventListeners); } else if (faultyWebapp != null && faultyWebapp.getLastModifiedTime() != lastModifiedTime && (configLastModified != 0 && faultyWebapp.getConfigDirLastModifiedTime() != configLastModified)) { handleHotDeployment(webappFile, webContextParams, applicationEventListeners); } } catch (Throwable t) { log.error("Error while Tomact jaggery web apps Deployment ", t); } } public void undeploy(File webappFile) throws CarbonException { //TODO : handle undeployment super.undeploy(webappFile); } /** * Handle the deployment of a an archive Jaggery app. i.e., a WAR * * @param webapp The WAR Jaggery app file * @param webContextParams ServletContext params for this webapp * @param applicationEventListeners Application event listeners * @throws CarbonException If a deployment error occurs */ protected void handleZipWebappDeployment(File webapp, List<WebContextParameter> webContextParams, List<Object> applicationEventListeners) throws CarbonException { synchronized (this) { String appPath = webapp.getAbsolutePath().substring(0, webapp.getAbsolutePath().indexOf(".zip")); try { JaggeryDeploymentUtil.unZip(new FileInputStream(webapp), appPath); if (!webapp.delete()) { throw new CarbonException(appPath + "could not be deleted"); } } catch (FileNotFoundException e) { throw new CarbonException(e); } File unzippedWebapp = new File(appPath); handleExplodedWebappDeployment(unzippedWebapp, webContextParams, applicationEventListeners); } } private void registerApplicationEventListeners(List<Object> applicationEventListeners, Context context) { Object[] originalEventListeners = context.getApplicationEventListeners(); Object[] newEventListeners = new Object[originalEventListeners.length + applicationEventListeners.size()]; if (originalEventListeners.length != 0) { System.arraycopy(originalEventListeners, 0, newEventListeners, 0, originalEventListeners.length); int i = originalEventListeners.length; for (Object eventListener : applicationEventListeners) { newEventListeners[i++] = eventListener; } } else { newEventListeners = applicationEventListeners.toArray(new Object[applicationEventListeners.size()]); } context.setApplicationEventListeners(newEventListeners); } /** * Deployment procedure of Jaggery apps * * @param webappFile The Jaggery app file to be deployed * @param contextStr jaggery app context string * @param webContextParams context-params for this Jaggery app * @param applicationEventListeners Application event listeners * @throws CarbonException If a deployment error occurs */ protected void handleWebappDeployment(File webappFile, String contextStr, List<WebContextParameter> webContextParams, List<Object> applicationEventListeners) throws CarbonException { String filename = webappFile.getName(); ArrayList<Object> listeners = new ArrayList<Object>(1); // listeners.add(new CarbonServletRequestListener()); SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setAuthConstraint(true); SecurityCollection securityCollection = new SecurityCollection(); securityCollection.setName("ConfigDir"); securityCollection.setDescription("Jaggery Configuration Dir"); securityCollection.addPattern("/" + JaggeryCoreConstants.JAGGERY_CONF_FILE); securityConstraint.addCollection(securityCollection); WebApplicationsHolder webApplicationsHolder = WebAppUtils.getWebappHolder(webappFile.getAbsolutePath(), configurationContext); try { JSONObject jaggeryConfigObj = readJaggeryConfig(webappFile); Tomcat tomcat = DataHolder.getCarbonTomcatService().getTomcat(); Context context = DataHolder.getCarbonTomcatService().addWebApp(contextStr, webappFile.getAbsolutePath(), new JaggeryConfListener(jaggeryConfigObj, securityConstraint)); //deploying web app for url mapping inside virtual host if (DataHolder.getHotUpdateService() != null) { List<String> hostNames = DataHolder.getHotUpdateService().getMappigsPerWebapp(contextStr); for (String hostName : hostNames) { Host host = DataHolder.getHotUpdateService().addHost(hostName); /* ApplicationContext.getCurrentApplicationContext().putUrlMappingForApplication(hostName, contextStr); */ Context contextForHost = DataHolder.getCarbonTomcatService().addWebApp(host, "/", webappFile.getAbsolutePath(), new JaggeryConfListener(jaggeryConfigObj, securityConstraint)); log.info("Deployed JaggeryApp on host: " + contextForHost); } } if (isDistributable(context, jaggeryConfigObj)) { //Clusterable manager implementation as DeltaManager context.setDistributable(true); CarbonTomcatClusterableSessionManager sessionManager = new CarbonTomcatClusterableSessionManager( tenantId); context.setManager(sessionManager); Object alreadyinsertedSMMap = configurationContext .getProperty(CarbonConstants.TOMCAT_SESSION_MANAGER_MAP); if (alreadyinsertedSMMap != null) { ((Map<String, CarbonTomcatClusterableSessionManager>) alreadyinsertedSMMap) .put(context.getName(), sessionManager); } else { sessionManagerMap.put(context.getName(), sessionManager); configurationContext.setProperty(CarbonConstants.TOMCAT_SESSION_MANAGER_MAP, sessionManagerMap); } } else { context.setManager(new CarbonTomcatSessionManager(tenantId)); } context.setReloadable(true); JaggeryApplication webapp = new JaggeryApplication(this, context, webappFile); webapp.setServletContextParameters(webContextParams); webapp.setState("Started"); webApplicationsHolder.getStartedWebapps().put(filename, webapp); webApplicationsHolder.getFaultyWebapps().remove(filename); registerApplicationEventListeners(applicationEventListeners, context); log.info("Deployed webapp: " + webapp); } catch (Throwable e) { //catching a Throwable here to avoid web-apps crashing the server during startup StandardContext context = new StandardContext(); context.setName(webappFile.getName()); context.addParameter(WebappsConstants.FAULTY_WEBAPP, "true"); JaggeryApplication webapp = new JaggeryApplication(this, context, webappFile); webapp.setProperty(WebappsConstants.WEBAPP_FILTER, JaggeryConstants.JAGGERY_WEBAPP_FILTER_PROP); String msg = "Error while deploying webapp: " + webapp; log.error(msg, e); webapp.setFaultReason(new Exception(msg, e)); webApplicationsHolder.getFaultyWebapps().put(filename, webapp); webApplicationsHolder.getStartedWebapps().remove(filename); throw new CarbonException(msg, e); } } private static class JaggeryConfListener implements LifecycleListener { private JSONObject jaggeryConfig; private SecurityConstraint securityConstraint; private JaggeryConfListener(JSONObject jaggeryConfig, SecurityConstraint securityConstraint) { this.jaggeryConfig = jaggeryConfig; this.securityConstraint = securityConstraint; } public void lifecycleEvent(LifecycleEvent event) { if (Lifecycle.BEFORE_START_EVENT.equals(event.getType())) { initJaggeryappDefaults((Context) event.getLifecycle(), this.jaggeryConfig, this.securityConstraint); return; } if (Lifecycle.START_EVENT.equals(event.getType())) { Context context = (Context) event.getLifecycle(); try { WebAppManager.getEngine().enterContext(); WebAppManager.deploy(context); setDisplayName(context, jaggeryConfig); if (jaggeryConfig != null) { addSessionCreatedListners(context, (JSONArray) jaggeryConfig .get(JaggeryCoreConstants.JaggeryConfigParams.SESSION_CREATED_LISTENER_SCRIPTS)); addSessionDestroyedListners(context, (JSONArray) jaggeryConfig .get(JaggeryCoreConstants.JaggeryConfigParams.SESSION_DESTROYED_LISTENER_SCRIPTS)); executeScripts(context, (JSONArray) jaggeryConfig .get(JaggeryCoreConstants.JaggeryConfigParams.INIT_SCRIPTS)); addUrlMappings(context, jaggeryConfig); } } catch (ScriptException e) { log.error(e.getMessage(), e); try { context.destroy(); } catch (LifecycleException e1) { log.error(e1.getMessage(), e1); } } finally { RhinoEngine.exitContext(); } return; } if (Lifecycle.STOP_EVENT.equals(event.getType())) { Context context = (Context) event.getLifecycle(); try { WebAppManager.getEngine().enterContext(); WebAppManager.undeploy(context); if (jaggeryConfig != null) { executeScripts(context, (JSONArray) jaggeryConfig .get(JaggeryCoreConstants.JaggeryConfigParams.DESTROY_SCRIPTS)); } } catch (ScriptException e) { log.error(e.getMessage(), e); } finally { RhinoEngine.exitContext(); } return; } } } private static void initJaggeryappDefaults(Context ctx, JSONObject jaggeryConfig, SecurityConstraint securityConstraint) { Tomcat.addServlet(ctx, JaggeryCoreConstants.JAGGERY_SERVLET_NAME, JaggeryCoreConstants.JAGGERY_SERVLET_CLASS); Tomcat.addServlet(ctx, JaggeryCoreConstants.JAGGERY_WEBSOCKET_SERVLET_NAME, JaggeryCoreConstants.JAGGERY_WEBSOCKET_SERVLET_CLASS); FilterDef filterDef = new FilterDef(); filterDef.setFilterName(JaggeryCoreConstants.JAGGERY_FILTER_NAME); filterDef.setFilterClass(JaggeryCoreConstants.JAGGERY_FILTER_CLASS); ctx.addFilterDef(filterDef); FilterMap filter1mapping = new FilterMap(); filter1mapping.setFilterName(JaggeryCoreConstants.JAGGERY_FILTER_NAME); filter1mapping.addURLPattern(JaggeryCoreConstants.JAGGERY_URL_PATTERN); ctx.addFilterMap(filter1mapping); ctx.addApplicationListener(JaggeryCoreConstants.JAGGERY_APPLICATION_SESSION_LISTENER); ctx.addConstraint(securityConstraint); addWelcomeFiles(ctx, jaggeryConfig); //jaggery conf params if null conf is not available if (jaggeryConfig != null) { setDisplayName(ctx, jaggeryConfig); addErrorPages(ctx, jaggeryConfig); addSecurityConstraints(ctx, jaggeryConfig); setLoginConfig(ctx, jaggeryConfig); addSecurityRoles(ctx, jaggeryConfig); // addUrlMappings(ctx, jaggeryConfig); addParameters(ctx, jaggeryConfig); addLogLevel(ctx, jaggeryConfig); } } private JSONObject readJaggeryConfig(File f) throws IOException { File confFile = new File(f.getAbsolutePath() + File.separator + JaggeryCoreConstants.JAGGERY_CONF_FILE); if (!confFile.exists()) { return null; } String jsonString = ""; if (!confFile.isDirectory()) { FileInputStream fis = new FileInputStream(confFile); StringWriter writer = new StringWriter(); IOUtils.copy(fis, writer, null); jsonString = writer.toString(); } return (JSONObject) JSONValue.parse(jsonString); } private static void addSessionCreatedListners(Context context, JSONArray arr) { if (arr != null) { try { JaggeryContext sharedContext = WebAppManager.sharedJaggeryContext(context.getServletContext()); CommonManager.setJaggeryContext(sharedContext); RhinoEngine engine = sharedContext.getEngine(); org.mozilla.javascript.Context cx = engine.enterContext(); ServletContext servletContext = (ServletContext) sharedContext .getProperty(org.jaggeryjs.hostobjects.web.Constants.SERVLET_CONTEXT); List<String> jsListeners = new ArrayList<String>(); Object[] scripts = arr.toArray(); for (Object script : scripts) { if (!(script instanceof String)) { log.error("Invalid value for initScripts/destroyScripts in jaggery.conf : " + script); continue; } String path = (String) script; path = path.startsWith("/") ? path : "/" + path; Stack<String> callstack = CommonManager.getCallstack(sharedContext); callstack.push(path); jsListeners.add(path); } servletContext.setAttribute(JaggeryCoreConstants.JS_CREATED_LISTENERS, jsListeners); } finally { if (org.mozilla.javascript.Context.getCurrentContext() != null) { RhinoEngine.exitContext(); } } } } private static void addSessionDestroyedListners(Context context, JSONArray arr) { if (arr != null) { try { JaggeryContext sharedContext = WebAppManager.sharedJaggeryContext(context.getServletContext()); CommonManager.setJaggeryContext(sharedContext); RhinoEngine engine = sharedContext.getEngine(); org.mozilla.javascript.Context cx = engine.enterContext(); ServletContext servletContext = (ServletContext) sharedContext .getProperty(org.jaggeryjs.hostobjects.web.Constants.SERVLET_CONTEXT); List<String> jsListeners = new ArrayList<String>(); Object[] scripts = arr.toArray(); for (Object script : scripts) { if (!(script instanceof String)) { log.error("Invalid value for initScripts/destroyScripts in jaggery.conf : " + script); continue; } String path = (String) script; path = path.startsWith("/") ? path : "/" + path; Stack<String> callstack = CommonManager.getCallstack(sharedContext); callstack.push(path); jsListeners.add(path); } servletContext.setAttribute(JaggeryCoreConstants.JS_DESTROYED_LISTENERS, jsListeners); } finally { if (org.mozilla.javascript.Context.getCurrentContext() != null) { RhinoEngine.exitContext(); } } } } private static void executeScripts(Context context, JSONArray arr) { if (arr != null) { try { JaggeryContext sharedContext = WebAppManager.sharedJaggeryContext(context.getServletContext()); CommonManager.setJaggeryContext(sharedContext); RhinoEngine engine = sharedContext.getEngine(); org.mozilla.javascript.Context cx = engine.enterContext(); ServletContext servletContext = (ServletContext) sharedContext .getProperty(org.jaggeryjs.hostobjects.web.Constants.SERVLET_CONTEXT); ScriptableObject sharedScope = sharedContext.getScope(); Object[] scripts = arr.toArray(); for (Object script : scripts) { if (!(script instanceof String)) { log.error("Invalid value for initScripts/destroyScripts in jaggery.conf : " + script); continue; } String path = (String) script; path = path.startsWith("/") ? path : "/" + path; Stack<String> callstack = CommonManager.getCallstack(sharedContext); callstack.push(path); String[] parts = WebAppManager.getKeys(servletContext.getContextPath(), path, path); ScriptCachingContext sctx = new ScriptCachingContext(sharedContext.getTenantId(), parts[0], parts[1], parts[2]); sctx.setSecurityDomain(new JaggerySecurityDomain(path, servletContext)); engine.exec(new ScriptReader(servletContext.getResourceAsStream(path)) { @Override protected void build() throws IOException { try { sourceReader = new StringReader(HostObjectUtil.streamToString(sourceIn)); } catch (ScriptException e) { throw new IOException(e); } } }, sharedScope, sctx); } } catch (ScriptException e) { log.error(e.getMessage(), e); } finally { if (org.mozilla.javascript.Context.getCurrentContext() != null) { RhinoEngine.exitContext(); } } } } private static void addErrorPages(Context context, JSONObject obj) { JSONObject arr = (JSONObject) obj.get(JaggeryCoreConstants.JaggeryConfigParams.ERROR_PAGES); if (arr != null) { for (Object keys : arr.keySet()) { ErrorPage errPage = new ErrorPage(); errPage.setErrorCode((String) keys); errPage.setLocation((String) arr.get(keys)); context.addErrorPage(errPage); } } } private static void setLoginConfig(Context context, JSONObject obj) { JSONObject loginObj = (JSONObject) obj.get(JaggeryCoreConstants.JaggeryConfigParams.LOGIN_CONFIG); if (loginObj != null) { if (loginObj.get(JaggeryCoreConstants.JaggeryConfigParams.AUTH_METHOD) .equals(JaggeryCoreConstants.JaggeryConfigParams.AUTH_METHOD_FORM)) { LoginConfig loginConfig = new LoginConfig(); loginConfig.setAuthMethod(JaggeryCoreConstants.JaggeryConfigParams.AUTH_METHOD_FORM); loginConfig.setLoginPage((String) ((JSONObject) loginObj .get(JaggeryCoreConstants.JaggeryConfigParams.FORM_LOGIN_CONFIG)) .get(JaggeryCoreConstants.JaggeryConfigParams.FORM_LOGIN_PAGE)); loginConfig.setErrorPage((String) ((JSONObject) loginObj .get(JaggeryCoreConstants.JaggeryConfigParams.FORM_LOGIN_CONFIG)) .get(JaggeryCoreConstants.JaggeryConfigParams.FORM_ERROR_PAGE)); context.setLoginConfig(loginConfig); } else if (loginObj.get(JaggeryCoreConstants.JaggeryConfigParams.AUTH_METHOD) .equals(JaggeryCoreConstants.JaggeryConfigParams.AUTH_METHOD_BASIC)) { LoginConfig loginConfig = new LoginConfig(); loginConfig.setAuthMethod(JaggeryCoreConstants.JaggeryConfigParams.AUTH_METHOD_BASIC); context.setLoginConfig(loginConfig); } } } private static void addSecurityConstraints(Context context, JSONObject obj) { JSONArray arr = (JSONArray) obj.get(JaggeryCoreConstants.JaggeryConfigParams.SECURITY_CONSTRAINTS); if (arr != null) { for (Object anArr : arr) { JSONObject o = (JSONObject) anArr; SecurityConstraint securityConstraint = new SecurityConstraint(); if (((JSONObject) o.get(JaggeryCoreConstants.JaggeryConfigParams.SECURITY_CONSTRAINT)) .get(JaggeryCoreConstants.JaggeryConfigParams.WEB_RESOURCE_COLLECTION) != null) { JSONObject resCollection = (JSONObject) ((JSONObject) o .get(JaggeryCoreConstants.JaggeryConfigParams.SECURITY_CONSTRAINT)) .get(JaggeryCoreConstants.JaggeryConfigParams.WEB_RESOURCE_COLLECTION); SecurityCollection secCollection = new SecurityCollection(); secCollection.setName( (String) resCollection.get(JaggeryCoreConstants.JaggeryConfigParams.WEB_RES_NAME)); JSONArray arrPattern = (JSONArray) resCollection .get(JaggeryCoreConstants.JaggeryConfigParams.URL_PATTERNS); for (Object anArrPattern : arrPattern) { secCollection.addPattern((String) anArrPattern); } JSONArray methods = (JSONArray) resCollection .get(JaggeryCoreConstants.JaggeryConfigParams.HTTP_METHODS); if (methods != null) { for (Object method : methods) { secCollection.addMethod((String) method); } } securityConstraint.addCollection(secCollection); } if (((JSONObject) o.get(JaggeryCoreConstants.JaggeryConfigParams.SECURITY_CONSTRAINT)) .get(JaggeryCoreConstants.JaggeryConfigParams.AUTH_ROLES) != null) { JSONArray roles = (JSONArray) ((JSONObject) o .get(JaggeryCoreConstants.JaggeryConfigParams.SECURITY_CONSTRAINT)) .get(JaggeryCoreConstants.JaggeryConfigParams.AUTH_ROLES); for (Object role : roles) { securityConstraint.addAuthRole((String) role); } securityConstraint.setAuthConstraint(true); } context.addConstraint(securityConstraint); } } } private static void addSecurityRoles(Context context, JSONObject obj) { JSONArray arr = (JSONArray) obj.get(JaggeryCoreConstants.JaggeryConfigParams.SECURITY_ROLES); if (arr != null) { for (Object role : arr) { context.addSecurityRole((String) role); } } } private static void setDisplayName(Context context, JSONObject obj) { if (obj == null) { return; } String dName = (String) obj.get(JaggeryCoreConstants.JaggeryConfigParams.DISPLAY_NAME); if (dName != null) { context.setDisplayName(dName); } } private static boolean isDistributable(Context context, JSONObject obj) { if (obj != null) { if (obj.get(JaggeryCoreConstants.JaggeryConfigParams.DISTRIBUTABLE) instanceof Boolean) { Boolean isDistributable = (Boolean) obj.get(JaggeryCoreConstants.JaggeryConfigParams.DISTRIBUTABLE); if (isDistributable != null) { return isDistributable.booleanValue(); } } else if (obj.get(JaggeryCoreConstants.JaggeryConfigParams.DISTRIBUTABLE) instanceof String) { String distributable = (String) obj.get(JaggeryCoreConstants.JaggeryConfigParams.DISTRIBUTABLE); return (distributable != null && distributable.equalsIgnoreCase("true")); } } return false; } private static void addParameters(Context context, JSONObject obj) { if (obj != null) { Iterator<?> keys = obj.keySet().iterator(); while (keys.hasNext()) { String key = (String) keys.next(); if (obj.get(key) instanceof String) { context.addParameter(key, (String) obj.get(key)); } } } } private static void addWelcomeFiles(Context context, JSONObject obj) { if (obj != null) { JSONArray arr = (JSONArray) obj.get(JaggeryCoreConstants.JaggeryConfigParams.WELCOME_FILES); if (arr != null) { for (Object role : arr) { context.addWelcomeFile((String) role); } } else { context.addWelcomeFile("index.jag"); context.addWelcomeFile("index.html"); } } else { context.addWelcomeFile("index.jag"); context.addWelcomeFile("index.html"); } } private static void addUrlMappings(Context context, JSONObject obj) { Object test = context.getServletContext().getAttribute("org.jaggeryjs.serveFunction"); JSONArray arr = null; if (test != null) { // URL mapping for progamticaly arr = new JSONArray(); JSONObject js1 = new JSONObject(); JSONObject js2 = new JSONObject(); js1.put("url", "/*"); js1.put("path", "/index.jag"); arr.add(js1); } else { arr = (JSONArray) obj.get(JaggeryCoreConstants.JaggeryConfigParams.URL_MAPPINGS); } if (arr != null) { Map<String, Object> urlMappings = new HashMap<String, Object>(); for (Object mapObj : arr) { JSONObject mapping = (JSONObject) mapObj; String url = (String) mapping.get(JaggeryCoreConstants.JaggeryConfigParams.URL_MAPPINGS_URL); String path = (String) mapping.get(JaggeryCoreConstants.JaggeryConfigParams.URL_MAPPINGS_PATH); if (url != null && path != null) { path = path.startsWith("/") ? path : "/" + path; FilterMap filterMap = new FilterMap(); filterMap.setFilterName(JaggeryCoreConstants.JAGGERY_FILTER_NAME); filterMap.addURLPattern(url); context.addFilterMap(filterMap); if (url.equals("/")) { urlMappings.put("/", path); continue; } url = url.startsWith("/") ? url.substring(1) : url; List<String> parts = new ArrayList<String>(Arrays.asList(url.split("/", -1))); addMappings(urlMappings, parts, path); } else { log.error("Invalid url mapping in jaggery.conf url : " + url + ", path : " + path); } } context.getServletContext().setAttribute(CommonManager.JAGGERY_URLS_MAP, urlMappings); } } private static void addLogLevel(Context cx, JSONObject jaggeryConfig) { String level = (String) jaggeryConfig.get(JaggeryCoreConstants.JaggeryConfigParams.LOG_LEVEL); if (level == null) { return; } ServletContext context = cx.getServletContext(); context.setAttribute(LogHostObject.LOG_LEVEL, level); } private static void addMappings(Map<String, Object> map, List<String> parts, String path) { String part = parts.remove(0); if (parts.isEmpty()) { Object obj = map.get(part); if (obj != null) { log.error("Conflicting url patterns for the path : " + path); return; } if (part.startsWith("*")) { int dotIndex = part.lastIndexOf("."); if (dotIndex != -1) { if (part.length() == dotIndex + 1) { log.error("Extension cannot be found for the url pattern for " + path); return; } String ext = part.substring(dotIndex + 1); Object exts = map.get("*"); if (exts instanceof String) { log.error("* wildcard mapping is already existing for " + path); return; } Map<String, String> extsMap; if (exts == null) { extsMap = new HashMap<String, String>(); } else { extsMap = (Map<String, String>) exts; if (extsMap.get(ext) != null) { log.error("Url mapping is already existing for " + path); return; } } extsMap.put(ext, path); map.put(part, extsMap); return; } map.put(part, path); return; } map.put(part, path); return; } Map<String, Object> childMap; Object obj = map.get(part); if (obj instanceof Map) { childMap = (Map<String, Object>) obj; } else { childMap = new HashMap<String, Object>(); map.put(part, childMap); if (obj instanceof String) { childMap.put("/", obj); } } addMappings(childMap, parts, path); } }