package org.jibeframework.contentmanager.service.impl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.alfresco.model.ApplicationModel;
import org.alfresco.model.ContentModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.version.Version;
import org.alfresco.service.cmr.version.VersionHistory;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.ISO9075;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
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.alfresco.util.SearchContext;
import org.jibeframework.contentmanager.service.AlfrescoService;
import org.jibeframework.core.util.Content;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AlfrescoServiceImpl implements AlfrescoService {
@Autowired
private ServiceRegistry serviceRegistry;
@Autowired
private RepositoryService repositoryService;
public void createFolder(String name, QName type, NodeRef parent, Map<String, Object> data) {
FileInfo fileInfo = serviceRegistry.getFileFolderService().create(parent, name, type);
NodeRef nodeRef = fileInfo.getNodeRef();
serviceRegistry.getNodeService().addAspect(nodeRef, ApplicationModel.ASPECT_UIFACETS, null);
Map<QName, Serializable> properties = serviceRegistry.getNodeService().getProperties(nodeRef);
for (String key : data.keySet()) {
properties.put(QName.createQName(key, serviceRegistry.getNamespaceService()), (Serializable) data.get(key));
}
serviceRegistry.getNodeService().setProperties(nodeRef, properties);
}
public void createDocument(NodeRef folderRef, Content content) {
String fileName = content.getName();
FileInfo fileInfo = serviceRegistry.getFileFolderService().create(folderRef, fileName,
ContentModel.TYPE_CONTENT);
NodeRef fileNodeRef = fileInfo.getNodeRef();
serviceRegistry.getNodeService().addAspect(fileNodeRef, ContentModel.ASPECT_AUTHOR, null);
serviceRegistry.getNodeService().addAspect(fileNodeRef, ContentModel.ASPECT_TITLED, null);
Map<QName, Serializable> props = serviceRegistry.getNodeService().getProperties(fileNodeRef);
props.put(ContentModel.PROP_CREATED, new Date());
String currentUserName = serviceRegistry.getAuthenticationService().getCurrentUserName();
props.put(ContentModel.PROP_CREATOR, currentUserName);
props.put(ContentModel.PROP_AUTHOR, currentUserName);
props.put(ContentModel.PROP_OWNER, currentUserName);
serviceRegistry.getNodeService().setProperties(fileNodeRef, props);
ContentWriter writer = serviceRegistry.getContentService().getWriter(fileNodeRef, ContentModel.PROP_CONTENT,
true);
String mimeType = serviceRegistry.getMimetypeService().guessMimetype(fileName);
writer.setMimetype(mimeType);
writer.setEncoding(content.getEncoding());
writer.putContent(content.getInputStream());
}
public List<String> getPath(NodeRef nodeRef) {
List<String> model = new ArrayList<String>();
model.add("rootNodeId");
NodeRef companyHome = AlfrescoUtil.getInstance().getCompanyHome();
model.add(companyHome.toString());
List<FileInfo> fis = null;
try {
fis = serviceRegistry.getFileFolderService().getNamePath(companyHome, nodeRef);
} catch (Exception e) {
return model;
}
for (FileInfo fi : fis) {
model.add(fi.getNodeRef().toString());
}
return model;
}
public String getPathByName(NodeRef nodeRef) {
StringBuilder b=new StringBuilder("/Root/Company Home");
NodeRef companyHome = AlfrescoUtil.getInstance().getCompanyHome();
List<FileInfo> fis = null;
try {
fis = serviceRegistry.getFileFolderService().getNamePath(companyHome, nodeRef);
} catch (Exception e) {
return b.toString();
}
for (FileInfo fi : fis) {
b.append("/");
b.append(fi.getName());
}
return b.toString();
}
public List<CMObject> getFolderChildren(CMFolder folder) {
List<CMObject> children = folder.getChildren(null);
CollectionUtils.filter(children, new Predicate() {
public boolean evaluate(Object object) {
return !((CMObject) object).hasAspect(ContentModel.ASPECT_WORKING_COPY);
}
});
return children;
}
public List<CMObject> getVersionHistory(NodeRef nodeRef) {
List<CMObject> versions = new ArrayList<CMObject>();
VersionHistory versionHistory = serviceRegistry.getVersionService().getVersionHistory(nodeRef);
if (versionHistory != null) {
for (Version version : versionHistory.getAllVersions()) {
CMObject doc = repositoryService.fetch(CMObject.class, version.getFrozenStateNodeRef());
versions.add(doc);
}
}
return versions;
}
public List<CMObject> search(CMFolder folder, String expr, int searchMode) {
SearchContext sc = new SearchContext();
sc.setLocation(getPathFromSpaceRef(folder.getNodeRef(), true));
sc.setText(expr);
sc.setMode(searchMode);
SearchParameters sp = new SearchParameters();
sp.setLanguage(SearchService.LANGUAGE_LUCENE);
String buildQuery = sc.buildQuery(3);
sp.setQuery(buildQuery);
sp.addStore(AlfrescoUtil.getInstance().getStoreRef());
List<CMObject> model = new ArrayList<CMObject>();
ResultSet rs = null;
try {
rs = serviceRegistry.getSearchService().query(sp);
for (ResultSetRow row : rs) {
NodeRef nodeRef = row.getNodeRef();
if (serviceRegistry.getNodeService().exists(nodeRef)) {
model.add(repositoryService.fetch(CMObject.class, nodeRef));
}
}
} finally {
if (rs != null) {
rs.close();
}
}
CollectionUtils.filter(model, new Predicate() {
public boolean evaluate(Object object) {
return !((CMObject) object).hasAspect(ContentModel.ASPECT_WORKING_COPY);
}
});
return model;
}
@SuppressWarnings("unchecked")
private String getPathFromSpaceRef(NodeRef ref, boolean children) {
Path path = serviceRegistry.getNodeService().getPath(ref);
NamespaceService ns = serviceRegistry.getNamespaceService();
StringBuilder buf = new StringBuilder(64);
for (int i = 0; i < path.size(); i++) {
String elementString = "";
Path.Element element = path.get(i);
if (element instanceof Path.ChildAssocElement) {
ChildAssociationRef elementRef = ((Path.ChildAssocElement) element).getRef();
if (elementRef.getParentRef() != null) {
Collection prefixes = ns.getPrefixes(elementRef.getQName().getNamespaceURI());
if (prefixes.size() > 0) {
elementString = '/' + (String) prefixes.iterator().next() + ':'
+ ISO9075.encode(elementRef.getQName().getLocalName());
}
}
}
buf.append(elementString);
}
if (children == true) {
// append syntax to get all children of the path
buf.append("//*");
} else {
// append syntax to just represent the path, not the children
buf.append("/*");
}
return buf.toString();
}
}