. First cut of the Externalised UI Actions

- XML Config for UI actions: web-client-config-actions.xml
   - commented examples are included in the config, I will write up a Wiki page to document it properly :)
 - Named groups of actions can also be reused across screens (where as previously individual ActionLink components had to be coded up for each screen by hand in the JSP)
 - Individual Actions can be reused across action groups or defined against a specific action group
 - UI actions for Browse (Create, More, Document and Space actions), Document and Space details pages now externalised into config
 - Refactoring of other JSPs to use externalised config - big reduction in hand coded JSF tags and code duplication between pages
. Document Details and Space Details pages now have Actions panel on the right hand side instead of an Actions drop-down menu
. Several unreported minor bugs fixed where actions conditions or listeners were inconsistent between browse and details pages

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2553 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2006-03-17 18:07:47 +00:00
parent dd70d72198
commit 5d3872279f
37 changed files with 2013 additions and 500 deletions

View File

@@ -30,5 +30,13 @@ import org.alfresco.web.bean.repository.Node;
*/
public interface ActionEvaluator
{
/**
* The evaluator should decide if the action precondition is valid based on the appropriate
* logic and the properties etc. of the Node context and return the result.
*
* @param node Node context for the action
*
* @return result of whether the action can proceed.
*/
public boolean evaluate(Node node);
}

View File

@@ -0,0 +1,43 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - 'Approve' workflow step for document.
*
* @author Kevin Roast
*/
public final class ApproveDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.getProperties().get("app:approveStep") != null &&
node.isLocked() == false &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false);
}
}
/*
<a:booleanEvaluator value='#{r["app:approveStep"] != null && r.workingCopy == false && r.locked == false}'>
*/

View File

@@ -0,0 +1,42 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Cancel checkout document.
*
* @author Kevin Roast
*/
public final class CancelCheckoutDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.hasPermission(PermissionService.CANCEL_CHECK_OUT) &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY));
}
}
/*
<a:booleanEvaluator value="#{r.cancelCheckOut == true}">
*/

View File

@@ -0,0 +1,42 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Checkin document.
*
* @author Kevin Roast
*/
public final class CheckinDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.hasPermission(PermissionService.CHECK_IN) &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == true);
}
}
/*
<a:booleanEvaluator value="#{r.checkIn == true}">
*/

View File

@@ -0,0 +1,43 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Checkout document.
*
* @author Kevin Roast
*/
public final class CheckoutDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.hasPermission(PermissionService.CHECK_OUT) &&
(node.isLocked() == false &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false));
}
}
/*
<a:booleanEvaluator value="#{r.locked == false && r.workingCopy == false}">
*/

View File

@@ -0,0 +1,42 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.model.ForumModel;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Create a forum around a node.
*
* @author Kevin Roast
*/
public final class CreateForumNodeEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.hasAspect(ForumModel.ASPECT_DISCUSSABLE) == false &&
node.isLocked() == false);
}
}
/*
<a:booleanEvaluator value="#{r.beingDiscussed == false && r.locked == false}">
*/

View File

@@ -0,0 +1,41 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Delete document.
*
* @author Kevin Roast
*/
public final class DeleteDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.isLocked() == false &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false);
}
}
/*
<a:booleanEvaluator value="#{r.locked == false && r.workingCopy == false}">
*/

View File

@@ -0,0 +1,41 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.model.ForumModel;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Discuss a node.
*
* @author Kevin Roast
*/
public final class DiscussNodeEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.hasAspect(ForumModel.ASPECT_DISCUSSABLE) == true);
}
}
/*
<a:booleanEvaluator value="#{r.beingDiscussed == true}">
*/

View File

@@ -19,16 +19,16 @@ package org.alfresco.web.action.evaluator;
import javax.faces.context.FacesContext;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.lock.LockService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
/**
* UI Action Evaluator - Edit document via CIFS.
*
* @author Kevin Roast
*/
public class EditDocCIFSEvaluator implements ActionEvaluator
public final class EditDocCIFSEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
@@ -41,11 +41,8 @@ public class EditDocCIFSEvaluator implements ActionEvaluator
if (node.hasAspect(ContentModel.ASPECT_INLINEEDITABLE) == false &&
"webdav".equals(Application.getClientConfig(fc).getEditLinkType()))
{
LockService lockService =
Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getLockService();
if (Repository.isNodeOwner(node, lockService) == true ||
(node.isLocked() == false && node.hasAspect(ContentModel.ASPECT_WORKING_COPY)))
if (node.isWorkingCopyOwner() == true ||
(node.isLocked() == false && node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false))
{
return true;
}

View File

@@ -19,16 +19,16 @@ package org.alfresco.web.action.evaluator;
import javax.faces.context.FacesContext;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.lock.LockService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
/**
* UI Action Evaluator - Edit document via HTTP or inline edit.
*
* @author Kevin Roast
*/
public class EditDocHttpEvaluator implements ActionEvaluator
public final class EditDocHttpEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
@@ -42,11 +42,8 @@ public class EditDocHttpEvaluator implements ActionEvaluator
if (node.hasAspect(ContentModel.ASPECT_INLINEEDITABLE) == true ||
"http".equals(Application.getClientConfig(fc).getEditLinkType()))
{
LockService lockService =
Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getLockService();
if (Repository.isNodeOwner(node, lockService) == true ||
(node.isLocked() == false && node.hasAspect(ContentModel.ASPECT_WORKING_COPY)))
if (node.isWorkingCopyOwner() == true ||
(node.isLocked() == false && node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false))
{
return true;
}

View File

@@ -19,16 +19,16 @@ package org.alfresco.web.action.evaluator;
import javax.faces.context.FacesContext;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.lock.LockService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
/**
* UI Action Evaluator - Edit document via Webdav.
*
* @author Kevin Roast
*/
public class EditDocWebDavEvaluator implements ActionEvaluator
public final class EditDocWebDavEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
@@ -41,11 +41,8 @@ public class EditDocWebDavEvaluator implements ActionEvaluator
if (node.hasAspect(ContentModel.ASPECT_INLINEEDITABLE) == false &&
"cifs".equals(Application.getClientConfig(fc).getEditLinkType()))
{
LockService lockService =
Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getLockService();
if (Repository.isNodeOwner(node, lockService) == true ||
(node.isLocked() == false && node.hasAspect(ContentModel.ASPECT_WORKING_COPY)))
if (node.isWorkingCopyOwner() == true ||
(node.isLocked() == false && node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false))
{
return true;
}

View File

@@ -0,0 +1,43 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - 'Reject' workflow step for document.
*
* @author Kevin Roast
*/
public final class RejectDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.getProperties().get("app:rejectStep") != null &&
node.isLocked() == false &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false);
}
}
/*
<a:booleanEvaluator value='#{r["app:rejectStep"] != null && r.workingCopy == false && r.locked == false}'>
*/

