/* * $Id: IWSlideStore.java,v 1.3 2006/06/02 10:21:21 tryggvil Exp $ * Created on Jun 24, 2005 in project com.idega.slide * * Copyright (C) 2005 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.store; import java.sql.Connection; import java.util.Hashtable; import org.apache.slide.common.Service; import org.apache.slide.common.ServiceParameterErrorException; import org.apache.slide.common.ServiceParameterMissingException; import org.apache.slide.search.basic.IBasicExpressionFactoryProvider; import org.apache.slide.store.ContentStore; import org.apache.slide.store.LockStore; import org.apache.slide.store.NodeStore; import org.apache.slide.store.RevisionDescriptorStore; import org.apache.slide.store.RevisionDescriptorsStore; import org.apache.slide.store.SecurityStore; import org.apache.slide.store.SequenceStore; import org.apache.slide.store.impl.rdbms.DB2RDBMSAdapter; import org.apache.slide.store.impl.rdbms.DerbyRDBMSAdapter; import org.apache.slide.store.impl.rdbms.HsqlRDBMSAdapter; import org.apache.slide.store.impl.rdbms.J2EEStore; import org.apache.slide.store.impl.rdbms.JDBCStore; import org.apache.slide.store.impl.rdbms.MySql41RDBMSAdapter; import org.apache.slide.store.impl.rdbms.OracleRDBMSAdapter; import org.apache.slide.store.impl.rdbms.SQLServerRDBMSAdapter; import com.idega.util.database.ConnectionBroker; import com.idega.util.database.PoolManager; import com.idega.util.dbschema.SQLSchemaAdapter; /** * <p> * Store implementation for idegaWeb for Slide that intercepts the regular store mechanism by Slide, * auto-detects the right store implementation to use (JDBCStore,J2EEStore) * </p> * Last modified: $Date: 2006/06/02 10:21:21 $ by $Author: tryggvil $ * * @author <a href="mailto:tryggvil@idega.com">tryggvil</a> * @version $Revision: 1.3 $ */ public class IWSlideStore extends AbstractSlideStore{ private Hashtable _parameters = new Hashtable(); /** * */ public IWSlideStore() { super(); detectStoreImplementation(); } /** * <p> * Called by constructor * </p> */ private void detectStoreImplementation() { try{ Service service = tryRDBMSStoreImpl(); setService(service); setNodeStore((NodeStore)service); setContentStore((ContentStore) service); setSecurityStore((SecurityStore) service); setLockStore((LockStore) service); setRevisionDescriptorsStore((RevisionDescriptorsStore) service); setRevisionDescriptorStore((RevisionDescriptorStore) service); try{ setSecurityStore((SecurityStore) service); } catch(ClassCastException cce){ System.err.println("Class "+service+" does not implement SecurityStore"); } try{ setSequenceStore((SequenceStore) service); } catch(ClassCastException cce){ System.err.println("Class "+service+" does not implement SequenceStore"); } try{ setIbasicExpressionFactoryProvider((IBasicExpressionFactoryProvider) service); } catch(ClassCastException cce){ System.err.println("Class "+service+" does not implement IBasicExpressionFactoryProvider"); } } catch(RuntimeException re){ System.err.println("IWSlideStore INFO: Unsupported Database"); throw re; //RDBMStore must be unsupported, fallbach to TX (File) Store : //System.out.println("IWSlideStore INFO: Falling back to Slide TxStore (File) implementation"); /* try { Service service; this._parameters.put("tlock-timeout","120"); NodeStore nodeStore = (NodeStore) Class.forName("org.apache.slide.store.txfile.TxXMLFileDescriptorsStore").newInstance(); //Hashtable nodeStoreParams = new Hashtable(); this._parameters.put("rootpath", "store/metadata"); this._parameters.put("workpath", "work/metadata"); this._parameters.put("defer-saving", "true"); this._parameters.put("timeout", "120"); //nodeStore.setParameters(nodeStoreParams); setNodeStore(nodeStore); service = nodeStore; setService(service); SequenceStore sequenceStore = (SequenceStore) Class.forName("org.apache.slide.store.txfile.FileSequenceStore").newInstance(); Hashtable sequenceStoreParams = new Hashtable(); sequenceStoreParams.put("rootpath", "store/sequence"); sequenceStore.setParameters(sequenceStoreParams); setSequenceStore(sequenceStore); setSecurityStore((SecurityStore) nodeStore); setLockStore((LockStore)nodeStore); setRevisionDescriptorsStore((RevisionDescriptorsStore)nodeStore); setRevisionDescriptorStore((RevisionDescriptorStore)nodeStore); ContentStore contentStore = (ContentStore) Class.forName("org.apache.slide.store.txfile.TxFileContentStore").newInstance(); Hashtable contentStoreparams = new Hashtable(); contentStoreparams.put("rootpath", "store/content"); contentStoreparams.put("workpath", "work/content"); contentStoreparams.put("defer-saving", "true"); contentStoreparams.put("timeout", "120"); contentStore.setParameters(contentStoreparams); setContentStore(contentStore); try{ setIbasicExpressionFactoryProvider((IBasicExpressionFactoryProvider) service); } catch(ClassCastException cce){ System.err.println("Class "+service+" does not implement IBasicExpressionFactoryProvider"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } */ } } /** * <p> * TODO tryggvil describe method getNodeStoreImpl * </p> * @return */ private Service tryRDBMSStoreImpl() { if(ConnectionBroker.isUsingIdegaPool()){ PoolManager pManager = PoolManager.getInstance(); Connection conn = pManager.getConnection(); String adapter = getRDBMSAdapterClassName(conn); pManager.freeConnection(conn); // <parameter name="adapter">org.apache.slide.store.impl.rdbms.MySql41RDBMSAdapter</parameter> // <parameter name="driver">com.mysql.jdbc.Driver</parameter> // <parameter name="url">jdbc:mysql://localhost/db_name?useUnicode=true&characterEncoding=UTF-8</parameter> // <parameter name="user">root</parameter> // <parameter name="dbcpPooling">true</parameter> // still handled in Domain.xml // <parameter name="maxPooledConnections">10</parameter> // <parameter name="isolation">SERIALIZABLE</parameter> // still handled in Domain.xml // <parameter name="compress">false</parameter> // still handled in Domain.xml this._parameters.put("adapter",adapter); this._parameters.put("driver",pManager.getDriverClassForPool()); this._parameters.put("url",pManager.getURLForPool()); this._parameters.put("user",pManager.getUserNameForPool()); this._parameters.put("password",pManager.getPasswordForPool()); this._parameters.put("maxPooledConnections",String.valueOf(pManager.getMaximumConnectionCount())); JDBCStore store = new JDBCStore(); return store; } else if(ConnectionBroker.isUsingJNDIDatasource()){ Connection conn = ConnectionBroker.getConnection(); String adapter = getRDBMSAdapterClassName(conn); ConnectionBroker.freeConnection(conn); this._parameters.put("adapter",adapter); this._parameters.put("datasource",ConnectionBroker.getDefaultJNDIUrl()); J2EEStore store = new J2EEStore(); return store; } throw new RuntimeException("Store implementation could not be detected"); } public String getRDBMSAdapterClassName(Connection conn){ String datastoreType = SQLSchemaAdapter.detectDataStoreType(conn); String adapter = ""; if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_ORACLE)){ adapter = OracleRDBMSAdapter.class.getName(); } else if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_MSSQLSERVER)){ adapter = SQLServerRDBMSAdapter.class.getName(); } else if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_MYSQL)){ adapter = MySql41RDBMSAdapter.class.getName(); } else if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_DB2)){ adapter = DB2RDBMSAdapter.class.getName(); } else if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_HSQL)){ adapter = HsqlRDBMSAdapter.class.getName(); this._parameters.put("dbcpPooling","false"); }else if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_DERBY)){ adapter = DerbyRDBMSAdapter.class.getName(); this._parameters.put("dbcpPooling","false"); } //else if(datastoreType.equals(SQLSchemaAdapter.DBTYPE_H2)){ // adapter = H2RDBMSAdapter.class.getName(); // this._parameters.put("dbcpPooling","false"); //} else { throw new RuntimeException("Datastore of type "+datastoreType+" is not supported by Slide"); } return adapter; } /* (non-Javadoc) * @see org.apache.slide.store.AbstractStore#setParameters(java.util.Hashtable) */ public void setParameters(Hashtable inParams) throws ServiceParameterErrorException, ServiceParameterMissingException { inParams.putAll(this._parameters); super.setParameters(inParams); } }