/*
* This is a common dao with basic CRUD operations and is not limited to any
* persistent layer implementation
*
* Copyright (C) 2008 Imran M Yousuf (imyousuf@smartitengineering.com)
*
* This library 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.
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.smartitengineering.version.impl.jgit.service.impl;
import com.smartitengineering.dao.common.CommonReadDao;
import com.smartitengineering.dao.common.CommonWriteDao;
import com.smartitengineering.dao.common.queryparam.MatchMode;
import com.smartitengineering.dao.common.queryparam.Order;
import com.smartitengineering.dao.common.queryparam.QueryParameter;
import com.smartitengineering.dao.common.queryparam.QueryParameterFactory;
import com.smartitengineering.version.impl.jgit.SearchProperties;
import com.smartitengineering.version.impl.jgit.domain.Commit;
import com.smartitengineering.version.impl.jgit.domain.Resource;
import com.smartitengineering.version.impl.jgit.domain.Revision;
import com.smartitengineering.version.impl.jgit.service.MetaFactory;
import com.smartitengineering.version.impl.jgit.service.MetaRCSService;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
/**
*
* @author imyousuf
*/
public class MetaRCSServiceImpl
implements MetaRCSService {
protected CommonWriteDao<Commit> commitWriter;
protected CommonReadDao<Commit, Integer> commitReader;
protected CommonWriteDao<Revision> revisionWriter;
protected CommonReadDao<Revision, Integer> revisionReader;
/**
* Get the value of revisionReader
*
* @return the value of revisionReader
*/
public CommonReadDao<Revision, Integer> getRevisionReader() {
return revisionReader;
}
/**
* Set the value of revisionReader
*
* @param revisionReader new value of revisionReader
*/
public void setRevisionReader(CommonReadDao<Revision, Integer> revisionReader) {
this.revisionReader = revisionReader;
}
/**
* Get the value of revisionWriter
*
* @return the value of revisionWriter
*/
public CommonWriteDao<Revision> getRevisionWriter() {
return revisionWriter;
}
/**
* Set the value of revisionWriter
*
* @param revisionWriter new value of revisionWriter
*/
public void setRevisionWriter(CommonWriteDao<Revision> revisionWriter) {
this.revisionWriter = revisionWriter;
}
/**
* Get the value of commitReader
*
* @return the value of commitReader
*/
public CommonReadDao<Commit, Integer> getCommitReader() {
return commitReader;
}
/**
* Set the value of commitReader
*
* @param commitReader new value of commitReader
*/
public void setCommitReader(CommonReadDao<Commit, Integer> commitReader) {
this.commitReader = commitReader;
}
/**
* Get the value of commitWriter
*
* @return the value of commitWriter
*/
public CommonWriteDao<Commit> getCommitWriter() {
return commitWriter;
}
/**
* Set the value of commitWriter
*
* @param commitWriter new value of commitWriter
*/
public void setCommitWriter(CommonWriteDao<Commit> commitWriter) {
this.commitWriter = commitWriter;
}
public String[] getVersionsForResource(final String resourceId) {
if (StringUtils.isBlank(resourceId)) {
throw new IllegalArgumentException("Blank resource not supported!");
}
final List<String> revisions =
revisionReader.<String>getOtherList(
QueryParameterFactory.<String>getStringLikePropertyParam(
new StringBuilder(Revision.PROP_RESOURCE).append('.').
append(Resource.PROP_RESOURCEID).toString(),
resourceId, MatchMode.EXACT),
QueryParameterFactory.getPropProjectionParam(
Revision.PROP_REVISIONID),
QueryParameterFactory.<Boolean>getEqualPropertyParam(
SearchProperties.REVISION_RESOURCE_DELETED.getPropertyName(), false),
QueryParameterFactory.getOrderByParam("id", Order.DESC));
return revisions.toArray(new String[0]);
}
public String getHeadVersionForResource(final String resourceId) {
if (StringUtils.isBlank(resourceId)) {
throw new IllegalArgumentException("Blank resource not supported!");
}
final String revision =
(String) revisionReader.getOther(QueryParameterFactory.<String>
getStringLikePropertyParam(new StringBuilder(
Revision.PROP_RESOURCE).append('.').
append(Resource.PROP_RESOURCEID).toString(),
resourceId, MatchMode.EXACT),
QueryParameterFactory.<Boolean>getEqualPropertyParam(
Revision.PROP_HEADREVISION, true),
QueryParameterFactory.getPropProjectionParam(
Revision.PROP_REVISIONID),
QueryParameterFactory.<Boolean>getEqualPropertyParam(
SearchProperties.REVISION_RESOURCE_DELETED.getPropertyName(), false));
return revision;
}
public void saveResources(
final com.smartitengineering.version.api.Commit commit) {
Commit commitDomain = MetaFactory.transformAPICommit(commit);
persistCommit(commitDomain);
}
private void persistCommit(Commit commitDomain)
throws IllegalStateException {
//Set all revisions in commit to 'head' and update all the revisions for
//the resources already in the system to 'not head'
if (!commitDomain.isValid()) {
throw new IllegalStateException(
"Commit domain's current state is not valid!");
}
Set<String> resourceIds = new HashSet<String>();
Set<Revision> currentHeads = new HashSet<Revision>();
for (Revision revision : commitDomain.getRevisions()) {
revision.setHeadRevision(true);
String resourceId = revision.getResource().getResourceId();
resourceIds.add(resourceId);
}
currentHeads = new HashSet<Revision>(revisionReader.getList(
QueryParameterFactory.<String>getIsInPropertyParam(new StringBuilder(Revision.PROP_RESOURCE).append('.').
append(Resource.PROP_RESOURCEID).toString(),
resourceIds.toArray(new String[0])),
QueryParameterFactory.<Boolean>getEqualPropertyParam(
Revision.PROP_HEADREVISION, true)));
commitWriter.save(commitDomain);
if (currentHeads != null && !currentHeads.isEmpty()) {
for (Revision revision : currentHeads) {
revision.setHeadRevision(false);
}
revisionWriter.update(currentHeads.toArray(new Revision[0]));
}
}
public Set<com.smartitengineering.version.api.Commit> searchForCommits(
Collection<QueryParameter> parameters) {
Collection<QueryParameter> params = parameters == null ? Collections.<QueryParameter>emptyList()
: parameters;
List<Commit> commits = commitReader.getList(params.toArray(
new QueryParameter[0]));
LinkedHashSet<com.smartitengineering.version.api.Commit> result =
new LinkedHashSet<com.smartitengineering.version.api.Commit>();
if (commits != null) {
for (Commit commit : commits) {
result.add(MetaFactory.transformMetaCommit(commit));
}
}
return result;
}
public Set<com.smartitengineering.version.api.Revision> searchForRevisions(
Collection<QueryParameter> parameters) {
Collection<QueryParameter> params = parameters == null ? Collections.<QueryParameter>emptyList()
: parameters;
List<Revision> revisions = revisionReader.getList(params.toArray(
new QueryParameter[0]));
LinkedHashSet<com.smartitengineering.version.api.Revision> result =
new LinkedHashSet<com.smartitengineering.version.api.Revision>();
if (revisions != null) {
for (Revision revision : revisions) {
result.add(MetaFactory.transformMetaRevision(revision));
}
}
return result;
}
}