View File

@@ -0,0 +1,45 @@
/*
* 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.action.evaluator;
import javax.faces.context.FacesContext;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.NavigationBean;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Create a shortcut to a node.
*
* @author Kevin Roast
*/
public final class ShortcutNodeEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
NavigationBean nav =
(NavigationBean)FacesHelper.getManagedBean(FacesContext.getCurrentInstance(), "NavigationBean");
return (nav.getIsGuest() == false);
}
}
/*
rendered="#{NavigationBean.isGuest == false}"
*/

View File

@@ -0,0 +1,42 @@
/*
* 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.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
/**
* UI Action Evaluator - Update document content.
*
* @author Kevin Roast
*/
public final class UpdateDocEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
return (node.isWorkingCopyOwner() == true ||
(node.isLocked() == false &&
node.hasAspect(ContentModel.ASPECT_WORKING_COPY) == false));
}
}
/*
<a:booleanEvaluator value="#{(r.locked == false && r.workingCopy == false) || r.owner == true}">
*/

View File

@@ -17,6 +17,11 @@
*/
package org.alfresco.web.app;
import java.util.ArrayList;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
@@ -33,30 +38,67 @@ public class DebugPhaseListener implements PhaseListener
{
private static final Log logger = LogFactory.getLog(DebugPhaseListener.class);
public int indent = 0;
public static final String INDENT = " ";
/**
* @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
*/
public void afterPhase(PhaseEvent event)
{
if (logger.isDebugEnabled())
logger.debug("********** Exiting phase: " + event.getPhaseId().toString());
{
printComponentTree(FacesContext.getCurrentInstance().getViewRoot());
}
}
/**
* @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
*/
public void beforePhase(PhaseEvent event)
{
if (logger.isDebugEnabled())
logger.debug("********** Entering phase: " + event.getPhaseId().toString());
}
/**
* @see javax.faces.event.PhaseListener#getPhaseId()
*/
public PhaseId getPhaseId()
{
return PhaseId.ANY_PHASE;
return PhaseId.RENDER_RESPONSE;
}
public void printComponentTree(UIComponent comp){
printComponentInfo(comp);
List complist = comp.getChildren();
if (complist.size()>0)
indent++;
for (int i = 0; i < complist.size(); i++) {
UIComponent uicom = (UIComponent) complist.get(i);
printComponentTree(uicom);
if (i+1 == complist.size())
indent--;
}
}
public void printComponentInfo(UIComponent comp){
if (comp.getId() == null){
logger.debug("UIViewRoot" + " " + "(" + comp.getClass().getName() + ")");
} else {
logger.debug(getIndent() + "|");
logger.debug(getIndent() + comp.getId() + " " + "(" + comp.getClass().getName() + ")");
}
}
public String getIndent()
{
String indent = "";
for (int i=0; i<this.indent; i++)
{
indent += INDENT;
}
return indent;
}
}

View File

@@ -783,7 +783,7 @@ public class BrowseBean implements IContextListener
public NodePropertyResolver resolverOwner = new NodePropertyResolver() {
public Object get(Node node) {
return Repository.isNodeOwner(node, lockService);
return getDocument().isWorkingCopyOwner();
}
};

View File

