/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/trunk/sakai/admin-tools/su/src/java/org/sakaiproject/tool/su/SuTool.java $
* $Id: SuTool.java 5970 2006-02-15 03:07:19Z ggolden@umich.edu $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Sakai Foundation
*
* Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.authz.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Stack;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.authz.api.AuthzGroup;
import org.sakaiproject.authz.api.Role;
import org.sakaiproject.util.Xml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* <p>
* BaseRole is an implementation of the AuthzGroup API Role.
* </p>
*/
public class BaseRole implements Role
{
/** Our log (commons). */
private static Log M_log = LogFactory.getLog(BaseRole.class);
/** A fixed class serian number. */
private static final long serialVersionUID = 1L;
/** The role id. */
protected String m_id = null;
/** The locks that make up this. */
protected Set m_locks = null;
/** The role description. */
protected String m_description = null;
/** Whether this is a provider-only role */
protected boolean m_providerOnly;
/** Active flag. */
protected boolean m_active = false;
/**
* Construct.
*
* @param id
* The role id.
*/
public BaseRole(String id)
{
m_id = id;
m_locks = new HashSet();
}
/**
* Construct as a copy
*
* @param id
* The role id.
* @param other
* The role to copy.
*/
public BaseRole(String id, Role other)
{
m_id = id;
m_description = ((BaseRole) other).m_description;
m_providerOnly = ((BaseRole) other).m_providerOnly;
m_locks = new HashSet();
m_locks.addAll(((BaseRole) other).m_locks);
}
/**
* Construct from information in XML.
*
* @param el
* The XML DOM Element definining the role.
*/
public BaseRole(Element el, AuthzGroup azGroup)
{
m_locks = new HashSet();
m_id = StringUtils.trimToNull(el.getAttribute("id"));
m_description = StringUtils.trimToNull(el.getAttribute("description"));
if (m_description == null)
{
m_description = StringUtils.trimToNull(Xml.decodeAttribute(el, "description-enc"));
}
if("true".equalsIgnoreCase(el.getAttribute("provider-only"))) m_providerOnly = true;
// the children (abilities)
NodeList children = el.getChildNodes();
final int length = children.getLength();
for (int i = 0; i < length; i++)
{
Node child = children.item(i);
if (child.getNodeType() != Node.ELEMENT_NODE) continue;
Element element = (Element) child;
// look for role | lock ability
if (element.getTagName().equals("ability"))
{
String roleId = StringUtils.trimToNull(element.getAttribute("role"));
String lock = StringUtils.trimToNull(element.getAttribute("lock"));
if (roleId != null)
{
M_log.warn("(el): nested role: " + m_id + " " + roleId);
}
m_locks.add(lock);
}
}
}
/**
* {@inheritDoc}
*/
public Element toXml(Document doc, Stack stack)
{
Element role = doc.createElement("role");
if (stack.isEmpty())
{
doc.appendChild(role);
}
else
{
((Element) stack.peek()).appendChild(role);
}
stack.push(role);
role.setAttribute("id", getId());
// encode the description
if (m_description != null) Xml.encodeAttribute(role, "description-enc", m_description);
// encode the provider only flag
if (m_providerOnly) Xml.encodeAttribute(role, "provider-only", "true");
// locks
for (Iterator a = m_locks.iterator(); a.hasNext();)
{
String lock = (String) a.next();
Element element = doc.createElement("ability");
role.appendChild(element);
element.setAttribute("lock", lock);
}
stack.pop();
return role;
}
/**
* Enable editing.
*/
protected void activate()
{
m_active = true;
}
/**
* Check to see if the azGroup is still active, or has already been closed.
*
* @return true if the azGroup is active, false if it's been closed.
*/
public boolean isActiveEdit()
{
return m_active;
}
/**
* Close the azGroup object - it cannot be used after this.
*/
protected void closeEdit()
{
m_active = false;
}
/**
* {@inheritDoc}
*/
public String getId()
{
return m_id;
}
/**
* {@inheritDoc}
*/
public String getDescription()
{
return m_description;
}
/**
* {@inheritDoc}
*/
public boolean isProviderOnly()
{
return m_providerOnly;
}
/**
* {@inheritDoc}
*/
public boolean isAllowed(String lock)
{
return m_locks.contains(lock);
}
/**
* {@inheritDoc}
*/
public Set getAllowedFunctions()
{
Set rv = new HashSet();
rv.addAll(m_locks);
return rv;
}
/**
* {@inheritDoc}
*/
public void setDescription(String description)
{
m_description = StringUtils.trimToNull(description);
}
/**
* {@inheritDoc}
*/
public void setProviderOnly(boolean providerOnly)
{
m_providerOnly = providerOnly;
}
/**
* {@inheritDoc}
*/
public void allowFunction(String lock)
{
m_locks.add(lock);
}
/**
* {@inheritDoc}
*/
public void allowFunctions(Collection locks)
{
m_locks.addAll(locks);
}
/**
* {@inheritDoc}
*/
public void disallowFunction(String lock)
{
m_locks.remove(lock);
}
/**
* {@inheritDoc}
*/
public void disallowFunctions(Collection locks)
{
m_locks.removeAll(locks);
}
/**
* {@inheritDoc}
*/
public boolean allowsNoFunctions()
{
return m_locks.isEmpty();
}
/**
* {@inheritDoc}
*/
public void disallowAll()
{
m_locks.clear();
}
/**
* {@inheritDoc}
*/
public int compareTo(Object obj)
{
if (!(obj instanceof Role)) throw new ClassCastException();
// if the object are the same, say so
if (obj == this) return 0;
// sort based on (unique) id
int compare = getId().compareTo(((Role) obj).getId());
return compare;
}
/**
* {@inheritDoc}
*/
public boolean equals(Object obj)
{
if (!(obj instanceof Role)) return false;
return ((Role) obj).getId().equals(getId());
}
/**
* {@inheritDoc}
*/
public int hashCode()
{
return getId().hashCode();
}
}