/** * $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; } }