@@ -1087,7 +1087,7 @@ public class DocumentDetailsBean
FacesContext context = FacesContext.getCurrentInstance();
String msg = Application.getMessage(context, MSG_SUCCESS_OWNERSHIP);
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
context.addMessage(event.getComponent().getClientId(context), facesMsg);
context.addMessage("document-details:document-props", facesMsg);
// commit the transaction
tx.commit();
@@ -1193,7 +1193,7 @@ public class DocumentDetailsBean
*/
public boolean isOwner()
{
return Repository.isNodeOwner(getDocument(), this.lockService);
return getDocument().isWorkingCopyOwner();
}
/**

View File

@@ -324,7 +324,7 @@ public class SpaceDetailsBean
FacesContext context = FacesContext.getCurrentInstance();
String msg = Application.getMessage(context, MSG_SUCCESS_OWNERSHIP);
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
context.addMessage(event.getComponent().getClientId(context), facesMsg);
context.addMessage("space-details:space-props", facesMsg);
// commit the transaction
tx.commit();

View File

@@ -35,6 +35,7 @@ import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.web.app.Application;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -57,6 +58,7 @@ public class Node implements Serializable
private Set<QName> aspects = null;
private Map<String, Boolean> permissions;
private Boolean locked = null;
private Boolean workingCopyOwner = null;
protected QNameNodeMap<String, Object> properties;
protected boolean propsRetrieved = false;
protected ServiceRegistry services = null;
@@ -404,6 +406,32 @@ public class Node implements Serializable
return this.locked.booleanValue();
}
/**
* @return whether a the Node is a WorkingCopy owned by the current User
*/
public final boolean isWorkingCopyOwner()
{
if (this.workingCopyOwner == null)
{
this.workingCopyOwner = Boolean.FALSE;
if (hasAspect(ContentModel.ASPECT_WORKING_COPY))
{
Object obj = getProperties().get(ContentModel.PROP_WORKING_COPY_OWNER);
if (obj instanceof String)
{
User user = Application.getCurrentUser(FacesContext.getCurrentInstance());
if ( ((String)obj).equals(user.getUserName()))
{
this.workingCopyOwner = Boolean.TRUE;
}
}
}
}
return workingCopyOwner.booleanValue();
}
/**
* Resets the state of the node to force re-retrieval of the data
*/
@@ -413,6 +441,7 @@ public class Node implements Serializable
this.type = null;
this.path = null;
this.locked = null;
this.workingCopyOwner = null;
this.properties.clear();
this.propsRetrieved = false;
this.aspects = null;

View File

@@ -219,34 +219,6 @@ public final class Repository
return locked;
}
/**
* Return whether a WorkingCopy Node is owned by the current User
*
* @param node The Node wrapper to test against
* @param lockService The LockService to use
*
* @return whether a WorkingCopy Node is owned by the current User
*/
public static Boolean isNodeOwner(Node node, LockService lockService)
{
Boolean locked = Boolean.FALSE;
if (node.hasAspect(ContentModel.ASPECT_WORKING_COPY))
{
Object obj = node.getProperties().get("workingCopyOwner");
if (obj instanceof String)
{
User user = Application.getCurrentUser(FacesContext.getCurrentInstance());
if ( ((String)obj).equals(user.getUserName()))
{
locked = Boolean.TRUE;
}
}
}
return locked;
}
/**
* Return the human readable form of the specified node Path. Fast version of the method that
* simply converts QName localname components to Strings.

View File

@@ -72,11 +72,18 @@ public class ActionsConfigElement extends ConfigElementAdapter
ActionsConfigElement existingElement = (ActionsConfigElement)configElement;
ActionsConfigElement combinedElement = new ActionsConfigElement();
combinedElement.actionDefs.putAll(this.actionDefs);
combinedElement.actionDefs.putAll(existingElement.actionDefs);
combinedElement.actionGroups.putAll(this.actionGroups);
combinedElement.actionGroups.putAll(existingElement.actionGroups);
//
// TODO: implement to allow override of config elements
// TODO: do we need to check all groups here and update ActionDefinition references incase they
// have changed? e.g. if an actiondef ID is overriden, a group using it will not know!
//
return null;
return combinedElement;
}
/*package*/ void addActionDefinition(ActionDefinition actionDef)
@@ -173,7 +180,7 @@ public class ActionsConfigElement extends ConfigElementAdapter
public String LabelMsg;
public String Tooltip;
public String TooltipMsg;
public boolean ShowLink;
public boolean ShowLink = true;
public String Style;
public String StyleClass;
public String Image;
@@ -181,6 +188,7 @@ public class ActionsConfigElement extends ConfigElementAdapter
public String Action;
public String Href;
public String Target;
public String Onclick;
}

View File

@@ -39,14 +39,15 @@ public class ActionsElementReader implements ConfigElementReader
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-msg";
public static final String ELEMENT_LABELMSG = "label-id";
public static final String ELEMENT_TOOLTIP = "tooltip";
public static final String ELEMENT_TOOLTIPMSG = "tooltip-msg";
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";
@@ -250,6 +251,7 @@ public class ActionsElementReader implements ConfigElementReader
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);

View File

