001: /*
002: * Copyright 2001-2006 C:1 Financial Services GmbH
003: *
004: * This software is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License Version 2.1, as published by the Free Software Foundation.
007: *
008: * This software is distributed in the hope that it will be useful,
009: * but WITHOUT ANY WARRANTY; without even the implied warranty of
010: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
011: * Lesser General Public License for more details.
012: *
013: * You should have received a copy of the GNU Lesser General Public
014: * License along with this library; if not, write to the Free Software
015: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
016: */
017:
018: package de.finix.contelligent.xml.export;
019:
020: import java.io.IOException;
021: import java.io.Writer;
022: import java.security.acl.Permission;
023: import java.util.Iterator;
024: import java.util.Map;
025: import java.util.Set;
026:
027: import de.finix.contelligent.Component;
028: import de.finix.contelligent.ComponentContext;
029: import de.finix.contelligent.ComponentManager;
030: import de.finix.contelligent.ComponentNotFoundException;
031: import de.finix.contelligent.ComponentPath;
032: import de.finix.contelligent.Container;
033: import de.finix.contelligent.Type;
034: import de.finix.contelligent.core.ComponentContextImpl;
035: import de.finix.contelligent.core.security.AccessControlList;
036: import de.finix.contelligent.core.security.AclEntry;
037: import de.finix.contelligent.core.security.ComponentPermission;
038: import de.finix.contelligent.core.security.ContelligentPrincipal;
039: import de.finix.contelligent.exception.TypeException;
040: import de.finix.contelligent.logging.LoggingService;
041: import de.finix.contelligent.util.ThreadedMem;
042:
043: public class ClientViewComponentXMLPolicy extends
044: DefaultComponentXMLPolicy {
045: final static org.apache.log4j.Logger log = LoggingService
046: .getLogger(ClientViewComponentXMLPolicy.class);
047:
048: public ClientViewComponentXMLPolicy(
049: ComponentManager componentManager) {
050: super (componentManager);
051: }
052:
053: public void writeXMLHeader(Writer writer) throws IOException {
054: }
055:
056: public void writeXMLFooter(Writer writer) throws IOException {
057: }
058:
059: public Set writeComponent(Component component, Writer writer)
060: throws IOException, ComponentNotFoundException {
061: writeStartTag(component, writer);
062: incrementDepth();
063: writeMetainfo(component, writer);
064: if (componentManager.callerHasPermission(ThreadedMem
065: .getCallData(), component, ComponentPermission.READ)) {
066: try {
067: Map componentPropertyMap = componentManager
068: .getPropertyMap(component, true, false);
069: writeProperties(componentPropertyMap, writer);
070: writeMetaContent(component, writer);
071: writeContent(component, writer);
072: writeRenderer(component, writer);
073: } catch (TypeException e) {
074: log.error("Could not read properties of component '"
075: + component + "'!", e);
076: }
077: } else {
078: writer.write("<noreadpermission/>");
079: }
080: // writeContent(component, writer);
081: // writeRenderer(component, writer);
082: writeSubcomponents(component, writer);
083: decrementDepth();
084: writeEndTag(component, writer);
085: return null;
086: }
087:
088: protected void writeAdditionalStartTagAttributes(
089: Component component, Writer writer) throws IOException {
090: ComponentPath componentPath = component.getComponentContext()
091: .getPath();
092: if (componentManager.componentExists(componentPath, false)) {
093: writer.write(" modified=\"true\"");
094: }
095: Type blueprintType = componentManager
096: .getBlueprintType(componentPath);
097: if (blueprintType != null) {
098: writer
099: .write(" isBlueprint=\"true\" definesBlueprintType=\"");
100: writer.write(blueprintType.getName());
101: writer.write("\"");
102: } else {
103: writer.write(" isBlueprint=\"false\"");
104: }
105: ContelligentPrincipal mod = component.getComponentContext()
106: .getModifiedBy();
107: writer.write(" modifiedBy=\"");
108: writer.write(mod.toPrincipalString());
109: writer.write("\"");
110: }
111:
112: // gets called by super.writeMetainfo()
113: protected void writeAdditionalMetainfoTagAttributes(
114: Component component, Writer writer) throws IOException {
115: ComponentContextImpl ctx = (ComponentContextImpl) component
116: .getComponentContext();
117: writer.write(" hasChildren=\"");
118: writer.write(String.valueOf(component instanceof Container
119: && ((Container) component).getHasChildren()));
120: writer.write("\"");
121: }
122:
123: protected void writeACLEntries(Component component,
124: AccessControlList acl, AccessControlList effectiveAcl,
125: Writer writer) throws IOException {
126: Iterator aclEntries = effectiveAcl.entrySet().iterator();
127:
128: while (aclEntries.hasNext()) {
129: AclEntry currentEntry = (AclEntry) aclEntries.next();
130: ContelligentPrincipal principal = currentEntry
131: .getPrincipal();
132: Permission permission = currentEntry.getPermission();
133: writer.write(indent);
134: writer.write("<access principalGroupId=\"");
135: writer.write(principal.getGroupId());
136: writer.write("\" principalId=\"");
137: writer.write(principal.getName());
138: writer.write("\" accessType=\"");
139: writer.write(permission.toString());
140: String orgMode = AccessControlList.MODE_UNSET;
141: String parentMode = currentEntry.getMode().toString();
142:
143: if (!currentEntry.isInherited()) {
144:
145: // determine original mode:
146: orgMode = currentEntry.getMode().toString();
147: Iterator orgEntries = acl.entries(principal);
148:
149: while (orgEntries.hasNext()) {
150: AclEntry orgEntry = (AclEntry) orgEntries.next();
151:
152: if (permission.equals(orgEntry.getPermission()))
153: orgMode = orgEntry.getMode().toString();
154: }
155:
156: // determine parent mode: (only if component is NOT the
157: // root-container!)
158: parentMode = AccessControlList.MODE_UNSET;
159: Container parent = componentManager
160: .parentContainer(component); // returns
161: // null
162: // if
163: // component
164: // is
165: // root
166: if (parent != null) {
167: AccessControlList parentACL = ((ComponentContextImpl) parent
168: .getComponentContext()).getACL();
169: Iterator parentEntries = parentACL
170: .entries(principal);
171: while (parentEntries.hasNext()) {
172: AclEntry parentEntry = (AclEntry) parentEntries
173: .next();
174: if (permission.equals(parentEntry
175: .getPermission()))
176: parentMode = parentEntry.getMode()
177: .toString();
178: }
179: }
180: }
181:
182: writer.write("\" mode=\"");
183: writer.write(orgMode);
184: writer.write("\" parentMode=\"");
185: writer.write(parentMode);
186: writer.write("\" validFrom=\"");
187: writer.write(Long.toString(currentEntry.getValidFrom()));
188: writer.write("\" validTo=\"");
189: writer.write(Long.toString(currentEntry.getValidTo()));
190: writer.write("\" period=\"");
191: writer.write(Long.toString(currentEntry.getPeriod()));
192: writer.write("\" duration=\"");
193: writer.write(Long.toString(currentEntry.getDuration()));
194: writer.write("\" />\n");
195: }
196: }
197:
198: protected void writePublisher(Component comp, Writer writer)
199: throws IOException {
200: ComponentContext cc = comp.getComponentContext();
201: if (cc instanceof ComponentContextImpl) {
202: ComponentContextImpl cci = (ComponentContextImpl) cc;
203: String pName = cci.getPublisherName();
204: String pType = cci.getPublisherType();
205: if ((pName.length() > 0) && (pType.length() > 0)) {
206: if (pType.equals("user")) {
207: writer.write(indent);
208: writer.write("<publisher>");
209: writer.write("<user name=\"");
210: writer.write(pName);
211: writer.write("\"/>");
212: writer.write("</publisher>\n");
213: } else {
214: super .writePublisher(comp, writer);
215: }
216: }
217: }
218: }
219:
220: protected boolean includeContent() {
221: return false;
222: }
223:
224: protected int maxDepth() {
225: return 1;
226: }
227:
228: }
|