Java tutorial
/** * $Id: DomainConfig.java,v 1.2 2009/01/07 11:41:27 tryggvil Exp $ * Created in 2009 by tryggvil * * Copyright (C) 2000-2009 Idega Software hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. */ package com.idega.slide.webdavservlet; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Vector; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletConfig; import org.apache.slide.authenticate.SecurityToken; import org.apache.slide.common.Domain; import org.apache.slide.common.NamespaceAccessToken; import org.apache.slide.content.Content; import org.apache.slide.security.Security; import org.apache.slide.structure.Structure; import org.apache.tools.ant.filters.ReplaceTokens; import org.apache.tools.ant.filters.util.ChainReaderHelper; import org.apache.tools.ant.types.FilterChain; import org.apache.tools.ant.util.FileUtils; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.idega.idegaweb.IWMainApplication; import com.idega.io.MemoryFileBuffer; import com.idega.io.MemoryInputStream; import com.idega.io.MemoryOutputStream; /** * <p> * This class manages the configuration and startup of the Slide instance. * e.g. manages what Domain xml config file is read to initialize Slide. * </p> * * Last modified: $Date: 2009/01/07 11:41:27 $ by $Author: tryggvil $ * * @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a> * @version $Revision: 1.2 $ */ @Scope(BeanDefinition.SCOPE_SINGLETON) @Service(DomainConfig.SPRING_BEAN_IDENTIFIER) public class DomainConfig { private static final String SLIDE_BASEPATH_PROPERTY = "slide.basepath"; public static final String SLIDE_STORE_TYPE = "slide.store.type"; public static final String SLIDE_DATA_PATH = "slide.data.path"; public static final String TYPE_TXFILE = "txfile"; public static final String TYPE_RDBMS = "rdbms"; public static final String SPRING_BEAN_IDENTIFIER = "slideDomainConfig"; public static final String STORE_FILESTORE_DYNAMIC_FILENAME = "Domain-FileStore-Dynamic.xml"; public static final String STORE_FILESTORE_FILENAME = "Domain-FileStore.xml"; public static final String STORE_RDBMS_FILENAME = "Domain-RDBMS.xml"; public static final String STORES_CLASSPATH = "com/idega/slide/properties/"; String domainConfigPath; private ServletConfig servletConfig; //Slide config members: private NamespaceAccessToken namespace; private Structure structure; private Content content; private Security security; private URL configurationURL; private boolean initialized = false; private boolean jndiLookupEnabled = true; private boolean iwAppPropertyLookupEnabled = true; //private String storeConfigClasspath=STORES_CLASSPATH+STORE_FILESTORE_DYNAMIC_NAME; private String storeType = TYPE_TXFILE; private boolean usingVariableBase = true; String basePath; //Just for testing purposes public DomainConfig() { //initializeContextVariables(); } public DomainConfig(ServletConfig config) { this.setServletConfig(config); //this.domainConfigPath=getDomainPath(config); //createDomainFile(config); //initializeContextVariables(); } public void initializeContextVariables() { if (getBasePath() == null && getSlideBasePathFromSystemProperty() != null) { this.setBasePath(getSlideBasePathFromSystemProperty()); } else { setBasePathFromFurrentFolder(); } if (isJndiLookupEnabled()) { if (getSlideBasePathFromJNDI() != null) { this.setBasePath(getSlideBasePathFromJNDI()); } } if (isIwAppPropertyLookupEnabled()) { lookupDomainSettingfromApplicationProperties(); } } private void setBasePathFromFurrentFolder() { if (getBasePath() == null) { String currentProcessPath = System.getProperty("user.dir"); setBasePath(currentProcessPath); } } public String getBasePath() { return basePath; } public void setBasePath(String basePath) { this.basePath = basePath; } public synchronized void initialize() { if (initialized) { return; } else { initializeContextVariables(); try { if (!Domain.isInitialized()) { if (initializeByStream()) { InputStream configurationInputStream = null; if (getStoreType().equals(TYPE_TXFILE)) { if (usingVariableBase) { configurationInputStream = this.getClass().getClassLoader() .getResourceAsStream(STORES_CLASSPATH + STORE_FILESTORE_DYNAMIC_FILENAME); MemoryFileBuffer memory = new MemoryFileBuffer(); MemoryOutputStream memoryOut = new MemoryOutputStream(memory); parseAndReplaceConfigInputStream(configurationInputStream, new BufferedWriter(new OutputStreamWriter(memoryOut))); //Now read from the replaced buffer configurationInputStream = new MemoryInputStream(memory); } else { configurationInputStream = this.getClass().getClassLoader() .getResourceAsStream(STORES_CLASSPATH + STORE_FILESTORE_FILENAME); } } else if (getStoreType().equals(TYPE_RDBMS)) { configurationInputStream = this.getClass().getClassLoader() .getResourceAsStream(STORES_CLASSPATH + STORE_RDBMS_FILENAME); } Domain.init(configurationInputStream); } else if (initializeByUrl()) { if (configurationURL == null) { URL defaultConfigURL = this.getClass().getClassLoader() .getResource(STORES_CLASSPATH + STORE_FILESTORE_FILENAME); configurationURL = defaultConfigURL; } Domain.init(configurationURL); } } //InputStream configStream = this.getClass().getClassLoader().getResourceAsStream("com/idega/slide/jcr/Domain.xml"); //InputStream configStream = new FileInputStream(new File("src/java/com/idega/slide/jcr/Domain.xml")); //Domain.init(configStream); namespace = Domain.accessNamespace(new SecurityToken(""), Domain.getDefaultNamespace()); structure = namespace.getStructureHelper(); content = namespace.getContentHelper(); security = namespace.getSecurityHelper(); this.initialized = true; } catch (Exception e) { initialized = false; e.printStackTrace(); } } } public void stop() { Domain.closeNamespace(this.getNamespace()); this.initialized = false; } public void reInitialize() { stop(); initialize(); } private boolean initializeByUrl() { return false; } private boolean initializeByStream() { // TODO Auto-generated method stub return true; } private static Context getEnvContext() throws NamingException { InitialContext initialContext = new InitialContext(); return (Context) initialContext.lookup("java:comp/env"); } public String getSlideBasePathFromJNDI() { try { String path = (String) getEnvContext().lookup("properties/" + SLIDE_BASEPATH_PROPERTY); return path; } catch (NamingException e) { // TODO Auto-generated catch block //e.printStackTrace(); System.err.println("Error looking up from JNDI: " + e.getMessage()); } return null; } public String getSlideBasePathFromSystemProperty() { return System.getProperty(SLIDE_BASEPATH_PROPERTY); } // public static void main(String[] args){ // // DomainConfig config = new DomainConfig(); // //config.domainConfigPath="C:\\Documents and Settings\\Tryggvi\\idega\\lucid\\org.apache.slide\\properties\\Domain-FileStore.xml"; // config.domainConfigPath="/Users/tryggvil/Documents/idega/Development/slide/org.apache.slide/properties/Domain-FileStore-Dynamic.xml"; // config.setBasePath("/Users/tryggvil/Documents/idega/Development/stores/pga-bin"); // config.parseAndReplaceConfigFile(); // // } // // private void createDomainFile(ServletConfig config) { // // //Temporary workaround to copy config file to webapp // if(config!=null){ // IWMainApplication iwma = IWMainApplication.getIWMainApplication(config.getServletContext()); // IWBundleResourceFilter.copyResourceFromJarToWebapp(iwma, this.domainConfigPath); // } // if(usingVariableBase) { // parseAndReplaceConfigFile(); // } // // } // // private void parseAndReplaceConfigFile() { // FilterChain filterChain = new FilterChain(); // // // add all the token specified in the containers configuration into the filterchain // addTokensToFilterChain(filterChain, getProperties()); // // //configureFiles(filterChain); // copyFileAndReplace(this.domainConfigPath,this.domainConfigPath+"-parsed",filterChain); // } protected void parseAndReplaceConfigInputStream(InputStream input, Writer outConfigWriter) throws IOException { FilterChain filterChain = new FilterChain(); // add all the token specified in the containers configuration into the filterchain addTokensToFilterChain(filterChain, getProperties()); //configureFiles(filterChain); replaceConfigfileStream(input, outConfigWriter, filterChain); } private Map getProperties() { Map properties = new HashMap(); properties.put(SLIDE_BASEPATH_PROPERTY, basePath); return properties; } /** * */ public void copyFileAndReplace(String source, String target, FilterChain filterChain) { try { FileUtils fileUtils = FileUtils.newFileUtils(); if (!source.equals(target)) { fileUtils.copyFile(new File(source).getAbsolutePath(), new File(target).getAbsolutePath()); } InputStream fileIS = new FileInputStream(source); FileWriter outWriter = new FileWriter(target); replaceConfigfileStream(fileIS, outWriter, filterChain); } catch (IOException e) { throw new RuntimeException( "Failed to copy source file [" + source + "] to [" + target + "] with FilterChain", e); } } private void replaceConfigfileStream(InputStream configInputStream, Writer targetOut, FilterChain filterChain) throws IOException { BufferedReader in = null; BufferedWriter out = null; try { ChainReaderHelper helper = new ChainReaderHelper(); helper.setBufferSize(8192); helper.setPrimaryReader(new BufferedReader(new InputStreamReader(configInputStream))); Vector filterChains = new Vector(); filterChains.add(filterChain); helper.setFilterChains(filterChains); in = new BufferedReader(helper.getAssembledReader()); out = new BufferedWriter(targetOut); String line; while ((line = in.readLine()) != null) { if (line.length() == 0) { out.newLine(); } else { out.write(line); out.newLine(); } } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } /** * Add a token to an existing filter chain. * * @param filterChain the filter chain to augment * @param key the token key * @param value the token value */ public void addTokenToFilterChain(FilterChain filterChain, String key, String value) { ReplaceTokens replaceToken = new ReplaceTokens(); ReplaceTokens.Token token = new ReplaceTokens.Token(); token.setKey(key); token.setValue(value); replaceToken.addConfiguredToken(token); filterChain.addReplaceTokens(replaceToken); } /** * Add the map of tokens to the filterChain. * * @param filterChain The filterchain to use * @param map The map */ public void addTokensToFilterChain(FilterChain filterChain, Map map) { Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); String value = (String) map.get(key); addTokenToFilterChain(filterChain, key, value); } } /** * <p> * Gets the path to the Domain.xml file that is used to initialize Slide * </p> * @return */ protected String getDomainPath(ServletConfig config) { String domainparam; String domainTxPath = "/idegaweb/bundles/org.apache.slide.bundle/properties/Domain-FileStore.xml"; String domainRdbmsPath = "/idegaweb/bundles/org.apache.slide.bundle/properties/Domain.xml"; IWMainApplication iwma = IWMainApplication.getIWMainApplication(config.getServletContext()); domainparam = domainTxPath; try { //First check if a written application property is set: String typeProperty = iwma.getSettings().getProperty(SLIDE_STORE_TYPE); String basePathProperty = iwma.getSettings().getProperty(SLIDE_DATA_PATH); if (basePathProperty != null) { usingVariableBase = true; this.basePath = basePathProperty; } if (typeProperty != null) { if (typeProperty.equals(TYPE_TXFILE)) { domainparam = domainTxPath; } else if (typeProperty.equals(TYPE_RDBMS)) { domainparam = domainRdbmsPath; } } else { if (basePathProperty == null) { basePathProperty = "../data"; iwma.getSettings().setProperty(SLIDE_DATA_PATH, basePathProperty); usingVariableBase = true; this.basePath = basePathProperty; } domainparam = domainTxPath; } //Register the usage for future reference if (domainparam.equals(domainTxPath)) { iwma.getSettings().setProperty(SLIDE_STORE_TYPE, TYPE_TXFILE); } else if (domainparam.equals(domainRdbmsPath)) { iwma.getSettings().setProperty(SLIDE_STORE_TYPE, TYPE_RDBMS); } //THE DEFAULT WILL NOW BE TXFILE!! //Eiki //Secondly check the database if it supports slide: // Connection conn = ConnectionBroker.getConnection(); // String datastoreType = SQLSchemaAdapter.detectDataStoreType(conn); // ConnectionBroker.freeConnection(conn); // SQLSchemaAdapter adapter = SQLSchemaAdapter.getInstance(datastoreType); // if(adapter.getSupportsSlide()){ // domainparam=domainRdbmsPath; // } } catch (Exception e) { e.printStackTrace(); } return domainparam; } /** * <p> * Gets the path to the Domain.xml file that is used to initialize Slide * </p> * @return */ protected void lookupDomainSettingfromApplicationProperties() { //String domainparam; //String domainTxPath = "/idegaweb/bundles/org.apache.slide.bundle/properties/Domain-FileStore.xml"; //String domainRdbmsPath = "/idegaweb/bundles/org.apache.slide.bundle/properties/Domain.xml"; IWMainApplication iwma = null; if (this.getServletConfig() != null) { iwma = IWMainApplication.getIWMainApplication(getServletConfig().getServletContext()); } else { iwma = IWMainApplication.getDefaultIWMainApplication(); } //domainparam=domainTxPath; try { //First check if a written application property is set: String typeProperty = iwma.getSettings().getProperty(SLIDE_STORE_TYPE); String basePathProperty = iwma.getSettings().getProperty(SLIDE_DATA_PATH); if (basePathProperty != null) { usingVariableBase = true; this.basePath = basePathProperty; } if (typeProperty != null) { if (typeProperty.equals(TYPE_TXFILE)) { //domainparam=domainTxPath; setStoreType(TYPE_TXFILE); } else if (typeProperty.equals(TYPE_RDBMS)) { //domainparam=domainRdbmsPath; setStoreType(TYPE_RDBMS); } } else { /*if(basePathProperty==null){ basePathProperty="../data"; iwma.getSettings().setProperty(SLIDE_DATA_PATH, basePathProperty); usingVariableBase=true; this.basePath=basePathProperty; }*/ //domainparam=domainTxPath; setStoreType(TYPE_TXFILE); } //Register the usage for future reference //if(domainparam.equals(domainTxPath)){ if (getStoreType().equals(TYPE_TXFILE)) { iwma.getSettings().setProperty(SLIDE_STORE_TYPE, TYPE_TXFILE); } //else if(domainparam.equals(domainRdbmsPath)){ else if (getStoreType().equals(TYPE_RDBMS)) { iwma.getSettings().setProperty(SLIDE_STORE_TYPE, TYPE_RDBMS); } //THE DEFAULT WILL NOW BE TXFILE!! //Eiki //Secondly check the database if it supports slide: // Connection conn = ConnectionBroker.getConnection(); // String datastoreType = SQLSchemaAdapter.detectDataStoreType(conn); // ConnectionBroker.freeConnection(conn); // SQLSchemaAdapter adapter = SQLSchemaAdapter.getInstance(datastoreType); // if(adapter.getSupportsSlide()){ // domainparam=domainRdbmsPath; // } } catch (Exception e) { e.printStackTrace(); } //return domainparam; } public String getConfigPath() { return this.domainConfigPath; } public NamespaceAccessToken getNamespace() { return namespace; } public void setNamespace(NamespaceAccessToken namespace) { this.namespace = namespace; } public Structure getStructure() { return structure; } public void setStructure(Structure structure) { this.structure = structure; } public Content getContent() { return content; } public void setContent(Content content) { this.content = content; } public Security getSecurity() { return security; } public void setSecurity(Security security) { this.security = security; } public void setJndiLookupEnabled(boolean jndiLookupEnabled) { this.jndiLookupEnabled = jndiLookupEnabled; } public boolean isJndiLookupEnabled() { return jndiLookupEnabled; } private void setStoreType(String storeType) { this.storeType = storeType; } private String getStoreType() { return storeType; } public void setIwAppPropertyLookupEnabled(boolean iwAppPropertyLookupEnabled) { this.iwAppPropertyLookupEnabled = iwAppPropertyLookupEnabled; } public boolean isIwAppPropertyLookupEnabled() { return iwAppPropertyLookupEnabled; } public void setServletConfig(ServletConfig servletConfig) { this.servletConfig = servletConfig; } public ServletConfig getServletConfig() { return servletConfig; } }