@@ -28,6 +28,7 @@ public final class ComponentConstants
public static final String JAVAX_FACES_PANEL = "javax.faces.Panel";
public static final String JAVAX_FACES_CHECKBOX = "javax.faces.Checkbox";
public static final String JAVAX_FACES_SELECT_BOOLEAN = "javax.faces.SelectBoolean";
public static final String JAVAX_FACES_PARAMETER = "javax.faces.Parameter";
/**
* Private constructor

View File

@@ -27,6 +27,7 @@ import javax.faces.event.ActionEvent;
import org.alfresco.web.ui.common.Utils;
import org.alfresco.web.ui.common.component.UIActionLink;
import org.alfresco.web.ui.common.component.UIMenu;
import org.alfresco.web.ui.repo.component.UIActions;
/**
* @author kevinr
@@ -78,10 +79,17 @@ public class ActionLinkRenderer extends BaseRenderer
UIActionLink link = (UIActionLink)component;
if (isInMenu(link) == true)
UIComponent verticalContiner = getVerticalContainer(link);
if (verticalContiner != null)
{
// render as menu item
out.write( renderMenuAction(context, link) );
int padding = link.getPadding();
if (verticalContiner instanceof UIActions)
{
padding = ((UIActions)verticalContiner).getVerticalSpacing();
}
// render as menu item style action link
out.write( renderMenuAction(context, link, padding) );
}
else
{
@@ -239,7 +247,7 @@ public class ActionLinkRenderer extends BaseRenderer
*
* @return action link HTML
*/
private String renderMenuAction(FacesContext context, UIActionLink link)
private String renderMenuAction(FacesContext context, UIActionLink link, int padding)
{
StringBuilder buf = new StringBuilder(256);
@@ -252,7 +260,6 @@ public class ActionLinkRenderer extends BaseRenderer
}
buf.append("</td><td");
int padding = link.getPadding();
if (padding != 0)
{
buf.append(" style=\"padding:")
@@ -314,23 +321,24 @@ public class ActionLinkRenderer extends BaseRenderer
// Private helpers
/**
* Return true if the action link is present within a UIMenu component container
* Return any vertically rendered container component the action link is present within
*
* @param link The ActionLink to test
*
* @return true if the action link is present within a UIMenu component
* @return UIComponent vertically rendered component
*/
private static boolean isInMenu(UIActionLink link)
private static UIComponent getVerticalContainer(UIActionLink link)
{
UIComponent parent = link.getParent();
while (parent != null)
{
if (parent instanceof UIMenu)
if (parent instanceof UIMenu ||
(parent instanceof UIActions && ((UIActions)parent).getVerticalSpacing() != 0))
{
break;
}
parent = parent.getParent();
}
return (parent != null);
return parent;
}
}

View File

@@ -355,42 +355,6 @@ public class RichListRenderer extends BaseRenderer
public void renderListBefore(FacesContext context, UIRichList richList, UIColumn[] columns)
throws IOException
{
// ResponseWriter out = context.getResponseWriter();
// render column headers as labels
// TODO: add "showHeaders" to RichList to allow hiding of header facets for some view modes
/*
out.write("<tr");
outputAttribute(out, richList.getAttributes().get("headerStyleClass"), "class");
out.write('>');
for (int i=0; i<columns.length; i++)
{
UIColumn column = columns[i];
if (column.isRendered() == true)
{
out.write("<th");
outputAttribute(out, column.getAttributes().get("width"), "width");
outputAttribute(out, column.getAttributes().get("style"), "style");
outputAttribute(out, column.getAttributes().get("styleClass"), "class");
out.write('>');
// output the header facet if any
UIComponent header = column.getHeader();
if (header != null)
{
header.encodeBegin(context);
header.encodeChildren(context);
header.encodeEnd(context);
}
}
// we don't render child controls for the header row
out.write("</th>");
}
out.write("</tr>");
*/
this.rowIndex = 0;
}

View File

