/* Name: - DefaultArtifactRepository Description: - Requires: - Provides: - Part of: ProcessPuzzle Framework, Domain and Business Model Ready Architecture. Provides content, workflow and social networking functionality. http://www.processpuzzle.com ProcessPuzzle - Content and Workflow Management Integration Business Platform Author(s): - Zsolt Zsuffa Copyright: (C) 2011 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.processpuzzle.artifact.domain; import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext; import com.processpuzzle.commons.persistence.PersistenceStrategy; import com.processpuzzle.commons.persistence.RepositoryResultSet; import com.processpuzzle.commons.persistence.UnitOfWork; import com.processpuzzle.commons.persistence.query.OrderSpecifier; import com.processpuzzle.commons.persistence.query.OrderingDirections; import com.processpuzzle.commons.persistence.query.Query; import com.processpuzzle.persistence.domain.DefaultUnitOfWork; import com.processpuzzle.persistence.query.domain.ComparisonOperators; import com.processpuzzle.persistence.query.domain.DefaultQuery; import com.processpuzzle.persistence.query.domain.DefaultQueryContext; import com.processpuzzle.persistence.query.domain.IntegerAttributeCondition; import com.processpuzzle.persistence.query.domain.TextAttributeCondition; import com.processpuzzle.workflow.activity.artifact.ActionDataSheet; public class DefaultArtifactRepository extends GenericArtifactRepository<Artifact> { private Class<? extends Artifact<?>> artifactClass; public DefaultArtifactRepository( PersistenceStrategy strategy, ProcessPuzzleContext applicationContext ) { super( strategy, applicationContext ); } public Integer add( UnitOfWork work, Artifact artifact ) { determineArtifactClass( artifact ); return super.add( work, artifactClass, artifact ); } public void deleteByName( UnitOfWork work, String name ) { delete( work, findByName( work, name ) ); } public void delete( UnitOfWork work, Artifact<?> artifact ) { determineArtifactClass( artifact ); super.delete( work, artifact ); } public void update( UnitOfWork work, Artifact<?> artifact ) { determineArtifactClass( artifact ); update( work, artifact ); } public RepositoryResultSet<Artifact> findAll( UnitOfWork work ) { return super.findAll( work ); } public Artifact<?> findByFullName( UnitOfWork work, String targetArtifactName ) { String folderName = targetArtifactName.substring( 0, targetArtifactName.lastIndexOf( "." ) ); ArtifactFolderRepository artifactFolderRepository = applicationContext.getRepository( ArtifactFolderRepository.class ); ArtifactFolder folder = artifactFolderRepository.findByPath( work, folderName ); String artifactName = targetArtifactName.substring( targetArtifactName.lastIndexOf( "." ) + 1 ); return findByFullName( work, artifactName, folder ); } public Artifact<?> findByFullName( UnitOfWork work, String artifactName, ArtifactFolder artifactFolder ) { DefaultQueryContext context = new DefaultQueryContext(); context.addTextValueFor( "name", artifactName ); ArtifactIdentity<Artifact<?>> identity = new ArtifactIdentity<Artifact<?>>( context ); return findByIdentityExpression( work, identity ); } public Artifact<?> findById( Integer id ) { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); Artifact<?> artifact = findById( work, id ); work.finish(); return artifact; } public Artifact<?> findById( UnitOfWork work, Integer id ) { return super.findById( work, id ); } @Override public Artifact findById( UnitOfWork work, Class artifactClass, Integer id ) { return super.findById( work, artifactClass, id ); } public Artifact<?> findByName( String name ) { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); Artifact<?> artifact = findByName( work, name ); work.finish(); return artifact; } public Artifact<?> findByName( UnitOfWork work, String name ) { DefaultQuery query = new DefaultQuery( Artifact.class ); query.getQueryCondition().addAttributeCondition( new TextAttributeCondition( "name", name, ComparisonOperators.EQUAL_TO ) ); RepositoryResultSet<Artifact> resultSet = super.findByQuery( work, query ); if( resultSet.size() == 1 ) return resultSet.getEntityAt( 0 ); else return null; } public Artifact<?> findByPath( String path ) { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); Artifact<?> folder = findByPath( work, path ); work.finish(); return folder; } public Artifact<?> findByPath( UnitOfWork work, String path ) { DefaultQuery query = new DefaultQuery( Artifact.class ); query.getQueryCondition().addAttributeCondition( new TextAttributeCondition( "path", path, ComparisonOperators.EQUAL_TO ) ); RepositoryResultSet<Artifact> possibleArtifacts = super.findByQuery( work, query ); if( possibleArtifacts.size() == 1 ){ return (Artifact<?>) possibleArtifacts.getEntityAt( 0 ); }else return null; } public RepositoryResultSet<Artifact> findByType( UnitOfWork work, String typeName ) { DefaultQuery q = new DefaultQuery( Artifact.class ); q.getQueryCondition().addAttributeCondition( new TextAttributeCondition( "type.name", typeName, ComparisonOperators.EQUAL_TO ) ); return findByQuery( work, q ); } public RepositoryResultSet<Artifact> findByQuery( Query query ) { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); RepositoryResultSet<Artifact> resultSet = findByQuery( work, query ); work.finish(); return resultSet; } public RepositoryResultSet<Artifact> findByQuery( UnitOfWork work, DefaultQuery query ) { return super.findByQuery( work, query ); } public RepositoryResultSet<Artifact> findDataSheetsByActionId( UnitOfWork work, Integer id ) { DefaultQuery q = new DefaultQuery( ActionDataSheet.class ); q.getQueryCondition().addAttributeCondition( new IntegerAttributeCondition( "action.id", id, ComparisonOperators.EQUAL_TO ) ); return findByQuery( work, q ); } protected RepositoryResultSet<Artifact> findArtifactVersionsByName( UnitOfWork work, String artifactName ) { DefaultQuery query = new DefaultQuery( ArtifactVersion.class ); query.getQueryCondition().addAttributeCondition( new TextAttributeCondition( "name", artifactName, ComparisonOperators.EQUAL_TO ) ); query.getQueryOrder().addOrderSpecifier( new OrderSpecifier( "versionNumber", OrderingDirections.Ascending ) ); return findByQuery( work, query ); } protected Object findByIdentityExpression( String identityExpression ) { return null; } @SuppressWarnings("unchecked") private void determineArtifactClass( Artifact<?> artifact ) { artifactClass = (Class<? extends Artifact<?>>) artifact.getClass(); } }