package org.jibeframework.contentmanager.dataprovider;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
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.namespace.NamespaceService;
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.core.data.model.DataModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;
@Component("jibe.repo.SearchResultsModel")
@Scope(value = "conversation", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SearchResultsModel extends DataModel<CMObject> implements Serializable {
private static final long serialVersionUID = 1L;
public final static String BEAN_ID = "jibe.repo.SearchResultsModel";
@Autowired
private RepositoryService repositoryService;
@Autowired
private ServiceRegistry serviceRegistry;
private String query;
public void refreshEntry(CMObject node) {
getModel().remove(node);
node = repositoryService.fetch(CMObject.class, node.getNodeRef());
getModel().add(node);
}
@Override
public void reloadModel() {
// TODO Auto-generated method stub
}
public void 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);
query = sc.buildQuery(3);
sp.setQuery(query);
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);
}
});
this.setModel(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();
}
@Override
public void refreshEntry(String entryId) {
StringBuffer b = new StringBuffer(this.query);
b.append(String.format(" +ID:\"%1$s\"", entryId));
List<NodeRef> l = AlfrescoUtil.getInstance().getResultSet(b.toString());
removeEntry(entryId);
if (!l.isEmpty()) {
CMObject o = repositoryService.fetch(CMObject.class, new NodeRef(entryId));
getModel().add(o);
}
}
@Override
protected void removeEntry(final String entryId) {
CollectionUtils.filter(this.getModel(), new Predicate() {
public boolean evaluate(Object object) {
CMObject o = (CMObject) object;
return !o.getNodeRef().toString().equals(entryId);
}
});
}
}