/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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.apache.cocoon.portal.coplet; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.apache.cocoon.portal.factory.impl.AbstractProducible; import org.apache.cocoon.portal.util.DeltaApplicable; import org.apache.commons.lang.StringUtils; /** * * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a> * @author <a href="mailto:volker.schmitt@basf-it-services.com">Volker Schmitt</a> * @author <a href="mailto:bluetkemeier@s-und-n.de">Björn Lütkemeier</a> * * @version CVS $Id$ */ public class CopletData extends AbstractProducible implements DeltaApplicable { protected String title; protected CopletBaseData copletBaseData; protected Map attributes = new HashMap(3); protected String allowedRoles; protected transient List allowedRolesList; /** * Signals whether a delta has been applied. */ private boolean deltaApplied = false; /** * Constructor */ public CopletData() { // Nothing to do } /** * Returns the title. * @return String */ public String getTitle() { return title; } /** * Sets the title. * @param title The title to set */ public void setTitle(String title) { this.title = title; } /** * Returns the copletBaseData. * @return CopletBaseData */ public CopletBaseData getCopletBaseData() { return copletBaseData; } /** * Sets the copletBaseData. * @param copletBaseData The copletBaseData to set */ public void setCopletBaseData(CopletBaseData copletBaseData) { this.copletBaseData = copletBaseData; } public Object removeAttribute(String key) { return this.attributes.remove(key); } public Object getAttribute(String key) { return this.attributes.get(key); } public void setAttribute(String key, Object value) { this.attributes.put(key, value); } public Map getAttributes() { return this.attributes; } /** * Applies the specified delta. * @throws ClassCastException If the object is not of the expected type. */ public boolean applyDelta(Object object) { CopletData data = (CopletData)object; this.deltaApplied = true; String title = data.getTitle(); if (title != null) { this.setTitle(title); } CopletBaseData copletBaseData = data.getCopletBaseData(); if (copletBaseData != null) { this.setCopletBaseData(copletBaseData); } Iterator iterator = data.getAttributes().entrySet().iterator(); Object attribute, delta; String key; Map.Entry entry; while (iterator.hasNext()) { entry = (Map.Entry)iterator.next(); key = (String)entry.getKey(); delta = entry.getValue(); attribute = this.getAttribute(key); if (attribute == null) { // add new attribute this.setAttribute(key, delta); } else if (attribute instanceof DeltaApplicable) { // apply delta boolean success = ((DeltaApplicable)attribute).applyDelta(delta); if (!success) { // replace attribute this.setAttribute(key, delta); } } else { // replace attribute this.setAttribute(key, delta); } } return true; } /** * Checks if a delta has been applied. */ public boolean deltaApplied() { return this.deltaApplied; } /** * @return Returns the allowed roles. */ public String getAllowedRoles() { return this.allowedRoles; } /** * @param roles The allowed roles to set. */ public void setAllowedRoles(String roles) { this.allowedRoles = roles; this.allowedRolesList = null; } /** * Return the list of roles that are allowed to access this coplet * @return A list of roles or null if everyone is allowed. */ public List getAllowedRolesList() { if ( StringUtils.isBlank(this.allowedRoles) ) { return null; } if ( this.allowedRolesList == null ) { this.allowedRolesList = new ArrayList(); final StringTokenizer tokenizer = new StringTokenizer(this.allowedRoles, ","); while ( tokenizer.hasMoreElements() ) { String token = (String)tokenizer.nextElement(); this.allowedRolesList.add(token); } if ( this.allowedRolesList.size() == 0 ) { this.allowedRoles = null; this.allowedRolesList = null; } } return this.allowedRolesList; } public void addToAllowedRoles(String role) { List l = this.getAllowedRolesList(); if ( l == null ) { l = new ArrayList(); l.add(role); } else { if ( !l.contains(role) ) { l.add(role); } } this.buildRolesString(l); } public void removeFromAllowedRoles(String role) { List l = this.getAllowedRolesList(); if ( l != null && l.contains(role) ) { l.remove(role); if ( l.size() == 0 ) { this.allowedRoles = null; this.allowedRolesList = null; } else { this.buildRolesString(l); } } } protected void buildRolesString(List fromList) { this.allowedRolesList = fromList; StringBuffer buffer = new StringBuffer(); boolean first = true; Iterator i = fromList.iterator(); while ( i.hasNext() ) { String role = (String)i.next(); if ( !first ) { buffer.append(','); } first = false; buffer.append(role); } this.allowedRoles = buffer.toString(); } }