package fr.itldev.koya.utils; import java.util.Date; import java.util.List; import org.alfresco.model.ContentModel; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.workflow.WorkflowInstance; import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.namespace.QName; import fr.itldev.koya.alfservice.KoyaNodeService; import fr.itldev.koya.alfservice.ModelService; import fr.itldev.koya.exception.KoyaServiceException; import fr.itldev.koya.model.KoyaModel; import fr.itldev.koya.model.KoyaNode; import fr.itldev.koya.model.exceptions.KoyaErrorCodes; import fr.itldev.koya.model.impl.Company; import fr.itldev.koya.model.impl.Directory; import fr.itldev.koya.model.impl.Document; import fr.itldev.koya.model.impl.DocumentToClassify; import fr.itldev.koya.model.impl.Dossier; import fr.itldev.koya.model.impl.Space; /** * * */ public class KoyaNodeBuilder { private final NodeService nodeService; private final KoyaNodeService koyaNodeService; private final WorkflowService workflowService; private final ModelService modelService; public KoyaNodeBuilder(NodeService nodeService, KoyaNodeService koyaNodeService, WorkflowService workflowService, ModelService modelService) { this.nodeService = nodeService; this.koyaNodeService = koyaNodeService; this.workflowService = workflowService; this.modelService = modelService; } public KoyaNode build(NodeRef nodeRef) throws KoyaServiceException { QName type = nodeService.getType(nodeRef); KoyaNode si; if (type.equals(KoyaModel.TYPE_COMPANY)) { si = companyBuilder(nodeRef); } else if (type.equals(KoyaModel.TYPE_SPACE)) { si = nodeSpaceBuilder(nodeRef); } else if (type.equals(KoyaModel.TYPE_DOSSIER)) { si = nodeDossierBuilder(nodeRef); } else if (type.equals(ContentModel.TYPE_FOLDER) && (koyaNodeService.getFirstParentOfType(nodeRef, Dossier.class) != null)) { si = nodeDirBuilder(nodeRef); } else if ((type.equals(ContentModel.TYPE_CONTENT) || type.equals(ContentModel.TYPE_THUMBNAIL))) { si = nodeDocumentBuilder(nodeRef); } else { throw new KoyaServiceException(KoyaErrorCodes.INVALID_KOYANODE_NODEREF); } return si; } private void fillKoyaNodeCommonProperties(KoyaNode k, NodeRef n) { k.setNodeRef(n); k.setName((String) nodeService.getProperty(n, ContentModel.PROP_NAME)); k.setTitle((String) nodeService.getProperty(n, ContentModel.PROP_TITLE)); k.setCreationDate((Date) nodeService.getProperty(n, ContentModel.PROP_CREATED)); k.setCreatorUsername((String) nodeService.getProperty(n, ContentModel.PROP_CREATOR)); } private Company companyBuilder(NodeRef n) throws KoyaServiceException { Company c = Company.newInstance(); fillKoyaNodeCommonProperties(c, n); c.setFtpUsername(modelService.getCompanyImporterUsername(c.getName())); return c; } private Space nodeSpaceBuilder(final NodeRef spaceNodeRef) throws KoyaServiceException { Space s = Space.newInstance(); fillKoyaNodeCommonProperties(s, spaceNodeRef); return s; } private Dossier nodeDossierBuilder(final NodeRef dossierNodeRef) { Dossier d = Dossier.newInstance(); fillKoyaNodeCommonProperties(d, dossierNodeRef); if (nodeService.getProperty(dossierNodeRef, KoyaModel.PROP_LASTMODIFICATIONDATE) != null) { d.setLastModifiedDate((Date) nodeService.getProperty(dossierNodeRef, KoyaModel.PROP_LASTMODIFICATIONDATE)); } else { d.setLastModifiedDate( (Date) nodeService.getProperty(dossierNodeRef, ContentModel.PROP_MODIFIED)); } if (nodeService.getProperty(dossierNodeRef, KoyaModel.PROP_ACTIVITIIDS) != null) { @SuppressWarnings("unchecked") List<String> ids = (List<String>) nodeService.getProperty(dossierNodeRef, KoyaModel.PROP_ACTIVITIIDS); for (String activitiId : ids) { String status = null; try { WorkflowInstance wf = workflowService.getWorkflowById(activitiId); status = (String) nodeService.getProperty(wf.getWorkflowPackage(), KoyaModel.PROP_BPMCURRENTSTATUS); if (status == null) { status = KoyaModel.BpmStatusValues.UNKNOWN; } } catch (Exception e) { status = KoyaModel.BpmStatusValues.UNKNOWN; } d.getWorkflows().put(activitiId, status); } } //pending classify files NodeRef publicUpload = koyaNodeService.getPublicUploadFolder(d); if (publicUpload != null) { d.setPendingClassifyFiles(nodeService.getChildAssocs(publicUpload).size()); } else { d.setPendingClassifyFiles(0); } return d; } private Directory nodeDirBuilder(NodeRef dirNodeRef) { Directory dir = Directory.newInstance(); fillKoyaNodeCommonProperties(dir, dirNodeRef); return dir; } /** * Return Document or DocumentToClassify * * @param docNodeRef * @return */ private Document nodeDocumentBuilder(final NodeRef docNodeRef) { Document doc = null; NodeRef docParent = nodeService.getParentAssocs(docNodeRef).get(0).getParentRef(); if (nodeService.getType(docParent).equals(KoyaModel.TYPE_DOSSIERCLASSIFYFOLDER)) { DocumentToClassify d = DocumentToClassify.newInsance(); d.setDossier(nodeDossierBuilder( (NodeRef) nodeService.getProperty(docParent, KoyaModel.PROP_DOSSIERREF))); doc = d; } else { doc = Document.newInsance(); } fillKoyaNodeCommonProperties(doc, docNodeRef); doc.setByteSize(AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Long>() { @Override public Long doWork() throws Exception { return koyaNodeService.getByteSize(docNodeRef); } })); ContentData contentData = (ContentData) nodeService.getProperty(docNodeRef, ContentModel.PROP_CONTENT); doc.setMimeType(contentData.getMimetype()); return doc; } }