For example, I need the evaluator, which I could use to show the action. If the current user is the author of the document, then I'll show the action.
The project structure is presented below (alf221-action-share):
C:\EclipseWorkspaces\alfresco\alf221-action-share>tree /F
...
├───build
│ ├───classes
│ │ └───com
│ │ └───tkbbank
│ │ └───alfresco
│ │ └───alf221
│ │ └───evaluators
│ │ UsersCompareEvaluator.class
│ │
│ ├───dist
│ └───lib
│ alf221-action-share.jar
│
└───src
└───main
├───com
│ └───tkbbank
│ └───alfresco
│ └───alf221
│ └───evaluators
│ UsersCompareEvaluator.java
│
└───resources
├───alfresco
│ └───web-extension
│ │ alf221-action-share-slingshot-application-context.x
│ │
│ └───messages
│ alf221-action-share.properties
│
└───META-INF
│ share-config-custom.xml
│
└───resources
└───components
└───documentlibrary
└───actions
tkbbank-exclude-participant-16.png
In the UsersCompareEvaluator class, I'm just trying to determine the current user:
package com.tkbbank.alfresco.alf221.evaluators;
import org.alfresco.web.ui.common.component.evaluator.BaseEvaluator;
import org.springframework.extensions.surf.RequestContext;
import org.springframework.extensions.surf.support.ThreadLocalRequestContext;
import org.springframework.extensions.webscripts.connector.User;
public class UsersCompareEvaluator extends BaseEvaluator {
@Override
public boolean evaluate() {
RequestContext requestContext = ThreadLocalRequestContext.getRequestContext();
User user = requestContext.getUser();
System.out.println("CURRENT USER IS ... " + user.getName());
return true;
}
}
My alf221-action-share-slingshot-application-context.xml:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN'
'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<bean id="com.tkbbank.alf221-action-share.resources"
class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
<property name="resourceBundles">
<list>
<value>alfresco.web-extension.messages.alf221-action-share</value>
</list>
</property>
</bean>
<bean id="evaluator.doclib.action.isDocumentOnApproval"
parent="evaluator.doclib.metadata.value">
<property name="accessor" value="node.properties.idocs:documentStatus" />
<property name="comparator">
<bean class="org.alfresco.web.evaluator.StringEqualsComparator">
<property name="value" value="onApproval" />
</bean>
</property>
</bean>
<bean id="evaluator.doclib.action.isCurrentUserAuthor"
class="com.tkbbank.alfresco.alf221.evaluators.UsersCompareEvaluator" />
</beans>
My share-config-custom.xml:
<alfresco-config>
<config evaluator="string-compare" condition="DocLibActions">
<actions>
<action id="tkbbank-exclude-participant"
type="javascript"
label="actions.tkbbank.exclude-participant"
icon="document-change-type">
<param name="function">onActionTkbFormDialog</param>
<permissions>
<permission allow="true">Write</permission>
</permissions>
<param name="itemKind">action</param>
<param name="itemId">exclude-participant</param>
<param name="mode">create</param>
<param name="successMessage">message.exclude-participant.success</param>
<param name="failureMessage">message.exclude-participant.failure</param>
<evaluator>evaluator.doclib.action.isDocumentOnApproval</evaluator>
<evaluator>evaluator.doclib.action.isCurrentUserAuthor</evaluator>
</action>
</actions>
<actionGroups>
<actionGroup id="document-details">
<action index="500" id="tkbbank-exclude-participant" />
</actionGroup>
</actionGroups>
</config>
</alfresco-config>
The jar-file I placed in the following path: /opt/tomcat7/webapps/share/WEB-INF/lib
Everything works perfectly, except the my custom evaluator. In this configuration, Share does not work... In the logs I see the following.
[aleksey@alfresco01 tomcat7]$ sudo vi share.log
...
Caused by: java.lang.NoClassDefFoundError: org/alfresco/web/ui/common/component/evaluator/BaseEvaluator
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2928)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1174)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1669)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1271)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1242)
... 22 more
Caused by: java.lang.ClassNotFoundException: org.alfresco.web.ui.common.component.evaluator.BaseEvaluator
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
... 33 more
If in the evaluator I implement the ActionEvaluator interface and try to identify the current user as follows...
public class UsersCompareEvaluator implements ActionEvaluator {
private Map<Object, Object> registeredBeans =
Context.getProcessEngineConfiguration().getBeans();
private ServiceRegistry registry =
(ServiceRegistry)registeredBeans.get(ActivitiConstants.SERVICE_REGISTRY_BEAN_KEY);
private AuthenticationService authenticationService =
registry.getAuthenticationService();
@Override
public boolean evaluate(Node node) {
System.out.println("CURRENT USER IS ... " +
authenticationService.getCurrentUserName());
return true;
}
@Override
public boolean evaluate(Object object) {
if(object instanceof Node) {
return evaluate((Node)object);
}
return false;
}
}
...and put my jar file in the same place (/opt/tomcat7/webapps/share/WEB-INF/lib) - then I get the following exception:
...
Caused by: java.lang.ClassNotFoundException: org.alfresco.web.action.ActionEvaluator
...
I tried to package my custom evaluator into the separate jar and place it here: /opt/tomcat7/webapps/alfresco/WEB-INF/lib But how can I refer to this evaluator from the Share?...
For example, I have a separate project (alf221-custom-evaluator):
C:\EclipseWorkspaces\alfresco\alf221-custom-evaluator>tree /F
...
└───src
└───main
├───com
│ └───tkbbank
│ └───alfresco
│ └───alf221
│ └───evaluators
│ UsersCompareEvaluator.java
│
└───resources
└───alfresco
└───web-extension
alf221-custom-evaluator-slingshot-application-context.xml
In alf221-custom-evaluator-slingshot-application-context.xml I specify the following:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN'
'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<bean id="evaluator.doclib.action.runtime.user"
class="com.tkbbank.alfresco.alf221.evaluators.UsersCompareEvaluator" />
</beans>
Then, in the sharre-config-custom.xml that is placed in alf221-action-share, I specify the following:
...
<evaluator>evaluator.doclib.action.runtime.user</evaluator>
...
In this case I get the following warning message:
...
2018-01-03 12:10:59,956 WARN [web.scripts.ActionEvaluatorHelper] [http-bio-8888-exec-8] Evaluator 'evaluator.doclib.action.runtime.user' not found.
...
And my custom evaluator does not work... How to write a custom evaluator for Share in Alfresco 4.2.2?
I would be very grateful for the information. Thanks to all.
Solved! Go to Solution.
It seems that I have found the solution... The thing is that I used the BaseEvaluator class from the Alfresco library. The same name class is represented in the Share library.
I.e. there are two jar files:
/alfresco/WEB-INF/lib/alfresco-web-client-4.2.2.5.jar
/share/WEB-INF/lib/alfresco-share-4.2.2.5.jar
In alfresco-share-4.2.2.5.jar#uzip/org/alfresco/web/evaluator I found all that I needed.
This solution now works:
package com.tkbbank.alfresco.alf221.evaluators;
// was import org.alfresco.web.ui.common.component.evaluator.BaseEvaluator;
import org.alfresco.web.evaluator.BaseEvaluator;
import org.json.simple.JSONObject;
import org.springframework.extensions.surf.RequestContext;
import org.springframework.extensions.surf.support.ThreadLocalRequestContext;
import org.springframework.extensions.webscripts.connector.User;
public class UsersCompareEvaluator extends BaseEvaluator {
@Override
public boolean evaluate(JSONObject jSONObject) {
RequestContext requestContext = ThreadLocalRequestContext.getRequestContext();
User user = requestContext.getUser();
System.out.println("CURRENT USER IS ... " + user.getName());
return true;
}
}
Now I can see in the catalina.out that:
CURRENT USER IS ... admin
It seems that I have found the solution... The thing is that I used the BaseEvaluator class from the Alfresco library. The same name class is represented in the Share library.
I.e. there are two jar files:
/alfresco/WEB-INF/lib/alfresco-web-client-4.2.2.5.jar
/share/WEB-INF/lib/alfresco-share-4.2.2.5.jar
In alfresco-share-4.2.2.5.jar#uzip/org/alfresco/web/evaluator I found all that I needed.
This solution now works:
package com.tkbbank.alfresco.alf221.evaluators;
// was import org.alfresco.web.ui.common.component.evaluator.BaseEvaluator;
import org.alfresco.web.evaluator.BaseEvaluator;
import org.json.simple.JSONObject;
import org.springframework.extensions.surf.RequestContext;
import org.springframework.extensions.surf.support.ThreadLocalRequestContext;
import org.springframework.extensions.webscripts.connector.User;
public class UsersCompareEvaluator extends BaseEvaluator {
@Override
public boolean evaluate(JSONObject jSONObject) {
RequestContext requestContext = ThreadLocalRequestContext.getRequestContext();
User user = requestContext.getUser();
System.out.println("CURRENT USER IS ... " + user.getName());
return true;
}
}
Now I can see in the catalina.out that:
CURRENT USER IS ... admin
Thank you for coming back to share your solution!
Ask for and offer help to other Alfresco Content Services Users and members of the Alfresco team.
Related links:
By using this site, you are agreeing to allow us to collect and use cookies as outlined in Alfresco’s Cookie Statement and Terms of Use (and you have a legitimate interest in Alfresco and our products, authorizing us to contact you in such methods). If you are not ok with these terms, please do not use this website.