/*
* Created on Mar 29, 2006
*/
package com.processpuzzle.artifact_management.control;
import java.security.InvalidParameterException;
import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext;
import com.processpuzzle.application.control.control.CommandDispatcher;
import com.processpuzzle.artifact.domain.Artifact;
import com.processpuzzle.artifact.domain.DefaultArtifactRepository;
import com.processpuzzle.artifact.domain.GenericArtifactRepository;
import com.processpuzzle.artifact_type.domain.ArtifactType;
import com.processpuzzle.artifact_type.domain.ArtifactTypeNotFoundException;
import com.processpuzzle.artifact_type.domain.ArtifactTypeRepository;
import com.processpuzzle.persistence.domain.DefaultUnitOfWork;
import com.processpuzzle.user_session.domain.UserRequestManager;
/**
* @author zsolt.zsuffa
*/
public class ArtifactLocator {
public static final String ARTIFACT_IDENTIFIERNAME = "artifactId";
public static final String ARTIFACTNAME_IDENTIFIERNAME = "artifactName";
public static final String ARTIFACTTYPE_IDENTIFIERNAME = "artifactType";
private ProcessPuzzleContext applicationContext;
private CommandDispatcher dispatcher;
private Integer artifactId;
private String artifactName;
private String artifactTypeName;
private GenericArtifactRepository<?> artifactRepository;
private ArtifactTypeRepository artifactTypeRepository;
private ArtifactType artifactType;
private Class<? extends Artifact<?>> artifactClass;
public ArtifactLocator( CommandDispatcher dispatcher ) {
this.dispatcher = dispatcher;
applicationContext = UserRequestManager.getInstance().getApplicationContext();
artifactTypeRepository = applicationContext.getRepository( ArtifactTypeRepository.class );
retrieveStandardRequestAttributes();
determineArtifactRepository();
}
public Artifact<?> findById( DefaultUnitOfWork work ) {
if( artifactId == null )
throw new InvalidParameterException( "The parameter '" + ARTIFACT_IDENTIFIERNAME + "' is required!" );
Artifact<?> artifact = artifactRepository.findById( work, artifactId );
return artifact; // null allowed
}
public Artifact<?> findByName( DefaultUnitOfWork work ) {
if( artifactName == null )
throw new InvalidParameterException( "The parameter '" + ARTIFACTNAME_IDENTIFIERNAME + "' is required!" );
/*
* RepositoryResultSet<Artifact> artifacts = artifactRepository.findAll(work); for (Iterator<?> iterator =
* artifacts.iterator(); iterator.hasNext();) { Artifact<?> artifact = (Artifact<?>) iterator.next();
* System.out.println("ArtifactLocator: - " + artifact.getPath()); }
*/
Artifact<?> artifact = artifactRepository.findByName( work, artifactName );
return artifact; // null allowed
}
public Artifact<?> findByType( DefaultUnitOfWork work ) {
if( artifactTypeName == null )
throw new InvalidParameterException( "The parameter '" + ARTIFACTTYPE_IDENTIFIERNAME + "' is required!" );
Artifact<?> artifact = null;
if( artifactType != null ) {
artifact = artifactRepository.findByName( work, artifactTypeName );
/*
String artifactClassName = artifactType.getArtifactClassName();
int lastDot = artifactClassName.lastIndexOf( "." );
artifactClassName = artifactClassName.substring( lastDot + 1 );
Class<? extends Artifact<?>> artifactClass = Class.forName( artifactClassName );
*/
}
return artifact; // null allowed
}
public Artifact<?> findArtifact( DefaultUnitOfWork work ) {
boolean found = false;
Artifact<?> artifact = null;
try{
artifact = findByType( work );
if( artifact != null ) found = true;
}catch( InvalidParameterException e ){}
if( !found ){
try{
artifact = findByName( work );
if( artifact != null ) found = true;
}catch( InvalidParameterException e ){}
}
if( !found ){
try{
artifact = findById( work );
if( artifact != null ) found = true;
}catch( InvalidParameterException e ){}
}
return artifact;
}
@SuppressWarnings("unchecked")
private void determineArtifactClass() {
artifactType = artifactTypeRepository.findByName( artifactTypeName );
if( artifactType == null ) throw new ArtifactTypeNotFoundException( artifactTypeName );
String artifactClassName = artifactType.getArtifactClassName();
try{
artifactClass = (Class<? extends Artifact<?>>) Class.forName( artifactClassName );
}catch( ClassNotFoundException e ){}
}
@SuppressWarnings("unchecked")
private void determineArtifactRepository() {
if( artifactTypeName != null && artifactClass != null ) {
artifactRepository = (GenericArtifactRepository) applicationContext.getRepositoryByEntityClass( artifactClass );
}else
artifactRepository = (GenericArtifactRepository) applicationContext.getRepository( DefaultArtifactRepository.class );
}
private void retrieveStandardRequestAttributes() {
retrieveArtifactId();
retrieveArtifactName();
retrieveArtifactType();
}
private void retrieveArtifactType() {
String artifactTypeIdentifier = dispatcher.getProperties().getProperty( ARTIFACTTYPE_IDENTIFIERNAME );
if( artifactTypeIdentifier != null && !artifactTypeIdentifier.equals( "" )) {
artifactTypeName = artifactTypeIdentifier;
determineArtifactClass();
}
}
private void retrieveArtifactName() {
String artifactNameIdentifier = dispatcher.getProperties().getProperty( ARTIFACTNAME_IDENTIFIERNAME );
if( artifactNameIdentifier != null && !artifactNameIdentifier.equals( "" ) )
artifactName = artifactNameIdentifier;
}
private void retrieveArtifactId() {
String artifactIdentifier = dispatcher.getProperties().getProperty( ARTIFACT_IDENTIFIERNAME );
if( artifactIdentifier != null && !artifactIdentifier.equals( "" )) {
Integer artifactIdentifierInteger = null;
try{
artifactIdentifierInteger = new Integer( artifactIdentifier );
}catch( NumberFormatException nfe ){
throw new InvalidParameterException( "The parameter '" + ARTIFACT_IDENTIFIERNAME + "' is not set properly!" );
}
artifactId = artifactIdentifierInteger;
}
}
}