package edu.stanford.rt.credential;
import java.util.Iterator;
import edu.stanford.rt.datatype.*;
import edu.stanford.rt.util.*;
/**
* @author Ninghui Li, Sandra Qiu
*
* Implementation of ApplicationDomain
element.
*
*/
public class ApplicationDomain extends DomainSpecification
{
/**
* Attribute uri (required).
*/
private String uri;
/**
* A flag indicates whether this domain is the built-in system one.
*/
private boolean isSystemDomain = false;
/**
* Constructor for ApplicationDomain.
* @param uri
* @param isSystemDomain
* @param context
* @throws DomainSpecException
*/
public ApplicationDomain(
String uri,
boolean isSystemDomain,
RTContext context)
throws DomainSpecException
{
super(context);
this.uri = uri;
this.isSystemDomain = isSystemDomain;
}
/**
* Method getUri.
* @return String
*/
public String getUri()
{
return uri;
}
/**
* Method lookupType.
* Look up the DataType declaration by given typeName
* in the current domain. If cannot find one and this domain is
* not system domain, then look up in the system domain.
* @param typeName
* @return DataType
* @throws DomainSpecException
* if cannot find a DataType declaration by the given name.
*/
public DataType lookupType(String typeName)
throws DomainSpecException
{
//RTUtil.debugInfo(" lookupType()>>>> isSystemDomain = " + isSystemDomain);
DataType type = super.lookupType(typeName);
if (!isSystemDomain && type == null)
{
type =
getContext().getSystemDomain().lookupType(typeName);
}
if (type == null)
{
throw new DomainSpecException(
"Type '" + typeName + "' not found.");
}
return type;
}
/**
* Method lookupRoleDeclaration.
* Look up the role declaration by given roleName in the
* current domain. If cannot find one and this domain is not system
* domain, then look it up in system domain.
* @param roleName
* @return RoleDeclaration
* @throws DomainSpecException
* if cannot find one.
*/
public RoleDeclaration lookupRoleDeclaration(String roleName)
throws DomainSpecException
{
RTUtil.debugInfo(
"DomainSpecification(id="
+ ((getHashID() == null)
? "null"
: getHashID().toString())
+ ") looking up role '"
+ roleName
+ "'");
RoleDeclaration role = super.lookupRoleDeclaration(roleName);
if (!isSystemDomain && role == null)
{
role =
getContext().getSystemDomain().lookupRoleDeclaration(
roleName);
}
if (role == null)
{
throw new DomainSpecException(
"Role '" + roleName + "' has not been declared.");
}
return role;
}
public String toString(String indent)
{
String thisIndent = indent + " ";
StringBuffer sb = new StringBuffer();
sb.append(thisIndent).append(
"ApplicationDomain: hashID = "
+ getHashID().toString()
+ "\n");
sb.append(thisIndent + " ").append("uri = ").append(
uri).append(
"\n");
sb
.append(thisIndent + " ")
.append("PrincipalType = ")
.append(getPrincipalType())
.append("\n");
sb.append(thisIndent + " ").append("Imported Domains: \n");
try
{
Iterator it = getImportedDomains().keyIterator();
while (it.hasNext())
{
String key = (String) it.next();
ApplicationDomain value =
(ApplicationDomain) getImportedDomains().get(key);
sb.append(thisIndent + " ").append(key).append(
"\n");
sb.append(thisIndent + " ").append(
value.getUri()).append(
"\n");
}
}
catch (DomainSpecException e)
{
e.printStackTrace();
}
sb.append(thisIndent + " ").append("Type Declarations: \n");
try
{
Iterator it = getTypeDeclarations().keyIterator();
while (it.hasNext())
{
String key = (String) it.next();
DataType value =
(DataType) getTypeDeclarations().get(key);
sb
.append(thisIndent + " ")
.append(key)
.append("\n")
.append(value.toString(thisIndent + " "))
.append("\n");
}
}
catch (DomainSpecException e)
{
e.printStackTrace();
}
sb.append(thisIndent + " ").append("Role Declarations: \n");
try
{
Iterator it = getRoleDeclarations().keyIterator();
while (it.hasNext())
{
String key = (String) it.next();
RoleDeclaration value =
(RoleDeclaration) getRoleDeclarations().get(key);
sb.append(thisIndent + " ").append(key).append(
"\n");
sb.append(
value.toString(thisIndent + " ")).append(
"\n");
}
}
catch (DomainSpecException e)
{
e.printStackTrace();
}
return sb.toString();
} // end of toString()
/* (non-Javadoc)
* @see edu.stanford.rt.credential.DomainSpecification#setHashID(HashID)
*/
public synchronized void setHashID(HashID hashID)
throws DomainSpecException
{
if (isComplete())
throw new DomainSpecException("ApplicationDomain unmodifiable.");
if (hashID.getHashType() != HashID.APPLICATION_DOMAIN)
throw new DomainSpecException("Wrong type of hash id");
super.setHashID(hashID);
}
}