01: /* Copyright 2005 The JA-SIG Collaborative. All rights reserved.
02: * See license distributed with this file and
03: * available online at http://www.uportal.org/license.html
04: */
05:
06: package org.jasig.portal.layout.dlm;
07:
08: import org.jasig.portal.PortalException;
09: import org.jasig.portal.layout.dlm.Constants;
10: import org.jasig.portal.layout.dlm.DistributedLayoutManager;
11: import org.jasig.portal.security.IPerson;
12: import org.w3c.dom.Document;
13: import org.w3c.dom.Element;
14:
15: /**
16: * Layout processing action for changing a node's attribute in the user's
17: * layout.
18: *
19: * @author Mark Boyd
20: */
21: public class LPAChangeAttribute implements ILayoutProcessingAction {
22: private String nodeId = null;
23: private String name = null;
24: private IPerson person = null;
25: private Element ilfNode = null;
26: private String value = null;
27: private boolean isFragmentOwner = false;
28:
29: LPAChangeAttribute(String nodeId, String name, String value,
30: IPerson p, Element ilfNode, boolean isFragmentOwner) {
31: this .nodeId = nodeId;
32: this .name = name;
33: this .person = p;
34: this .ilfNode = ilfNode;
35: this .value = value;
36: this .isFragmentOwner = isFragmentOwner;
37: }
38:
39: /**
40: * Apply the attribute change.
41: */
42: public void perform() throws PortalException {
43: // push the change into the PLF
44: if (nodeId.startsWith(Constants.FRAGMENT_ID_USER_PREFIX)) {
45: // we are dealing with an incorporated node, so get a plf ghost
46: // node, set its attribute, then add a directive indicating the
47: // attribute that should be pushed into the ilf during merge
48: Element plfNode = HandlerUtils.getPLFNode(ilfNode, person,
49: true, // create node if not found
50: false); // don't create children
51: plfNode.setAttribute(name, value);
52: /*
53: * add directive to hold override value. This is not necessary for
54: * folder names since they are overridden at render time with their
55: * locale specific version and persisted via a different mechanism.
56: */
57: EditManager.addEditDirective(plfNode, name, person);
58:
59: // name attribute takes special handling since it is localizable
60: if (name.equals(Constants.ATT_NAME)
61: && DistributedLayoutManager.ContextHolder.labelPolicy != null) {
62: String plfId = plfNode
63: .getAttribute(Constants.ATT_PLF_ID);
64: DistributedLayoutManager.ContextHolder.labelPolicy
65: .updateNodeLabel(plfId, person.getID(), false,
66: value);
67: }
68: } else {
69: // node owned by user so change attribute in child directly
70: Document plf = RDBMDistributedLayoutStore.getPLF(person);
71: Element plfNode = plf.getElementById(nodeId);
72: if (plfNode != null) // should always be non-null
73: {
74: // name attribute takes special handling since it is localizable
75: if (name.equals(Constants.ATT_NAME)
76: && DistributedLayoutManager.ContextHolder.labelPolicy != null) {
77: String plfId = plfNode
78: .getAttribute(Constants.ATT_PLF_ID);
79: DistributedLayoutManager.ContextHolder.labelPolicy
80: .updateNodeLabel(nodeId, person.getID(),
81: isFragmentOwner, value);
82: } else {
83: plfNode.setAttribute(name, value);
84: }
85: }
86: }
87: /*
88: * push the change into the ILF if not the name attribute. For names
89: * the rendering will inject the localized name via a special processor.
90: * So it doesn't matter what is in the ILF's folder name attribute.
91: */
92: if (!name.equals(Constants.ATT_NAME)
93: || DistributedLayoutManager.ContextHolder.labelPolicy == null)
94: // should always be non-null
95: {
96: ilfNode.setAttribute(name, value);
97: }
98: }
99: }
|