@@ -0,0 +1,587 @@
/*
* 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.ui.repo.component;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.el.ValueBinding;
import org.alfresco.config.Config;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.config.ActionsConfigElement;
import org.alfresco.web.config.ActionsConfigElement.ActionDefinition;
import org.alfresco.web.config.ActionsConfigElement.ActionGroup;
import org.alfresco.web.ui.common.ComponentConstants;
import org.alfresco.web.ui.common.ConstantMethodBinding;
import org.alfresco.web.ui.common.Utils;
import org.alfresco.web.ui.common.component.SelfRenderingComponent;
import org.alfresco.web.ui.common.component.UIActionLink;
import org.alfresco.web.ui.repo.component.evaluator.ActionInstanceEvaluator;
import org.alfresco.web.ui.repo.component.evaluator.PermissionEvaluator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.myfaces.taglib.UIComponentTagUtils;
/**
* @author kevinr
*/
public class UIActions extends SelfRenderingComponent
{
// ------------------------------------------------------------------------------
// Component implementation
private static final String ATTR_VALUE = "value";
private static Log logger = LogFactory.getLog(UIActions.class);
private static final String ATTR_SHOWLINK = "showLink";
private static final String ATTR_STYLECLASS = "styleClass";
private static final String ATTR_STYLE = "style";
private static final String ACTION_CONTEXT = "actionContext";
private static final String RENDERER_ACTIONLINK = "org.alfresco.faces.ActionLinkRenderer";
private static final String COMPONENT_ACTIONLINK = "org.alfresco.faces.ActionLink";
private static final String COMPONENT_PERMISSIONEVAL = "org.alfresco.faces.PermissionEvaluator";
private static final String COMPONENT_ACTIONEVAL = "org.alfresco.faces.ActionInstanceEvaluator";
private final static Class ACTION_CLASS_ARGS[] = {javax.faces.event.ActionEvent.class};
/**
* @see javax.faces.component.UIComponent#getFamily()
*/
public String getFamily()
{
return "org.alfresco.faces.Controls";
}
/**
* @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext, java.lang.Object)
*/
public void restoreState(FacesContext context, Object state)
{
Object values[] = (Object[])state;
// standard component attributes are restored by the super class
super.restoreState(context, values[0]);
this.value = (String)values[1];
this.showLink = (Boolean)values[2];
this.verticalSpacing = (Integer)values[3];
}
/**
* @see javax.faces.component.StateHolder#saveState(javax.faces.context.FacesContext)
*/
public Object saveState(FacesContext context)
{
Object values[] = new Object[4];
// standard component attributes are saved by the super class
values[0] = super.saveState(context);
values[1] = this.value;
values[2] = this.showLink;
values[3] = this.verticalSpacing;
return (values);
}
/**
* @see javax.faces.component.UIComponentBase#encodeBegin(javax.faces.context.FacesContext)
*/
public void encodeBegin(FacesContext context) throws IOException
{
if (isRendered() == false)
{
return;
}
if (logger.isDebugEnabled())
logger.debug("encodeBegin() for <r:actions/> Id: " + getId() + " groupId: " + getValue());
// put the context object into the requestMap so it is accessable
// by any child component value binding expressions
Map requestMap = getFacesContext().getExternalContext().getRequestMap();
requestMap.put(ACTION_CONTEXT, getContext());
if (getChildCount() != 0)
{
if (logger.isDebugEnabled())
logger.debug("---already built component tree for actions.");
return;
}
ResponseWriter out = context.getResponseWriter();
String groupId = getValue();
if (groupId != null && groupId.length() != 0)
{
Config config = Application.getConfigService(context).getConfig("Actions");
if (config != null)
{
// find the Actions specific config element
ActionsConfigElement actionConfig =
(ActionsConfigElement)config.getConfigElement(ActionsConfigElement.CONFIG_ELEMENT_ID);
if (actionConfig != null)
{
// and lookup our ActionGroup by Id
ActionGroup actionGroup = actionConfig.getActionGroup(groupId);
if (actionGroup != null)
{
// render the action group component tree
if (logger.isDebugEnabled())
logger.debug("-constructing ActionGroup: " + groupId);
buildActionGroup(context, actionGroup);
}
else
{
logger.warn("Unable to find specified Action Group config ID: " + groupId);
}
}
}
}
}
/**
* @see javax.faces.component.UIComponentBase#getRendersChildren()
*/
public boolean getRendersChildren()
{
return true;
}
/**
* @see javax.faces.component.UIComponentBase#encodeChildren(javax.faces.context.FacesContext)
*/
public void encodeChildren(FacesContext context) throws IOException
{
ResponseWriter out = context.getResponseWriter();
int verticalSpacing = getVerticalSpacing();
if (verticalSpacing != 0)
{
out.write("<table cellspacing='");
out.write(verticalSpacing);
out.write("'");
if (getAttributes().get(ATTR_STYLE) != null)
{
outputAttribute(out, getAttributes().get(ATTR_STYLE), ATTR_STYLE);
}
if (getAttributes().get(ATTR_STYLECLASS) != null)
{
outputAttribute(out, getAttributes().get(ATTR_STYLECLASS), "class");
}
out.write(">");
}
for (Iterator i=getChildren().iterator(); i.hasNext(); /**/)
{
UIComponent child = (UIComponent)i.next();
Utils.encodeRecursive(context, child);
}
if (verticalSpacing != 0)
{
out.write("</table>");
}
}
/**
* @see javax.faces.component.UIComponentBase#encodeEnd(javax.faces.context.FacesContext)
*/
public void encodeEnd(FacesContext context) throws IOException
{
if (logger.isDebugEnabled())
logger.debug("encodeEnd() for <r:actions/> Id: " + getId());
Map requestMap = getFacesContext().getExternalContext().getRequestMap();
requestMap.remove(ACTION_CONTEXT);
}
/**
* Build an action group as reusable UIActionLink components.
*
* @param context
* @param actionGroup
*/
private void buildActionGroup(FacesContext context, ActionGroup actionGroup)
throws IOException
{
javax.faces.application.Application facesApp = context.getApplication();
Node node = getContext();
ResourceBundle messages = Application.getBundle(context);
// get overriding display attributes
String style = (String)getAttributes().get(ATTR_STYLE);
String styleClass = (String)getAttributes().get(ATTR_STYLECLASS);
Boolean showLink = null;
if (getAttributes().get(ATTR_SHOWLINK) != null)
{
showLink = (Boolean)getAttributes().get(ATTR_SHOWLINK);
}
// process each ActionDefinition in the order they were defined
for (ActionDefinition actionDef : actionGroup)
{
if (logger.isDebugEnabled())
logger.debug("---processing ActionDefinition: " + actionDef.getId());
UIComponent currentParent = this;
// build a permissions evaluator component to wrap the actionlink
PermissionEvaluator permEval = null;
List<String> allow = actionDef.getAllowPermissions();
if (allow != null && allow.size() != 0)
{
// found some permissions to test
permEval = (PermissionEvaluator)facesApp.createComponent(COMPONENT_PERMISSIONEVAL);
String condition = allow.get(0);
if (allow.size() != 1)
{
for (int i=1; i<allow.size(); i++)
{
condition += "," + allow.get(i);
}
}
permEval.setAllow(condition);
}
List<String> deny = actionDef.getDenyPermissions();
if (deny != null && deny.size() != 0)
{
if (permEval == null)
{
permEval = (PermissionEvaluator)facesApp.createComponent(COMPONENT_PERMISSIONEVAL);
}
String condition = deny.get(0);
if (deny.size() != 1)
{
for (int i=1; i<deny.size(); i++)
{
condition += "," + deny.get(i);
}
}
permEval.setDeny(condition);
}
if (permEval != null)
{
// add the permission evaluator component and walk down the hierarchy
permEval.setId(createUniqueId());
permEval.setValueBinding(ATTR_VALUE, facesApp.createValueBinding("#{" + ACTION_CONTEXT + "}"));
if (logger.isDebugEnabled())
logger.debug("-----adding PermissionEvaluator to action");
currentParent.getChildren().add(permEval);
currentParent = permEval;
}
// now prepare any code based evaluators that may be present
if (actionDef.Evaluator != null)
{
ActionInstanceEvaluator evaluator =
(ActionInstanceEvaluator)facesApp.createComponent(COMPONENT_ACTIONEVAL);
evaluator.setId(createUniqueId());
evaluator.setEvaluator(actionDef.Evaluator);
evaluator.setValueBinding(ATTR_VALUE, facesApp.createValueBinding("#{" + ACTION_CONTEXT + "}"));
// add the action evaluator component and walk down the hiearchy
if (logger.isDebugEnabled())
logger.debug("-----adding ActionEvaluator to action");
currentParent.getChildren().add(evaluator);
currentParent = evaluator;
}
// now build the UIActionLink component for this action
UIActionLink control = (UIActionLink)facesApp.createComponent(COMPONENT_ACTIONLINK);
control.setRendererType(RENDERER_ACTIONLINK);
control.setId(actionDef.getId() + createUniqueId());
if (actionDef.Action != null)
{
if (UIComponentTagUtils.isValueReference(actionDef.Action))
{
control.setAction(facesApp.createMethodBinding(actionDef.Action, null));
}
else
{
control.setAction(new ConstantMethodBinding(actionDef.Action));
}
}
if (actionDef.ActionListener != null)
{
control.setActionListener(facesApp.createMethodBinding(actionDef.ActionListener, ACTION_CLASS_ARGS));
}
if (style != null)
{
control.getAttributes().put(ATTR_STYLE, style);
}
else if (actionDef.Style != null)
{
control.getAttributes().put(ATTR_STYLE, actionDef.Style);
}
if (styleClass != null)
{
control.getAttributes().put(ATTR_STYLECLASS, styleClass);
}
else if (actionDef.StyleClass != null)
{
control.getAttributes().put(ATTR_STYLECLASS, actionDef.StyleClass);
}
if (showLink != null)
{
control.setShowLink(showLink.booleanValue());
}
else
{
control.setShowLink(actionDef.ShowLink);
}
if (actionDef.Onclick != null)
{
if (UIComponentTagUtils.isValueReference(actionDef.Onclick))
{
control.setValueBinding("onclick", facesApp.createValueBinding(actionDef.Onclick));
}
else
{
control.setOnclick(actionDef.Onclick);
}
}
if (actionDef.Href != null)
{
if (UIComponentTagUtils.isValueReference(actionDef.Href))
{
control.setValueBinding("href", facesApp.createValueBinding(actionDef.Href));
}
else
{
control.setHref(actionDef.Href);
}
}
control.setTarget(actionDef.Target);
control.setImage(actionDef.Image);
if (actionDef.TooltipMsg != null)
{
control.setTooltip(messages.getString(actionDef.TooltipMsg));
}
else if (actionDef.Tooltip != null)
{
if (UIComponentTagUtils.isValueReference(actionDef.Tooltip))
{
control.setValueBinding("tooltip", facesApp.createValueBinding(actionDef.Tooltip));
}
else
{
control.setValue(actionDef.Tooltip);
}
}
if (actionDef.LabelMsg != null)
{
control.setValue(messages.getString(actionDef.LabelMsg));
}
else if (actionDef.Label != null)
{
if (UIComponentTagUtils.isValueReference(actionDef.Label))
{
control.setValueBinding("value", facesApp.createValueBinding(actionDef.Label));
}
else
{
control.setValue(actionDef.Label);
}
}
// build any child params <f:param> components that are needed.
Map<String, String> params = actionDef.getParams();
if (params != null)
{
for (String name : params.keySet())
{
UIParameter param =
(UIParameter)facesApp.createComponent(ComponentConstants.JAVAX_FACES_PARAMETER);
param.setId(createUniqueId());
param.setName(name);
String value = params.get(name);
if (UIComponentTagUtils.isValueReference(value))
{
param.setValueBinding(ATTR_VALUE, facesApp.createValueBinding(value));
}
else
{
param.setValue(value);
}
control.getChildren().add(param);
}
}
if (logger.isDebugEnabled())
logger.debug("-----adding UIActionLink component for: " + actionDef.getId());
currentParent.getChildren().add(control);
}
}
// ------------------------------------------------------------------------------
// Strongly typed component property accessors
/**
* Get the value (for this component the value is the ID of an Action Group config block)
*
* @return the value
*/
public String getValue()
{
if (this.value == null)
{
ValueBinding vb = getValueBinding(ATTR_VALUE);
if (vb != null)
{
this.value = (String)vb.getValue(getFacesContext());
}
}
return this.value;
}
/**
* Set the value (for this component the value is the ID of an Action Group config block)
*
* @param value the value
*/
public void setValue(String value)
{
this.value = value;
}
/**
* Get the Node that forms the context object for this group of actions
*
* @return the context
*/
public Node getContext()
{
ValueBinding vb = getValueBinding("context");
if (vb != null)
{
this.context = (Node)vb.getValue(getFacesContext());
}
return this.context;
}
/**
* Set the the Node that forms the context object for this group of actions
*
* @param context the context
*/
public void setContext(Node context)
{
this.context = context;
}
/**
* Get whether to show the link as well as the image if specified
*
* @return true to show the link as well as the image if specified
*/
public boolean getShowLink()
{
ValueBinding vb = getValueBinding(ATTR_SHOWLINK);
if (vb != null)
{
this.showLink = (Boolean)vb.getValue(getFacesContext());
}
if (this.showLink != null)
{
return this.showLink.booleanValue();
}
else
{
// return default
return true;
}
}
/**
* Set whether to show the link as well as the image if specified
*
* @param showLink Whether to show the link as well as the image if specified
*/
public void setShowLink(boolean showLink)
{
this.showLink = Boolean.valueOf(showLink);
}
/**
* @return Returns the vertical spacing value in pixels or zero if not set.
*/
public int getVerticalSpacing()
{
ValueBinding vb = getValueBinding("verticalSpacing");
if (vb != null)
{
this.verticalSpacing = (Integer)vb.getValue(getFacesContext());
}
if (this.verticalSpacing != null)
{
return this.verticalSpacing;
}
else
{
return 0;
}
}
/**
* @param verticalSpacing The verticalSpacing to set.
*/
public void setVerticalSpacing(int verticalSpacing)
{
this.verticalSpacing = verticalSpacing;
}
/**
* @return a unique ID for a JSF component
*/
private static String createUniqueId()
{
return "_id_" + Short.toString(++id);
}
// ------------------------------------------------------------------------------
// Private data
/** True to show the link as well as the image if specified */
private Boolean showLink = null;
/** For this component the value is the ID of an Action Group config block */
private String value = null;
/** The context Node for the action group */
private Node context = null;
/** Vertical layout spacing */
private Integer verticalSpacing = null;
private static short id = 0;
}

