As we transition to the new Hyland Community, some post links may be temporarily disrupted as we finalize redirects. We apologize for the inconvenience and are working to resolve this as quickly as possible. Details.
DROP TABLE IF EXISTS `alfresco`.`km_user_statistics`;CREATE TABLE `alfresco`.`km_user_statistics` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `userName` varchar(160) NOT NULL, `contentNodeRef` varchar(500) NOT NULL, `contentRating` bigint(20) DEFAULT NULL, `contentStatus` varchar(50) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;
package com.xxxx.alfresco.km.db; /** * @author Lalit Jangra * Class to get/set values in KM_User_Statistics Table. */ public class KMUserValueObject { private String userName; private String contentNodeRef; private int contentRating; private String contentStatus; private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getContentRating() { return contentRating; } public void setContentRating(int contentRating) { this.contentRating = contentRating; } public String getContentNodeRef() { return contentNodeRef; } public void setContentNodeRef(String contentNodeRef) { this.contentNodeRef = contentNodeRef; } public String getContentStatus() { return contentStatus; } public void setContentStatus(String contentStatus) { this.contentStatus = contentStatus; } }
package com.xxxx.alfresco.km.db; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * @author Lalit Jangra * Class to save/update User Statistics in DB. * Implementing KMUserDAO. */ public class KMUserDAOImpl extends HibernateDaoSupport implements KMUserDAO{ @Override public void saveKMUSerStatistics(KMUserValueObject kmUserValueObject) { getHibernateTemplate().save(kmUserValueObject); } @Override public void updateKMUSerStatistics(KMUserValueObject kmUserValueObject) { HibernateTemplate template = getHibernateTemplate(); template.flush(); template.clear(); template.update(kmUserValueObject); } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xxxx.alfresco.km.db.KMUserValueObject" table="km_user_statistics"> <id name="id" column="id" type="integer"> <generator class="native" /> </id> <property name="userName" column="userName" type="string" not-null="true" /> <property name="contentNodeRef" column="contentNodeRef" type="string" not-null="true" /> <property name="contentRating" column="contentRating" type="integer" not-null="false" /> <property name="contentStatus" column="contentStatus" type="string" not-null="false" /> </class> </hibernate-mapping>
<!– Added by Lalit –> <value>com/xxxx/alfresco/km/db/kmuserstatstics.hbm.xml</value> <!– Added by Lalit –>
java.lang.NullPointerException at com.xxxx.alfresco.km.db.KMUserDAOImpl.saveKMUSerStatistics(KMUserDAOImpl.java:19) at com.xxxx.alfresco.km.bpm.KMReviewProcessAction$1.doWork(KMReviewProcessAction.java:120) at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:514) at com.xxxx.alfresco.km.bpm.KMReviewProcessAction.execute(KMReviewProcessAction.java:64) at org.jbpm.graph.def.Action.execute(Action.java:129) at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:284) at org.jbpm.graph.def.GraphElement.executeActions(GraphElement.java:241) at org.jbpm.graph.def.GraphElement.fireAndPropagateEvent(GraphElement.java:213) at org.jbpm.graph.def.GraphElement.fireEvent(GraphElement.java:196) at org.jbpm.graph.def.Node.leave(Node.java:466) at org.jbpm.graph.def.Node.leave(Node.java:438) at org.jbpm.graph.def.Node.execute(Node.java:429) at org.jbpm.graph.def.Node.enter(Node.java:390) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157) at org.jbpm.graph.def.Node$$EnhancerByCGLIB$$7586d505.enter(<generated>) at org.jbpm.graph.def.Transition.take(Transition.java:167) at org.jbpm.graph.def.Node.leave(Node.java:479) at org.jbpm.graph.node.TaskNode.leave(TaskNode.java:213) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157) at org.jbpm.graph.node.TaskNode$$EnhancerByCGLIB$$afcccb4f.leave(<generated>) at org.jbpm.graph.exe.Token.signal(Token.java:223) at org.jbpm.graph.exe.Token.signal(Token.java:188) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:157) at org.jbpm.graph.exe.Token$$EnhancerByCGLIB$$22157b99.signal(<generated>) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:495) at org.alfresco.repo.workflow.jbpm.WorkflowTaskInstance.end(WorkflowTaskInstance.java:141) at org.jbpm.taskmgmt.exe.TaskInstance.end(TaskInstance.java:436) at org.alfresco.repo.workflow.jbpm.JBPMEngine$26.doInJbpm(JBPMEngine.java:1712) at org.springmodules.workflow.jbpm31.JbpmTemplate$1.doInHibernate(JbpmTemplate.java:87) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:338) at org.springmodules.workflow.jbpm31.JbpmTemplate.execute(JbpmTemplate.java:80) at org.alfresco.repo.workflow.jbpm.JBPMEngine.endTask(JBPMEngine.java:1680) at org.alfresco.repo.workflow.WorkflowServiceImpl.endTask(WorkflowServiceImpl.java:627) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) at org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor.invoke(AlwaysProceedMethodInterceptor.java:40) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.j ava:49) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.alfresco.repo.audit.AuditMethodInterceptor.proceedWithAudit(AuditMethodInterceptor.java:238) at org.alfresco.repo.audit.AuditMethodInterceptor.proceed(AuditMethodInterceptor.java:205) at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:153) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy48.endTask(Unknown Source) at org.alfresco.web.bean.workflow.ManageTaskDialog.transition(ManageTaskDialog.java:449) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132) at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61) at javax.faces.component.UICommand.broadcast(UICommand.java:109) at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171) at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32) at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.alfresco.web.app.servlet.AuthenticationFilter.doFilter(AuthenticationFilter.java:110) at sun.reflect.GeneratedMethodAccessor500.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.alfresco.repo.management.subsystems.ChainingSubsystemProxyFactory$1.invoke(ChainingSubsystemProxyFactory.java:122) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy210.doFilter(Unknown Source) at org.alfresco.repo.web.filter.beans.BeanProxyFilter.doFilter(BeanProxyFilter.java:88) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.alfresco.repo.web.filter.beans.NullFilter.doFilter(NullFilter.java:74) at sun.reflect.GeneratedMethodAccessor500.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.alfresco.repo.management.subsystems.ChainingSubsystemProxyFactory$1.invoke(ChainingSubsystemProxyFactory.java:122) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy210.doFilter(Unknown Source) at org.alfresco.repo.web.filter.beans.BeanProxyFilter.doFilter(BeanProxyFilter.java:88) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) 15:21:39,695 User:jindaladmin WARN [engine.StatefulPersistenceContext.ProxyWarnLog] Narrowing proxy to class org.jbpm.graph.node. StartState - this operation breaks ==
public class DatabaseOperation extends HibernateDaoSupport { public void test1(){ Session session = null; HibernateTemplate ht = new HibernateTemplate(); SessionFactory sessionFactory = ht.getSessionFactory(); session = sessionFactory.getCurrentSession(); UserSessionMaster userSessionMaster = new UserSessionMaster(); userSessionMaster.setUserId("A1010"); userSessionMaster.setSessionStatus("submitted"); userSessionMaster.setSessionCreatedDate(date.toLocaleString()); userSessionMaster.setSessionEndDate(date.toLocaleString()); //getHibernateTemplate().save(userSessionMaster); session.save(userSessionMaster); //HibernateTemplate template = getHibernateTemplate(); // template.flush(); // template.clear(); // template.update(userSessionMaster); System.out.println("Done"); }
… <type name="cm:content"> <title>Content</title> <parent>cm:cmobject</parent> <archive>true</archive> <properties> <property name="cm:content"> <type>d:content</type> <mandatory>false</mandatory> <!– Although content is marked as indexed atomically it may end up asynchronous –> <!– if the content conversion will take too long. Content that does not require conversion –> <!– to UTF8 test/plain will always be indexed atomically –> <index enabled="true"> <atomic>true</atomic> <stored>false</stored> <tokenised>true</tokenised> </index> </property> <!–Custom Properties added by Lalit for User Statistics.–> <property name="cm:contentStatus"> <type>d:text</type> <mandatory>false</mandatory> </property> <property name="cm:originalOwner"> <type>d:text</type> <mandatory>false</mandatory> </property> <property name="cm:contentRating"> <type>d:text</type> <mandatory>false</mandatory> </property> <!–Custom Properties added by Lalit for User Statistics.–> </properties> </type> …
package com.xxxx.alfresco.km.bpm; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.faces.context.FacesContext; import org.alfresco.deployment.transformers.CompressionTransformer; import org.alfresco.model.ContentModel; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.transform.ComplexContentTransformer; import org.alfresco.repo.content.transform.ComplexContentTransformerTest; import org.alfresco.repo.content.transform.ContentTransformer; import org.alfresco.repo.content.transform.PoiHssfContentTransformer; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.workflow.jbpm.JBPMSpringActionHandler; import org.alfresco.service.Auditable; import org.alfresco.service.PublicService; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.TransformationOptions; import org.alfresco.service.cmr.search.CategoryService; import org.alfresco.service.namespace.QName; import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.common.Utils.URLMode; import org.apache.log4j.Logger; import org.jbpm.context.exe.ContextInstance; import org.jbpm.graph.exe.ExecutionContext; import org.springframework.beans.factory.BeanFactory; import com.xxxx.alfresco.km.property.KmPropertyReader; /** * @author Lalit Jangra * Action Class for xxxx Approval Workflow. Content is * moved to "Under Review" once it is uploaded. If content is approved, * it will be moved back to original location. If content is rejected, * it will be moved to User Home of Workflow initiator.Also as per approval * or rejection, content will be assigned a property to get/set user statistics. */ @PublicService public class KMReviewProcessAction extends JBPMSpringActionHandler { private static final long serialVersionUID = 1L; private static Logger logger = Logger .getLogger(KMReviewProcessAction.class); private ServiceRegistry services; private FileFolderService fileFolderService; private NodeService nodeService; int approvalRating = 5; int rejOrURRating = 0; ContentService contentService = null; String content = ""; CategoryService categoryService = null; List<String> categoryList = new ArrayList<String>(); private String solrServIp = null; private String solrFileLoc = null; private String alfServerIp = null; /** * Method to initialize services. */ @Override protected void initialiseHandler(BeanFactory factory) { logger.debug("Inside initialiseHandler of KMReviewProcessAction!!!!"); services = (ServiceRegistry) factory .getBean(ServiceRegistry.SERVICE_REGISTRY); fileFolderService = services.getFileFolderService(); services.getAuditService(); nodeService = services.getNodeService(); contentService = services.getContentService(); logger.debug("contentService "+contentService ); categoryService = services.getCategoryService(); } /** * Method to move content in workflow. It will move content depending upon * wfFlag variable value.Also it will get/set the user statistics by use of 'contentStatus' property. * For under review or rejected content, rating will be 0 & for approved content, rating will be 5. * Once content is approved , an XML is formed to be posted to SOLR. **/ @Auditable public void execute(ExecutionContext context) throws Exception { logger.debug("Inside execute of KMReviewProcessAction"); try{ KmPropertyReader kmPropertyReader = new KmPropertyReader(); solrServIp = kmPropertyReader.getProperty("solr.server.ip"); logger.debug("solrServIp : "+solrServIp); solrFileLoc = kmPropertyReader.getProperty("solr.file.location"); logger.debug("solrFileLoc : "+solrFileLoc); alfServerIp = kmPropertyReader.getProperty("alfresco.server.ip"); logger.debug("alfServerIp : "+alfServerIp); }catch (Exception e) { logger.error("Error while reading property in KMReviewProcessAction : "+e.getMessage()); } final ContextInstance contextInstance = context.getContextInstance(); AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>() { String userName = (String) contextInstance.getVariable("userName"); String wfFlag = (String) contextInstance.getVariable("wfFlag"); NodeRef nodeRef = (NodeRef) contextInstance.getVariable("nodeRef"); NodeRef targetNodeRef = (NodeRef) contextInstance .getVariable("targetNodeRef"); NodeRef docParentRef = (NodeRef) contextInstance .getVariable("docParentRef"); NodeRef userHomeRef = (NodeRef) contextInstance .getVariable("userHomeRef"); List<ChildAssociationRef> children = null; String docPath = (String) contextInstance.getVariable("docPath"); String docName = (String) contextInstance.getVariable("docName"); public Object doWork() throws Exception { logger.debug("User name " + userName); logger.debug("wfFlag in KMReviewProcessAction " + wfFlag); logger.debug("docPath in execute() " + docPath); logger.debug("docName in execute() " + docName); logger.debug("nodeRef in execute() " + nodeRef); logger.debug("targetNodeRef in execute() " + targetNodeRef); logger.debug("docParentRef in execute() " + docParentRef); logger.debug("userHomeRef in execute() " + userHomeRef); if (wfFlag.equalsIgnoreCase("Moved")) { //Under Review Case // Moving Content from its original location to Under Review. logger.debug("Moving content to Under Review & set user statistics properties"); try { @SuppressWarnings("unused") FileInfo fileInfo = fileFolderService.move(nodeRef, targetNodeRef, null); Map<QName, Serializable> propertyMap = nodeService .getProperties(nodeRef); QName statusQname = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentStatus"); QName contentRating = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentRating"); QName ownerQname = QName.createQName("{http://www.alfresco.org/model/content/1.0}originalOwner"); propertyMap.put(statusQname, "underreview"); propertyMap.put(contentRating,getRating(rejOrURRating, nodeRef, userName)); propertyMap.put(ownerQname, userName); nodeService.setProperties(nodeRef, propertyMap); } catch (Exception e) { logger .error("Error while moving content to Under Review " + e.getMessage()); } } else if (wfFlag.equalsIgnoreCase("Approved")) { //Content Approval Case // Move Content back to original location. logger.debug("Moving Content back after Approval & set user statistics properties"); try { @SuppressWarnings("unused") FileInfo fileInfo = fileFolderService.move(nodeRef, docParentRef, null); Map<QName, Serializable> propertyMap = nodeService .getProperties(nodeRef); QName statusQname = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentStatus"); QName ownerQname = QName.createQName("{http://www.alfresco.org/model/content/1.0}originalOwner"); QName contentRating = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentRating"); propertyMap.put(statusQname, "approved"); propertyMap.put(ownerQname, userName); propertyMap.put(contentRating,getRating(approvalRating, nodeRef, userName)); nodeService.setProperties(nodeRef, propertyMap); } catch (Exception e) { logger .error("Error while moving content to original location after approval : " + e.getMessage()); e.printStackTrace(); } } else if (wfFlag.equalsIgnoreCase("Rejected")) { //Content Rejection Case // Move content to User Home. logger.debug("Moving Content to User Home after Rejection & set user statistics properties"); try { FileInfo fileInfo = fileFolderService.move(nodeRef, userHomeRef, null); Map<QName, Serializable> propertyMap = nodeService .getProperties(nodeRef); QName statusQname = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentStatus"); QName ownerQname = QName.createQName("{http://www.alfresco.org/model/content/1.0}originalOwner"); QName contentRating = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentRating"); propertyMap.put(statusQname, "rejected"); propertyMap.put(ownerQname, userName); propertyMap.put(contentRating,getRating(rejOrURRating, nodeRef, userName)); nodeService.setProperties(nodeRef, propertyMap); System.out.println("After Rejection " + fileInfo.getName()); } catch (Exception e) { logger.error("Error while moving content to User Home after rejection " + e.getMessage()); } } return children; } }, "admin"); } /* * Method to get overall rating for a user. */ public String getRating(int newRating, NodeRef nodeRef,String userName){ QName contentRating = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentRating"); String totalCurRating = null; try{ totalCurRating = nodeService.getProperty(nodeRef, contentRating).toString(); }catch (NullPointerException e) { logger.debug("Null Rating for user in getRating()"); totalCurRating = "0"; } int tempRating = new Integer(totalCurRating).intValue(); int overallRating = tempRating + newRating; logger.debug("Final rating for content "+overallRating); String result = ""; return (result+overallRating); }
package com.xxxx.alfresco.km.webscripts; import java.io.IOException; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; 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.QName; import org.alfresco.web.scripts.AbstractWebScript; import org.alfresco.web.scripts.WebScriptRequest; import org.alfresco.web.scripts.WebScriptResponse; import org.apache.log4j.Logger; /** * @author Lalit Jangra * Web Script to get user statistics per user. User name * will be passed a parameter on basis of which all content on which he * is owner will be searched. Once all content are available, it will be * checked for approved, rejected & under review property. * Finally an HTML string will be returned back as output to a custom dashlet for the same. */ public class GetUserStatisticsWebScript extends AbstractWebScript { private static Logger logger = Logger .getLogger(GetUserStatisticsWebScript.class); private SearchService searchService; private ServiceRegistry serviceRegistry; private NodeService nodeService; /* * Method to get user statistics. User name will be passed as a request parameter & * for this user, a search will be performed to get all the content of which he is * original owner. After this, each of content in resultset will be checked for the * status. */ public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException { int totalNoOfContent = 0; int approvedContent = 0; int rejectedContent = 0; int underReviewContent = 0; String ratingPerContent = null; NodeRef currentNodeRef = null; int ratingToDisplay = 0; String userName = req.getParameter("userName"); logger.debug("User name to get statistics for : " + userName); nodeService = serviceRegistry.getNodeService(); StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE,"SpacesStore"); SearchParameters sp = new SearchParameters(); sp.addStore(storeRef); sp.setLanguage(SearchService.LANGUAGE_LUCENE); sp.setQuery("@cm\\:originalOwner:" + userName + ""); ResultSet results = null; try { results = getSearchService().query(sp); totalNoOfContent = results.length(); //logger.debug("Size of resultset is " + totalNoOfContent); for (ResultSetRow row : results) { currentNodeRef = row.getNodeRef(); QName statusQname = QName .createQName("{http://www.alfresco.org/model/content/1.0}contentStatus"); nodeService.getProperty(currentNodeRef, statusQname); //logger.debug("Status for "+ currentNodeRef.toString()+ " is "+ nodeService.getProperty(currentNodeRef, statusQname).toString()); if((nodeService.getProperty(currentNodeRef, statusQname) .toString()).equalsIgnoreCase("underreview")){ underReviewContent = underReviewContent + 1; }else if ((nodeService.getProperty(currentNodeRef, statusQname) .toString()).equalsIgnoreCase("approved")) { approvedContent = approvedContent + 1; } else if ((nodeService .getProperty(currentNodeRef, statusQname).toString()) .equalsIgnoreCase("rejected")) { rejectedContent = rejectedContent + 1; } //For User Rating. QName contentRating = QName.createQName("{http://www.alfresco.org/model/content/1.0}contentRating"); try{ ratingPerContent = nodeService.getProperty(currentNodeRef, contentRating).toString(); ratingToDisplay += new Integer(ratingPerContent).intValue(); }catch (NullPointerException e) { //logger.debug("Null Rating for user in GetUserStatisticsWebScript"); ratingToDisplay = 0; } } logger.debug("totalNoOfContent for " + userName+ " : " + totalNoOfContent); logger.debug("approvedContent for " + userName+ " : " + approvedContent); logger.debug("rejectedContent for " + userName+ " : " + rejectedContent); logger.debug("underReviewContent for " + userName+ " : " + underReviewContent); logger.debug("ratingToDisplay for " + userName+ " : " + ratingToDisplay); //Creating an HTML String that include total output. res.setContentType("text/html"); String finalOutput = ""; finalOutput += "<html>"+ "<body>"+ "<table border=1>"+ "<tr>"+ "<th>"+ "Total No of KM Contribution"+ "</th>"+ "<th>"+ "Total No of KM Approvals"+ "</th>"+ "<th>"+ "Total No of KM Disapprovals"+ "</th>"+ "<th>"+ "Total No of KM Under Reviews"+ "</th>"+ "<th>"+ "Total User Rating"+ "</th>"+ "</tr>"; finalOutput += "<tr><td align=center>"; finalOutput +=totalNoOfContent; finalOutput += "</td><td align=center>"; finalOutput += approvedContent; finalOutput += "</td><td align=center>"; finalOutput += rejectedContent; finalOutput += "</td><td align=center>"; finalOutput += underReviewContent; finalOutput += "</td><td align=center>"; finalOutput += ratingToDisplay; finalOutput += "</td></tr></table></body></html>"; res.getWriter().write(finalOutput); } finally { if (results != null) { totalNoOfContent = 0; approvedContent = 0; rejectedContent = 0; underReviewContent = 0; ratingToDisplay = 0; results.close(); } } } public ServiceRegistry getServiceRegistry() { return serviceRegistry; } public void setServiceRegistry(ServiceRegistry serviceRegistry) { this.serviceRegistry = serviceRegistry; } public void setSearchService(SearchService searchService) { this.searchService = searchService; } public SearchService getSearchService() { return searchService; } }
<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %> <%@ page import="com.xxxx.alfresco.km.webscripts.WebScriptInvoker"%> <%@ page import="com.xxxx.alfresco.km.webscripts.WebScriptCall"%> <r:webScript scriptUrl="/wcservice/com/xxxx/alfresco/km/getuserstatistics?userName=#{NavigationBean.currentUser.userName}" />