diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml
index 2bc03dcb3f..8530dffba2 100644
--- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml
+++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml
@@ -26,6 +26,7 @@
+
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodes.java b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodes.java
new file mode 100644
index 0000000000..fbb9794a01
--- /dev/null
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodes.java
@@ -0,0 +1,43 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2016 Alfresco Software Limited
+ * %%
+ * This file is part of the Alfresco software.
+ * -
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ * -
+ * Alfresco 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.
+ * -
+ * Alfresco 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 Alfresco. If not, see .
+ * #L%
+ */
+package org.alfresco.rest.api.impl;
+
+import org.alfresco.rest.api.Nodes;
+
+/**
+ * RM Nodes API
+ *
+ * @author Ana Bozianu
+ * @since 2.6
+ *
+ */
+public interface RMNodes extends Nodes
+{
+ String PARAM_INCLUDE_HAS_RETENTION_SCHEDULE = "hasRetentionSchedule";
+ String PARAM_INCLUDE_IS_CLOSED = "isClosed";
+ String PARAM_INCLUDE_IS_COMPLETED = "isCompleted";
+}
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodesImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodesImpl.java
index 90c63efbcd..2763cf890b 100644
--- a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodesImpl.java
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/impl/RMNodesImpl.java
@@ -27,28 +27,30 @@
package org.alfresco.rest.api.impl;
-import java.io.Serializable;
+import java.security.InvalidParameterException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.model.ContentModel;
+import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
+import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
+import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.model.Repository;
+import org.alfresco.rest.api.model.CategoryNode;
+import org.alfresco.rest.api.model.FileplanComponentNode;
import org.alfresco.rest.api.model.Node;
-import org.alfresco.rest.api.model.PathInfo;
-import org.alfresco.rest.api.model.RMNode;
+import org.alfresco.rest.api.model.RecordFolderNode;
+import org.alfresco.rest.api.model.RecordNode;
import org.alfresco.rest.api.model.UserInfo;
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
-import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.dictionary.DictionaryService;
-import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
-import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
@@ -58,7 +60,7 @@ import org.alfresco.util.Pair;
* @author Ana Bozianu
* @since 2.6
*/
-public class RMNodesImpl extends NodesImpl
+public class RMNodesImpl extends NodesImpl implements RMNodes
{
String FILE_PLAN = "-filePlan-";
String TRANSFERS = "-transfers-";
@@ -73,23 +75,22 @@ public class RMNodesImpl extends NodesImpl
private FilePlanService filePlanService;
private NodeService nodeService;
- private ServiceRegistry sr;
+ private RecordsManagementServiceRegistry serviceRegistry;
private Repository repositoryHelper;
private DictionaryService dictionaryService;
- private NamespaceService namespaceService;
+ private DispositionService dispositionService;
public void init()
{
super.init();
- this.nodeService = sr.getNodeService();
- this.dictionaryService = sr.getDictionaryService();
- this.namespaceService = sr.getNamespaceService();
+ this.nodeService = serviceRegistry.getNodeService();
+ this.dictionaryService = serviceRegistry.getDictionaryService();
+ this.dispositionService = serviceRegistry.getDispositionService();
}
- public void setServiceRegistry(ServiceRegistry sr)
+ public void setRecordsManagementServiceRegistry(RecordsManagementServiceRegistry serviceRegistry)
{
- super.setServiceRegistry(sr);
- this.sr = sr;
+ this.serviceRegistry = serviceRegistry;
}
public void setRepositoryHelper(Repository repositoryHelper)
@@ -106,58 +107,61 @@ public class RMNodesImpl extends NodesImpl
@Override
public Node getFolderOrDocument(final NodeRef nodeRef, NodeRef parentNodeRef, QName nodeTypeQName, List includeParam, Map mapUserInfo)
{
- Map properties = nodeService.getProperties(nodeRef);
+ Node originalNode = super.getFolderOrDocument(nodeRef, parentNodeRef, nodeTypeQName, includeParam, mapUserInfo);
- // Get general information
- if (nodeTypeQName == null)
+ if(nodeTypeQName == null)
{
nodeTypeQName = nodeService.getType(nodeRef);
}
- if (parentNodeRef == null)
- {
- parentNodeRef = getParentNodeRef(nodeRef);
- }
-
RMNodeType type = getType(nodeTypeQName, nodeRef);
- RMNode node;
+ FileplanComponentNode node = null;
if (mapUserInfo == null)
{
mapUserInfo = new HashMap<>(2);
}
- node = new RMNode(nodeRef, parentNodeRef, properties, mapUserInfo, sr);
- if (type == RMNodeType.CATEGORY)
+ if(type == null)
{
- node.setIsCategory(true);
+ if(filePlanService.isFilePlanComponent(nodeRef))
+ {
+ node = new FileplanComponentNode(originalNode);
+ }
+ else
+ {
+ throw new InvalidParameterException("The provided node is not a fileplan component");
+ }
}
- else if (type == RMNodeType.RECORD_FOLDER)
+ else
{
- node.setIsRecordFolder(true);
- }
- else if (type == RMNodeType.FILE)
- {
- node.setIsFile(true);
- }
-
- PathInfo pathInfo = null;
- if (includeParam.contains(PARAM_INCLUDE_PATH))
- {
- ChildAssociationRef archivedParentAssoc = (ChildAssociationRef) properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
- pathInfo = lookupPathInfo(nodeRef, archivedParentAssoc);
- }
- node.setPath(pathInfo);
- node.setNodeType(nodeTypeQName.toPrefixString(namespaceService));
-
- // Get optional fields
- if (includeParam.size() > 0)
- {
- node.setProperties(mapFromNodeProperties(properties, includeParam, mapUserInfo));
- }
-
- if (includeParam.contains(PARAM_INCLUDE_ASPECTNAMES))
- {
- node.setAspectNames(mapFromNodeAspects(nodeService.getAspects(nodeRef)));
+ switch(type)
+ {
+ case CATEGORY:
+ CategoryNode categoryNode = new CategoryNode(originalNode);
+ if (includeParam.contains(PARAM_INCLUDE_HAS_RETENTION_SCHEDULE))
+ {
+ DispositionSchedule ds = dispositionService.getDispositionSchedule(nodeRef);
+ categoryNode.setHasRetentionSchedule(ds!=null?true:false);
+ }
+ node = categoryNode;
+ break;
+ case RECORD_FOLDER:
+ RecordFolderNode rfNode = new RecordFolderNode(originalNode);
+ if (includeParam.contains(PARAM_INCLUDE_IS_CLOSED))
+ {
+ rfNode.setIsClosed((Boolean) nodeService.getProperty(nodeRef, RecordsManagementModel.PROP_IS_CLOSED));
+ }
+ node = rfNode;
+ break;
+ case FILE:
+ RecordNode rNode = new RecordNode(originalNode);
+ if (includeParam.contains(PARAM_INCLUDE_IS_COMPLETED))
+ {
+ rNode.setIsCompleted(nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_DECLARED_RECORD));
+ }
+ node = rNode;
+ break;
+ }
}
return node;
@@ -223,16 +227,6 @@ public class RMNodesImpl extends NodesImpl
return super.validateOrLookupNode(nodeId, path);
}
- private NodeRef getParentNodeRef(NodeRef nodeRef)
- {
- if (repositoryHelper.getCompanyHome().equals(nodeRef))
- {
- return null; // note: does not make sense to return parent above C/H
- }
-
- return nodeService.getPrimaryParent(nodeRef).getParentRef();
- }
-
private RMNodeType getType(QName typeQName, NodeRef nodeRef)
{
// quick check for common types
@@ -244,12 +238,22 @@ public class RMNodesImpl extends NodesImpl
{
return RMNodeType.CATEGORY;
}
- else if (typeQName.equals(ContentModel.TYPE_CONTENT) || dictionaryService.isSubClass(typeQName, ContentModel.TYPE_CONTENT))
+ if (typeQName.equals(ContentModel.TYPE_CONTENT))
{
return RMNodeType.FILE;
}
- return null; // unknown
+ // check subclasses
+ if(dictionaryService.isSubClass(typeQName, ContentModel.TYPE_CONTENT))
+ {
+ return RMNodeType.FILE;
+ }
+ if(dictionaryService.isSubClass(typeQName, RecordsManagementModel.TYPE_RECORD_FOLDER))
+ {
+ return RMNodeType.RECORD_FOLDER;
+ }
+
+ return null;
}
@Override
@@ -262,7 +266,10 @@ public class RMNodesImpl extends NodesImpl
searchTypeQNames.remove(RecordsManagementModel.TYPE_HOLD_CONTAINER);
searchTypeQNames.remove(RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER);
searchTypeQNames.remove(RecordsManagementModel.TYPE_TRANSFER_CONTAINER);
+
searchTypeQNames.remove(RecordsManagementModel.TYPE_DISPOSITION_SCHEDULE);
+ searchTypeQNames.remove(RecordsManagementModel.TYPE_DISPOSITION_ACTION);
+ searchTypeQNames.remove(RecordsManagementModel.TYPE_DISPOSITION_ACTION_DEFINITION);
return new Pair<>(searchTypeQNames, ignoreAspectQNames);
}
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RMNode.java b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/CategoryNode.java
similarity index 69%
rename from rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RMNode.java
rename to rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/CategoryNode.java
index 59ff66fa47..60a6d5830c 100644
--- a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RMNode.java
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/CategoryNode.java
@@ -24,7 +24,6 @@
* along with Alfresco. If not, see .
* #L%
*/
-
package org.alfresco.rest.api.model;
import java.io.Serializable;
@@ -35,34 +34,31 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
/**
- * Concrete class carrying general information for an RM node
+ * Concrete class carrying specific information for a category
*
* @author Ana Bozianu
* @since 2.6
*/
-public class RMNode extends Node
+public class CategoryNode extends FileplanComponentNode
{
- protected Boolean isCategory;
- protected Boolean isRecordFolder;
protected Boolean hasRetentionSchedule;
- public RMNode(NodeRef nodeRef, NodeRef parentNodeRef, Map nodeProps, Map mapUserInfo, ServiceRegistry sr)
+ public CategoryNode(NodeRef nodeRef, NodeRef parentNodeRef, Map nodeProps, Map mapUserInfo, ServiceRegistry sr)
{
super(nodeRef, parentNodeRef, nodeProps, mapUserInfo, sr);
-
- isCategory = false;
- isRecordFolder = false;
- isFile = false;
}
- public Boolean getIsCategory()
+ public CategoryNode(Node node)
{
- return isCategory;
+ super(node);
}
- public Boolean getIsRecordFolder()
+ @Override
+ protected void defineType()
{
- return isRecordFolder;
+ setIsCategory(true);
+ setIsRecordFolder(false);
+ setIsFile(false);
}
public Boolean getHasRetentionSchedule()
@@ -70,16 +66,6 @@ public class RMNode extends Node
return hasRetentionSchedule;
}
- public void setIsCategory(Boolean isCategory)
- {
- this.isCategory = isCategory;
- }
-
- public void setIsRecordFolder(Boolean isRecordFolder)
- {
- this.isRecordFolder = isRecordFolder;
- }
-
public void setHasRetentionSchedule(Boolean hasRetentionSchedule)
{
this.hasRetentionSchedule = hasRetentionSchedule;
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/FileplanComponentNode.java b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/FileplanComponentNode.java
new file mode 100644
index 0000000000..6531ff19f2
--- /dev/null
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/FileplanComponentNode.java
@@ -0,0 +1,104 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2016 Alfresco Software Limited
+ * %%
+ * This file is part of the Alfresco software.
+ * -
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ * -
+ * Alfresco 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.
+ * -
+ * Alfresco 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 Alfresco. If not, see .
+ * #L%
+ */
+
+package org.alfresco.rest.api.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.QName;
+
+/**
+ * Concrete class carrying general information for a fileplan component node
+ *
+ * @author Ana Bozianu
+ * @since 2.6
+ */
+public class FileplanComponentNode extends Node
+{
+ protected Boolean isCategory;
+ protected Boolean isRecordFolder;
+
+ public FileplanComponentNode(NodeRef nodeRef, NodeRef parentNodeRef, Map nodeProps, Map mapUserInfo, ServiceRegistry sr)
+ {
+ super(nodeRef, parentNodeRef, nodeProps, mapUserInfo, sr);
+ defineType();
+ }
+
+ public FileplanComponentNode(Node node)
+ {
+ this.nodeRef = node.getNodeRef();
+ this.name = node.getName();
+ this.createdAt = node.getCreatedAt();
+ this.modifiedAt = node.getModifiedAt();
+ this.createdByUser = node.getCreatedByUser();
+ this.modifiedByUser = node.getModifiedByUser();
+ this.archivedAt = node.getArchivedAt();
+ this.archivedByUser = node.getArchivedByUser();
+ this.parentNodeRef = node.getParentId();
+ this.pathInfo = node.getPath();
+ this.prefixTypeQName = node.getNodeType();
+ this.relativePath = node.getRelativePath();
+ this.secondaryChildren = node.getSecondaryChildren();
+ this.targets = node.getTargets();
+ this.aspectNames = node.getAspectNames();
+ this.properties =node.getProperties();
+ this.allowableOperations = node.getAllowableOperations();
+ this.contentInfo = node.getContent();
+ this.description = node.description;
+ defineType();
+ }
+
+ protected void defineType()
+ {
+ isCategory = false;
+ isRecordFolder = false;
+ isFile = false;
+ }
+
+ public Boolean getIsCategory()
+ {
+ return isCategory;
+ }
+
+ public Boolean getIsRecordFolder()
+ {
+ return isRecordFolder;
+ }
+
+ public void setIsCategory(Boolean isCategory)
+ {
+ this.isCategory = isCategory;
+ }
+
+ public void setIsRecordFolder(Boolean isRecordFolder)
+ {
+ this.isRecordFolder = isRecordFolder;
+ }
+}
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RecordFolderNode.java b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RecordFolderNode.java
new file mode 100644
index 0000000000..9aeaca65ed
--- /dev/null
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RecordFolderNode.java
@@ -0,0 +1,73 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2016 Alfresco Software Limited
+ * %%
+ * This file is part of the Alfresco software.
+ * -
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ * -
+ * Alfresco 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.
+ * -
+ * Alfresco 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 Alfresco. If not, see .
+ * #L%
+ */
+package org.alfresco.rest.api.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.QName;
+
+/**
+ * Concrete class carrying specific information for a record folder
+ *
+ * @author Ana Bozianu
+ * @since 2.6
+ */
+public class RecordFolderNode extends FileplanComponentNode
+{
+ private Boolean isClosed;
+
+ public RecordFolderNode(NodeRef nodeRef, NodeRef parentNodeRef, Map nodeProps, Map mapUserInfo, ServiceRegistry sr)
+ {
+ super(nodeRef, parentNodeRef, nodeProps, mapUserInfo, sr);
+ }
+
+ public RecordFolderNode(Node node)
+ {
+ super(node);
+ }
+
+ @Override
+ protected void defineType()
+ {
+ setIsRecordFolder(true);
+ setIsCategory(false);
+ setIsFile(false);
+ }
+
+ public Boolean getIsClosed()
+ {
+ return isClosed;
+ }
+
+ public void setIsClosed(Boolean isClosed)
+ {
+ this.isClosed = isClosed;
+ }
+}
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RecordNode.java b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RecordNode.java
new file mode 100644
index 0000000000..b5c85c8128
--- /dev/null
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/rest/api/model/RecordNode.java
@@ -0,0 +1,74 @@
+/*
+ * #%L
+ * Alfresco Records Management Module
+ * %%
+ * Copyright (C) 2005 - 2016 Alfresco Software Limited
+ * %%
+ * This file is part of the Alfresco software.
+ * -
+ * If the software was purchased under a paid Alfresco license, the terms of
+ * the paid license agreement will prevail. Otherwise, the software is
+ * provided under the following open source license terms:
+ * -
+ * Alfresco 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.
+ * -
+ * Alfresco 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 Alfresco. If not, see .
+ * #L%
+ */
+package org.alfresco.rest.api.model;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.QName;
+
+/**
+ * Concrete class carrying specific information for a record
+ *
+ * @author Ana Bozianu
+ * @since 2.6
+ */
+public class RecordNode extends FileplanComponentNode
+{
+
+ private Boolean isCompleted;
+
+ public RecordNode(NodeRef nodeRef, NodeRef parentNodeRef, Map nodeProps, Map mapUserInfo, ServiceRegistry sr)
+ {
+ super(nodeRef, parentNodeRef, nodeProps, mapUserInfo, sr);
+ }
+
+ public RecordNode(Node node)
+ {
+ super(node);
+ }
+
+ @Override
+ protected void defineType()
+ {
+ setIsFile(true);
+ setIsCategory(false);
+ setIsRecordFolder(false);
+ }
+
+ public Boolean getIsCompleted()
+ {
+ return isCompleted;
+ }
+
+ public void setIsCompleted(Boolean isCompleted)
+ {
+ this.isCompleted = isCompleted;
+ }
+}