mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
Merged HEAD (5.2) to 5.2.N (5.2.1)
126351 jkaabimofrad: Merged FILE-FOLDER-API (5.2.0) to HEAD (5.2) 118825 jkaabimofrad: RA-655: manual merge of SFS module to FILE-FOLDER-API. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@126696 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -36,6 +36,7 @@ import org.alfresco.rest.api.model.Document;
|
||||
import org.alfresco.rest.api.model.Folder;
|
||||
import org.alfresco.rest.api.model.Node;
|
||||
import org.alfresco.rest.api.model.PathInfo;
|
||||
import org.alfresco.rest.api.model.PathInfo.ElementInfo;
|
||||
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
|
||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
|
||||
import org.alfresco.rest.framework.resource.content.BasicContentInfo;
|
||||
@@ -53,11 +54,14 @@ import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
import org.alfresco.service.cmr.model.FileInfo;
|
||||
import org.alfresco.service.cmr.model.FileNotFoundException;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.ContentData;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.repository.Path;
|
||||
import org.alfresco.service.cmr.repository.Path.Element;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.security.AccessStatus;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
@@ -76,6 +80,7 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@@ -83,6 +88,7 @@ import java.util.Set;
|
||||
*
|
||||
* @author steveglover
|
||||
* @author janv
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*
|
||||
* @since publicapi1.0
|
||||
*/
|
||||
@@ -90,22 +96,36 @@ public class NodesImpl implements Nodes
|
||||
{
|
||||
private static enum Type
|
||||
{
|
||||
// Note: ordered
|
||||
DOCUMENT, FOLDER;
|
||||
// Note: ordered
|
||||
DOCUMENT, FOLDER;
|
||||
};
|
||||
|
||||
|
||||
private final static String PATH_ROOT = "-root-";
|
||||
private final static String PATH_MY = "-my-";
|
||||
private final static String PATH_SHARED = "-shared-";
|
||||
|
||||
private NodeService nodeService;
|
||||
|
||||
private NodeService nodeService;
|
||||
private DictionaryService dictionaryService;
|
||||
private FileFolderService fileFolderService;
|
||||
private NamespaceService namespaceService;
|
||||
private PermissionService permissionService;
|
||||
private Repository repositoryHelper;
|
||||
private ServiceRegistry sr;
|
||||
private Set<String> defaultIgnoreTypes;
|
||||
private Set<QName> ignoreTypeQNames;
|
||||
|
||||
public void init()
|
||||
{
|
||||
if (defaultIgnoreTypes != null)
|
||||
{
|
||||
ignoreTypeQNames = new HashSet<>(defaultIgnoreTypes.size());
|
||||
for (String type : defaultIgnoreTypes)
|
||||
{
|
||||
ignoreTypeQNames.add(createQName(type));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setServiceRegistry(ServiceRegistry sr) {
|
||||
this.sr = sr;
|
||||
|
||||
@@ -121,6 +141,11 @@ public class NodesImpl implements Nodes
|
||||
this.repositoryHelper = repositoryHelper;
|
||||
}
|
||||
|
||||
public void setIgnoreTypes(Set<String> ignoreTypes)
|
||||
{
|
||||
this.defaultIgnoreTypes = ignoreTypes;
|
||||
}
|
||||
|
||||
private static final List<QName> EXCLUDED_ASPECTS = Arrays.asList(
|
||||
ContentModel.ASPECT_REFERENCEABLE,
|
||||
ContentModel.ASPECT_LOCALIZED);
|
||||
@@ -176,47 +201,46 @@ public class NodesImpl implements Nodes
|
||||
new HashSet<>(Arrays.asList(new String[] {PARAM_ISFOLDER}));
|
||||
|
||||
/*
|
||||
*
|
||||
* Note: assumes workspace://SpacesStore
|
||||
*/
|
||||
public NodeRef validateNode(String nodeId)
|
||||
{
|
||||
return validateNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId);
|
||||
}
|
||||
|
||||
public NodeRef validateNode(StoreRef storeRef, String nodeId)
|
||||
{
|
||||
String versionLabel = null;
|
||||
|
||||
int idx = nodeId.indexOf(";");
|
||||
if(idx != -1)
|
||||
{
|
||||
versionLabel = nodeId.substring(idx + 1);
|
||||
nodeId = nodeId.substring(0, idx);
|
||||
if(versionLabel.equals("pwc"))
|
||||
{
|
||||
// TODO correct exception?
|
||||
throw new EntityNotFoundException(nodeId);
|
||||
}
|
||||
}
|
||||
|
||||
NodeRef nodeRef = new NodeRef(storeRef, nodeId);
|
||||
return validateNode(nodeRef);
|
||||
}
|
||||
|
||||
public NodeRef validateNode(NodeRef nodeRef)
|
||||
{
|
||||
if (! nodeService.exists(nodeRef))
|
||||
{
|
||||
throw new EntityNotFoundException(nodeRef.getId());
|
||||
}
|
||||
|
||||
return nodeRef;
|
||||
}
|
||||
|
||||
public boolean nodeMatches(NodeRef nodeRef, Set<QName> expectedTypes, Set<QName> excludedTypes)
|
||||
* Note: assumes workspace://SpacesStore
|
||||
*/
|
||||
public NodeRef validateNode(String nodeId)
|
||||
{
|
||||
if (! nodeService.exists(nodeRef))
|
||||
return validateNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId);
|
||||
}
|
||||
|
||||
public NodeRef validateNode(StoreRef storeRef, String nodeId)
|
||||
{
|
||||
String versionLabel = null;
|
||||
|
||||
int idx = nodeId.indexOf(";");
|
||||
if (idx != -1)
|
||||
{
|
||||
versionLabel = nodeId.substring(idx + 1);
|
||||
nodeId = nodeId.substring(0, idx);
|
||||
if (versionLabel.equals("pwc"))
|
||||
{
|
||||
// TODO correct exception?
|
||||
throw new EntityNotFoundException(nodeId);
|
||||
}
|
||||
}
|
||||
|
||||
NodeRef nodeRef = new NodeRef(storeRef, nodeId);
|
||||
return validateNode(nodeRef);
|
||||
}
|
||||
|
||||
public NodeRef validateNode(NodeRef nodeRef)
|
||||
{
|
||||
if (!nodeService.exists(nodeRef))
|
||||
{
|
||||
throw new EntityNotFoundException(nodeRef.getId());
|
||||
}
|
||||
|
||||
return nodeRef;
|
||||
}
|
||||
|
||||
public boolean nodeMatches(NodeRef nodeRef, Set<QName> expectedTypes, Set<QName> excludedTypes)
|
||||
{
|
||||
if (!nodeService.exists(nodeRef))
|
||||
{
|
||||
throw new EntityNotFoundException(nodeRef.getId());
|
||||
}
|
||||
@@ -226,35 +250,35 @@ public class NodesImpl implements Nodes
|
||||
|
||||
protected boolean typeMatches(QName type, Set<QName> expectedTypes, Set<QName> excludedTypes)
|
||||
{
|
||||
Set<QName> allExpectedTypes = new HashSet<>();
|
||||
if (expectedTypes != null)
|
||||
{
|
||||
for (QName expectedType : expectedTypes)
|
||||
{
|
||||
allExpectedTypes.addAll(dictionaryService.getSubTypes(expectedType, true));
|
||||
}
|
||||
}
|
||||
Set<QName> allExpectedTypes = new HashSet<>();
|
||||
if (expectedTypes != null)
|
||||
{
|
||||
for (QName expectedType : expectedTypes)
|
||||
{
|
||||
allExpectedTypes.addAll(dictionaryService.getSubTypes(expectedType, true));
|
||||
}
|
||||
}
|
||||
|
||||
Set<QName> allExcludedTypes = new HashSet<>();
|
||||
if (excludedTypes != null)
|
||||
{
|
||||
for (QName excludedType : excludedTypes)
|
||||
{
|
||||
allExcludedTypes.addAll(dictionaryService.getSubTypes(excludedType, true));
|
||||
}
|
||||
}
|
||||
Set<QName> allExcludedTypes = new HashSet<>();
|
||||
if (excludedTypes != null)
|
||||
{
|
||||
for (QName excludedType : excludedTypes)
|
||||
{
|
||||
allExcludedTypes.addAll(dictionaryService.getSubTypes(excludedType, true));
|
||||
}
|
||||
}
|
||||
|
||||
boolean inExpected = allExpectedTypes.contains(type);
|
||||
boolean excluded = allExcludedTypes.contains(type);
|
||||
return(inExpected && !excluded);
|
||||
}
|
||||
boolean inExpected = allExpectedTypes.contains(type);
|
||||
boolean excluded = allExcludedTypes.contains(type);
|
||||
return (inExpected && !excluded);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated review usage (backward compat')
|
||||
*/
|
||||
public Node getNode(String nodeId)
|
||||
{
|
||||
NodeRef nodeRef = validateNode(nodeId);
|
||||
NodeRef nodeRef = validateNode(nodeId);
|
||||
|
||||
return new Node(nodeRef, null, nodeService.getProperties(nodeRef), sr);
|
||||
}
|
||||
@@ -266,17 +290,17 @@ public class NodesImpl implements Nodes
|
||||
{
|
||||
return new Node(nodeRef, null, nodeService.getProperties(nodeRef), sr);
|
||||
}
|
||||
|
||||
|
||||
private Type getType(NodeRef nodeRef)
|
||||
{
|
||||
return getType(nodeService.getType(nodeRef));
|
||||
}
|
||||
|
||||
|
||||
private Type getType(QName type)
|
||||
{
|
||||
boolean isContainer = Boolean.valueOf((dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDER) == true &&
|
||||
!dictionaryService.isSubClass(type, ContentModel.TYPE_SYSTEM_FOLDER)));
|
||||
return isContainer ? Type.FOLDER : Type.DOCUMENT;
|
||||
boolean isContainer = Boolean.valueOf((dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDER) == true
|
||||
&& !dictionaryService.isSubClass(type, ContentModel.TYPE_SYSTEM_FOLDER)));
|
||||
return isContainer ? Type.FOLDER : Type.DOCUMENT;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -284,14 +308,14 @@ public class NodesImpl implements Nodes
|
||||
*/
|
||||
public Document getDocument(NodeRef nodeRef)
|
||||
{
|
||||
Type type = getType(nodeRef);
|
||||
if (type.equals(Type.DOCUMENT))
|
||||
Type type = getType(nodeRef);
|
||||
if (type.equals(Type.DOCUMENT))
|
||||
{
|
||||
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
|
||||
|
||||
Document doc = new Document(nodeRef, getParentNodeRef(nodeRef), properties, sr);
|
||||
|
||||
doc.setVersionLabel((String)properties.get(ContentModel.PROP_VERSION_LABEL));
|
||||
doc.setVersionLabel((String) properties.get(ContentModel.PROP_VERSION_LABEL));
|
||||
ContentData cd = (ContentData) properties.get(ContentModel.PROP_CONTENT);
|
||||
if (cd != null)
|
||||
{
|
||||
@@ -300,12 +324,12 @@ public class NodesImpl implements Nodes
|
||||
}
|
||||
|
||||
setCommonProps(doc, nodeRef, properties);
|
||||
return doc;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("Node is not a file");
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("Node is not a file");
|
||||
}
|
||||
}
|
||||
|
||||
private void setCommonProps(Node node, NodeRef nodeRef, Map<QName,Serializable> properties)
|
||||
@@ -316,25 +340,25 @@ public class NodesImpl implements Nodes
|
||||
node.setModifiedBy((String)properties.get(ContentModel.PROP_MODIFIER));
|
||||
node.setCreatedBy((String)properties.get(ContentModel.PROP_CREATOR));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @deprecated note: currently required for backwards compat' (Favourites API)
|
||||
*/
|
||||
public Folder getFolder(NodeRef nodeRef)
|
||||
{
|
||||
Type type = getType(nodeRef);
|
||||
if (type.equals(Type.FOLDER))
|
||||
{
|
||||
Type type = getType(nodeRef);
|
||||
if (type.equals(Type.FOLDER))
|
||||
{
|
||||
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
|
||||
|
||||
Folder folder = new Folder(nodeRef, getParentNodeRef(nodeRef), properties, sr);
|
||||
Folder folder = new Folder(nodeRef, getParentNodeRef(nodeRef), properties, sr);
|
||||
setCommonProps(folder, nodeRef, properties);
|
||||
return folder;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("Node is not a folder");
|
||||
}
|
||||
return folder;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("Node is not a folder");
|
||||
}
|
||||
}
|
||||
|
||||
private NodeRef getParentNodeRef(final NodeRef nodeRef) {
|
||||
@@ -346,38 +370,44 @@ public class NodesImpl implements Nodes
|
||||
|
||||
return nodeService.getPrimaryParent(nodeRef).getParentRef();
|
||||
}
|
||||
|
||||
private NodeRef validateOrLookupNode(String nodeId, String path) {
|
||||
NodeRef parentNodeRef;
|
||||
|
||||
if (nodeId.equals(PATH_ROOT))
|
||||
{
|
||||
parentNodeRef = repositoryHelper.getCompanyHome();
|
||||
}
|
||||
private NodeRef validateOrLookupNode(String nodeId, String path)
|
||||
{
|
||||
NodeRef parentNodeRef;
|
||||
|
||||
if (nodeId.equals(PATH_ROOT))
|
||||
{
|
||||
parentNodeRef = repositoryHelper.getCompanyHome();
|
||||
}
|
||||
else if (nodeId.equals(PATH_SHARED))
|
||||
{
|
||||
parentNodeRef = repositoryHelper.getSharedHome();
|
||||
}
|
||||
else if (nodeId.equals(PATH_MY))
|
||||
{
|
||||
NodeRef person = repositoryHelper.getPerson();
|
||||
if (person == null)
|
||||
{
|
||||
throw new IllegalArgumentException("Unexpected: cannot use "+PATH_MY);
|
||||
}
|
||||
parentNodeRef = repositoryHelper.getUserHome(person);
|
||||
}
|
||||
else
|
||||
{
|
||||
parentNodeRef = validateNode(nodeId);
|
||||
}
|
||||
else if (nodeId.equals(PATH_MY))
|
||||
{
|
||||
NodeRef person = repositoryHelper.getPerson();
|
||||
if (person == null)
|
||||
{
|
||||
throw new InvalidArgumentException("Unexpected: cannot use " + PATH_MY);
|
||||
}
|
||||
parentNodeRef = repositoryHelper.getUserHome(person);
|
||||
if (parentNodeRef == null)
|
||||
{
|
||||
throw new EntityNotFoundException(nodeId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parentNodeRef = validateNode(nodeId);
|
||||
}
|
||||
|
||||
if (path != null) {
|
||||
if (path != null)
|
||||
{
|
||||
// resolve path relative to current nodeId
|
||||
parentNodeRef = resolveNodeByPath(parentNodeRef, path, true);
|
||||
}
|
||||
|
||||
return parentNodeRef;
|
||||
return parentNodeRef;
|
||||
}
|
||||
|
||||
protected NodeRef resolveNodeByPath(final NodeRef parentNodeRef, String path, boolean checkForCompanyHome)
|
||||
@@ -431,116 +461,176 @@ public class NodesImpl implements Nodes
|
||||
|
||||
return fileInfo.getNodeRef();
|
||||
}
|
||||
|
||||
public Node getFolderOrDocument(String nodeId, Parameters parameters)
|
||||
{
|
||||
String path = parameters.getParameter("path");
|
||||
NodeRef nodeRef = validateOrLookupNode(nodeId, path);
|
||||
|
||||
QName typeQName = nodeService.getType(nodeRef);
|
||||
return getFolderOrDocument(nodeRef, getParentNodeRef(nodeRef), typeQName, false);
|
||||
}
|
||||
|
||||
private Node getFolderOrDocument(final NodeRef nodeRef, NodeRef parentNodeRef, QName typeQName, boolean minimalnfo)
|
||||
public Node getFolderOrDocument(String nodeId, Parameters parameters)
|
||||
{
|
||||
PathInfo pathInfo = null;
|
||||
if (! minimalnfo)
|
||||
String path = parameters.getParameter("path");
|
||||
NodeRef nodeRef = validateOrLookupNode(nodeId, path);
|
||||
|
||||
QName typeQName = nodeService.getType(nodeRef);
|
||||
List<QName> requestedProperties = createQNames(parameters.getSelectedProperties());
|
||||
return getFolderOrDocument(nodeRef, getParentNodeRef(nodeRef), typeQName, requestedProperties, false);
|
||||
}
|
||||
|
||||
private Node getFolderOrDocument(final NodeRef nodeRef, NodeRef parentNodeRef, QName typeQName, List<QName> selectedProperties, boolean minimalnfo)
|
||||
{
|
||||
PathInfo pathInfo = null;
|
||||
if (!minimalnfo)
|
||||
{
|
||||
pathInfo = lookupPathInfo(nodeRef);
|
||||
}
|
||||
|
||||
|
||||
Type type = getType(typeQName);
|
||||
|
||||
Node node;
|
||||
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
|
||||
|
||||
if (type.equals(Type.DOCUMENT))
|
||||
{
|
||||
node = new Document(nodeRef, parentNodeRef, properties, sr);
|
||||
}
|
||||
else if (type.equals(Type.FOLDER))
|
||||
{
|
||||
// container/folder
|
||||
node = new Folder(nodeRef, parentNodeRef, properties, sr);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("Node is not a folder or file");
|
||||
}
|
||||
if (type.equals(Type.DOCUMENT))
|
||||
{
|
||||
node = new Document(nodeRef, parentNodeRef, properties, sr);
|
||||
}
|
||||
else if (type.equals(Type.FOLDER))
|
||||
{
|
||||
// container/folder
|
||||
node = new Folder(nodeRef, parentNodeRef, properties, sr);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("Node is not a folder or file");
|
||||
}
|
||||
|
||||
if (! minimalnfo) {
|
||||
node.setProperties(mapProperties(properties));
|
||||
if (!minimalnfo)
|
||||
{
|
||||
node.setProperties(mapProperties(properties, selectedProperties));
|
||||
node.setAspectNames(mapAspects(nodeService.getAspects(nodeRef)));
|
||||
}
|
||||
|
||||
node.setNodeType(typeQName.toPrefixString(namespaceService));
|
||||
node.setPath(pathInfo);
|
||||
node.setPath(pathInfo);
|
||||
|
||||
return node;
|
||||
return node;
|
||||
}
|
||||
|
||||
protected PathInfo lookupPathInfo(NodeRef nodeRefIn)
|
||||
{
|
||||
List<PathInfo.ElementInfo> elements = new ArrayList<>(5);
|
||||
// TODO which implementation?
|
||||
return getPathInfo(nodeRefIn);
|
||||
|
||||
NodeRef companyHomeNodeRef = repositoryHelper.getCompanyHome();
|
||||
boolean isComplete = true;
|
||||
// List<PathInfo.ElementInfo> elements = new ArrayList<>(5);
|
||||
//
|
||||
// NodeRef companyHomeNodeRef = repositoryHelper.getCompanyHome();
|
||||
// boolean isComplete = true;
|
||||
//
|
||||
// NodeRef pNodeRef = nodeRefIn;
|
||||
// while (pNodeRef != null)
|
||||
// {
|
||||
// if (pNodeRef.equals(companyHomeNodeRef))
|
||||
// {
|
||||
// pNodeRef = null;
|
||||
// }
|
||||
// else {
|
||||
// pNodeRef = nodeService.getPrimaryParent(pNodeRef).getParentRef();
|
||||
//
|
||||
// if (pNodeRef == null)
|
||||
// {
|
||||
// // belts-and-braces - is it even possible to get here ?
|
||||
// isComplete = false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// if (permissionService.hasPermission(pNodeRef, PermissionService.READ)
|
||||
// == AccessStatus.ALLOWED)
|
||||
// {
|
||||
// String name = (String) nodeService.getProperty(pNodeRef,
|
||||
// ContentModel.PROP_NAME);
|
||||
// elements.add(0, new ElementInfo(pNodeRef, name));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// isComplete = false;
|
||||
// pNodeRef = null;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
// for (PathInfo.ElementInfo e : elements)
|
||||
// {
|
||||
// sb.append("/").append(e.getName());
|
||||
// }
|
||||
//
|
||||
// return new PathInfo(sb.toString(), isComplete, elements);
|
||||
}
|
||||
|
||||
NodeRef pNodeRef = nodeRefIn;
|
||||
while (pNodeRef != null)
|
||||
private PathInfo getPathInfo(NodeRef nodeRef)
|
||||
{
|
||||
final Path nodePath = nodeService.getPath(nodeRef);
|
||||
|
||||
List<ElementInfo> pathElements = new ArrayList<>();
|
||||
Boolean isComplete = Boolean.TRUE;
|
||||
// 2 => as we don't want to include the given node in the path as well.
|
||||
for (int i = nodePath.size() - 2; i >= 0; i--)
|
||||
{
|
||||
if (pNodeRef.equals(companyHomeNodeRef))
|
||||
Element element = nodePath.get(i);
|
||||
if (element instanceof Path.ChildAssocElement)
|
||||
{
|
||||
pNodeRef = null;
|
||||
}
|
||||
else {
|
||||
pNodeRef = nodeService.getPrimaryParent(pNodeRef).getParentRef();
|
||||
|
||||
if (pNodeRef == null)
|
||||
ChildAssociationRef elementRef = ((Path.ChildAssocElement) element).getRef();
|
||||
if (elementRef.getParentRef() != null)
|
||||
{
|
||||
// belts-and-braces - is it even possible to get here ?
|
||||
isComplete = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (permissionService.hasPermission(pNodeRef, PermissionService.READ) == AccessStatus.ALLOWED)
|
||||
NodeRef childNodeRef = elementRef.getChildRef();
|
||||
if (permissionService.hasPermission(childNodeRef, PermissionService.READ) == AccessStatus.ALLOWED)
|
||||
{
|
||||
String name = (String) nodeService.getProperty(pNodeRef, ContentModel.PROP_NAME);
|
||||
elements.add(0, new PathInfo().new ElementInfo(pNodeRef.getId(), name));
|
||||
Serializable nameProp = nodeService.getProperty(childNodeRef, ContentModel.PROP_NAME);
|
||||
pathElements.add(0, new ElementInfo(childNodeRef, nameProp.toString()));
|
||||
}
|
||||
else
|
||||
{
|
||||
isComplete = false;
|
||||
pNodeRef = null;
|
||||
// Just return the pathInfo up to the location where the user has access
|
||||
isComplete = Boolean.FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (PathInfo.ElementInfo e : elements)
|
||||
String pathStr = null;
|
||||
if(pathElements.size() > 0)
|
||||
{
|
||||
sb.append("/").append(e.getName());
|
||||
StringBuilder sb = new StringBuilder(120);
|
||||
for (PathInfo.ElementInfo e : pathElements)
|
||||
{
|
||||
sb.append("/").append(e.getName());
|
||||
}
|
||||
pathStr = sb.toString();
|
||||
}
|
||||
|
||||
return new PathInfo(sb.toString(), isComplete, elements);
|
||||
else
|
||||
{
|
||||
// There is no path element, so set it to null in order to be
|
||||
// ignored by Jackson during serialisation
|
||||
isComplete = null;
|
||||
}
|
||||
return new PathInfo(pathStr, isComplete, pathElements);
|
||||
}
|
||||
|
||||
protected Map<String, Serializable> mapProperties(Map<QName, Serializable> nodeProps)
|
||||
protected Map<String, Object> mapProperties(Map<QName, Serializable> nodeProps, List<QName> selectedProperties)
|
||||
{
|
||||
Map<String, Serializable> props = new HashMap<>(nodeProps.size());
|
||||
|
||||
for (Map.Entry<QName, Serializable> entry : nodeProps.entrySet()) {
|
||||
QName propQName = entry.getKey();
|
||||
if (!EXCLUDED_PROPS.contains(propQName))
|
||||
{
|
||||
props.put(entry.getKey().toPrefixString(namespaceService), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (props.size() == 0)
|
||||
Map<String, Object> props = null;
|
||||
if (!selectedProperties.isEmpty())
|
||||
{
|
||||
props = null; // no props to return
|
||||
props = new HashMap<>(selectedProperties.size());
|
||||
for (QName qName : selectedProperties)
|
||||
{
|
||||
Serializable value = nodeProps.get(qName);
|
||||
if (value != null)
|
||||
{
|
||||
props.put(qName.toPrefixString(namespaceService), value);
|
||||
}
|
||||
}
|
||||
if (props.isEmpty())
|
||||
{
|
||||
props = null; // set to null so it doesn't show up as an empty object in the JSON response.
|
||||
}
|
||||
}
|
||||
|
||||
return props;
|
||||
@@ -568,12 +658,19 @@ public class NodesImpl implements Nodes
|
||||
|
||||
public CollectionWithPagingInfo<Node> getChildren(String parentFolderNodeId, Parameters parameters)
|
||||
{
|
||||
// TODO
|
||||
// TODO do we want to support path with list folder children ?
|
||||
String path = null;
|
||||
// String path = parameters.getParameter("path");
|
||||
|
||||
final NodeRef parentNodeRef = validateOrLookupNode(parentFolderNodeId, path);
|
||||
|
||||
// TODO
|
||||
// map - where (filter) properties - including isFolder
|
||||
// map - orderBy (sort) properties - including isFolder
|
||||
|
||||
// TODO refactor & fix !
|
||||
final boolean minimalnfo = (parameters.getSelectedProperties().size() == 0);
|
||||
final List<QName> requestedProperties = createQNames(parameters.getSelectedProperties());
|
||||
|
||||
boolean includeFolders = true;
|
||||
boolean includeFiles = true;
|
||||
@@ -604,7 +701,7 @@ public class NodesImpl implements Nodes
|
||||
QName propQname = MAP_PARAM_QNAME.get(sortCol.column);
|
||||
if (propQname == null)
|
||||
{
|
||||
propQname = QName.resolveToQName(namespaceService, sortCol.column);
|
||||
propQname = createQName(sortCol.column);
|
||||
}
|
||||
|
||||
if (propQname != null)
|
||||
@@ -623,46 +720,40 @@ public class NodesImpl implements Nodes
|
||||
|
||||
Paging paging = parameters.getPaging();
|
||||
|
||||
// TODO do we want to support path with list folder children ?
|
||||
String path = null;
|
||||
//String path = parameters.getParameter("path");
|
||||
|
||||
final NodeRef parentNodeRef = validateOrLookupNode(parentFolderNodeId, path);
|
||||
|
||||
if (! nodeMatches(parentNodeRef, Collections.singleton(ContentModel.TYPE_FOLDER), null))
|
||||
{
|
||||
throw new InvalidArgumentException("NodeId of folder is expected");
|
||||
}
|
||||
|
||||
PagingRequest pagingRequest = Util.getPagingRequest(paging);
|
||||
|
||||
final PagingResults<FileInfo> pagingResults = fileFolderService.list(parentNodeRef, includeFiles, includeFolders, null, sortProps, pagingRequest);
|
||||
|
||||
final List<FileInfo> page = pagingResults.getPage();
|
||||
List<Node> nodes = new AbstractList<Node>()
|
||||
{
|
||||
@Override
|
||||
public Node get(int index)
|
||||
{
|
||||
FileInfo fInfo = page.get(index);
|
||||
PagingRequest pagingRequest = Util.getPagingRequest(paging);
|
||||
|
||||
final PagingResults<FileInfo> pagingResults = fileFolderService.list(parentNodeRef, includeFiles, includeFolders, ignoreTypeQNames, sortProps, pagingRequest);
|
||||
|
||||
final List<FileInfo> page = pagingResults.getPage();
|
||||
List<Node> nodes = new AbstractList<Node>()
|
||||
{
|
||||
@Override
|
||||
public Node get(int index)
|
||||
{
|
||||
FileInfo fInfo = page.get(index);
|
||||
|
||||
// basic info by default (unless "select"ed otherwise)
|
||||
return getFolderOrDocument(fInfo.getNodeRef(), parentNodeRef, fInfo.getType(), minimalnfo);
|
||||
}
|
||||
return getFolderOrDocument(fInfo.getNodeRef(), parentNodeRef, fInfo.getType(), requestedProperties, minimalnfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size()
|
||||
{
|
||||
return page.size();
|
||||
}
|
||||
};
|
||||
@Override
|
||||
public int size()
|
||||
{
|
||||
return page.size();
|
||||
}
|
||||
};
|
||||
|
||||
return CollectionWithPagingInfo.asPaged(paging, nodes, pagingResults.hasMoreItems(), pagingResults.getTotalResultCount().getFirst());
|
||||
}
|
||||
|
||||
|
||||
public void deleteNode(String nodeId)
|
||||
{
|
||||
NodeRef nodeRef = validateNode(nodeId);
|
||||
NodeRef nodeRef = validateNode(nodeId);
|
||||
fileFolderService.delete(nodeRef);
|
||||
}
|
||||
|
||||
@@ -689,8 +780,8 @@ public class NodesImpl implements Nodes
|
||||
throw new InvalidArgumentException("Node type is expected: "+parentNodeRef+","+nodeName);
|
||||
}
|
||||
|
||||
// check that requested type is a (sub-) type of folder or content
|
||||
QName nodeTypeQName = QName.resolveToQName(namespaceService, nodeType);
|
||||
// check that requested type is a (sub-) type of folder or content
|
||||
QName nodeTypeQName = createQName(nodeType);
|
||||
|
||||
Set<QName> contentAndFolders = new HashSet<>(Arrays.asList(ContentModel.TYPE_FOLDER, ContentModel.TYPE_CONTENT));
|
||||
if (! typeMatches(nodeTypeQName, contentAndFolders, null)) {
|
||||
@@ -703,7 +794,7 @@ public class NodesImpl implements Nodes
|
||||
|
||||
if (nodeInfo.getProperties() != null)
|
||||
{
|
||||
for (Map.Entry entry : (Set<Map.Entry<String, Serializable>>)nodeInfo.getProperties().entrySet())
|
||||
for (Entry<String, Object> entry : nodeInfo.getProperties().entrySet())
|
||||
{
|
||||
QName propQName = QName.createQName((String)entry.getKey(), namespaceService);
|
||||
props.put(propQName, (Serializable)entry.getValue());
|
||||
@@ -741,7 +832,7 @@ public class NodesImpl implements Nodes
|
||||
|
||||
if (nodeInfo.getProperties() != null)
|
||||
{
|
||||
for (Map.Entry entry : (Set<Map.Entry<String, Serializable>>)nodeInfo.getProperties().entrySet())
|
||||
for (Entry<String, Object> entry : nodeInfo.getProperties().entrySet())
|
||||
{
|
||||
QName propQName = QName.createQName((String)entry.getKey(), namespaceService);
|
||||
props.put(propQName, (Serializable)entry.getValue());
|
||||
@@ -807,4 +898,58 @@ public class NodesImpl implements Nodes
|
||||
// TODO - hmm - we may wish to return json info !!
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to create a QName from either a fully qualified or short-name QName string
|
||||
*
|
||||
* @param qnameStr Fully qualified or short-name QName string
|
||||
* @return QName
|
||||
*/
|
||||
protected QName createQName(String qnameStr)
|
||||
{
|
||||
try
|
||||
{
|
||||
QName qname;
|
||||
if (qnameStr.indexOf(QName.NAMESPACE_BEGIN) != -1)
|
||||
{
|
||||
qname = QName.createQName(qnameStr);
|
||||
}
|
||||
else
|
||||
{
|
||||
qname = QName.createQName(qnameStr, namespaceService);
|
||||
}
|
||||
return qname;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
String msg = ex.getMessage();
|
||||
if (msg == null)
|
||||
{
|
||||
msg = "";
|
||||
}
|
||||
throw new InvalidArgumentException(qnameStr + " isn't a valid QName. " + msg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to create a QName from either a fully qualified or short-name QName string
|
||||
*
|
||||
* @param qnameStrList list of fully qualified or short-name QName string
|
||||
* @return a list of {@code QName} objects
|
||||
*/
|
||||
protected List<QName> createQNames(List<String> qnameStrList)
|
||||
{
|
||||
List<QName> result = new ArrayList<>(qnameStrList.size());
|
||||
for (String str : qnameStrList)
|
||||
{
|
||||
str = str.replaceFirst("_", ":"); // FIXME remove this when we have fixed the framework.
|
||||
QName name = createQName(str);
|
||||
if (!EXCLUDED_PROPS.contains(name))
|
||||
{
|
||||
result.add(name);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -46,6 +46,11 @@ public class Document extends Node
|
||||
{
|
||||
private ContentInfo contentInfo;
|
||||
|
||||
// instance init block
|
||||
{
|
||||
this.isFolder = Boolean.FALSE;
|
||||
}
|
||||
|
||||
public Document() {
|
||||
super();
|
||||
}
|
||||
@@ -64,76 +69,76 @@ public class Document extends Node
|
||||
}
|
||||
}
|
||||
|
||||
public Boolean getIsFolder()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public ContentInfo getContent()
|
||||
{
|
||||
return contentInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Document [contentInfo=" + contentInfo.toString() + ", nodeRef="
|
||||
+ nodeRef + ", name=" + name + ", createdAt=" + createdAt
|
||||
+ ", modifiedAt=" + modifiedAt + ", createdBy=" + createdBy
|
||||
+ ", modifiedBy=" + modifiedBy + "]";
|
||||
}
|
||||
public void setContent(ContentInfo contentInfo)
|
||||
{
|
||||
this.contentInfo = contentInfo;
|
||||
}
|
||||
|
||||
// TODO for backwards compat' - set explicitly when needed (ie. favourites)
|
||||
private String mimeType;
|
||||
private BigInteger sizeInBytes;
|
||||
private String versionLabel;
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Document [contentInfo=" + contentInfo.toString() + ", nodeRef="
|
||||
+ nodeRef + ", name=" + name + ", createdAt=" + createdAt
|
||||
+ ", modifiedAt=" + modifiedAt + ", createdBy=" + createdBy
|
||||
+ ", modifiedBy=" + modifiedBy + "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
// TODO for backwards compat' - set explicitly when needed (ie. favourites)
|
||||
private String mimeType;
|
||||
private BigInteger sizeInBytes;
|
||||
private String versionLabel;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public String getMimeType()
|
||||
{
|
||||
return mimeType;
|
||||
}
|
||||
public String getMimeType()
|
||||
{
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public BigInteger getSizeInBytes()
|
||||
{
|
||||
return sizeInBytes;
|
||||
}
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public BigInteger getSizeInBytes()
|
||||
{
|
||||
return sizeInBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public String getVersionLabel()
|
||||
{
|
||||
return versionLabel;
|
||||
}
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public String getVersionLabel()
|
||||
{
|
||||
return versionLabel;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public void setMimeType(String mimeType)
|
||||
{
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public void setMimeType(String mimeType)
|
||||
{
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public void setSizeInBytes(BigInteger sizeInBytes)
|
||||
{
|
||||
this.sizeInBytes = sizeInBytes;
|
||||
}
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public void setSizeInBytes(BigInteger sizeInBytes)
|
||||
{
|
||||
this.sizeInBytes = sizeInBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public void setVersionLabel(String versionLabel)
|
||||
{
|
||||
this.versionLabel = versionLabel;
|
||||
}
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public void setVersionLabel(String versionLabel)
|
||||
{
|
||||
this.versionLabel = versionLabel;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -23,6 +23,7 @@
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
@@ -37,31 +38,30 @@ import org.alfresco.service.namespace.QName;
|
||||
*
|
||||
* @author steveglover
|
||||
* @author janv
|
||||
*
|
||||
*/
|
||||
public class Folder extends Node
|
||||
{
|
||||
public Folder()
|
||||
{
|
||||
super();
|
||||
}
|
||||
// instance init block
|
||||
{
|
||||
this.isFolder = Boolean.TRUE;
|
||||
}
|
||||
|
||||
public Folder()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
public Folder(NodeRef nodeRef, NodeRef parentNodeRef, Map<QName, Serializable> nodeProps, ServiceRegistry sr)
|
||||
{
|
||||
super(nodeRef, parentNodeRef, nodeProps, sr);
|
||||
}
|
||||
|
||||
public Boolean getIsFolder()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Folder [nodeRef=" + nodeRef + ", name=" + name + ", title="
|
||||
+ title + ", description=" + description + ", createdAt="
|
||||
+ createdAt + ", modifiedAt=" + modifiedAt + ", createdBy="
|
||||
+ createdBy + ", modifiedBy=" + modifiedBy + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Folder [nodeRef=" + nodeRef + ", name=" + name + ", title="
|
||||
+ title + ", description=" + description + ", createdAt="
|
||||
+ createdAt + ", modifiedAt=" + modifiedAt + ", createdBy="
|
||||
+ createdBy + ", modifiedBy=" + modifiedBy + "]";
|
||||
}
|
||||
}
|
||||
|
@@ -57,13 +57,15 @@ public class Node implements Comparable<Node>
|
||||
protected UserInfo createdByUser;
|
||||
protected UserInfo modifiedByUser;
|
||||
|
||||
protected Boolean isFolder;
|
||||
|
||||
protected NodeRef parentNodeRef;
|
||||
protected PathInfo pathInfo;
|
||||
protected String prefixTypeQName;
|
||||
|
||||
protected List<String> aspectNames;
|
||||
|
||||
protected Map<String, Serializable> props;
|
||||
protected Map<String, Object> properties;
|
||||
|
||||
// TODO fixme !
|
||||
// also need to optionally pass in user map - eg. when listing children (to avoid multiple lookups for same user)
|
||||
@@ -190,12 +192,12 @@ public class Node implements Comparable<Node>
|
||||
this.prefixTypeQName = prefixType;
|
||||
}
|
||||
|
||||
public Map getProperties() {
|
||||
return this.props;
|
||||
public Map<String, Object> getProperties() {
|
||||
return this.properties;
|
||||
}
|
||||
|
||||
public void setProperties(Map props) {
|
||||
this.props = props;
|
||||
public void setProperties(Map<String, Object> props) {
|
||||
this.properties = props;
|
||||
}
|
||||
|
||||
public List<String> getAspectNames() {
|
||||
@@ -211,6 +213,21 @@ public class Node implements Comparable<Node>
|
||||
return parentNodeRef;
|
||||
}
|
||||
|
||||
public void setParentId(NodeRef parentNodeRef)
|
||||
{
|
||||
this.parentNodeRef = parentNodeRef;
|
||||
}
|
||||
|
||||
public Boolean getIsFolder()
|
||||
{
|
||||
return isFolder;
|
||||
}
|
||||
|
||||
public void setIsFolder(Boolean isFolder)
|
||||
{
|
||||
this.isFolder=isFolder;
|
||||
}
|
||||
|
||||
public boolean equals(Object other)
|
||||
{
|
||||
if(this == other)
|
||||
|
@@ -1,64 +1,92 @@
|
||||
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
|
||||
/**
|
||||
* Representation of a path info
|
||||
*
|
||||
* @author janv
|
||||
*
|
||||
*/
|
||||
public class PathInfo
|
||||
{
|
||||
private String name;
|
||||
private Boolean isComplete;
|
||||
private List<ElementInfo> elements;
|
||||
private String name;
|
||||
private Boolean isComplete;
|
||||
private List<ElementInfo> elements;
|
||||
|
||||
public PathInfo()
|
||||
{
|
||||
}
|
||||
public PathInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public PathInfo(String name, Boolean isComplete, List<ElementInfo> elements)
|
||||
{
|
||||
this.name = name;
|
||||
this.isComplete = isComplete;
|
||||
this.elements = elements;
|
||||
}
|
||||
public PathInfo(String name, Boolean isComplete, List<ElementInfo> elements)
|
||||
{
|
||||
this.name = name;
|
||||
this.isComplete = isComplete;
|
||||
this.elements = elements;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public Boolean getIsComplete() {
|
||||
return isComplete;
|
||||
}
|
||||
public Boolean getIsComplete()
|
||||
{
|
||||
return isComplete;
|
||||
}
|
||||
|
||||
public List<ElementInfo> getElements() {
|
||||
return elements;
|
||||
}
|
||||
public List<ElementInfo> getElements()
|
||||
{
|
||||
return elements;
|
||||
}
|
||||
|
||||
public class ElementInfo {
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(120);
|
||||
sb.append("PathInfo [name='").append(name)
|
||||
.append(", isComplete=").append(isComplete)
|
||||
.append(", elements=").append(elements)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String id;
|
||||
public static class ElementInfo
|
||||
{
|
||||
|
||||
private String name;
|
||||
private NodeRef id;
|
||||
private String name;
|
||||
|
||||
public ElementInfo()
|
||||
{
|
||||
}
|
||||
public ElementInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public ElementInfo(String id, String name)
|
||||
{
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
public ElementInfo(NodeRef id, String name)
|
||||
{
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
public NodeRef getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(250);
|
||||
sb.append("PathElement [id=").append(id)
|
||||
.append(", name='").append(name)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -16,41 +16,42 @@
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
/**
|
||||
* Representation of a user info
|
||||
*
|
||||
* @author janv
|
||||
*
|
||||
*/
|
||||
public class UserInfo
|
||||
{
|
||||
private String userName;
|
||||
private String displayName;
|
||||
private String userName;
|
||||
private String displayName;
|
||||
|
||||
public UserInfo()
|
||||
{
|
||||
}
|
||||
public UserInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public UserInfo(String userName, String firstName, String lastName)
|
||||
{
|
||||
this.userName = userName;
|
||||
this.displayName = ((firstName != null ? firstName + " " : "") + (lastName != null ? lastName : "")).replaceAll("^\\s+|\\s+$", "");
|
||||
}
|
||||
public UserInfo(String userName, String firstName, String lastName)
|
||||
{
|
||||
this.userName = userName;
|
||||
this.displayName = ((firstName != null ? firstName + " " : "") + (lastName != null ? lastName : "")).trim();
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
public String getDisplayName()
|
||||
{
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
public String getUserName()
|
||||
{
|
||||
return userName;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "User [userName=" + userName + ", displayName=" + displayName + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "User [userName=" + userName + ", displayName=" + displayName + "]";
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user