/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. 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 com.esri.gpt.sdisuite; import com.esri.gpt.framework.collection.StringAttribute; import com.esri.gpt.framework.collection.StringAttributeMap; import com.esri.gpt.framework.context.ConfigurationException; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.util.ResourcePath; import com.esri.gpt.framework.util.Val; import com.esri.gpt.framework.xml.DomUtil; import java.io.IOException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * A factory for configuring and instantiating the sdi.suite integration context. */ public class IntegrationContextFactory { /** class variables ========================================================= */ /** The configuration. */ private static StringAttributeMap CONFIG; /** The configuration file location. */ public static final String CONFIG_FILE = "gpt/config/gpt-tc.xml"; /** The Logger. */ private static Logger LOGGER = Logger.getLogger(IntegrationContextFactory.class.getName()); /** constructors ============================================================ */ /** Default constructor */ public IntegrationContextFactory() {} /** main ==================================================================== */ /** * Main unit test method. * @param args startup arguments */ public static void main(String[] args) { RequestContext rc = null; try { IntegrationContextFactory self = new IntegrationContextFactory(); System.out.println("isIntegrationEnabled="+self.isIntegrationEnabled()); IntegrationContext ictx = self.newIntegrationContext(); if (ictx == null) { System.out.println("newIntegrationContext=null"); } else { System.out.println("sdisuite.securityManagerUrl="+self.getSecurityManagerUrl()); } } catch (Throwable t) { t.printStackTrace(System.err); } finally { if (rc != null) rc.onExecutionPhaseCompleted(); } } /** properties ============================================================== */ /** * Gets the configuration. * @return the configuration (can be null) */ public StringAttributeMap getConfiguration() { StringAttributeMap config = IntegrationContextFactory.CONFIG; if (config != null) { return config; } else { configure(); return IntegrationContextFactory.CONFIG; } } /** * Gets the URL for viewing a user's license list.. * @return the URL (can be null if not integrated) */ public String getLicensesUrl() { if (this.isIntegrationEnabled()) { return Val.chkStr(this.getConfiguration().getValue("sdisuite.licensesUrl")); } return ""; } /** * Gets the URL to the security manager user interface. * @return the URL (can be null if not integrated) */ public String getSecurityManagerUrl() { if (this.isIntegrationEnabled()) { return Val.chkStr(this.getConfiguration().getValue("sdisuite.securityManagerUrl")); } return ""; } /** * Gets the URL to the service monitor user interface. * @return the URL (can be null if not integrated) */ public String getServiceMonitorUrl() { if (this.isIntegrationEnabled()) { return Val.chkStr(this.getConfiguration().getValue("sdisuite.serviceMonitorUrl")); } return ""; } /** * Gets the URL to the smart editor user interface. * @return the URL (can be null if not integrated) */ public String getSmartEditorUrl() { if (this.isIntegrationEnabled()) { return Val.chkStr(this.getConfiguration().getValue("sdisuite.smartEditorUrl")); } return ""; } /** * Gets the URL to the smart editor user interface (for opening an existing document). * @return the URL (can be null if not integrated) */ public String getSmartEditorStartWithUrl() { if (this.isIntegrationEnabled()) { return Val.chkStr(this.getConfiguration().getValue("sdisuite.smartEditorStartWithUrl")); } return ""; } /** methods ================================================================= */ /** * Builds the configuration if necessary. */ private synchronized void configure() { StringAttributeMap config = IntegrationContextFactory.CONFIG; if (config == null) { config = new StringAttributeMap(); String configFile = IntegrationContextFactory.CONFIG_FILE; URL configUrl = null; ResourcePath rp = new ResourcePath(); try { configUrl = rp.makeUrl(configFile); } catch (IOException e) { LOGGER.finer(configFile+" was not loaded."); } if (configUrl != null) { String err = "Exception while loading: "+configFile; try { LOGGER.config("Loading configuration file: "+configFile); Document dom = DomUtil.makeDomFromResourcePath(configFile,false); XPath xpath = XPathFactory.newInstance().newXPath(); NodeList nl = (NodeList)xpath.evaluate("//parameter",dom,XPathConstants.NODESET); for (int i=0; i< nl.getLength(); i++) { Node nd = nl.item(i); String key = Val.chkStr(xpath.evaluate("@key",nd)); String value = Val.chkStr(xpath.evaluate("@value",nd)); if (key.length() > 0) { config.add(new StringAttribute(key,value)); } } } catch (ParserConfigurationException e) { LOGGER.log(Level.SEVERE,err,e); } catch (SAXException e) { LOGGER.log(Level.SEVERE,err,e); } catch (IOException e) { LOGGER.log(Level.SEVERE,err,e); } catch (XPathExpressionException e) { LOGGER.log(Level.SEVERE,err,e); } } IntegrationContextFactory.CONFIG = config; } } /** * Determines if the integrating is enabled. * @return <code>true</code> if enabled */ public boolean isIntegrationEnabled() { StringAttributeMap config = this.getConfiguration(); if (config != null) { String val = Val.chkStr(config.getValue("sdisuite.enabled")); return (val.equalsIgnoreCase("true")); } return false; } /** * Instantiates a new integration context. * <p/> * This instantiated class is based upon the configuration parameter: * <br/>gpt/config/gpt-tc.xml ... //parameter/@key="sdisuite.integrationContextClass" * <p/> * The method will return null if: * <br/>gpt/config/gpt-tc.xml does not exist * <br/>//parameter/@key="sdisuite.enabled" is not set to true * <br/>//parameter/@key="sdisuite.integrationContextClass" is empty * @return the integration context (can be null if not integrated) * @throws ClassNotFoundException if the class was not found * @throws InstantiationException if the class could not be instantiated * @throws IllegalAccessException if the class could not be accessed */ public IntegrationContext newIntegrationContext() throws ClassNotFoundException, InstantiationException, IllegalAccessException { StringAttributeMap config = this.getConfiguration(); if (config == null) { return null; } else { String val = Val.chkStr(config.getValue("sdisuite.enabled")); if (!val.equalsIgnoreCase("true")) { return null; } } String key = "sdisuite.integrationContextClass"; String className =Val.chkStr(config.getValue(key)); if (className.length() == 0) { String msg = "The configured "+key+" was empty"; throw new ConfigurationException(msg); } else { Class<?> cls = Class.forName(className); Object obj = cls.newInstance(); if (obj instanceof IntegrationContext) { IntegrationContext ictx = (IntegrationContext)obj; ictx.setConfig(config); return ictx; } else { String msg = "The configured "+key+" is invalid: "+ className; throw new ConfigurationException(msg); } } } }