View File

@@ -56,6 +56,8 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements
public static final String PREFIX_DATE_TO = "to_";
public static final String PREFIX_DATE_FROM = "from_";
private static final String VALUE = "value";
private static final String MSG_TO = "to";
private static final String MSG_FROM = "from";
@@ -252,12 +254,12 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements
{
control = (UISelectBoolean)facesApp.createComponent(ComponentConstants.JAVAX_FACES_SELECT_BOOLEAN);
control.setRendererType(ComponentConstants.JAVAX_FACES_CHECKBOX);
control.setValueBinding("value", vb);
control.setValueBinding(VALUE, vb);
}
else if (typeName.equals(DataTypeDefinition.CATEGORY))
{
control = (UICategorySelector)facesApp.createComponent(RepoConstants.ALFRESCO_FACES_CATEGORY_SELECTOR);
control.setValueBinding("value", vb);
control.setValueBinding(VALUE, vb);
}
else if (typeName.equals(DataTypeDefinition.DATETIME) || typeName.equals(DataTypeDefinition.DATE))
{
@@ -275,7 +277,7 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements
checkbox.setId(context.getViewRoot().createUniqueId());
ValueBinding vbCheckbox = facesApp.createValueBinding(
"#{" + beanBinding + "[\"" + propDef.getName().toString() + "\"]}");
checkbox.setValueBinding("value", vbCheckbox);
checkbox.setValueBinding(VALUE, vbCheckbox);
control.getChildren().add(checkbox);
// main display label
@@ -300,7 +302,7 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements
inputFromDate.getAttributes().put("showTime", showTime);
ValueBinding vbFromDate = facesApp.createValueBinding(
"#{" + beanBinding + "[\"" + PREFIX_DATE_FROM + propDef.getName().toString() + "\"]}");
inputFromDate.setValueBinding("value", vbFromDate);
inputFromDate.setValueBinding(VALUE, vbFromDate);
control.getChildren().add(inputFromDate);
// to date label
@@ -318,13 +320,13 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements
inputToDate.getAttributes().put("showTime", showTime);
ValueBinding vbToDate = facesApp.createValueBinding(
"#{" + beanBinding + "[\"" + PREFIX_DATE_TO + propDef.getName().toString() + "\"]}");
inputToDate.setValueBinding("value", vbToDate);
inputToDate.setValueBinding(VALUE, vbToDate);
control.getChildren().add(inputToDate);
}
else if (typeName.equals(DataTypeDefinition.NODE_REF))
{
control = (UISpaceSelector)facesApp.createComponent(RepoConstants.ALFRESCO_FACES_SPACE_SELECTOR);
control.setValueBinding("value", vb);
control.setValueBinding(VALUE, vb);
}
else
{
@@ -333,7 +335,7 @@ public class UISearchCustomProperties extends SelfRenderingComponent implements
control.setRendererType(ComponentConstants.JAVAX_FACES_TEXT);
control.getAttributes().put("size", "28");
control.getAttributes().put("maxlength", "1024");
control.setValueBinding("value", vb);
control.setValueBinding(VALUE, vb);
}
// set up the common aspects of the control

