/**
* Copyright (C) Intersect 2012.
*
* This module contains Proprietary Information of Intersect,
* and should be treated as Confidential.
*/
package au.org.intersect.exsite9.service;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.log4j.Logger;
import au.org.intersect.exsite9.dao.FolderDAO;
import au.org.intersect.exsite9.dao.MetadataAssociationDAO;
import au.org.intersect.exsite9.dao.ProjectDAO;
import au.org.intersect.exsite9.dao.ResearchFileDAO;
import au.org.intersect.exsite9.dao.SubmissionPackageDAO;
import au.org.intersect.exsite9.dao.factory.FolderDAOFactory;
import au.org.intersect.exsite9.dao.factory.MetadataAssociationDAOFactory;
import au.org.intersect.exsite9.dao.factory.ProjectDAOFactory;
import au.org.intersect.exsite9.dao.factory.ResearchFileDAOFactory;
import au.org.intersect.exsite9.dao.factory.SubmissionPackageDAOFactory;
import au.org.intersect.exsite9.domain.Folder;
import au.org.intersect.exsite9.domain.Group;
import au.org.intersect.exsite9.domain.MetadataAssociation;
import au.org.intersect.exsite9.domain.Project;
import au.org.intersect.exsite9.domain.ResearchFile;
import au.org.intersect.exsite9.domain.Schema;
import au.org.intersect.exsite9.domain.SubmissionPackage;
import au.org.intersect.exsite9.dto.ProjectFieldsDTO;
import au.org.intersect.exsite9.xml.MetadataSchemaXMLBuilder;
/**
* A service for manipulating {@link Project}s
*/
public class ProjectService implements IProjectService
{
private final Logger LOG = Logger.getLogger(ProjectService.class);
private final EntityManagerFactory entityManagerFactory;
private final ProjectDAOFactory projectDAOFactory;
private final FolderDAOFactory folderDAOFactory;
private final ResearchFileDAOFactory researchFileDAOFactory;
private final MetadataAssociationDAOFactory metaAssociationDAOFactory;
private final SubmissionPackageDAOFactory submissionPackageDAOFactory;
public ProjectService(final EntityManagerFactory entityManagerFactory, final ProjectDAOFactory projectDAOFactory,
final FolderDAOFactory folderDAOFactory, final ResearchFileDAOFactory researchFileDAOFactory,
final MetadataAssociationDAOFactory metadataAssociationDAOFactory,
final SubmissionPackageDAOFactory submissionPackageDAOFactory)
{
this.entityManagerFactory = entityManagerFactory;
this.projectDAOFactory = projectDAOFactory;
this.folderDAOFactory = folderDAOFactory;
this.researchFileDAOFactory = researchFileDAOFactory;
this.metaAssociationDAOFactory = metadataAssociationDAOFactory;
this.submissionPackageDAOFactory = submissionPackageDAOFactory;
}
/**
* {@inheritDoc}
*/
@Override
public Project createProject(final ProjectFieldsDTO projectFields, final Schema schema)
{
final EntityManager em = entityManagerFactory.createEntityManager();
try
{
final Project project = new Project(projectFields);
final ProjectDAO projectDAO = projectDAOFactory.createInstance(em);
project.setSchema(schema);
projectDAO.createProject(project);
return project;
}
finally
{
em.close();
}
}
/**
* {@inheritDoc}
*/
@Override
public void mapFolderToProject(final Project project, final Folder folder)
{
EntityManager em = entityManagerFactory.createEntityManager();
try
{
ProjectDAO projectDAO = projectDAOFactory.createInstance(em);
FolderDAO folderDAO = folderDAOFactory.createInstance(em);
folderDAO.createFolder(folder);
project.getFolders().add(folder);
projectDAO.updateProject(project);
}
finally
{
em.close();
}
}
@Override
public List<Project> getAllProjects()
{
EntityManager em = entityManagerFactory.createEntityManager();
try
{
ProjectDAO projectDAO = projectDAOFactory.createInstance(em);
return projectDAO.findAllProjects();
}
finally
{
em.close();
}
}
@Override
public Project editProject(final ProjectFieldsDTO projectFields, final Long id)
{
EntityManager em = entityManagerFactory.createEntityManager();
try
{
ProjectDAO projectDAO = projectDAOFactory.createInstance(em);
Project project = projectDAO.findById(id);
project.setName(projectFields.getName());
project.setOwner(projectFields.getOwner());
project.setInstitution(projectFields.getInstitution());
project.setEmail(projectFields.getEmail());
project.setDescription(projectFields.getDescription());
project.setCollectionType(projectFields.getCollectionType());
project.setRightsStatement(projectFields.getRightsStatement());
project.setAccessRights(projectFields.getAccessRights());
project.setLicence(projectFields.getLicence());
project.setIdentifier(projectFields.getIdentifier());
project.setSubject(projectFields.getSubject());
project.setElectronicLocation(projectFields.getElectronicLocation());
project.setPhysicalLocation(projectFields.getPhysicalLocation());
project.setPlaceOrRegionName(projectFields.getPlaceOrRegionName());
project.setGeographicalCoverage(projectFields.getGeographicalCoverage());
project.setDatesOfCapture(projectFields.getDatesOfCapture());
project.setCitationInformation(projectFields.getCitationInformation());
project.setRelatedParty(projectFields.getRelatedParty());
project.setCountries(projectFields.getCountries());
project.setLanguages(projectFields.getLanguages());
project.setFieldOfResearch(projectFields.getFieldOfResearch());
project.setFundingBody(projectFields.getFundingBody());
project.setGrantID(projectFields.getGrantID());
project.setRelatedGrant(projectFields.getRelatedGrant());
project.setRelatedInformation(projectFields.getRelatedInformation());
projectDAO.updateProject(project);
return project;
}
finally
{
em.close();
}
}
@Override
public Project editProject(final Schema schema, final Long id)
{
final EntityManager em = entityManagerFactory.createEntityManager();
try
{
final ProjectDAO projectDAO = projectDAOFactory.createInstance(em);
final Project project = projectDAO.findById(id);
project.setSchema(schema);
projectDAO.updateProject(project);
return project;
}
finally
{
em.close();
}
}
@Override
public Project findProjectById(Long id)
{
final EntityManager em = this.entityManagerFactory.createEntityManager();
try
{
final ProjectDAO projectDAO = this.projectDAOFactory.createInstance(em);
return projectDAO.findById(id);
}
finally
{
em.close();
}
}
@Override
public Project removeFoldersFromProject(Project project, List<String> deletedFolderList)
{
EntityManager em = entityManagerFactory.createEntityManager();
try
{
final ProjectDAO projectDAO = this.projectDAOFactory.createInstance(em);
final FolderDAO folderDAO = this.folderDAOFactory.createInstance(em);
final ResearchFileDAO researchFileDAO = this.researchFileDAOFactory.createInstance(em);
final MetadataAssociationDAO metadataAssociationDAO = this.metaAssociationDAOFactory.createInstance(em);
final SubmissionPackageDAO submissionPackageDAO = this.submissionPackageDAOFactory.createInstance(em);
project = projectDAO.findById(project.getId());
Iterator<Folder> folderIter = project.getFolders().iterator();
while (folderIter.hasNext())
{
Folder folder = folderIter.next();
if (deletedFolderList.contains(folder.getFolder().getAbsolutePath()))
{
LOG.info("Removing folder id= " + folder.getId());
em.getTransaction().begin();
Iterator<ResearchFile> fileIter = folder.getFiles().iterator();
while (fileIter.hasNext())
{
ResearchFile researchFile = fileIter.next();
Group parentGroup = researchFile.getParentGroup();
parentGroup.getResearchFiles().remove(researchFile);
Iterator<MetadataAssociation> maIter = researchFile.getMetadataAssociations().iterator();
while (maIter.hasNext())
{
MetadataAssociation metadataAssociation = maIter.next();
metadataAssociationDAO.removeMetadataAssociation(metadataAssociation);
maIter.remove();
}
// Remove the research file from any submission packages it is part of.
final List<SubmissionPackage> submissionPackages = submissionPackageDAO
.findSubmissionPackagesWithResearchFile(researchFile);
for (final SubmissionPackage submissionPackage : submissionPackages)
{
submissionPackage.getResearchFiles().remove(researchFile);
submissionPackageDAO.updateSubmissionPackage(submissionPackage);
}
fileIter.remove();
researchFileDAO.removeResearchFile(researchFile);
}
folderIter.remove();
folderDAO.removeFolder(folder);
em.getTransaction().commit();
}
}
return project;
}
finally
{
em.close();
}
}
@Override
public void updateFolderPath(long folderId, File newFileForFolder)
{
EntityManager em = entityManagerFactory.createEntityManager();
try
{
final FolderDAO folderDAO = this.folderDAOFactory.createInstance(em);
final ResearchFileDAO researchFileDAO = this.researchFileDAOFactory.createInstance(em);
Folder folder = folderDAO.findById(folderId);
String newFolderPath = newFileForFolder.getAbsolutePath();
// modify the path in each of the research files
List<ResearchFile> researchFiles = folder.getFiles();
for (ResearchFile researchFile : researchFiles)
{
String originalPath = researchFile.getFile().getAbsolutePath();
if(! originalPath.startsWith(newFolderPath))
{
String newPath = originalPath.replace(folder.getFolder().getAbsolutePath(),newFolderPath);
File replacementFile = new File(newPath);
researchFile.setFile(replacementFile);
researchFileDAO.updateResearchFile(researchFile);
}
}
folder.setFolder(newFileForFolder);
folderDAO.updateFolder(folder);
}
finally
{
em.close();
}
}
@Override
public String buildMetadataSchemaXML(Project project)
{
return MetadataSchemaXMLBuilder.buildXML(project);
}
@Override
public void removeResearchFileFromSystem(long fileToBeRemovedId)
{
EntityManager em = entityManagerFactory.createEntityManager();
try
{
final ResearchFileDAO researchFileDAO = this.researchFileDAOFactory.createInstance(em);
final MetadataAssociationDAO metadataAssociationDAO = this.metaAssociationDAOFactory.createInstance(em);
final SubmissionPackageDAO submissionPackageDAO = this.submissionPackageDAOFactory.createInstance(em);
final FolderDAO folderDAO = this.folderDAOFactory.createInstance(em);
ResearchFile fileToBeRemoved = researchFileDAO.findById(fileToBeRemovedId);
em.getTransaction().begin();
Group parentGroup = fileToBeRemoved.getParentGroup();
parentGroup.getResearchFiles().remove(fileToBeRemoved);
Iterator<MetadataAssociation> maIter = fileToBeRemoved.getMetadataAssociations().iterator();
while (maIter.hasNext())
{
MetadataAssociation metadataAssociation = maIter.next();
metadataAssociationDAO.removeMetadataAssociation(metadataAssociation);
maIter.remove();
}
// Remove the research file from any submission packages it is part of.
final List<SubmissionPackage> submissionPackages = submissionPackageDAO
.findSubmissionPackagesWithResearchFile(fileToBeRemoved);
for (final SubmissionPackage submissionPackage : submissionPackages)
{
submissionPackage.getResearchFiles().remove(fileToBeRemoved);
submissionPackageDAO.updateSubmissionPackage(submissionPackage);
}
Folder folder = researchFileDAO.getParentFolder(fileToBeRemoved);
folder.getFiles().remove(fileToBeRemoved);
folderDAO.updateFolder(folder);
researchFileDAO.removeResearchFile(fileToBeRemoved);
em.getTransaction().commit();
}
finally
{
em.close();
}
}
}