org.exoplatform.services.jcr.util.TesterConfigurationHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.services.jcr.util.TesterConfigurationHelper.java

Source

/*
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.exoplatform.services.jcr.util;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.config.CacheEntry;
import org.exoplatform.services.jcr.config.ContainerEntry;
import org.exoplatform.services.jcr.config.LockManagerEntry;
import org.exoplatform.services.jcr.config.QueryHandlerEntry;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.ValueStorageEntry;
import org.exoplatform.services.jcr.config.ValueStorageFilterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCDataContainerConfig.DatabaseStructureType;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.jcr.RepositoryException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

/**
 * Created by The eXo Platform SAS
 * 
 * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
 * @version $Id: ConfigurationHelper.java 11907 2008-03-13 15:36:21Z ksm $
 */
public class TesterConfigurationHelper {
    private static Log log = ExoLogger.getLogger("exo.jcr.component.core.ConfigurationHelper");

    private static TesterConfigurationHelper instance;

    private TesterConfigurationHelper() {
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.exoplatform.services.naming.SimpleContextFactory");
    }

    /**
     * Add new workspace to repository.
     */
    public void addWorkspace(ManageableRepository repository, WorkspaceEntry workspaceEntry)
            throws RepositoryConfigurationException, RepositoryException {
        repository.configWorkspace(workspaceEntry);
        repository.createWorkspace(workspaceEntry.getName());
    }

    /**
     * Create new datasource. 
     * 
     * @return datasource name
     */
    public String createDatasource() throws Exception {
        String dsName = IdGenerator.generate();

        Properties properties = new Properties();
        properties.setProperty("driverClassName", "org.hsqldb.jdbcDriver");
        properties.setProperty("url", "jdbc:hsqldb:file:target/temp/data/" + dsName);
        properties.setProperty("username", "sa");
        properties.setProperty("password", "");

        DataSource ds = BasicDataSourceFactory.createDataSource(properties);

        new InitialContext().bind(dsName, ds);

        return dsName;

    }

    public ManageableRepository createRepository(ExoContainer container, DatabaseStructureType dbStructureType,
            String dsName) throws Exception {
        RepositoryService service = (RepositoryService) container
                .getComponentInstanceOfType(RepositoryService.class);
        RepositoryEntry repoEntry = createRepositoryEntry(dbStructureType, null, dsName);
        service.createRepository(repoEntry);

        return service.getRepository(repoEntry.getName());
    }

    /**
    * Create workspace entry. 
    */
    public RepositoryEntry createRepositoryEntry(DatabaseStructureType dbStructureType, String systemWSName,
            String dsName) throws Exception {
        // create system workspace entry
        List<String> ids = new ArrayList<String>();
        ids.add("id");
        WorkspaceEntry wsEntry = createWorkspaceEntry(dbStructureType, dsName, ids);

        if (systemWSName != null) {
            wsEntry.setName(systemWSName);
        }

        RepositoryEntry repository = new RepositoryEntry();
        repository.setSystemWorkspaceName(wsEntry.getName());
        repository.setDefaultWorkspaceName(wsEntry.getName());
        repository.setName("repo-" + IdGenerator.generate());
        repository.setSessionTimeOut(3600000);
        repository.setAuthenticationPolicy("org.exoplatform.services.jcr.impl.core.access.JAASAuthenticator");
        repository.setSecurityDomain("exo-domain");
        repository.addWorkspace(wsEntry);

        return repository;
    }