View File

@@ -0,0 +1,99 @@
/*
* 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.ui.repo.component.evaluator;
import javax.faces.context.FacesContext;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.ui.common.component.evaluator.BaseEvaluator;
/**
* Evaluator for executing an ActionEvaluator instance.
*
* @author Kevin Roast
*/
public class ActionInstanceEvaluator extends BaseEvaluator
{
/**
* Evaluate by executing the specified action instance evaluator.
*
* @return true to allow rendering of child components, false otherwise
*/
public boolean evaluate()
{
boolean result = false;
try
{
Object obj = getValue();
if (obj instanceof Node)
{
result = getEvaluator().evaluate((Node)obj);
}
}
catch (Exception err)
{
// return default value on error
s_logger.debug("Error during ActionInstanceEvaluator evaluation: " + err.getMessage());
}
return result;
}
/**
* @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext, java.lang.Object)
*/
public void restoreState(FacesContext context, Object state)
{
Object values[] = (Object[])state;
// standard component attributes are restored by the super class
super.restoreState(context, values[0]);
this.evaluator = (ActionEvaluator)values[1];
}
/**
* @see javax.faces.component.StateHolder#saveState(javax.faces.context.FacesContext)
*/
public Object saveState(FacesContext context)
{
Object values[] = new Object[2];
// standard component attributes are saved by the super class
values[0] = super.saveState(context);
values[1] = this.evaluator;
return (values);
}
/**
* @return the ActionEvaluator to execute
*/
public ActionEvaluator getEvaluator()
{
return this.evaluator;
}
/**
* @param evaluator The ActionEvaluator to execute
*/
public void setEvaluator(ActionEvaluator evaluator)
{
this.evaluator = evaluator;
}
private ActionEvaluator evaluator;
}

