fr.acxio.tools.agia.alfresco.dao.HibernateNodeDao.java Source code

Java tutorial

Introduction

Here is the source code for fr.acxio.tools.agia.alfresco.dao.HibernateNodeDao.java

Source

package fr.acxio.tools.agia.alfresco.dao;

/*
 * Copyright 2014 Acxio
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.hibernate.criterion.Order;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.RepeatListener;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

import fr.acxio.tools.agia.alfresco.domain.Aspect;
import fr.acxio.tools.agia.alfresco.domain.Association;
import fr.acxio.tools.agia.alfresco.domain.Document;
import fr.acxio.tools.agia.alfresco.domain.Folder;
import fr.acxio.tools.agia.alfresco.domain.Node;
import fr.acxio.tools.agia.alfresco.domain.Property;
import fr.acxio.tools.agia.alfresco.domain.QName;

/**
 * <p>
 * Hibernate implementation of {@link fr.acxio.tools.agia.alfresco.dao.NodeDao
 * NodeDao}.
 * </p>
 * 
 * @author pcollardez
 *
 */
public class HibernateNodeDao extends HibernateDaoSupport implements NodeDao, RepeatListener {

    private List<Throwable> errors = new ArrayList<Throwable>();

    /**
     * Public accessor for the errors property.
     * 
     * @return the errors - a list of Throwable instances
     */
    public List<Throwable> getErrors() {
        return errors;
    }

    /**
     * <p>
     * Gets the list of stored QNames
     * </p>
     * 
     * @return the current list of stored QNames
     * @throws NodeDaoException
     *             if the list cannot be retrieved
     */
    @Transactional(readOnly = true)
    public Collection<QName> getQNames() throws NodeDaoException {
        Collection<QName> aResult;
        try {
            aResult = getSessionFactory().getCurrentSession().createCriteria(QName.class)
                    .addOrder(Order.asc("namespaceURI")).addOrder(Order.asc("localName")).list();
        } catch (Exception e) {
            throw new NodeDaoException(e);
        }
        return aResult;
    }

    @Transactional(readOnly = true)
    public Node findById(long sId) throws NodeDaoException {
        Node aResult;
        try {
            aResult = (Node) getHibernateTemplate().get(Node.class, sId);
        } catch (Exception e) {
            throw new NodeDaoException(e);
        }
        return aResult;
    }

    @Transactional
    public void saveOrUpdate(Node sNode) throws NodeDaoException {
        try {
            Collection<QName> aKnowQNames = getQNames();
            loadQNames(sNode, aKnowQNames);
            getSessionFactory().getCurrentSession().saveOrUpdate(sNode);
        } catch (Exception e) {
            throw new NodeDaoException(e);
        }
    }

    private void loadQNames(Node sNode, Collection<QName> sKnowQNames) throws NodeDaoException {
        // Replace QNames in the object graph when they are already stored in
        // the database
        sNode.setType(getKnowQname(sNode.getType(), sKnowQNames));
        for (Aspect aAspect : sNode.getAspects()) {
            aAspect.setName(getKnowQname(aAspect.getName(), sKnowQNames));
        }
        for (Property aProperty : sNode.getProperties()) {
            aProperty.setName(getKnowQname(aProperty.getName(), sKnowQNames));
        }
        for (Association aAssociation : sNode.getAssociations()) {
            aAssociation.setType(getKnowQname(aAssociation.getType(), sKnowQNames));
        }
        if (sNode instanceof Folder) {
            Folder aFolder = (Folder) sNode;
            for (Document aDocument : aFolder.getDocuments()) {
                loadQNames(aDocument, sKnowQNames);
            }
            for (Folder aSubFolder : aFolder.getFolders()) {
                loadQNames(aSubFolder, sKnowQNames);
            }
        }
    }

    private QName getKnowQname(QName sQName, Collection<QName> sKnowQNames) {
        QName aResult = null;
        for (QName aQName : sKnowQNames) {
            if (aQName.equals(sQName)) {
                aResult = aQName;
            }
        }
        if (aResult == null) {
            aResult = sQName;
            sKnowQNames.add(sQName);
        }
        return aResult;
    }

    @Transactional
    public void delete(Node sNode) throws NodeDaoException {
        try {
            getHibernateTemplate().delete(sNode);
        } catch (Exception e) {
            throw new NodeDaoException(e);
        }
    }

    @Transactional
    public void markError(long sId, int sError) throws NodeDaoException {
        try {
            Node aNode = findById(sId);
            aNode.setLastErrorTimestamp(new Date());
            aNode.setJobStep(sError);
            getSessionFactory().getCurrentSession().update(aNode);
        } catch (Exception e) {
            throw new NodeDaoException(e);
        }
    }

    public void onError(RepeatContext sContext, Throwable sThrowable) {
        errors.add(sThrowable);
    }

    public void after(RepeatContext sArg0, RepeatStatus sArg1) {
        // Nothing to do
    }

    public void before(RepeatContext sArg0) {
        // Nothing to do
    }

    public void close(RepeatContext sArg0) {
        // Nothing to do
    }

    public void open(RepeatContext sArg0) {
        // Nothing to do
    }

}