package org.jibeframework.contentmanager.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.alfresco.model.ContentModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.lock.LockStatus;
import org.alfresco.service.cmr.repository.FileTypeImageSize;
import org.alfresco.service.cmr.repository.NodeRef;
import org.jibeframework.alfresco.node.CMContent;
import org.jibeframework.alfresco.node.CMFolder;
import org.jibeframework.alfresco.node.CMObject;
import org.jibeframework.alfresco.service.RepositoryService;
import org.jibeframework.alfresco.util.AlfrescoUtil;
import org.jibeframework.core.Context;
import org.jibeframework.core.annotation.Progress;
import org.jibeframework.core.annotation.Remote;
import org.jibeframework.core.app.method.ArgumentsResolver;
import org.jibeframework.core.app.method.RequestParamArgumentResolver;
import org.jibeframework.core.app.method.ArgumentsResolver.ArgumentCandidatesCache;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.ServletContextAware;
@Controller("repo.Node")
public class NodeController implements InitializingBean, ServletContextAware {
@Autowired
private ArgumentsResolver argumentsResolver;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ServiceRegistry serviceRegistry;
private ServletContext servletContext;
@Progress("progress.repo.save")
@Remote
public void saveDocument(CMObject node) {
// bindingService.bind(node, "repo.nodeProperties");
}
public final String getIcon(CMObject node) {
boolean isFolder = node.isSubTypeOf(ContentModel.TYPE_FOLDER);
HttpServletRequest request = Context.getCurrentContext().getServletRequest();
if (!isFolder) {
String fileTypeImage = AlfrescoUtil.getFileTypeImage(servletContext, node.getName(),
FileTypeImageSize.Small);
return request.getContextPath() + fileTypeImage;
} else {
return (request.getContextPath() + "/extjs/resources/images/default/tree/folder.gif");
}
}
public boolean isContainer(CMObject node) {
return node.isSubTypeOf(ContentModel.TYPE_FOLDER);
}
public String getRowType(CMObject node) {
return node.isSubTypeOf(ContentModel.TYPE_FOLDER) ? "folder" : "document";
}
public boolean isMovable(CMObject node) {
if (!node.isSubTypeOf(ContentModel.TYPE_FOLDER)) {
if (node.hasAspect(ContentModel.ASPECT_LOCKABLE)) {
LockStatus lockStatus = serviceRegistry.getLockService().getLockStatus(node.getNodeRef());
if (lockStatus == LockStatus.LOCKED || lockStatus == LockStatus.LOCK_OWNER) {
return false;
}
}
}
return node.hasPermission("Delete");
}
public void afterPropertiesSet() throws Exception {
argumentsResolver.registerRequestParamResolver("folderId", new RequestParamArgumentResolver() {
public void addToArgumentsCache(ArgumentCandidatesCache cache, Object paramValue) {
if (paramValue != null) {
CMFolder folder = repositoryService.fetch(CMFolder.class, new NodeRef((String) paramValue));
cache.add(CMFolder.class, folder);
}
}
});
argumentsResolver.registerRequestParamResolver("contentId", new RequestParamArgumentResolver() {
public void addToArgumentsCache(ArgumentCandidatesCache cache, Object paramValue) {
if (paramValue != null) {
CMContent content = repositoryService.fetch(CMContent.class, new NodeRef((String) paramValue));
cache.add(CMContent.class, content);
}
}
});
argumentsResolver.registerRequestParamResolver("nodeId", new RequestParamArgumentResolver() {
public void addToArgumentsCache(ArgumentCandidatesCache cache, Object paramValue) {
if (paramValue != null) {
CMObject node = repositoryService.fetch(CMObject.class, new NodeRef((String) paramValue));
cache.add(CMObject.class, node);
}
}
});
argumentsResolver.registerRequestParamResolver("nodes", new RequestParamArgumentResolver() {
@SuppressWarnings("unchecked")
public void addToArgumentsCache(ArgumentCandidatesCache cache, Object paramValue) {
if (paramValue != null) {
List<CMObject> nodes = new ArrayList<CMObject>();
for (String nr : (List<String>) paramValue) {
nodes.add(repositoryService.fetch(CMObject.class, new NodeRef(nr)));
}
cache.add(List.class, new Class[] { CMObject.class }, nodes);
}
}
});
}
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}