mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2556 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
260 lines
11 KiB
Java
260 lines
11 KiB
Java
/*
|
|
* Copyright (C) 2005 Alfresco, Inc.
|
|
*
|
|
* Licensed under the Mozilla Public License version 1.1
|
|
* with a permitted attribution clause. You may obtain a
|
|
* copy of the License at
|
|
*
|
|
* http://www.alfresco.org/legal/license.txt
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
* either express or implied. See the License for the specific
|
|
* language governing permissions and limitations under the
|
|
* License.
|
|
*/
|
|
package org.alfresco.web.config;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import org.alfresco.config.ConfigElement;
|
|
import org.alfresco.config.ConfigException;
|
|
import org.alfresco.config.xml.elementreader.ConfigElementReader;
|
|
import org.alfresco.web.action.ActionEvaluator;
|
|
import org.alfresco.web.config.ActionsConfigElement.ActionDefinition;
|
|
import org.alfresco.web.config.ActionsConfigElement.ActionGroup;
|
|
import org.dom4j.Element;
|
|
|
|
/**
|
|
* Config Element Reader for the "Action" config blocks.
|
|
*
|
|
* @author Kevin Roast
|
|
*/
|
|
public class ActionsElementReader implements ConfigElementReader
|
|
{
|
|
public static final String ELEMENT_ACTION = "action";
|
|
public static final String ELEMENT_ACTIONGROUP = "action-group";
|
|
public static final String ELEMENT_PERMISSIONS = "permissions";
|
|
public static final String ELEMENT_PERMISSION = "permission";
|
|
public static final String ELEMENT_EVALUATOR = "evaluator";
|
|
public static final String ELEMENT_LABEL = "label";
|
|
public static final String ELEMENT_LABELMSG = "label-id";
|
|
public static final String ELEMENT_TOOLTIP = "tooltip";
|
|
public static final String ELEMENT_TOOLTIPMSG = "tooltip-id";
|
|
public static final String ELEMENT_SHOWLINK = "show-link";
|
|
public static final String ELEMENT_STYLE = "style";
|
|
public static final String ELEMENT_STYLECLASS = "style-class";
|
|
public static final String ELEMENT_IMAGE = "image";
|
|
public static final String ELEMENT_ACTIONLISTENER = "action-listener";
|
|
public static final String ELEMENT_ONCLICK = "onclick";
|
|
public static final String ELEMENT_HREF = "href";
|
|
public static final String ELEMENT_TARGET = "target";
|
|
public static final String ELEMENT_PARAMS = "params";
|
|
public static final String ELEMENT_PARAM = "param";
|
|
public static final String ATTRIBUTE_ID = "id";
|
|
public static final String ATTRIBUTE_IDREF = "idref";
|
|
public static final String ATTRIBUTE_NAME = "name";
|
|
public static final String ATTRIBUTE_ALLOW = "allow";
|
|
|
|
|
|
/**
|
|
* @see org.alfresco.config.xml.elementreader.ConfigElementReader#parse(org.dom4j.Element)
|
|
*/
|
|
@SuppressWarnings("unchecked")
|
|
public ConfigElement parse(Element element)
|
|
{
|
|
ActionsConfigElement configElement = new ActionsConfigElement();
|
|
|
|
if (element != null)
|
|
{
|
|
if (ActionsConfigElement.CONFIG_ELEMENT_ID.equals(element.getName()) == false)
|
|
{
|
|
throw new ConfigException("ActionsElementReader can only parse config elements of type 'Actions'");
|
|
}
|
|
|
|
Iterator<Element> actionItr = element.elementIterator(ELEMENT_ACTION);
|
|
while (actionItr.hasNext())
|
|
{
|
|
// work on each 'action' element in turn
|
|
Element actionElement = actionItr.next();
|
|
|
|
// parse the action definition for the element
|
|
ActionDefinition actionDef = parseActionDefinition(actionElement);
|
|
|
|
// add our finished action def to the map of all actions
|
|
configElement.addActionDefinition(actionDef);
|
|
}
|
|
|
|
Iterator<Element> actionGroupItr = element.elementIterator(ELEMENT_ACTIONGROUP);
|
|
while (actionGroupItr.hasNext())
|
|
{
|
|
// work on each 'action-group' element in turn
|
|
Element groupElement = actionGroupItr.next();
|
|
String groupId = groupElement.attributeValue(ATTRIBUTE_ID);
|
|
if (groupId == null || groupId.length() == 0)
|
|
{
|
|
throw new ConfigException("'action-group' config element specified without mandatory 'id' attribute.");
|
|
}
|
|
|
|
// build a structure to represent the action group
|
|
ActionGroup actionGroup = new ActionGroup(groupId);
|
|
|
|
// loop round each action ref and add them to the list for this action group
|
|
Iterator<Element> actionRefItr = groupElement.elementIterator(ELEMENT_ACTION);
|
|
while (actionRefItr.hasNext())
|
|
{
|
|
Element actionRefElement = actionRefItr.next();
|
|
|
|
// look for an action referred to be Id - this is the common use-case
|
|
String idRef = actionRefElement.attributeValue(ATTRIBUTE_IDREF);
|
|
if (idRef == null || idRef.length() == 0)
|
|
{
|
|
// look for an action defined directly rather than referenced by Id
|
|
String id = actionRefElement.attributeValue(ATTRIBUTE_ID);
|
|
if (id != null && id.length() != 0)
|
|
{
|
|
ActionDefinition def = parseActionDefinition(actionRefElement);
|
|
// override action definition ID based on the group name to avoid conflicts
|
|
def.id = actionGroup.getId() + '_' + def.getId();
|
|
configElement.addActionDefinition(def);
|
|
actionGroup.addAction(def.getId());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// add the action definition ID to the group
|
|
actionGroup.addAction(idRef);
|
|
}
|
|
}
|
|
|
|
// get simple string properties for the action group
|
|
actionGroup.Style = groupElement.elementTextTrim(ELEMENT_STYLE);
|
|
actionGroup.StyleClass = groupElement.elementTextTrim(ELEMENT_STYLECLASS);
|
|
if (groupElement.element(ELEMENT_SHOWLINK) != null)
|
|
{
|
|
actionGroup.ShowLink = Boolean.parseBoolean(groupElement.element(ELEMENT_SHOWLINK).getTextTrim());
|
|
}
|
|
|
|
// add the action group to the map of all action groups
|
|
configElement.addActionGroup(actionGroup);
|
|
}
|
|
}
|
|
|
|
return configElement;
|
|
}
|
|
|
|
/**
|
|
* Parse an ActionDefinition from the specific config element.
|
|
*
|
|
* @param actionElement The config element containing the action def
|
|
*
|
|
* @return The populated ActionDefinition
|
|
*/
|
|
public ActionDefinition parseActionDefinition(Element actionElement)
|
|
{
|
|
String actionId = actionElement.attributeValue(ATTRIBUTE_ID);
|
|
if (actionId == null || actionId.length() == 0)
|
|
{
|
|
throw new ConfigException("'action' config element specified without mandatory 'id' attribute.");
|
|
}
|
|
|
|
// build a structure to represent the action definition
|
|
ActionDefinition actionDef = new ActionDefinition(actionId);
|
|
|
|
// look for the permissions element - it can contain many permission
|
|
Element permissionsElement = actionElement.element(ELEMENT_PERMISSIONS);
|
|
if (permissionsElement != null)
|
|
{
|
|
// read and process each permission element
|
|
Iterator<Element> permissionItr = permissionsElement.elementIterator(ELEMENT_PERMISSION);
|
|
while (permissionItr.hasNext())
|
|
{
|
|
Element permissionElement = permissionItr.next();
|
|
boolean allow = true;
|
|
if (permissionElement.attributeValue(ATTRIBUTE_ALLOW) != null)
|
|
{
|
|
allow = Boolean.parseBoolean(permissionElement.attributeValue(ATTRIBUTE_ALLOW));
|
|
}
|
|
String permissionValue = permissionElement.getTextTrim();
|
|
if (allow)
|
|
{
|
|
actionDef.addAllowPermission(permissionValue);
|
|
}
|
|
else
|
|
{
|
|
actionDef.addDenyPermission(permissionValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
// find and construct the specified evaluator class
|
|
Element evaluatorElement = actionElement.element(ELEMENT_EVALUATOR);
|
|
if (evaluatorElement != null)
|
|
{
|
|
Object evaluator;
|
|
String className = evaluatorElement.getTextTrim();
|
|
try
|
|
{
|
|
Class clazz = Class.forName(className);
|
|
evaluator = clazz.newInstance();
|
|
}
|
|
catch (Throwable err)
|
|
{
|
|
throw new ConfigException("Unable to construct action '" +
|
|
actionId + "' evaluator classname: " +className);
|
|
}
|
|
if (evaluator instanceof ActionEvaluator == false)
|
|
{
|
|
throw new ConfigException("Action '" + actionId + "' evaluator class '" +
|
|
className + "' does not implement ActionEvaluator interface.");
|
|
}
|
|
actionDef.Evaluator = (ActionEvaluator)evaluator;
|
|
}
|
|
|
|
// find any parameter values that the action requires
|
|
Element paramsElement = actionElement.element(ELEMENT_PARAMS);
|
|
if (paramsElement != null)
|
|
{
|
|
Iterator<Element> paramsItr = paramsElement.elementIterator(ELEMENT_PARAM);
|
|
while (paramsItr.hasNext())
|
|
{
|
|
Element paramElement = paramsItr.next();
|
|
String name = paramElement.attributeValue(ATTRIBUTE_NAME);
|
|
if (name == null || name.length() == 0)
|
|
{
|
|
throw new ConfigException("Action '" + actionId +
|
|
"' param does not have mandatory 'name' attribute.");
|
|
}
|
|
String value = paramElement.getTextTrim();
|
|
if (value == null || value.length() == 0)
|
|
{
|
|
throw new ConfigException("Action '" + actionId + "' param '" + name + "'" +
|
|
"' does not have a value.");
|
|
}
|
|
actionDef.addParam(name, value);
|
|
}
|
|
}
|
|
|
|
// get simple string properties for the action
|
|
actionDef.Label = actionElement.elementTextTrim(ELEMENT_LABEL);
|
|
actionDef.LabelMsg = actionElement.elementTextTrim(ELEMENT_LABELMSG);
|
|
actionDef.Tooltip = actionElement.elementTextTrim(ELEMENT_TOOLTIP);
|
|
actionDef.TooltipMsg = actionElement.elementTextTrim(ELEMENT_TOOLTIPMSG);
|
|
actionDef.Href = actionElement.elementTextTrim(ELEMENT_HREF);
|
|
actionDef.Target = actionElement.elementTextTrim(ELEMENT_TARGET);
|
|
actionDef.Action = actionElement.elementTextTrim(ELEMENT_ACTION);
|
|
actionDef.ActionListener = actionElement.elementTextTrim(ELEMENT_ACTIONLISTENER);
|
|
actionDef.Onclick = actionElement.elementTextTrim(ELEMENT_ONCLICK);
|
|
actionDef.Image = actionElement.elementTextTrim(ELEMENT_IMAGE);
|
|
actionDef.Style = actionElement.elementTextTrim(ELEMENT_STYLE);
|
|
actionDef.StyleClass = actionElement.elementTextTrim(ELEMENT_STYLECLASS);
|
|
if (actionElement.element(ELEMENT_SHOWLINK) != null)
|
|
{
|
|
actionDef.ShowLink = Boolean.parseBoolean(actionElement.element(ELEMENT_SHOWLINK).getTextTrim());
|
|
}
|
|
|
|
return actionDef;
|
|
}
|
|
}
|