/*
* Copyright (C) 2005-2012 BetaCONCEPT Limited
*
* This file is part of Astroboa.
*
* Astroboa 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 3 of the License, or
* (at your option) any later version.
*
* Astroboa 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 Astroboa. If not, see <http://www.gnu.org/licenses/>.
*/
package org.betaconceptframework.astroboa.engine.jcr.dao;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import org.betaconceptframework.astroboa.api.model.exception.CmsException;
import org.betaconceptframework.astroboa.api.model.io.FetchLevel;
import org.betaconceptframework.astroboa.api.model.io.SerializationConfiguration;
import org.betaconceptframework.astroboa.api.model.io.SerializationReport;
import org.betaconceptframework.astroboa.api.model.query.criteria.CmsCriteria;
import org.betaconceptframework.astroboa.api.model.query.criteria.ContentObjectCriteria;
import org.betaconceptframework.astroboa.context.AstroboaClientContext;
import org.betaconceptframework.astroboa.context.AstroboaClientContextHolder;
import org.betaconceptframework.astroboa.engine.jcr.PrototypeFactory;
import org.betaconceptframework.astroboa.engine.jcr.io.SerializationBean;
import org.betaconceptframework.astroboa.engine.jcr.io.SerializationBean.CmsEntityType;
import org.betaconceptframework.astroboa.engine.jcr.query.CmsQueryHandler;
import org.betaconceptframework.astroboa.engine.jcr.query.CmsQueryResult;
import org.betaconceptframework.astroboa.engine.jcr.query.CmsScoreNodeIteratorUsingJcrRangeIterator;
import org.betaconceptframework.astroboa.model.impl.io.SerializationReportImpl;
import org.betaconceptframework.astroboa.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
*
* @author Gregory Chomatas (gchomatas@betaconcept.com)
* @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
*
*/
public class SerializationDao {
@Autowired
private CmsQueryHandler cmsQueryHandler;
@Autowired
private SerializationBean serializationBean;
//Use this method only if you want to use SerializationBean in a newly
//created Thread
@Autowired
public PrototypeFactory prototypeFactory;
//TODO : The use of the ExecutorService must be reviewed.
private ExecutorService executorService = Executors.newCachedThreadPool();
public long serializeSearchResults(Session session, CmsCriteria cmsCriteria, OutputStream os, FetchLevel fetchLevel,
SerializationConfiguration serializationConfiguration) throws Exception{
CmsQueryResult cmsQueryResult = null;
NodeIterator nodeIterator = null;
if (cmsCriteria instanceof ContentObjectCriteria){
cmsQueryResult = cmsQueryHandler.getNodesFromXPathQuery(session, cmsCriteria, false);
nodeIterator =
new CmsScoreNodeIteratorUsingJcrRangeIterator(cmsQueryResult.getRowIterator());
}
else{
cmsQueryResult = cmsQueryHandler.getNodesFromXPathQuery(session, cmsCriteria, true);
nodeIterator = cmsQueryResult.getNodeIterator();
}
serializationBean.serializeNodesAsResourceCollection(nodeIterator, os, cmsCriteria, fetchLevel, serializationConfiguration, cmsQueryResult.getTotalRowCount());
return nodeIterator.getSize();
}
public void serializeCmsRepositoryEntity(Node nodeRepresentingEntity, OutputStream os, CmsEntityType entityTypeToSerialize,
List<String> propertyPathsWhoseValuesAreIncludedInTheSerialization, FetchLevel fetchLevel, boolean nodeRepresentsRootElement,
SerializationConfiguration serializationConfiguration) throws Exception{
serializationBean.serializeNode(nodeRepresentingEntity, os, entityTypeToSerialize, serializationConfiguration, propertyPathsWhoseValuesAreIncludedInTheSerialization, fetchLevel, nodeRepresentsRootElement);
}
public Future<SerializationReport> serializeAllInstancesOfEntity(final CmsEntityType entityTypeToSerialize, final SerializationConfiguration serializationConfiguration) {
Calendar now = Calendar.getInstance();
final String serializationPath = DateUtils.format(now, "yyyy/MM/dd");
final AstroboaClientContext clientContext = AstroboaClientContextHolder.getActiveClientContext();
final String filename = createFilename(now, entityTypeToSerialize, clientContext);
final SerializationBean serializationBean = prototypeFactory.newSerializationBean();
final SerializationReport serializationReport = new SerializationReportImpl(filename+".zip", serializationPath);
Future<SerializationReport> future = executorService.submit(new Callable<SerializationReport>() {
@Override
public SerializationReport call() throws Exception {
serializationBean.serialize(entityTypeToSerialize, serializationPath, filename, clientContext, serializationReport, serializationConfiguration);
return serializationReport;
}
});
return future;
}
public Future<SerializationReport> serializeObjectsUsingCriteria(final ContentObjectCriteria contentObjectCriteria, final SerializationConfiguration serializationConfiguration) {
Calendar now = Calendar.getInstance();
final String serializationPath = DateUtils.format(now, "yyyy/MM/dd");
final AstroboaClientContext clientContext = AstroboaClientContextHolder.getActiveClientContext();
final String filename = createFilename(now, CmsEntityType.OBJECT, clientContext);
final SerializationBean serializationBean = prototypeFactory.newSerializationBean();
final SerializationReport serializationReport = new SerializationReportImpl(filename+".zip", serializationPath);
Future<SerializationReport> future = executorService.submit(new Callable<SerializationReport>() {
@Override
public SerializationReport call() throws Exception {
serializationBean.serializeObjectsUsingCriteria(contentObjectCriteria, serializationPath, filename, clientContext, serializationReport, serializationConfiguration);
return serializationReport;
}
});
return future;
}
public String createFilename(Calendar date, CmsEntityType entityTypeToSerialize, AstroboaClientContext clientContext){
if (clientContext == null)
{
throw new CmsException("Astroboa client context is not provided. Serialization failed");
}
/* Build serialization file path
*
* yyyy/MM/dd/<repositoryId>-{repositoryUsers|taxonomies|objects|organizationSpace-}yyyyMMddHHmmssSSS
*
*/
String repositoryId = clientContext.getRepositoryContext().getCmsRepository().getId();
StringBuilder sb = new StringBuilder();
sb.append(repositoryId);
if (entityTypeToSerialize != null)
{
switch (entityTypeToSerialize) {
case OBJECT:
sb.append("-objects");
break;
case ORGANIZATION_SPACE:
sb.append("-organizationSpace");
break;
case REPOSITORY_USER:
sb.append("-repositoryUsers");
break;
case TAXONOMY:
sb.append("-taxonomies");
break;
default:
break;
}
}
sb.append("-");
sb.append(DateUtils.format(date, "yyyyMMddHHmmssSSS"));
return sb.toString();
}
}