mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-03-09 06:50:05 +00:00
Reformat code.
This commit is contained in:
parent
e675c89e28
commit
449e395181
@ -1,4 +1,4 @@
|
|||||||
/* Copyright 2004, 2005 Acegi Technology Pty Limited
|
/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -138,336 +138,320 @@ public class JdbcDaoImpl extends JdbcDaoSupport implements BasicAclDao {
|
|||||||
|
|
||||||
entry.setAclObjectIdentity(propertiesInformation.getAclObjectIdentity());
|
entry.setAclObjectIdentity(propertiesInformation.getAclObjectIdentity());
|
||||||
entry.setAclObjectParentIdentity(propertiesInformation
|
entry.setAclObjectParentIdentity(propertiesInformation
|
||||||
.getAclObjectParentIdentity());
|
.getAclObjectParentIdentity());
|
||||||
|
|
||||||
if (aclInformation == null) {
|
if (aclInformation == null) {
|
||||||
// this is an inheritence marker instance only
|
// this is an inheritence marker instance only
|
||||||
entry.setMask(0);
|
entry.setMask(0);
|
||||||
entry.setRecipient(RECIPIENT_USED_FOR_INHERITENCE_MARKER);
|
entry.setRecipient(RECIPIENT_USED_FOR_INHERITENCE_MARKER);
|
||||||
} else {
|
} else {
|
||||||
// this is an individual ACL entry
|
// this is an individual ACL entry
|
||||||
entry.setMask(aclInformation.getMask());
|
entry.setMask(aclInformation.getMask());
|
||||||
entry.setRecipient(aclInformation.getRecipient());
|
entry.setRecipient(aclInformation.getRecipient());
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the ACLs associated with the requested
|
||||||
|
* <code>AclObjectIdentity</code>.
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* The {@link BasicAclEntry}s returned by this method will have
|
||||||
|
* <code>String</code>-based recipients. This will not be a problem if you
|
||||||
|
* are using the <code>GrantedAuthorityEffectiveAclsResolver</code>, which
|
||||||
|
* is the default configured against <code>BasicAclProvider</code>.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* This method will only return ACLs for requests where the
|
||||||
|
* <code>AclObjectIdentity</code> is of type {@link
|
||||||
|
* NamedEntityObjectIdentity}. Of course, you can subclass or replace this
|
||||||
|
* class and support your own custom <code>AclObjectIdentity</code> types.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param aclObjectIdentity for which ACL information is required (cannot
|
||||||
|
* be <code>null</code> and must be an instance of
|
||||||
|
* <code>NamedEntityObjectIdentity</code>)
|
||||||
|
*
|
||||||
|
* @return the ACLs that apply (without any <code>null</code>s inside the
|
||||||
|
* array), or <code>null</code> if not found or if an incompatible
|
||||||
|
* <code>AclObjectIdentity</code> was requested
|
||||||
|
*/
|
||||||
|
public BasicAclEntry[] getAcls(AclObjectIdentity aclObjectIdentity) {
|
||||||
|
String aclObjectIdentityString;
|
||||||
|
|
||||||
|
try {
|
||||||
|
aclObjectIdentityString = convertAclObjectIdentityToString(aclObjectIdentity);
|
||||||
|
} catch (IllegalArgumentException unsupported) {
|
||||||
|
return null; // pursuant to contract described in JavaDocs above
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lookup the object's main properties from the RDBMS (guaranteed no nulls)
|
||||||
|
List objects = objectProperties.execute(aclObjectIdentityString);
|
||||||
|
|
||||||
|
if (objects.size() == 0) {
|
||||||
|
// this is an unknown object identity string
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cast to an object properties holder (there should only be one record)
|
||||||
|
AclDetailsHolder propertiesInformation = (AclDetailsHolder) objects.get(0);
|
||||||
|
|
||||||
|
// Lookup the object's ACLs from RDBMS (guaranteed no nulls)
|
||||||
|
List acls = aclsByObjectIdentity.execute(propertiesInformation
|
||||||
|
.getForeignKeyId());
|
||||||
|
|
||||||
|
if (acls.size() == 0) {
|
||||||
|
// return merely an inheritence marker (as we know about the object but it has no related ACLs)
|
||||||
|
return new BasicAclEntry[] {createBasicAclEntry(propertiesInformation,
|
||||||
|
null)};
|
||||||
|
} else {
|
||||||
|
// return the individual ACL instances
|
||||||
|
AclDetailsHolder[] aclHolders = (AclDetailsHolder[]) acls.toArray(new AclDetailsHolder[] {});
|
||||||
|
List toReturnAcls = new Vector();
|
||||||
|
|
||||||
|
for (int i = 0; i < aclHolders.length; i++) {
|
||||||
|
toReturnAcls.add(createBasicAclEntry(propertiesInformation,
|
||||||
|
aclHolders[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry;
|
return (BasicAclEntry[]) toReturnAcls.toArray(new BasicAclEntry[] {});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MappingSqlQuery getAclsByObjectIdentity() {
|
||||||
|
return aclsByObjectIdentity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAclsByObjectIdentityQuery() {
|
||||||
|
return aclsByObjectIdentityQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getObjectPropertiesQuery() {
|
||||||
|
return objectPropertiesQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initDao() throws ApplicationContextException {
|
||||||
|
initMappingSqlQueries();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension point to allow other MappingSqlQuery objects to be substituted
|
||||||
|
* in a subclass
|
||||||
|
*/
|
||||||
|
protected void initMappingSqlQueries() {
|
||||||
|
setAclsByObjectIdentity(new AclsByObjectIdentityMapping(getDataSource()));
|
||||||
|
setObjectProperties(new ObjectPropertiesMapping(getDataSource()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAclsByObjectIdentity(
|
||||||
|
MappingSqlQuery aclsByObjectIdentityQuery) {
|
||||||
|
this.aclsByObjectIdentity = aclsByObjectIdentityQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows the default query string used to retrieve ACLs based on object
|
||||||
|
* identity to be overriden, if default table or column names need to be
|
||||||
|
* changed. The default query is {@link
|
||||||
|
* #DEF_ACLS_BY_OBJECT_IDENTITY_QUERY}; when modifying this query, ensure
|
||||||
|
* that all returned columns are mapped back to the same column names as
|
||||||
|
* in the default query.
|
||||||
|
*
|
||||||
|
* @param queryString The query string to set
|
||||||
|
*/
|
||||||
|
public void setAclsByObjectIdentityQuery(String queryString) {
|
||||||
|
aclsByObjectIdentityQuery = queryString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setObjectProperties(MappingSqlQuery objectPropertiesQuery) {
|
||||||
|
this.objectProperties = objectPropertiesQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setObjectPropertiesQuery(String queryString) {
|
||||||
|
objectPropertiesQuery = queryString;
|
||||||
|
}
|
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to hold details of a domain object instance's properties, or an
|
||||||
|
* individual ACL entry.
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Not all properties will be set. The actual properties set will depend on
|
||||||
|
* which <code>MappingSqlQuery</code> creates the object.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Does not enforce <code>null</code>s or empty <code>String</code>s as
|
||||||
|
* this is performed by the <code>MappingSqlQuery</code> objects (or
|
||||||
|
* preferably the backend RDBMS via schema constraints).
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
protected final class AclDetailsHolder {
|
||||||
|
private AclObjectIdentity aclObjectIdentity;
|
||||||
|
private AclObjectIdentity aclObjectParentIdentity;
|
||||||
|
private Class aclClass;
|
||||||
|
private Object recipient;
|
||||||
|
private int mask;
|
||||||
|
private long foreignKeyId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record details of an individual ACL entry (usually from the
|
||||||
|
* ACL_PERMISSION table)
|
||||||
|
*
|
||||||
|
* @param recipient the recipient
|
||||||
|
* @param mask the integer to be masked
|
||||||
|
*/
|
||||||
|
public AclDetailsHolder(Object recipient, int mask) {
|
||||||
|
this.recipient = recipient;
|
||||||
|
this.mask = mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the ACLs associated with the requested
|
* Record details of a domain object instance's properties (usually
|
||||||
* <code>AclObjectIdentity</code>.
|
* from the ACL_OBJECT_IDENTITY table)
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* The {@link BasicAclEntry}s returned by this method will have
|
|
||||||
* <code>String</code>-based recipients. This will not be a problem if
|
|
||||||
* you are using the
|
|
||||||
* <code>GrantedAuthorityEffectiveAclsResolver</code>, which is the
|
|
||||||
* default configured against <code>BasicAclProvider</code>.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* This method will only return ACLs for requests where the
|
|
||||||
* <code>AclObjectIdentity</code> is of type {@link
|
|
||||||
* NamedEntityObjectIdentity}. Of course, you can subclass or replace
|
|
||||||
* this class and support your own custom
|
|
||||||
* <code>AclObjectIdentity</code> types.
|
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @param aclObjectIdentity for which ACL information is required
|
* @param foreignKeyId used by the
|
||||||
* (cannot be <code>null</code> and must be an instance of
|
* <code>AclsByObjectIdentityMapping</code> to locate the
|
||||||
* <code>NamedEntityObjectIdentity</code>)
|
* individual ACL entries
|
||||||
*
|
* @param aclObjectIdentity the object identity of the domain object
|
||||||
* @return the ACLs that apply (without any <code>null</code>s inside
|
* instance
|
||||||
* the array), or <code>null</code> if not found or if an
|
* @param aclObjectParentIdentity the object identity of the domain
|
||||||
* incompatible <code>AclObjectIdentity</code> was requested
|
* object instance's parent
|
||||||
|
* @param aclClass the class of which a new instance which should be
|
||||||
|
* created for each individual ACL entry (or an inheritence
|
||||||
|
* "holder" class if there are no ACL entries)
|
||||||
*/
|
*/
|
||||||
public BasicAclEntry[] getAcls(AclObjectIdentity aclObjectIdentity) {
|
public AclDetailsHolder(long foreignKeyId,
|
||||||
String aclObjectIdentityString;
|
AclObjectIdentity aclObjectIdentity,
|
||||||
|
AclObjectIdentity aclObjectParentIdentity, Class aclClass) {
|
||||||
|
this.foreignKeyId = foreignKeyId;
|
||||||
|
this.aclObjectIdentity = aclObjectIdentity;
|
||||||
|
this.aclObjectParentIdentity = aclObjectParentIdentity;
|
||||||
|
this.aclClass = aclClass;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
public Class getAclClass() {
|
||||||
aclObjectIdentityString = convertAclObjectIdentityToString(aclObjectIdentity);
|
return aclClass;
|
||||||
} catch (IllegalArgumentException unsupported) {
|
}
|
||||||
return null; // pursuant to contract described in JavaDocs above
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lookup the object's main properties from the RDBMS (guaranteed no nulls)
|
public AclObjectIdentity getAclObjectIdentity() {
|
||||||
List objects = objectProperties.execute(aclObjectIdentityString);
|
return aclObjectIdentity;
|
||||||
|
}
|
||||||
|
|
||||||
if (objects.size() == 0) {
|
public AclObjectIdentity getAclObjectParentIdentity() {
|
||||||
// this is an unknown object identity string
|
return aclObjectParentIdentity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getForeignKeyId() {
|
||||||
|
return foreignKeyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMask() {
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getRecipient() {
|
||||||
|
return recipient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query object to look up individual ACL entries.
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Returns the generic <code>AclDetailsHolder</code> object.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Guarantees to never return <code>null</code> (exceptions are thrown in
|
||||||
|
* the event of any issues).
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* The executed SQL requires the following information be made available
|
||||||
|
* from the indicated placeholders: 1. RECIPIENT, 2. MASK.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
protected class AclsByObjectIdentityMapping extends MappingSqlQuery {
|
||||||
|
protected AclsByObjectIdentityMapping(DataSource ds) {
|
||||||
|
super(ds, aclsByObjectIdentityQuery);
|
||||||
|
declareParameter(new SqlParameter(Types.BIGINT));
|
||||||
|
compile();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object mapRow(ResultSet rs, int rownum)
|
||||||
|
throws SQLException {
|
||||||
|
String recipient = rs.getString(1);
|
||||||
|
int mask = rs.getInt(2);
|
||||||
|
Assert.hasText(recipient, "recipient required");
|
||||||
|
|
||||||
|
return new AclDetailsHolder(recipient, mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query object to look up properties for an object identity.
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Returns the generic <code>AclDetailsHolder</code> object.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Guarantees to never return <code>null</code> (exceptions are thrown in
|
||||||
|
* the event of any issues).
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* The executed SQL requires the following information be made available
|
||||||
|
* from the indicated placeholders: 1. ID, 2. OBJECT_IDENTITY, 3.
|
||||||
|
* ACL_CLASS and 4. PARENT_OBJECT_IDENTITY.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
protected class ObjectPropertiesMapping extends MappingSqlQuery {
|
||||||
|
protected ObjectPropertiesMapping(DataSource ds) {
|
||||||
|
super(ds, objectPropertiesQuery);
|
||||||
|
declareParameter(new SqlParameter(Types.VARCHAR));
|
||||||
|
compile();
|
||||||
|
}
|
||||||
|
|
||||||
|
private AclObjectIdentity buildIdentity(String identity) {
|
||||||
|
if (identity == null) {
|
||||||
|
// Must be an empty parent, so return null
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cast to an object properties holder (there should only be one record)
|
int delim = identity.lastIndexOf(":");
|
||||||
AclDetailsHolder propertiesInformation = (AclDetailsHolder) objects
|
String classname = identity.substring(0, delim);
|
||||||
.get(0);
|
String id = identity.substring(delim + 1);
|
||||||
|
|
||||||
// Lookup the object's ACLs from RDBMS (guaranteed no nulls)
|
return new NamedEntityObjectIdentity(classname, id);
|
||||||
List acls = aclsByObjectIdentity.execute(propertiesInformation
|
}
|
||||||
.getForeignKeyId());
|
|
||||||
|
|
||||||
if (acls.size() == 0) {
|
protected Object mapRow(ResultSet rs, int rownum)
|
||||||
// return merely an inheritence marker (as we know about the object but it has no related ACLs)
|
throws SQLException {
|
||||||
return new BasicAclEntry[] {createBasicAclEntry(propertiesInformation,
|
long id = rs.getLong(1); // required
|
||||||
null)};
|
String objectIdentity = rs.getString(2); // required
|
||||||
} else {
|
String aclClass = rs.getString(3); // required
|
||||||
// return the individual ACL instances
|
String parentObjectIdentity = rs.getString(4); // optional
|
||||||
AclDetailsHolder[] aclHolders = (AclDetailsHolder[]) acls
|
Assert.hasText(objectIdentity,
|
||||||
.toArray(new AclDetailsHolder[] {});
|
"required DEF_OBJECT_PROPERTIES_QUERY value (objectIdentity) returned null or empty");
|
||||||
List toReturnAcls = new Vector();
|
Assert.hasText(aclClass,
|
||||||
|
"required DEF_OBJECT_PROPERTIES_QUERY value (aclClass) returned null or empty");
|
||||||
|
|
||||||
for (int i = 0; i < aclHolders.length; i++) {
|
Class aclClazz;
|
||||||
toReturnAcls.add(createBasicAclEntry(
|
|
||||||
propertiesInformation, aclHolders[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
return (BasicAclEntry[]) toReturnAcls.toArray(new BasicAclEntry[] {});
|
try {
|
||||||
}
|
aclClazz = this.getClass().getClassLoader().loadClass(aclClass);
|
||||||
}
|
} catch (ClassNotFoundException cnf) {
|
||||||
|
throw new IllegalArgumentException(cnf.getMessage());
|
||||||
public MappingSqlQuery getAclsByObjectIdentity() {
|
|
||||||
return aclsByObjectIdentity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAclsByObjectIdentityQuery() {
|
|
||||||
return aclsByObjectIdentityQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getObjectPropertiesQuery() {
|
|
||||||
return objectPropertiesQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void initDao() throws ApplicationContextException {
|
|
||||||
initMappingSqlQueries();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension point to allow other MappingSqlQuery objects to be
|
|
||||||
* substituted in a subclass
|
|
||||||
*/
|
|
||||||
protected void initMappingSqlQueries() {
|
|
||||||
setAclsByObjectIdentity(new AclsByObjectIdentityMapping(
|
|
||||||
getDataSource()));
|
|
||||||
setObjectProperties(new ObjectPropertiesMapping(
|
|
||||||
getDataSource()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAclsByObjectIdentity(
|
|
||||||
MappingSqlQuery aclsByObjectIdentityQuery) {
|
|
||||||
this.aclsByObjectIdentity = aclsByObjectIdentityQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allows the default query string used to retrieve ACLs based
|
|
||||||
* on object identity to be overriden, if default table or
|
|
||||||
* column names need to be changed. The default query is
|
|
||||||
* {@link #DEF_ACLS_BY_OBJECT_IDENTITY_QUERY}; when modifying
|
|
||||||
* this query, ensure that all returned columns are mapped
|
|
||||||
* back to the same column names as in the default query.
|
|
||||||
*
|
|
||||||
* @param queryString The query string to set
|
|
||||||
*/
|
|
||||||
public void setAclsByObjectIdentityQuery(String queryString) {
|
|
||||||
aclsByObjectIdentityQuery = queryString;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setObjectProperties(
|
|
||||||
MappingSqlQuery objectPropertiesQuery) {
|
|
||||||
this.objectProperties = objectPropertiesQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setObjectPropertiesQuery(String queryString) {
|
|
||||||
objectPropertiesQuery = queryString;
|
|
||||||
}
|
|
||||||
|
|
||||||
//~ Inner Classes ==========================================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used to hold details of a domain object instance's
|
|
||||||
* properties, or an individual ACL entry.
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* Not all properties will be set. The actual properties set
|
|
||||||
* will depend on which <code>MappingSqlQuery</code> creates
|
|
||||||
* the object.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* Does not enforce <code>null</code>s or empty
|
|
||||||
* <code>String</code>s as this is performed by the
|
|
||||||
* <code>MappingSqlQuery</code> objects (or preferably the
|
|
||||||
* backend RDBMS via schema constraints).
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
protected final class AclDetailsHolder {
|
|
||||||
private AclObjectIdentity aclObjectIdentity;
|
|
||||||
private AclObjectIdentity aclObjectParentIdentity;
|
|
||||||
private Class aclClass;
|
|
||||||
private Object recipient;
|
|
||||||
private int mask;
|
|
||||||
private long foreignKeyId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Record details of an individual ACL entry (usually from
|
|
||||||
* the ACL_PERMISSION table)
|
|
||||||
*
|
|
||||||
* @param recipient the recipient
|
|
||||||
* @param mask the integer to be masked
|
|
||||||
*/
|
|
||||||
public AclDetailsHolder(Object recipient, int mask) {
|
|
||||||
this.recipient = recipient;
|
|
||||||
this.mask = mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Record details of a domain object instance's properties
|
|
||||||
* (usually from the ACL_OBJECT_IDENTITY table)
|
|
||||||
*
|
|
||||||
* @param foreignKeyId used by the
|
|
||||||
* <code>AclsByObjectIdentityMapping</code> to
|
|
||||||
* locate the individual ACL entries
|
|
||||||
* @param aclObjectIdentity the object identity of the
|
|
||||||
* domain object instance
|
|
||||||
* @param aclObjectParentIdentity the object identity of
|
|
||||||
* the domain object instance's parent
|
|
||||||
* @param aclClass the class of which a new instance which
|
|
||||||
* should be created for each individual ACL entry
|
|
||||||
* (or an inheritence "holder" class if there are
|
|
||||||
* no ACL entries)
|
|
||||||
*/
|
|
||||||
public AclDetailsHolder(long foreignKeyId,
|
|
||||||
AclObjectIdentity aclObjectIdentity,
|
|
||||||
AclObjectIdentity aclObjectParentIdentity,
|
|
||||||
Class aclClass) {
|
|
||||||
this.foreignKeyId = foreignKeyId;
|
|
||||||
this.aclObjectIdentity = aclObjectIdentity;
|
|
||||||
this.aclObjectParentIdentity = aclObjectParentIdentity;
|
|
||||||
this.aclClass = aclClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Class getAclClass() {
|
|
||||||
return aclClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AclObjectIdentity getAclObjectIdentity() {
|
|
||||||
return aclObjectIdentity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AclObjectIdentity getAclObjectParentIdentity() {
|
|
||||||
return aclObjectParentIdentity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getForeignKeyId() {
|
|
||||||
return foreignKeyId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMask() {
|
|
||||||
return mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getRecipient() {
|
|
||||||
return recipient;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query object to look up individual ACL entries.
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* Returns the generic <code>AclDetailsHolder</code> object.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* Guarantees to never return <code>null</code> (exceptions are
|
|
||||||
* thrown in the event of any issues).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* The executed SQL requires the following information be made
|
|
||||||
* available from the indicated placeholders: 1. RECIPIENT, 2.
|
|
||||||
* MASK.
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
protected class AclsByObjectIdentityMapping
|
|
||||||
extends MappingSqlQuery {
|
|
||||||
protected AclsByObjectIdentityMapping(DataSource ds) {
|
|
||||||
super(ds, aclsByObjectIdentityQuery);
|
|
||||||
declareParameter(new SqlParameter(Types.BIGINT));
|
|
||||||
compile();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Object mapRow(ResultSet rs, int rownum)
|
|
||||||
throws SQLException {
|
|
||||||
String recipient = rs.getString(1);
|
|
||||||
int mask = rs.getInt(2);
|
|
||||||
Assert.hasText(recipient, "recipient required");
|
|
||||||
|
|
||||||
return new AclDetailsHolder(recipient, mask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query object to look up properties for an object identity.
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* Returns the generic <code>AclDetailsHolder</code> object.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* Guarantees to never return <code>null</code> (exceptions are
|
|
||||||
* thrown in the event of any issues).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <P>
|
|
||||||
* The executed SQL requires the following information be made
|
|
||||||
* available from the indicated placeholders: 1. ID, 2.
|
|
||||||
* OBJECT_IDENTITY, 3. ACL_CLASS and 4.
|
|
||||||
* PARENT_OBJECT_IDENTITY.
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
protected class ObjectPropertiesMapping extends MappingSqlQuery {
|
|
||||||
protected ObjectPropertiesMapping(DataSource ds) {
|
|
||||||
super(ds, objectPropertiesQuery);
|
|
||||||
declareParameter(new SqlParameter(Types.VARCHAR));
|
|
||||||
compile();
|
|
||||||
}
|
|
||||||
|
|
||||||
private AclObjectIdentity buildIdentity(String identity) {
|
|
||||||
if (identity == null) {
|
|
||||||
// Must be an empty parent, so return null
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
int delim = identity.lastIndexOf(":");
|
|
||||||
String classname = identity.substring(0, delim);
|
|
||||||
String id = identity.substring(delim + 1);
|
|
||||||
|
|
||||||
return new NamedEntityObjectIdentity(classname, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Object mapRow(ResultSet rs, int rownum)
|
|
||||||
throws SQLException {
|
|
||||||
long id = rs.getLong(1); // required
|
|
||||||
String objectIdentity = rs.getString(2); // required
|
|
||||||
String aclClass = rs.getString(3); // required
|
|
||||||
String parentObjectIdentity = rs.getString(4); // optional
|
|
||||||
Assert.hasText(objectIdentity,
|
|
||||||
"required DEF_OBJECT_PROPERTIES_QUERY value (objectIdentity) returned null or empty");
|
|
||||||
Assert.hasText(aclClass,
|
|
||||||
"required DEF_OBJECT_PROPERTIES_QUERY value (aclClass) returned null or empty");
|
|
||||||
|
|
||||||
Class aclClazz;
|
|
||||||
|
|
||||||
try {
|
|
||||||
aclClazz = this.getClass().getClassLoader()
|
|
||||||
.loadClass(aclClass);
|
|
||||||
} catch (ClassNotFoundException cnf) {
|
|
||||||
throw new IllegalArgumentException(cnf.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return new AclDetailsHolder(id,
|
|
||||||
buildIdentity(objectIdentity),
|
|
||||||
buildIdentity(parentObjectIdentity), aclClazz);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new AclDetailsHolder(id, buildIdentity(objectIdentity),
|
||||||
|
buildIdentity(parentObjectIdentity), aclClazz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user