/**************************************************************************
* Copyright (c) 2001 by Punch Telematix. All rights reserved. *
* *
* Redistribution and use in source and binary forms, with or without *
* modification, are permitted provided that the following conditions *
* are met: *
* 1. Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. *
* 2. Redistributions in binary form must reproduce the above copyright *
* notice, this list of conditions and the following disclaimer in the *
* documentation and/or other materials provided with the distribution. *
* 3. Neither the name of Punch Telematix nor the names of *
* other contributors may be used to endorse or promote products *
* derived from this software without specific prior written permission.*
* *
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED *
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. *
* IN NO EVENT SHALL PUNCH TELEMATIX OR OTHER CONTRIBUTORS BE LIABLE *
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF *
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR *
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, *
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE *
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN *
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
**************************************************************************/
/**
* $Id: PropertyPermission.java,v 1.2 2006/02/23 12:32:12 cvs Exp $
*/
package java.util;
import java.security.Permission;
import java.security.BasicPermission;
import java.security.PermissionCollection;
/**
** This class is like a simplified version of java.io.FilePermission, q.v..
*/
public final class PropertyPermission extends BasicPermission {
private static final long serialVersionUID = 885438825399942851L;
private String actions;
private boolean read;
private boolean write;
private void parseActions(String s) {
String sx = s.toLowerCase();
while (sx != "") {
int i = sx.indexOf(',');
String s0;
if (i<0) {
s0 = sx.trim();
sx = "";
}
else {
s0 = sx.substring(0,i).trim();
sx = sx.substring(i+1);
}
if (s0.equals("read")) {
read = true;
}
else {
if (s0.equals("write")) {
write = true;
}
else {
throw new IllegalArgumentException("udefined action encountered: "+s0);
}
}
}
if(read) {
this.actions = (write ? "read,write" : "read");
}
else {
this.actions = "write";
}
}
public PropertyPermission(String path, String actions) {
super (path);
parseActions(actions);
}
public boolean implies (Permission p) {
try {
PropertyPermission pp = (PropertyPermission)p;
if ((pp.read && !this.read)||(pp.write && !this.write)) {
return false;
}
String thisname = super.getName();
String othername = p.getName();
if (thisname == "*") {
return true;
}
if (thisname.endsWith(".*")) {
return othername.length() >= thisname.length() &&
othername.startsWith(thisname.substring(0,thisname.length()-1));
}
else {
return othername.equals(thisname);
}
} catch (ClassCastException e) {
return false;
}
}
public boolean equals (Object o) {
if(!(o instanceof PropertyPermission)) {
return false;
}
PropertyPermission pp = (PropertyPermission)o;
if ((pp.read != this.read) || (pp.write != this.write)) {
return false;
}
return pp.getName().equals(super.getName());
}
public int hashCode() {
int h = super.getName().hashCode();
/**
unfortunenatly sun implementation doesn't use the specified actions to calculate the hashCode
if (this.read) {
h ^= 0x80402010;
}
if (this.write) {
h ^= 0x20408010;
}
*/
return h;
}
public String getActions() {
return actions;
}
public PermissionCollection newPermissionCollection() {
return new wonka.security.PropertyPermissionCollection();
}
}