package javax.management;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.security.BasicPermission;
import java.security.Permission;
import java.security.PermissionCollection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
public class MBeanServerPermission
extends BasicPermission
{
private static final long serialVersionUID = -5661980843569388590L;
private transient boolean allNames;
public MBeanServerPermission(String name)
{
this(name, null);
}
public MBeanServerPermission(String name, String actions)
{
super(name, actions);
init(name, actions);
}
public String toString()
{
StringBuffer buffer = new StringBuffer(100);
buffer.append(getClass().getName()).append(":");
buffer.append(" name=").append(getName());
buffer.append(" actions=").append(getActions());
return buffer.toString();
}
public boolean implies(Permission p)
{
if( (p instanceof MBeanServerPermission) == false )
return false;
boolean implies = allNames == true;
if( implies == false )
{
String n0 = getName();
String n1 = p.getName();
implies = n0.equals(n1);
if( implies == false )
{
implies =
(n0.equals("createMBeanServer") && n1.equals("newMBeanServer"));
}
}
return implies;
}
private void init(String name, String actions)
{
if( name == null )
throw new NullPointerException("name cannot be null");
if( actions != null && actions.length() > 0 )
throw new IllegalArgumentException("actions must be null or empty");
if (name.equals("*") == false &&
name.equals("createMBeanServer") == false &&
name.equals("findMBeanServer") == false &&
name.equals("newMBeanServer") == false &&
name.equals("releaseMBeanServer") == false)
throw new IllegalArgumentException("Unknown name: " + name);
allNames = name.equals("*");
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException
{
ois.defaultReadObject();
init(getName(), getActions());
}
public PermissionCollection newPermissionCollection()
{
return new MBeanServerPermissionCollections();
}
class MBeanServerPermissionCollections extends PermissionCollection
{
private static final long serialVersionUID = -4111836792595161197L;
private HashSet permissions = new HashSet();
private boolean hasAll;
public void add(Permission p)
{
if( this.isReadOnly() )
throw new SecurityException("Collection is read-only");
if( p instanceof MBeanServerPermission )
permissions.add(p);
if( p.getName().equals("createMBeanServer") )
permissions.add(new MBeanServerPermission("newMBeanServer"));
else if( p.getName().equals("*") )
hasAll = true;
}
public boolean implies(Permission p)
{
boolean implies = false;
if( p instanceof MBeanServerPermission )
{
implies = hasAll;
if( implies == false )
{
implies = permissions.contains(p);
}
}
return implies;
}
public Enumeration elements()
{
final Iterator iter = permissions.iterator();
Enumeration enumerator = new Enumeration()
{
public boolean hasMoreElements()
{
return iter.hasNext();
}
public Object nextElement()
{
return iter.next();
}
};
return enumerator;
}
}
}