Component visibility in the Share user interface can be controlled by Evaluators.
Architecture Information: Software Architecture
An evaluator is used by other extension points, such as Document Library Actions and Surf Extension Modules, to control when they should display or hide something. Custom evaluators are either configured or coded in Java. The following is an example of an evaluator that is configured as a Spring Bean:
<beanid="evaluator.doclib.metadata.hasExposure"parent="evaluator.doclib.action.propertyNotNull"> <property name="property" value="exif:exposureTime"/> </bean>
In this case a new custom evaluator with ID evaluator.doclib.metadata.hasExposure is created. It is based on the out-of-the-box propertyNotNull evaluator, which takes a property parameter with the content model property that should be checked for null. This evaluator is now ready to use in for example a Document Library Action definition.
If the evaluator is a bit more complex, and there is no existing evaluator that it can be based on, then we can implement the evaluator in Java as in the following example:
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.web.evaluator.BaseEvaluator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.simple.JSONArray; import org.json.simple.JSONObject; publicclassCheckIfDocIsEmailedEvaluatorextendsBaseEvaluator { privatestatic Log logger = LogFactory.getLog(CheckIfDocIsEmailedEvaluator.class); privatestaticfinal String ASPECT_EMAILED = "cm:emailed"; @Override publicbooleanevaluate(JSONObject jsonObject) { try { JSONArray nodeAspects = getNodeAspects(jsonObject); if (nodeAspects == null) { logger.info("No aspects found"); returnfalse; } else { if (nodeAspects.contains(ASPECT_EMAILED)) { logger.info("Has been emailed"); returntrue; } else { logger.info("Has NOT been emailed"); returnfalse; } } } catch (Exception err) { thrownew AlfrescoRuntimeException("JSONException whilst running action evaluator: " + err.getMessage()); } } }
This evaluator needs to be declared as a Spring bean too as follows:
<beanid="org.alfresco.training.evaluator.doclib.action.isEmailed"class="org.alfresco.training.documentlibrary.action.evaluator.CheckIfDocIsEmailedEvaluator" />
An evaluator is used by referring to it via the Spring Bean ID, as in the following example when declaring a Document Library Action:
<actionid="org.alfresco.training.doclib.action.sendAsEmail"icon="email"type="javascript"label="actions.training.alfresco.sendAsEmail"> <param name="function">onActionFormDialog</param> <param name="itemKind">action</param> <param name="itemId">send-as-email</param> <param name="mode">create</param> <param name="destination">{node.nodeRef}</param> <param name="successMessage">message.send-as-email.success</param> <param name="failureMessage">message.send-as-email.failure</param> <evaluator negate="true">org.alfresco.training.evaluator.doclib.action.isEmailed</evaluator> </action>
Note here how you can negate the outcome of the evaluation. Which means that in this case we want to show the Send As Email document library action in the UI if an email has not been sent.