/*
* $Id: FileCitizen.java,v 1.8 2002/09/16 08:05:06 jkl Exp $
*
* Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
*
* Use is subject to license terms, as defined in
* Anvil Sofware License, Version 1.1. See LICENSE
* file, or http://njet.org/license-1.1.txt
*/
package anvil.server.file;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Permission;
import java.util.Iterator;
import anvil.java.util.BindingEnumeration;
import anvil.core.Any;
import anvil.java.util.Hashlist;
import anvil.java.util.EnumerationToIterator;
import anvil.server.Zone;
import anvil.server.Realm;
import anvil.server.Tribe;
import anvil.server.Citizen;
import anvil.server.Realm;
import anvil.server.Tribe;
import anvil.server.Citizen;
import anvil.util.Conversions;
import anvil.java.security.PermissionCollectionCombiner;
/**
* interface FileCitizen
*
* @author: Jani Lehtim�ki
*/
public class FileCitizen extends PersistentFileNamespace
implements FileEntity, Citizen
{
private FileRealm _realm;
private int _id;
private String _name;
private String _credentials;
private PermissionCollection _permissions = null;
private PermissionCollection _combined = null;
private boolean _resolved = false;
public FileCitizen(FileRealm realm, File file, int id, String name, String credentials)
{
super(realm.getZone(), name, file, realm.copyOnGet(),
realm.copyOnSet(), realm.getMaxModifications());
_realm = realm;
_id = id;
_name = name;
_credentials = credentials;
}
public String toString()
{
return "FileCitizen("+_name+"@"+_file+")";
}
public int getId()
{
return _id;
}
public int hashCode()
{
return _id;
}
public Realm getRealm()
{
return _realm;
}
public String getName()
{
return _name;
}
String getCredentials()
{
return _credentials;
}
public boolean verifyCredentials(String credentials)
{
return _credentials.equals(credentials);
}
public void setCredentials(String newCredentials)
{
_credentials = newCredentials;
}
public PermissionCollection getPermissions()
{
return _permissions;
}
private void getCombinedPermissions0(PermissionCollectionCombiner combiner, Tribe[] tribes)
{
int n = tribes.length;
for(int i=0; i<n; i++) {
Tribe tribe = tribes[i];
combiner.combine(tribe.getPermissions());
getCombinedPermissions0(combiner, tribe.getParents());
}
}
public PermissionCollection getCombinedPermissions()
{
if (!_resolved) {
synchronized(this) {
_resolved = true;
PermissionCollectionCombiner combiner = new PermissionCollectionCombiner();
combiner.combine(_permissions);
getCombinedPermissions0(combiner, getParents());
_combined = combiner.getResult();
}
}
return _combined;
}
public void addPermission(Permission perm)
{
if (_permissions == null) {
_permissions = new Permissions();
}
_permissions.add(perm);
}
public void removePermission(Permission perm)
{
//TODO
}
public Iterator listPermissions()
{
if (_permissions != null) {
return new EnumerationToIterator(_permissions.elements());
} else {
return BindingEnumeration.EMPTY;
}
}
public Tribe[] getParents()
{
return (Tribe[])_realm.getMappings(this, Tribe.class, true, true);
}
public void remove()
{
_realm.removeMappings(this);
super.remove();
}
public void write(OutputStream out) throws IOException
{
out.write('c');
out.write(':');
out.write(' ');
out.write(Conversions.getBytes(String.valueOf(_id)));
out.write(',');
out.write(' ');
out.write('"');
out.write(Conversions.getBytes(Conversions.URLEncode(_name)));
out.write('"');
out.write(',');
out.write(' ');
out.write('"');
out.write(Conversions.getBytes(Conversions.URLEncode(_credentials)));
out.write('"');
out.write('\n');
}
}