    /**
    * Create copy of workspace entry. 
    */
    public WorkspaceEntry copyWorkspaceEntry(WorkspaceEntry baseWorkspaceEntry) throws Exception {
        // container entry
        ArrayList<SimpleParameterEntry> params = new ArrayList<SimpleParameterEntry>();
        params.addAll(copyList(baseWorkspaceEntry.getContainer().getParameters()));
        ContainerEntry containerEntry = new ContainerEntry(baseWorkspaceEntry.getContainer().getType(), params);
        containerEntry.setParameters(params);

        // value storage
        ArrayList<ValueStorageEntry> list = new ArrayList<ValueStorageEntry>();

        for (ValueStorageEntry baseValueStorageEntry : baseWorkspaceEntry.getContainer().getValueStorages()) {
            ArrayList<ValueStorageFilterEntry> vsparams = new ArrayList<ValueStorageFilterEntry>();

            for (ValueStorageFilterEntry baseValueStorageFilterEntry : baseValueStorageEntry.getFilters()) {
                ValueStorageFilterEntry filterEntry = new ValueStorageFilterEntry();
                filterEntry.setPropertyType(baseValueStorageFilterEntry.getPropertyType());
                filterEntry.setPropertyName(baseValueStorageFilterEntry.getPropertyName());
                filterEntry.setAncestorPath(baseValueStorageFilterEntry.getAncestorPath());
                filterEntry.setMinValueSize(baseValueStorageFilterEntry.getMinValueSize());

                vsparams.add(filterEntry);
            }

            ValueStorageEntry valueStorageEntry = new ValueStorageEntry(baseValueStorageEntry.getType(), vsparams);
            ArrayList<SimpleParameterEntry> spe = new ArrayList<SimpleParameterEntry>();
            spe.addAll(copyList(baseValueStorageEntry.getParameters()));
            valueStorageEntry.setId(baseValueStorageEntry.getId());
            valueStorageEntry.setParameters(spe);
            valueStorageEntry.setFilters(vsparams);

            // containerEntry.setValueStorages();
            list.add(valueStorageEntry);
        }

        containerEntry.setValueStorages(list);

        // Indexer
        params = new ArrayList<SimpleParameterEntry>();
        params.addAll(copyList(baseWorkspaceEntry.getQueryHandler().getParameters()));
        QueryHandlerEntry qEntry = new QueryHandlerEntry(baseWorkspaceEntry.getQueryHandler().getType(), params);

        // Cache
        params = new ArrayList<SimpleParameterEntry>();
        params.addAll(copyList(baseWorkspaceEntry.getCache().getParameters()));
        CacheEntry cacheEntry = new CacheEntry(params);
        cacheEntry.setType(baseWorkspaceEntry.getCache().getType());

        // Lock
        LockManagerEntry lockManagerEntry = new LockManagerEntry();
        lockManagerEntry.setType("org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl");
        lockManagerEntry.putParameterValue("time-out", "15m");
        lockManagerEntry.putParameterValue("jbosscache-configuration", "conf/standalone/test-jbosscache-lock.xml");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.name", "jcrlocks");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.create", "true");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.drop", "false");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.primarykey",
                "jcrlocks_" + IdGenerator.generate());
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.fqn.column", "fqn");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.node.column", "node");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.parent.column", "parent");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.datasource",
                baseWorkspaceEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME));
        lockManagerEntry.putParameterValue("jbosscache-shareable", "${jbosscache-shareable}");

        WorkspaceEntry workspaceEntry = new WorkspaceEntry();
        workspaceEntry.setContainer(containerEntry);
        workspaceEntry.setCache(cacheEntry);
        workspaceEntry.setQueryHandler(qEntry);
        workspaceEntry.setName(baseWorkspaceEntry.getName());
        workspaceEntry.setUniqueName(baseWorkspaceEntry.getUniqueName());
        workspaceEntry.setLockManager(lockManagerEntry);

        return workspaceEntry;

    }

    /**
     * Create copy of repository entry. 
     */
    public RepositoryEntry copyRepositoryEntry(RepositoryEntry baseRepositoryEntry) throws Exception {
        ArrayList<WorkspaceEntry> wsEntries = new ArrayList<WorkspaceEntry>();

        for (WorkspaceEntry wsEntry : baseRepositoryEntry.getWorkspaceEntries()) {
            WorkspaceEntry newWSEntry = copyWorkspaceEntry(wsEntry);

            wsEntries.add(newWSEntry);
        }

        RepositoryEntry newRepositoryEntry = new RepositoryEntry();

        newRepositoryEntry.setSystemWorkspaceName(baseRepositoryEntry.getSystemWorkspaceName());
        newRepositoryEntry.setAccessControl(baseRepositoryEntry.getAccessControl());
        newRepositoryEntry.setAuthenticationPolicy(baseRepositoryEntry.getAuthenticationPolicy());
        newRepositoryEntry.setDefaultWorkspaceName(baseRepositoryEntry.getDefaultWorkspaceName());
        newRepositoryEntry.setName(baseRepositoryEntry.getName());
        newRepositoryEntry.setSecurityDomain(baseRepositoryEntry.getSecurityDomain());
        newRepositoryEntry.setSessionTimeOut(baseRepositoryEntry.getSessionTimeOut());

        newRepositoryEntry.setWorkspaceEntries(wsEntries);
        return newRepositoryEntry;

    }

    /**
     * Create copy of list with SimpleParameterEntry-s
     */
    private List<SimpleParameterEntry> copyList(List<SimpleParameterEntry> baseArrayList) {
        ArrayList<SimpleParameterEntry> arrayList = new ArrayList<SimpleParameterEntry>();

        for (SimpleParameterEntry baseParameter : baseArrayList) {
            arrayList.add(new SimpleParameterEntry(baseParameter.getName(), baseParameter.getValue()));
        }

        return arrayList;
    }

    /**
     * Create workspace entry. 
     */
    public WorkspaceEntry createWorkspaceEntry(DatabaseStructureType dbStructureType, String dsName)
            throws Exception {
        List<String> ids = new ArrayList<String>();
        ids.add("id");

        return createWorkspaceEntry(dbStructureType, dsName, ids);
    }

    /**
     * Create workspace entry. 
     */
    public WorkspaceEntry createWorkspaceEntry(DatabaseStructureType dbStructureType, String dsName,
            List<String> valueStorageIds) throws Exception {
        if (dsName == null) {
            dsName = createDatasource();
        }

        String id = IdGenerator.generate();
        String wsName = "ws_" + id;

        // container entry
        List params = new ArrayList();
        params.add(new SimpleParameterEntry("source-name", dsName));
        params.add(
                new SimpleParameterEntry(JDBCWorkspaceDataContainer.DB_STRUCTURE_TYPE, dbStructureType.toString()));
        params.add(new SimpleParameterEntry("max-buffer-size", "204800"));
        params.add(new SimpleParameterEntry("dialect", "auto"));
        params.add(new SimpleParameterEntry("swap-directory", "target/temp/swap/" + wsName));

        ContainerEntry containerEntry = new ContainerEntry(
                "org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer", (ArrayList) params);
        containerEntry.setParameters(params);

        // value storage
        ArrayList list = new ArrayList();
        if (valueStorageIds != null) {
            for (String vsId : valueStorageIds) {
                ArrayList<ValueStorageFilterEntry> vsparams = new ArrayList<ValueStorageFilterEntry>();
                ValueStorageFilterEntry filterEntry = new ValueStorageFilterEntry();
                filterEntry.setPropertyType("Binary");
                vsparams.add(filterEntry);

                ValueStorageEntry valueStorageEntry = new ValueStorageEntry(
                        "org.exoplatform.services.jcr.impl.storage.value.fs.SimpleFileValueStorage", vsparams);
                ArrayList<SimpleParameterEntry> spe = new ArrayList<SimpleParameterEntry>();
                spe.add(new SimpleParameterEntry("path", "target/temp/values/" + wsName + "-" + vsId));
                valueStorageEntry.setId(vsId);
                valueStorageEntry.setParameters(spe);
                valueStorageEntry.setFilters(vsparams);

                // containerEntry.setValueStorages();
                containerEntry.setParameters(params);
                list.add(valueStorageEntry);
            }
        }

        containerEntry.setValueStorages(list);

        // Indexer
        params = new ArrayList();
        params.add(new SimpleParameterEntry("index-dir", "target/temp/index/" + wsName));
        QueryHandlerEntry qEntry = new QueryHandlerEntry(
                "org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex", params);

        // Cache
        ArrayList cacheParams = new ArrayList();
        cacheParams.add(new SimpleParameterEntry("maxSize", "2000"));
        cacheParams.add(new SimpleParameterEntry("liveTime", "20m"));
        CacheEntry cacheEntry = new CacheEntry(cacheParams);
        cacheEntry.setType("org.exoplatform.services.jcr.impl.dataflow.persistent.LinkedWorkspaceStorageCacheImpl");

        // Lock
        LockManagerEntry lockManagerEntry = new LockManagerEntry();
        lockManagerEntry.setType("org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl");
        lockManagerEntry.putParameterValue("time-out", "15m");
        lockManagerEntry.putParameterValue("jbosscache-configuration", "conf/standalone/test-jbosscache-lock.xml");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.name", "jcrlocks");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.create", "true");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.drop", "false");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.table.primarykey",
                "jcrlocks_" + IdGenerator.generate());
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.fqn.column", "fqn");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.node.column", "node");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.parent.column", "parent");
        lockManagerEntry.putParameterValue("jbosscache-cl-cache.jdbc.datasource", dsName);
        lockManagerEntry.putParameterValue("jbosscache-shareable", "${jbosscache-shareable}");

        WorkspaceEntry workspaceEntry = new WorkspaceEntry();
        workspaceEntry.setLockManager(lockManagerEntry);
        workspaceEntry.setContainer(containerEntry);
        workspaceEntry.setCache(cacheEntry);
        workspaceEntry.setQueryHandler(qEntry);
        workspaceEntry.setName(wsName);
        workspaceEntry.setUniqueName(wsName);

        return workspaceEntry;
    }

    public List<String> getValueStorageIds(ArrayList<ValueStorageEntry> entries) {
        List<String> ids = new ArrayList<String>();
        if (entries != null) {
            for (ValueStorageEntry entry : entries) {
                ids.add(entry.getId());
            }
        }

        return ids;
    }

    public static TesterConfigurationHelper getInstance() {
        if (instance == null) {
            instance = new TesterConfigurationHelper();
        }

        return instance;
    }
}