View File

@@ -0,0 +1,121 @@
/*
* 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.ui.repo.tag;
import javax.faces.component.UIComponent;
import org.alfresco.web.ui.common.tag.HtmlComponentTag;
/**
* @author kevinr
*/
public class ActionsTag extends HtmlComponentTag
{
/**
* @see javax.faces.webapp.UIComponentTag#getComponentType()
*/
public String getComponentType()
{
return "org.alfresco.faces.Actions";
}
/**
* @see javax.faces.webapp.UIComponentTag#getRendererType()
*/
public String getRendererType()
{
return null;
}
/**
* @see javax.faces.webapp.UIComponentTag#setProperties(javax.faces.component.UIComponent)
*/
protected void setProperties(UIComponent component)
{
super.setProperties(component);
setBooleanProperty(component, "showLink", this.showLink);
setStringProperty(component, "value", this.value);
setStringBindingProperty(component, "context", this.context);
setIntProperty(component, "verticalSpacing", this.verticalSpacing);
}
/**
* @see org.alfresco.web.ui.common.tag.HtmlComponentTag#release()
*/
public void release()
{
super.release();
this.value = null;
this.showLink = null;
this.context = null;
this.verticalSpacing = null;
}
/**
* Set the value (id of the action group config to use)
*
* @param value the value (id of the action group config to use)
*/
public void setValue(String value)
{
this.value = value;
}
/**
* Set the showLink
*
* @param showLink the showLink
*/
public void setShowLink(String showLink)
{
this.showLink = showLink;
}
/**
* Set the context object
*
* @param context the context object
*/
public void setContext(String context)
{
this.context = context;
}
/**
* Set the verticalSpacing
*
* @param verticalSpacing the verticalSpacing
*/
public void setVerticalSpacing(String verticalSpacing)
{
this.verticalSpacing = verticalSpacing;
}
/** the verticalSpacing */
private String verticalSpacing;
/** the context object */
private String context;
/** the value (id of the action group config to use) */
private String value;
/** the showLink boolean */
private String showLink;
}

View File

@@ -44,7 +44,7 @@ public class PageTag extends TagSupport
private final static String ALF_URL = "http://www.alfresco.com";
private final static String ALF_LOGO = "/images/logo/alfresco_logo.gif";
private final static String ALF_TEXT = "Content managed by Alfresco";
private final static String ALF_COPY = "Alfresco Software Inc. <EFBFBD> 2005 All rights reserved.";
private final static String ALF_COPY = "Alfresco Software Inc. (C) 2005-2006 All rights reserved.";
private static Log logger = LogFactory.getLog(PageTag.class);
private static String alfresco = null;

View File

@@ -0,0 +1,35 @@
/*
* 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.ui.repo.tag.evaluator;
import javax.faces.component.UIComponent;
import org.alfresco.web.ui.common.tag.evaluator.GenericEvaluatorTag;
/**
* @author Kevin Roast
*/
public class ActionInstanceEvaluatorTag extends GenericEvaluatorTag
{
/**
* @see javax.faces.webapp.UIComponentTag#getComponentType()
*/
public String getComponentType()
{
return "org.alfresco.faces.ActionInstanceEvaluator";
}
}