mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
[feature/MNT-24127-EndpointToCalculateFolderSize] Updated endpoints flow to calculate and retrieve folder size details
This commit is contained in:
@@ -25,15 +25,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.rest.api;
|
package org.alfresco.rest.api;
|
||||||
|
|
||||||
import org.alfresco.rest.api.model.NodeSizeDetail;
|
import org.alfresco.rest.api.model.NodeSizeDetails;
|
||||||
|
|
||||||
public interface SizeDetail
|
public interface SizeDetails
|
||||||
{
|
{
|
||||||
enum PROCESSINGSTATE
|
enum PROCESSINGSTATE
|
||||||
{
|
{
|
||||||
NOT_INITIATED, IN_PROGRESS, COMPLETED;
|
NOT_INITIATED, IN_PROGRESS, COMPLETED;
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeSizeDetail generateNodeSizeDetailsRequest(String nodeId);
|
NodeSizeDetails generateNodeSizeDetailsRequest(String nodeId);
|
||||||
NodeSizeDetail getNodeSizeDetails(String nodeId, String jobId);
|
NodeSizeDetails getNodeSizeDetails(String nodeId, String jobId);
|
||||||
}
|
}
|
@@ -29,10 +29,10 @@ import org.alfresco.repo.action.executer.NodeSizeDetailActionExecutor;
|
|||||||
import org.alfresco.repo.cache.SimpleCache;
|
import org.alfresco.repo.cache.SimpleCache;
|
||||||
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
||||||
import org.alfresco.rest.api.Nodes;
|
import org.alfresco.rest.api.Nodes;
|
||||||
import org.alfresco.rest.api.SizeDetail;
|
import org.alfresco.rest.api.SizeDetails;
|
||||||
import org.alfresco.rest.api.model.Node;
|
import org.alfresco.rest.api.model.Node;
|
||||||
import org.alfresco.rest.api.model.NodePermissions;
|
import org.alfresco.rest.api.model.NodePermissions;
|
||||||
import org.alfresco.rest.api.model.NodeSizeDetail;
|
import org.alfresco.rest.api.model.NodeSizeDetails;
|
||||||
import org.alfresco.rest.framework.core.exceptions.InvalidNodeTypeException;
|
import org.alfresco.rest.framework.core.exceptions.InvalidNodeTypeException;
|
||||||
import org.alfresco.rest.framework.core.exceptions.UnprocessableContentException;
|
import org.alfresco.rest.framework.core.exceptions.UnprocessableContentException;
|
||||||
import org.alfresco.service.cmr.action.Action;
|
import org.alfresco.service.cmr.action.Action;
|
||||||
@@ -48,13 +48,13 @@ import java.io.Serializable;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import static org.alfresco.rest.api.SizeDetail.PROCESSINGSTATE.COMPLETED;
|
import static org.alfresco.rest.api.SizeDetails.PROCESSINGSTATE.COMPLETED;
|
||||||
import static org.alfresco.rest.api.SizeDetail.PROCESSINGSTATE.NOT_INITIATED;
|
import static org.alfresco.rest.api.SizeDetails.PROCESSINGSTATE.NOT_INITIATED;
|
||||||
import static org.alfresco.rest.api.SizeDetail.PROCESSINGSTATE.IN_PROGRESS;
|
import static org.alfresco.rest.api.SizeDetails.PROCESSINGSTATE.IN_PROGRESS;
|
||||||
|
|
||||||
public class SizeDetailImpl implements SizeDetail
|
public class SizeDetailsImpl implements SizeDetails
|
||||||
{
|
{
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(SizeDetailImpl.class);
|
private static final Logger LOG = LoggerFactory.getLogger(SizeDetailsImpl.class);
|
||||||
private static final String STATUS = "status";
|
private static final String STATUS = "status";
|
||||||
private static final String ACTIONID = "actionId";
|
private static final String ACTIONID = "actionId";
|
||||||
private static final String INVALID_NODEID = "Invalid parameter: value of nodeId is invalid";
|
private static final String INVALID_NODEID = "Invalid parameter: value of nodeId is invalid";
|
||||||
@@ -97,37 +97,41 @@ public class SizeDetailImpl implements SizeDetail
|
|||||||
this.defaultItems = defaultItems;
|
this.defaultItems = defaultItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* generateNodeSizeDetailsRequest : providing HTTP STATUS 202 with jobId.
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public NodeSizeDetail generateNodeSizeDetailsRequest(String nodeId) {
|
public NodeSizeDetails generateNodeSizeDetailsRequest(String nodeId)
|
||||||
|
{
|
||||||
NodeRef nodeRef = nodes.validateNode(nodeId);
|
NodeRef nodeRef = nodes.validateNode(nodeId);
|
||||||
validateType(nodeRef);
|
validateType(nodeRef);
|
||||||
String actionId;
|
String actionId;
|
||||||
if(simpleCache.get(nodeId) == null)
|
if(simpleCache.get(nodeId) == null)
|
||||||
{
|
{
|
||||||
actionId = executeAction(nodeRef, defaultItems, simpleCache);
|
actionId = executeAction(nodeRef, defaultItems, simpleCache);
|
||||||
} else {
|
} else
|
||||||
|
{
|
||||||
Map<String, Object> result = simpleCache.get(nodeRef.getId());
|
Map<String, Object> result = simpleCache.get(nodeRef.getId());
|
||||||
actionId = (String)result.get(ACTIONID);
|
actionId = (String)result.get(ACTIONID);
|
||||||
}
|
}
|
||||||
return new NodeSizeDetail(actionId);
|
return new NodeSizeDetails(actionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* calculateNodeSize : providing HTTP STATUS 202 which signifies REQUEST ACCEPTED.
|
* getNodeSizeDetails : providing HTTP STATUS 200 with NodeSizeDetails data from cache.
|
||||||
* HTTP STATUS 200 will provide the size details response from cache.
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public NodeSizeDetail getNodeSizeDetails(final String nodeId, final String jobId)
|
public NodeSizeDetails getNodeSizeDetails(final String nodeId, final String jobId)
|
||||||
{
|
{
|
||||||
NodeRef nodeRef = nodes.validateNode(nodeId);
|
NodeRef nodeRef = nodes.validateNode(nodeId);
|
||||||
validateType(nodeRef);
|
validateType(nodeRef);
|
||||||
|
|
||||||
if(simpleCache.get(nodeId) == null)
|
if(simpleCache.get(nodeId) == null)
|
||||||
{
|
{
|
||||||
return new NodeSizeDetail(nodeId, NOT_INITIATED.name());
|
return new NodeSizeDetails(nodeId, NOT_INITIATED.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG.debug("Executing NodeSizeDetailActionExecuter from calculateNodeSize method");
|
LOG.debug("Executing executorResultToSizeDetail method");
|
||||||
return executorResultToSizeDetail(simpleCache.get(nodeId), nodeId, jobId);
|
return executorResultToSizeDetail(simpleCache.get(nodeId), nodeId, jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,11 +155,11 @@ public class SizeDetailImpl implements SizeDetail
|
|||||||
/**
|
/**
|
||||||
* Converting action executor response to their respective model class.
|
* Converting action executor response to their respective model class.
|
||||||
*/
|
*/
|
||||||
private NodeSizeDetail executorResultToSizeDetail(final Map<String,Object> result, String nodeId, String jobId)
|
private NodeSizeDetails executorResultToSizeDetail(final Map<String,Object> result, String nodeId, String jobId)
|
||||||
{
|
{
|
||||||
if(result.containsKey(NodeSizeDetailActionExecutor.EXCEPTION))
|
if(result.containsKey(NodeSizeDetailActionExecutor.EXCEPTION))
|
||||||
{
|
{
|
||||||
return new NodeSizeDetail(nodeId, COMPLETED.name());
|
return new NodeSizeDetails(nodeId, COMPLETED.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for the presence of "size" key.
|
// Check for the presence of "size" key.
|
||||||
@@ -163,21 +167,22 @@ public class SizeDetailImpl implements SizeDetail
|
|||||||
|
|
||||||
if (hasSizeKey)
|
if (hasSizeKey)
|
||||||
{
|
{
|
||||||
NodeSizeDetail nodeSizeDetail = new NodeSizeDetail((String) result.get("nodeId"),
|
NodeSizeDetails nodeSizeDetails = new NodeSizeDetails((String) result.get("nodeId"),
|
||||||
(Long) result.get("size"),
|
(Long) result.get("size"),
|
||||||
(String) result.get("calculatedAt"),
|
(String) result.get("calculatedAt"),
|
||||||
(Integer) result.get("numberOfFiles"),
|
(Integer) result.get("numberOfFiles"),
|
||||||
COMPLETED.name(),
|
COMPLETED.name(),
|
||||||
(String) result.get(ACTIONID));
|
(String) result.get(ACTIONID));
|
||||||
|
|
||||||
if(!nodeSizeDetail.getJobId().equalsIgnoreCase(jobId)) {
|
if(!nodeSizeDetails.getJobId().equalsIgnoreCase(jobId))
|
||||||
|
{
|
||||||
throw new UnprocessableContentException(INVALID_JOBID);
|
throw new UnprocessableContentException(INVALID_JOBID);
|
||||||
}
|
}
|
||||||
return nodeSizeDetail;
|
return nodeSizeDetails;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new NodeSizeDetail(nodeId, IN_PROGRESS.name());
|
return new NodeSizeDetails(nodeId, IN_PROGRESS.name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@@ -25,9 +25,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.rest.api.model;
|
package org.alfresco.rest.api.model;
|
||||||
|
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class NodeSizeDetail
|
public class NodeSizeDetails
|
||||||
{
|
{
|
||||||
private String nodeId;
|
private String nodeId;
|
||||||
private Long size;
|
private Long size;
|
||||||
@@ -36,16 +38,18 @@ public class NodeSizeDetail
|
|||||||
private String status;
|
private String status;
|
||||||
private String jobId;
|
private String jobId;
|
||||||
|
|
||||||
public NodeSizeDetail(String jobId) {
|
public NodeSizeDetails(String jobId)
|
||||||
|
{
|
||||||
this.jobId = jobId;
|
this.jobId = jobId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NodeSizeDetail(String nodeId, String status) {
|
public NodeSizeDetails(String nodeId, String status)
|
||||||
|
{
|
||||||
this.nodeId = nodeId;
|
this.nodeId = nodeId;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NodeSizeDetail(String nodeId, Long size, String calculatedAt, Integer numberOfFiles, String status, String jobId)
|
public NodeSizeDetails(String nodeId, Long size, String calculatedAt, Integer numberOfFiles, String status, String jobId)
|
||||||
{
|
{
|
||||||
this.nodeId = nodeId;
|
this.nodeId = nodeId;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
@@ -105,26 +109,46 @@ public class NodeSizeDetail
|
|||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getJobId() { return jobId; }
|
public String getJobId()
|
||||||
|
{
|
||||||
|
return jobId;
|
||||||
|
}
|
||||||
|
|
||||||
public void setJobId(String jobId) { this.jobId = jobId; }
|
public void setJobId(String jobId)
|
||||||
|
{
|
||||||
|
this.jobId = jobId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String parseJson(JSONObject jsonObject)
|
||||||
|
{
|
||||||
|
if (jsonObject == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String jobId = (String)jsonObject.get("jobId");
|
||||||
|
return jobId;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o)
|
||||||
|
{
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
NodeSizeDetail that = (NodeSizeDetail) o;
|
NodeSizeDetails that = (NodeSizeDetails) o;
|
||||||
return Objects.equals(nodeId, that.nodeId) && Objects.equals(size, that.size) && Objects.equals(calculatedAt, that.calculatedAt) && Objects.equals(numberOfFiles, that.numberOfFiles) && Objects.equals(status, that.status) && Objects.equals(jobId, that.jobId);
|
return Objects.equals(nodeId, that.nodeId) && Objects.equals(size, that.size) && Objects.equals(calculatedAt, that.calculatedAt) && Objects.equals(numberOfFiles, that.numberOfFiles) && Objects.equals(status, that.status) && Objects.equals(jobId, that.jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode()
|
||||||
|
{
|
||||||
return Objects.hash(nodeId, size, calculatedAt, numberOfFiles, status, jobId);
|
return Objects.hash(nodeId, size, calculatedAt, numberOfFiles, status, jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString()
|
||||||
return "NodeSizeDetail{" +
|
{
|
||||||
|
return "NodeSizeDetails{" +
|
||||||
"nodeId='" + nodeId + '\'' +
|
"nodeId='" + nodeId + '\'' +
|
||||||
", size=" + size +
|
", size=" + size +
|
||||||
", calculatedAt='" + calculatedAt + '\'' +
|
", calculatedAt='" + calculatedAt + '\'' +
|
@@ -2,7 +2,7 @@
|
|||||||
* #%L
|
* #%L
|
||||||
* Alfresco Remote API
|
* Alfresco Remote API
|
||||||
* %%
|
* %%
|
||||||
* Copyright (C) 2005 - 2023 Alfresco Software Limited
|
* Copyright (C) 2005 - 2024 Alfresco Software Limited
|
||||||
* %%
|
* %%
|
||||||
* This file is part of the Alfresco software.
|
* This file is part of the Alfresco software.
|
||||||
* If the software was purchased under a paid Alfresco license, the terms of
|
* If the software was purchased under a paid Alfresco license, the terms of
|
||||||
@@ -27,8 +27,8 @@
|
|||||||
package org.alfresco.rest.api.nodes;
|
package org.alfresco.rest.api.nodes;
|
||||||
|
|
||||||
import org.alfresco.rest.api.Nodes;
|
import org.alfresco.rest.api.Nodes;
|
||||||
import org.alfresco.rest.api.SizeDetail;
|
import org.alfresco.rest.api.SizeDetails;
|
||||||
import org.alfresco.rest.api.model.NodeSizeDetail;
|
import org.alfresco.rest.api.model.NodeSizeDetails;
|
||||||
import org.alfresco.rest.framework.WebApiDescription;
|
import org.alfresco.rest.framework.WebApiDescription;
|
||||||
import org.alfresco.rest.framework.WebApiParam;
|
import org.alfresco.rest.framework.WebApiParam;
|
||||||
import org.alfresco.rest.framework.WebApiParameters;
|
import org.alfresco.rest.framework.WebApiParameters;
|
||||||
@@ -47,22 +47,22 @@ import java.util.List;
|
|||||||
|
|
||||||
@RelationshipResource(name = "size-details", entityResource = NodesEntityResource.class, title = "Node Size Details")
|
@RelationshipResource(name = "size-details", entityResource = NodesEntityResource.class, title = "Node Size Details")
|
||||||
public class NodeSizeDetailsRelation implements
|
public class NodeSizeDetailsRelation implements
|
||||||
RelationshipResourceAction.ReadById<NodeSizeDetail>,
|
RelationshipResourceAction.ReadById<NodeSizeDetails>,
|
||||||
RelationshipResourceAction.Create<NodeSizeDetail>,
|
RelationshipResourceAction.Create<NodeSizeDetails>,
|
||||||
InitializingBean {
|
InitializingBean {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(NodeSizeDetailsRelation.class);
|
private static final Logger LOG = LoggerFactory.getLogger(NodeSizeDetailsRelation.class);
|
||||||
private Nodes nodes;
|
private Nodes nodes;
|
||||||
private SizeDetail sizeDetail;
|
private SizeDetails sizeDetails;
|
||||||
|
|
||||||
public void setNodes(Nodes nodes)
|
public void setNodes(Nodes nodes)
|
||||||
{
|
{
|
||||||
this.nodes = nodes;
|
this.nodes = nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSizeDetail(SizeDetail sizeDetail)
|
public void setSizeDetails(SizeDetails sizeDetails)
|
||||||
{
|
{
|
||||||
this.sizeDetail = sizeDetail;
|
this.sizeDetails = sizeDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -75,9 +75,10 @@ public class NodeSizeDetailsRelation implements
|
|||||||
@WebApiParam(name="nodeSizeEntity", title="Node Size Details Request", description="Request for processing Node Size.",
|
@WebApiParam(name="nodeSizeEntity", title="Node Size Details Request", description="Request for processing Node Size.",
|
||||||
kind= ResourceParameter.KIND.HTTP_BODY_OBJECT, allowMultiple=false)
|
kind= ResourceParameter.KIND.HTTP_BODY_OBJECT, allowMultiple=false)
|
||||||
@Override
|
@Override
|
||||||
public List<NodeSizeDetail> create(String nodeId, List<NodeSizeDetail> nodeSizeEntity, Parameters parameters) {
|
public List<NodeSizeDetails> create(String nodeId, List<NodeSizeDetails> nodeSizeEntity, Parameters parameters)
|
||||||
|
{
|
||||||
LOG.debug(" Executing generateNodeSizeDetailsRequest method ");
|
LOG.debug(" Executing generateNodeSizeDetailsRequest method ");
|
||||||
return Arrays.asList(sizeDetail.generateNodeSizeDetailsRequest(nodeId));
|
return Arrays.asList(sizeDetails.generateNodeSizeDetailsRequest(nodeId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@WebApiDescription(title = "Get Node Size Details", description = "Get the Node Size Details")
|
@WebApiDescription(title = "Get Node Size Details", description = "Get the Node Size Details")
|
||||||
@@ -85,8 +86,9 @@ public class NodeSizeDetailsRelation implements
|
|||||||
@WebApiParam(name="nodeId", title="The unique id of the Node being addressed", description="A single node id"),
|
@WebApiParam(name="nodeId", title="The unique id of the Node being addressed", description="A single node id"),
|
||||||
@WebApiParam(name="jobId", title="Job Id to get the NodeSizeDetails", description="JobId")})
|
@WebApiParam(name="jobId", title="Job Id to get the NodeSizeDetails", description="JobId")})
|
||||||
@Override
|
@Override
|
||||||
public NodeSizeDetail readById(String nodeId, String jobId, Parameters parameters) throws RelationshipResourceNotFoundException {
|
public NodeSizeDetails readById(String nodeId, String jobId, Parameters parameters) throws RelationshipResourceNotFoundException
|
||||||
|
{
|
||||||
LOG.debug(" Executing getNodeSizeDetails method ");
|
LOG.debug(" Executing getNodeSizeDetails method ");
|
||||||
return sizeDetail.getNodeSizeDetails(nodeId,jobId);
|
return sizeDetails.getNodeSizeDetails(nodeId,jobId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -996,7 +996,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="sizeDetailImpl" class="org.alfresco.rest.api.impl.SizeDetailImpl">
|
<bean id="sizeDetailsImpl" class="org.alfresco.rest.api.impl.SizeDetailsImpl">
|
||||||
<property name="nodes" ref="nodes" />
|
<property name="nodes" ref="nodes" />
|
||||||
<property name="nodeService" ref="NodeService" />
|
<property name="nodeService" ref="NodeService" />
|
||||||
<property name="permissionService" ref="permissionService"/>
|
<property name="permissionService" ref="permissionService"/>
|
||||||
@@ -1005,12 +1005,12 @@
|
|||||||
<property name="defaultItems" value="${alfresco.restApi.calculateFolderSize.items}"/>
|
<property name="defaultItems" value="${alfresco.restApi.calculateFolderSize.items}"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="sizeDetail" class="org.springframework.aop.framework.ProxyFactoryBean">
|
<bean id="sizeDetails" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||||
<property name="proxyInterfaces">
|
<property name="proxyInterfaces">
|
||||||
<value>org.alfresco.rest.api.SizeDetail</value>
|
<value>org.alfresco.rest.api.SizeDetails</value>
|
||||||
</property>
|
</property>
|
||||||
<property name="target">
|
<property name="target">
|
||||||
<ref bean="sizeDetailImpl" />
|
<ref bean="sizeDetailsImpl" />
|
||||||
</property>
|
</property>
|
||||||
<property name="interceptorNames">
|
<property name="interceptorNames">
|
||||||
<list>
|
<list>
|
||||||
@@ -1796,6 +1796,6 @@
|
|||||||
|
|
||||||
<bean class="org.alfresco.rest.api.nodes.NodeSizeDetailsRelation">
|
<bean class="org.alfresco.rest.api.nodes.NodeSizeDetailsRelation">
|
||||||
<property name="nodes" ref="nodes" />
|
<property name="nodes" ref="nodes" />
|
||||||
<property name="sizeDetail" ref="sizeDetail" />
|
<property name="sizeDetails" ref="sizeDetails" />
|
||||||
</bean>
|
</bean>
|
||||||
</beans>
|
</beans>
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco;
|
package org.alfresco;
|
||||||
|
|
||||||
import org.alfresco.rest.api.tests.NodeSizeDetailTest;
|
import org.alfresco.rest.api.tests.NodeSizeDetailsTest;
|
||||||
import org.alfresco.util.testing.category.DBTests;
|
import org.alfresco.util.testing.category.DBTests;
|
||||||
import org.alfresco.util.testing.category.NonBuildTests;
|
import org.alfresco.util.testing.category.NonBuildTests;
|
||||||
import org.junit.experimental.categories.Categories;
|
import org.junit.experimental.categories.Categories;
|
||||||
@@ -77,7 +77,7 @@ import org.junit.runners.Suite;
|
|||||||
org.alfresco.rest.api.tests.BufferedResponseTest.class,
|
org.alfresco.rest.api.tests.BufferedResponseTest.class,
|
||||||
org.alfresco.rest.workflow.api.tests.DeploymentWorkflowApiTest.class,
|
org.alfresco.rest.workflow.api.tests.DeploymentWorkflowApiTest.class,
|
||||||
org.alfresco.rest.workflow.api.tests.ProcessDefinitionWorkflowApiTest.class,
|
org.alfresco.rest.workflow.api.tests.ProcessDefinitionWorkflowApiTest.class,
|
||||||
org.alfresco.rest.api.tests.NodeSizeDetailTest.class
|
org.alfresco.rest.api.tests.NodeSizeDetailsTest.class
|
||||||
})
|
})
|
||||||
public class AppContext02TestSuite
|
public class AppContext02TestSuite
|
||||||
{
|
{
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
package org.alfresco;
|
package org.alfresco;
|
||||||
|
|
||||||
import org.alfresco.repo.web.scripts.TestWebScriptRepoServer;
|
import org.alfresco.repo.web.scripts.TestWebScriptRepoServer;
|
||||||
import org.alfresco.rest.api.impl.SizeDetailImplTest;
|
import org.alfresco.rest.api.impl.SizeDetailsImplTest;
|
||||||
import org.alfresco.util.testing.category.DBTests;
|
import org.alfresco.util.testing.category.DBTests;
|
||||||
import org.alfresco.util.testing.category.NonBuildTests;
|
import org.alfresco.util.testing.category.NonBuildTests;
|
||||||
import org.junit.experimental.categories.Categories;
|
import org.junit.experimental.categories.Categories;
|
||||||
@@ -79,7 +79,7 @@ import org.junit.runners.Suite;
|
|||||||
org.alfresco.rest.api.impl.CommentsImplUnitTest.class,
|
org.alfresco.rest.api.impl.CommentsImplUnitTest.class,
|
||||||
org.alfresco.rest.api.impl.DownloadsImplCheckArchiveStatusUnitTest.class,
|
org.alfresco.rest.api.impl.DownloadsImplCheckArchiveStatusUnitTest.class,
|
||||||
org.alfresco.rest.api.impl.RestApiDirectUrlConfigUnitTest.class,
|
org.alfresco.rest.api.impl.RestApiDirectUrlConfigUnitTest.class,
|
||||||
org.alfresco.rest.api.impl.SizeDetailImplTest.class
|
org.alfresco.rest.api.impl.SizeDetailsImplTest.class
|
||||||
})
|
})
|
||||||
public class AppContext04TestSuite
|
public class AppContext04TestSuite
|
||||||
{
|
{
|
||||||
|
@@ -29,7 +29,7 @@ import org.alfresco.repo.action.executer.NodeSizeDetailActionExecutor;
|
|||||||
import org.alfresco.repo.cache.SimpleCache;
|
import org.alfresco.repo.cache.SimpleCache;
|
||||||
import org.alfresco.rest.api.Nodes;
|
import org.alfresco.rest.api.Nodes;
|
||||||
import org.alfresco.rest.api.model.Node;
|
import org.alfresco.rest.api.model.Node;
|
||||||
import org.alfresco.rest.api.model.NodeSizeDetail;
|
import org.alfresco.rest.api.model.NodeSizeDetails;
|
||||||
import org.alfresco.service.cmr.action.Action;
|
import org.alfresco.service.cmr.action.Action;
|
||||||
import org.alfresco.service.cmr.action.ActionService;
|
import org.alfresco.service.cmr.action.ActionService;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
@@ -42,18 +42,18 @@ import org.junit.Test;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for {@link SizeDetailImpl} class.
|
* Unit tests for {@link SizeDetailsImpl} class.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class SizeDetailImplTest
|
public class SizeDetailsImplTest
|
||||||
{
|
{
|
||||||
private final static int DEFAULT_ITEMS = 1000;
|
private final static int DEFAULT_ITEMS = 1000;
|
||||||
private SizeDetailImpl sizeDetailImpl;
|
private SizeDetailsImpl sizeDetailsImpl;
|
||||||
private Nodes nodes;
|
private Nodes nodes;
|
||||||
private NodeService nodeService;
|
private NodeService nodeService;
|
||||||
private ActionService actionService;
|
private ActionService actionService;
|
||||||
@@ -64,7 +64,7 @@ public class SizeDetailImplTest
|
|||||||
@Before
|
@Before
|
||||||
public void setUp()
|
public void setUp()
|
||||||
{
|
{
|
||||||
sizeDetailImpl = new SizeDetailImpl();
|
sizeDetailsImpl = new SizeDetailsImpl();
|
||||||
nodes = mock(Nodes.class);
|
nodes = mock(Nodes.class);
|
||||||
nodeService = mock(NodeService.class);
|
nodeService = mock(NodeService.class);
|
||||||
PermissionService permissionService = mock(PermissionService.class);
|
PermissionService permissionService = mock(PermissionService.class);
|
||||||
@@ -72,19 +72,20 @@ public class SizeDetailImplTest
|
|||||||
action = mock(Action.class);
|
action = mock(Action.class);
|
||||||
SimpleCache<Serializable, Map<String, Object>> simpleCache = mock(SimpleCache.class);
|
SimpleCache<Serializable, Map<String, Object>> simpleCache = mock(SimpleCache.class);
|
||||||
|
|
||||||
sizeDetailImpl.setNodes(nodes);
|
sizeDetailsImpl.setNodes(nodes);
|
||||||
sizeDetailImpl.setNodeService(nodeService);
|
sizeDetailsImpl.setNodeService(nodeService);
|
||||||
sizeDetailImpl.setPermissionService(permissionService);
|
sizeDetailsImpl.setPermissionService(permissionService);
|
||||||
sizeDetailImpl.setActionService(actionService);
|
sizeDetailsImpl.setActionService(actionService);
|
||||||
sizeDetailImpl.setSimpleCache(simpleCache);
|
sizeDetailsImpl.setSimpleCache(simpleCache);
|
||||||
sizeDetailImpl.setDefaultItems(DEFAULT_ITEMS);
|
sizeDetailsImpl.setDefaultItems(DEFAULT_ITEMS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void calculateNodeSize()
|
public void calculateNodeSizeDetails()
|
||||||
{
|
{
|
||||||
String nodeName = "folderNode";
|
String nodeName = "folderNode";
|
||||||
String nodeId = "node-id";
|
String nodeId = "node-id";
|
||||||
|
String jobId = "job-id";
|
||||||
NodeRef nodeRef = new NodeRef("protocol", "identifier", nodeId);
|
NodeRef nodeRef = new NodeRef("protocol", "identifier", nodeId);
|
||||||
action.setTrackStatus(true);
|
action.setTrackStatus(true);
|
||||||
action.setExecuteAsynchronously(true);
|
action.setExecuteAsynchronously(true);
|
||||||
@@ -101,8 +102,13 @@ public class SizeDetailImplTest
|
|||||||
when(nodes.getNode(nodeId)).thenReturn(node);
|
when(nodes.getNode(nodeId)).thenReturn(node);
|
||||||
when(nodeService.getType(nodeRef)).thenReturn(TYPE_FOLDER);
|
when(nodeService.getType(nodeRef)).thenReturn(TYPE_FOLDER);
|
||||||
when(actionService.createAction(NodeSizeDetailActionExecutor.NAME)).thenReturn(action);
|
when(actionService.createAction(NodeSizeDetailActionExecutor.NAME)).thenReturn(action);
|
||||||
NodeSizeDetail nodeSizeDetail = sizeDetailImpl.getNodeSizeDetails(nodeId,"");
|
|
||||||
assertNull("After executing POST/request-size-detail first time, it will provide null with 202 status code", nodeSizeDetail);
|
NodeSizeDetails requestSizeDetails = sizeDetailsImpl.generateNodeSizeDetailsRequest(nodeId);
|
||||||
|
assertNotNull("After executing POST/size-details, it will provide with 202 status code", requestSizeDetails);
|
||||||
|
|
||||||
|
NodeSizeDetails nodeSizeDetails = sizeDetailsImpl.getNodeSizeDetails(nodeId,jobId);
|
||||||
|
assertNotNull("After executing GET/size-details, it will provide with 200 status code", nodeSizeDetails);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -105,7 +105,7 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
|||||||
|
|
||||||
private static final String URL_CHILDREN = "children";
|
private static final String URL_CHILDREN = "children";
|
||||||
private static final String URL_CONTENT = "content";
|
private static final String URL_CONTENT = "content";
|
||||||
private static final String URL_CALCULATEFOLDERSIZE = "request-size-detail";
|
private static final String URL_CALCULATEFOLDERSIZE = "size-details";
|
||||||
|
|
||||||
protected static final String TYPE_CM_FOLDER = "cm:folder";
|
protected static final String TYPE_CM_FOLDER = "cm:folder";
|
||||||
protected static final String TYPE_CM_CONTENT = "cm:content";
|
protected static final String TYPE_CM_CONTENT = "cm:content";
|
||||||
@@ -1122,9 +1122,14 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
|||||||
restDauConfig.setEnabled(false);
|
restDauConfig.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getCalculateFolderSizeUrl(String nodeId)
|
protected String generateNodeSizeDetailsUrl(String nodeId)
|
||||||
{
|
{
|
||||||
return URL_NODES + "/" + nodeId + "/" + URL_CALCULATEFOLDERSIZE;
|
return URL_NODES + "/" + nodeId + "/" + URL_CALCULATEFOLDERSIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getNodeSizeDetailsUrl(String nodeId, String jobId)
|
||||||
|
{
|
||||||
|
return URL_NODES + "/" + nodeId + "/" + URL_CALCULATEFOLDERSIZE + "/" + jobId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -26,16 +26,15 @@
|
|||||||
package org.alfresco.rest.api.tests;
|
package org.alfresco.rest.api.tests;
|
||||||
|
|
||||||
import org.alfresco.rest.api.Nodes;
|
import org.alfresco.rest.api.Nodes;
|
||||||
|
import org.alfresco.rest.api.model.NodeSizeDetails;
|
||||||
import org.alfresco.rest.api.model.Site;
|
import org.alfresco.rest.api.model.Site;
|
||||||
import org.alfresco.rest.api.tests.client.HttpResponse;
|
import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||||
import org.alfresco.rest.api.tests.client.PublicApiClient;
|
import org.alfresco.rest.api.tests.client.PublicApiClient;
|
||||||
import org.alfresco.rest.api.tests.client.data.ContentInfo;
|
import org.alfresco.rest.api.tests.client.data.*;
|
||||||
import org.alfresco.rest.api.tests.client.data.Document;
|
|
||||||
import org.alfresco.rest.api.tests.client.data.UserInfo;
|
|
||||||
import org.alfresco.rest.api.tests.client.data.Node;
|
|
||||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.alfresco.service.cmr.site.SiteVisibility;
|
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.FixMethodOrder;
|
import org.junit.FixMethodOrder;
|
||||||
@@ -62,9 +61,9 @@ import static org.junit.Assert.assertNull;
|
|||||||
*/
|
*/
|
||||||
@FixMethodOrder (MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder (MethodSorters.NAME_ASCENDING)
|
||||||
@RunWith (JUnit4.class)
|
@RunWith (JUnit4.class)
|
||||||
public class NodeSizeDetailTest extends AbstractBaseApiTest
|
public class NodeSizeDetailsTest extends AbstractBaseApiTest
|
||||||
{
|
{
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(NodeSizeDetailTest.class);
|
private static final Logger LOG = LoggerFactory.getLogger(NodeSizeDetailsTest.class);
|
||||||
|
|
||||||
private Site userOneN1Site;
|
private Site userOneN1Site;
|
||||||
private String folderId;
|
private String folderId;
|
||||||
@@ -92,7 +91,7 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
LOG.error("Exception occurred in NodeSizeDetailTest:addToDocumentLibrary {}", e.getMessage());
|
LOG.error("Exception occurred in NodeSizeDetailsTest:addToDocumentLibrary {}", e.getMessage());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -115,11 +114,13 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test case for POST/request-size-detail, which calculates and retrieve size of a folder.
|
* Test case for POST/size-details, which request and calculates the size of a folder.
|
||||||
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/request-size-detail}
|
* GET/size-details, which retrieve the SizeDetails of the folder Node.
|
||||||
|
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/size-details}
|
||||||
|
* {@literal <host>:<port>/alfresco/api/<networkId>/public/alfresco/versions/1/nodes/<nodeId>/size-details/<jobId>}
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testPostAndGetFolderSize() throws Exception
|
public void testPostAndGetFolderSizeDetails() throws Exception
|
||||||
{
|
{
|
||||||
// Prepare parameters
|
// Prepare parameters
|
||||||
Map<String, String> params = new HashMap<>();
|
Map<String, String> params = new HashMap<>();
|
||||||
@@ -127,14 +128,19 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
params.put("maxItems", "1000");
|
params.put("maxItems", "1000");
|
||||||
|
|
||||||
// Perform POST request
|
// Perform POST request
|
||||||
HttpResponse postResponse = post(getCalculateFolderSizeUrl(folderId), toJsonAsStringNonNull(params), 202);
|
HttpResponse postResponse = post(generateNodeSizeDetailsUrl(folderId), toJsonAsStringNonNull(params), 202);
|
||||||
|
|
||||||
assertNull("After executing POST/request-size-detail first time, it will provide null with 202 status code",postResponse.getJsonResponse());
|
assertNotNull("After executing POST/size-details first time, it will provide jobId with 202 status code",postResponse.getJsonResponse());
|
||||||
|
|
||||||
HttpResponse getResponse = post(getCalculateFolderSizeUrl(folderId), toJsonAsStringNonNull(params), 200);
|
String jobId = NodeSizeDetails.parseJson((JSONObject)postResponse.getJsonResponse().get("entry"));
|
||||||
|
|
||||||
|
assertNotNull("In response, JobId should be present", jobId);
|
||||||
|
|
||||||
|
HttpResponse getResponse = get(getNodeSizeDetailsUrl(folderId, jobId), params, 200);
|
||||||
|
|
||||||
|
assertNotNull("After executing GET/size-details, it will provide NodeSizeDetails with 200 status code",getResponse.getJsonResponse());
|
||||||
|
|
||||||
String getJsonResponse = String.valueOf(getResponse.getJsonResponse());
|
String getJsonResponse = String.valueOf(getResponse.getJsonResponse());
|
||||||
assertNotNull("JSON response should not be null", getJsonResponse);
|
|
||||||
|
|
||||||
assertTrue("We are not getting correct response "+getJsonResponse,getJsonResponse.contains("size") || getJsonResponse.contains("status"));
|
assertTrue("We are not getting correct response "+getJsonResponse,getJsonResponse.contains("size") || getJsonResponse.contains("status"));
|
||||||
}
|
}
|
||||||
@@ -168,7 +174,7 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
List<Node> nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class);
|
List<Node> nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class);
|
||||||
assertEquals(500, nodes.size());
|
assertEquals(500, nodes.size());
|
||||||
|
|
||||||
//Start Time before triggering POST/calculate-folder-size API
|
//Start Time before triggering POST/size-details API
|
||||||
LocalTime expectedTime = LocalTime.now().plusSeconds(5);
|
LocalTime expectedTime = LocalTime.now().plusSeconds(5);
|
||||||
|
|
||||||
// Prepare parameters.
|
// Prepare parameters.
|
||||||
@@ -176,18 +182,23 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
params.put("nodeId", folderId);
|
params.put("nodeId", folderId);
|
||||||
|
|
||||||
// Perform POST request
|
// Perform POST request
|
||||||
HttpResponse postResponse = post(getCalculateFolderSizeUrl(parentFolder), toJsonAsStringNonNull(params), 202);
|
HttpResponse postResponse = post(generateNodeSizeDetailsUrl(parentFolder), toJsonAsStringNonNull(params), 202);
|
||||||
|
|
||||||
assertNull("After executing POST/request-size-detail first time, it will provide null with 202 status code",postResponse.getJsonResponse());
|
assertNull("After executing POST/size-details first time, it will provide jobId with 202 status code",postResponse.getJsonResponse());
|
||||||
|
|
||||||
HttpResponse getResponse = post(getCalculateFolderSizeUrl(parentFolder), toJsonAsStringNonNull(params), 200);
|
String jobId = NodeSizeDetails.parseJson((JSONObject)postResponse.getJsonResponse().get("entry"));
|
||||||
|
|
||||||
|
assertNotNull("In response, JobId should be present", jobId);
|
||||||
|
|
||||||
|
HttpResponse getResponse = get(getNodeSizeDetailsUrl(folderId, jobId), params, 200);
|
||||||
|
|
||||||
|
assertNotNull("After executing GET/size-details, it will provide NodeSizeDetails with 200 status code",getResponse.getJsonResponse());
|
||||||
|
|
||||||
String getJsonResponse = String.valueOf(getResponse.getJsonResponse());
|
String getJsonResponse = String.valueOf(getResponse.getJsonResponse());
|
||||||
assertNotNull("JSON response should not be null", getJsonResponse);
|
|
||||||
|
|
||||||
assertTrue("We are not getting correct response "+getJsonResponse,getJsonResponse.contains("size") || getJsonResponse.contains("status"));
|
assertTrue("We are not getting correct response "+getJsonResponse,getJsonResponse.contains("size") || getJsonResponse.contains("status"));
|
||||||
|
|
||||||
//current Time after executing GET/request-size-details
|
//current Time after executing GET/size-details
|
||||||
LocalTime actualTime = LocalTime.now();
|
LocalTime actualTime = LocalTime.now();
|
||||||
assertTrue("Calculating folder node is taking time greater than 5 seconds ",actualTime.isBefore(expectedTime));
|
assertTrue("Calculating folder node is taking time greater than 5 seconds ",actualTime.isBefore(expectedTime));
|
||||||
}
|
}
|
||||||
@@ -199,12 +210,12 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
public void testHTTPStatus() throws Exception
|
public void testHTTPStatus() throws Exception
|
||||||
{
|
{
|
||||||
setRequestContext(null);
|
setRequestContext(null);
|
||||||
delete(getCalculateFolderSizeUrl(folderId), folderId, null, 401);
|
delete(generateNodeSizeDetailsUrl(folderId), folderId, null, 401);
|
||||||
|
|
||||||
setRequestContext(user1);
|
setRequestContext(user1);
|
||||||
String folderName = "folder0" + System.currentTimeMillis();
|
String folderName = "folder0" + System.currentTimeMillis();
|
||||||
|
|
||||||
HttpResponse responseForNotFound = post(getCalculateFolderSizeUrl(folderName), null, 404);
|
HttpResponse responseForNotFound = post(generateNodeSizeDetailsUrl(folderName), null, 404);
|
||||||
assertNotNull(responseForNotFound);
|
assertNotNull(responseForNotFound);
|
||||||
|
|
||||||
folderName = "folder1" + System.currentTimeMillis();
|
folderName = "folder1" + System.currentTimeMillis();
|
||||||
@@ -219,7 +230,7 @@ public class NodeSizeDetailTest extends AbstractBaseApiTest
|
|||||||
params.put("maxItems", "1000");
|
params.put("maxItems", "1000");
|
||||||
|
|
||||||
// Perform POST request
|
// Perform POST request
|
||||||
HttpResponse responseForInvalidNode = post(getCalculateFolderSizeUrl(n1Id), toJsonAsStringNonNull(params), 422);
|
HttpResponse responseForInvalidNode = post(generateNodeSizeDetailsUrl(n1Id), toJsonAsStringNonNull(params), 422);
|
||||||
assertNotNull(responseForInvalidNode);
|
assertNotNull(responseForInvalidNode);
|
||||||
}
|
}
|
||||||
|
|
@@ -25,7 +25,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco;
|
package org.alfresco;
|
||||||
|
|
||||||
import org.alfresco.repo.action.executer.NodeSizeDetailActionExecutorTest;
|
import org.alfresco.repo.action.executer.NodeSizeDetailsActionExecutorTest;
|
||||||
import org.alfresco.util.testing.category.DBTests;
|
import org.alfresco.util.testing.category.DBTests;
|
||||||
import org.alfresco.util.testing.category.NonBuildTests;
|
import org.alfresco.util.testing.category.NonBuildTests;
|
||||||
import org.junit.experimental.categories.Categories;
|
import org.junit.experimental.categories.Categories;
|
||||||
@@ -79,7 +79,7 @@ import org.junit.runners.Suite;
|
|||||||
org.alfresco.repo.activities.SiteActivityTestCaseInsensitivity.class,
|
org.alfresco.repo.activities.SiteActivityTestCaseInsensitivity.class,
|
||||||
org.alfresco.repo.admin.registry.RegistryServiceImplTest.class,
|
org.alfresco.repo.admin.registry.RegistryServiceImplTest.class,
|
||||||
org.alfresco.repo.bootstrap.DataDictionaryFolderTest.class,
|
org.alfresco.repo.bootstrap.DataDictionaryFolderTest.class,
|
||||||
org.alfresco.repo.action.executer.NodeSizeDetailActionExecutorTest.class
|
org.alfresco.repo.action.executer.NodeSizeDetailsActionExecutorTest.class
|
||||||
})
|
})
|
||||||
public class AppContext01TestSuite
|
public class AppContext01TestSuite
|
||||||
{
|
{
|
||||||
|
@@ -43,7 +43,7 @@ import org.junit.Test;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public class NodeSizeDetailActionExecutorTest extends BaseSpringTest
|
public class NodeSizeDetailsActionExecutorTest extends BaseSpringTest
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The test node reference
|
* The test node reference
|
Reference in New Issue
Block a user