Package org.talend.esb.auxiliary.storage.persistence.jcr

Source Code of org.talend.esb.auxiliary.storage.persistence.jcr.PersistencyJCRManager

/*
* ============================================================================
*
* Copyright (C) 2011 - 2013 Talend Inc. - www.talend.com
*
* This source code is available under agreement available at
* %InstallDIR%\license.txt
*
* You should have received a copy of the agreement
* along with this program; if not, write to Talend SA
* 9 rue Pages 92150 Suresnes, France
*
* ============================================================================
*/
package org.talend.esb.auxiliary.storage.persistence.jcr;


import java.util.HashMap;
import java.util.logging.Level;

import javax.jcr.LoginException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.RepositoryFactory;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;

import org.apache.jackrabbit.core.RepositoryFactoryImpl;
import org.talend.esb.auxiliary.storage.common.exception.ObjectAlreadyExistsException;
import org.talend.esb.auxiliary.storage.common.exception.ObjectNotFoundException;
import org.talend.esb.auxiliary.storage.common.exception.InitializationException;
import org.talend.esb.auxiliary.storage.common.exception.PersistencyException;
import org.talend.esb.auxiliary.storage.persistence.AbstractPersistencyManager;

public class PersistencyJCRManager extends AbstractPersistencyManager {


    public static String CONTEXT_DATA_PROPERTY_NAME = "context";

    private RepositoryFactory repositoryFactory;
    private Repository repository;

    private String storageDirPath;



    public PersistencyJCRManager() {
        repositoryFactory = new RepositoryFactoryImpl();
    }


    public void init() throws InitializationException {

        if (repositoryFactory == null) {
            String errorMessage = "Failed to initialize auxiliary storage persistency manager. JCR repository factory is null.";
            LOG.log(Level.SEVERE, errorMessage);
            throw new InitializationException(errorMessage);
        }


        HashMap<String,String> parameters = new HashMap<String, String>();
        parameters.put(RepositoryFactoryImpl.REPOSITORY_HOME, storageDirPath);
        parameters.put(RepositoryFactoryImpl.REPOSITORY_CONF, "etc/org.talend.esb.auxiliary.repo.xml");


        try {
            repository = repositoryFactory.getRepository(parameters);
        } catch (RepositoryException e) {
            String errorMessage = "Failed to initialize auxiliary storage persistency manager. " +
                                  "Failed to inititalize jackrabbit repository: " + e.getMessage();
            LOG.log(Level.SEVERE, errorMessage);
            throw new InitializationException(errorMessage);
        }
    }


    @Override
    public void storeObject(String context, String key) throws PersistencyException {

        Session session = null;
        Node rootNode;
        Node node;

        synchronized (this) {

            try {
                session = getSession();
                rootNode = session.getRootNode();

                if (rootNode.hasNode(key)) {
                    throw new ObjectAlreadyExistsException("Dublicated object with key {" + key + "}");
                }

                node = rootNode.addNode(key);
                node.setProperty(CONTEXT_DATA_PROPERTY_NAME, context);
                session.save();

            } catch (RepositoryException e) {
                LOG.log(Level.SEVERE, "Failed to sotre object. RepositoryException. Error message: " + e.getMessage());
                throw new PersistencyException("Saving object failed due to error " + e.getMessage());
            } finally {
                releaseSession(session);
            }
        }
    }

    @Override
    public String restoreObject(String key) throws PersistencyException {

        Node node = null;
        Property property = null;

        Session session=null;
        Node rootNode;

        synchronized (this) {
            try {
                session = getSession();
                rootNode = session.getRootNode();
                node = rootNode.getNode(key);
                property = node.getProperty(CONTEXT_DATA_PROPERTY_NAME);
                return (property == null) ? null : property.getString();
            } catch (PathNotFoundException e) {
                return null;
            } catch (RepositoryException e) {
                LOG.log(Level.SEVERE, "Failed to resotre object. RepositoryException. Error message: " + e.getMessage());
                    throw new PersistencyException("Error retrieving auxiliary store node with the key "
                            + key + "  Underlying error message is:" + e.getMessage());
            } finally {
                releaseSession(session);
            }
        }
    }


    @Override
    public void removeObject(String key) throws PersistencyException {

        synchronized (this) {

            Session session=null;
            Node rootNode;

            try {
                session = getSession();
                rootNode = session.getRootNode();

                Node node = rootNode.getNode(key);
                node.remove();
                session.save();
            } catch (PathNotFoundException e) {
                String errorMessage = "Attempt to remove non-existing object with key: " + key;
                LOG.log(Level.WARNING, errorMessage);
                throw new ObjectNotFoundException(errorMessage);
            } catch (RepositoryException e) {
                String errorMessage = "Attempt to remove object with key: " + key + " failed. "
                        + "RepositoryException. Error message is: " + e.getMessage();
                LOG.log(Level.WARNING, errorMessage);
                throw new PersistencyException(errorMessage);
            } finally {
                 releaseSession(session);
            }
        }
    }

    public void setStorageDirPath(String storageDirPath) {
        this.storageDirPath = storageDirPath;
    }

    private Session getSession() {

        Session session = null;

        try {
            session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
            return session;
        } catch (LoginException e) {
            String errorMessage = "Failed to login to jackrabbit repository: " + e.getMessage();
            LOG.log(Level.SEVERE, errorMessage);
            throw new InitializationException(errorMessage);
        } catch (RepositoryException e) {
            String errorMessage = "Error occured during login process to jackrabbit repository: " + e.getMessage();
            LOG.log(Level.SEVERE, errorMessage);
            throw new InitializationException(errorMessage);
        }
    }

    private void releaseSession(Session session) {
        if (session != null) {
            session.logout();
            session = null;
        }
    }

}
TOP

Related Classes of org.talend.esb.auxiliary.storage.persistence.jcr.PersistencyJCRManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.