⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbcextendeddaoimpl.java

📁 acegi构造安全的java系统
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.acegisecurity.acl.basic.jdbc;import org.acegisecurity.acl.basic.AclObjectIdentity;import org.acegisecurity.acl.basic.BasicAclEntry;import org.acegisecurity.acl.basic.BasicAclEntryCache;import org.acegisecurity.acl.basic.BasicAclExtendedDao;import org.acegisecurity.acl.basic.cache.NullAclEntryCache;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationContextException;import org.springframework.dao.DataAccessException;import org.springframework.dao.DataIntegrityViolationException;import org.springframework.dao.DataRetrievalFailureException;import org.springframework.jdbc.core.SqlParameter;import org.springframework.jdbc.object.MappingSqlQuery;import org.springframework.jdbc.object.SqlUpdate;import org.springframework.util.Assert;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Types;import java.util.Iterator;import java.util.List;import javax.sql.DataSource;/** * <p>Extension of the base {@link JdbcDaoImpl}, which implements {@link BasicAclExtendedDao}.</p> * <p>A default database structure is assumed. This may be overridden by setting the default query strings to use.</p> * <p>If you are using a cache with <code>BasicAclProvider</code>, you should specify that cache via {@link * #setBasicAclEntryCache(BasicAclEntryCache)}. This will cause cache evictions (removals) to take place whenever a * DAO mutator method is called.</p> *  <p>This implementation works with <code>String</code> based recipients and {@link * org.acegisecurity.acl.basic.NamedEntityObjectIdentity} only. The latter can be changed by overriding {@link * #convertAclObjectIdentityToString(AclObjectIdentity)}.</p> * * @author Ben Alex * @version $Id: JdbcExtendedDaoImpl.java 1784 2007-02-24 21:00:24Z luke_t $ */public class JdbcExtendedDaoImpl extends JdbcDaoImpl implements BasicAclExtendedDao {    //~ Static fields/initializers =====================================================================================    private static final Log logger = LogFactory.getLog(JdbcExtendedDaoImpl.class);    public static final String DEF_ACL_OBJECT_IDENTITY_DELETE_STATEMENT =            "DELETE FROM acl_object_identity WHERE id = ?";    public static final String DEF_ACL_OBJECT_IDENTITY_INSERT_STATEMENT =            "INSERT INTO acl_object_identity (object_identity, parent_object, acl_class) VALUES (?, ?, ?)";    public static final String DEF_ACL_PERMISSION_DELETE_STATEMENT =            "DELETE FROM acl_permission WHERE acl_object_identity = ? AND recipient = ?";    public static final String DEF_ACL_PERMISSION_INSERT_STATEMENT =            "INSERT INTO acl_permission (acl_object_identity, recipient, mask) VALUES (?, ?, ?)";    public static final String DEF_ACL_PERMISSION_UPDATE_STATEMENT =            "UPDATE acl_permission SET mask = ? WHERE id = ?";    public static final String DEF_LOOKUP_PERMISSION_ID_QUERY =            "SELECT id FROM acl_permission WHERE acl_object_identity = ? AND recipient = ?";    //~ Instance fields ================================================================================================    private AclObjectIdentityDelete aclObjectIdentityDelete;    private AclObjectIdentityInsert aclObjectIdentityInsert;    private AclPermissionDelete aclPermissionDelete;    private AclPermissionInsert aclPermissionInsert;    private AclPermissionUpdate aclPermissionUpdate;    private BasicAclEntryCache basicAclEntryCache = new NullAclEntryCache();    private MappingSqlQuery lookupPermissionIdMapping;    private String aclObjectIdentityDeleteStatement;    private String aclObjectIdentityInsertStatement;    private String aclPermissionDeleteStatement;    private String aclPermissionInsertStatement;    private String aclPermissionUpdateStatement;    private String lookupPermissionIdQuery;    //~ Constructors ===================================================================================================    public JdbcExtendedDaoImpl() {        aclObjectIdentityDeleteStatement = DEF_ACL_OBJECT_IDENTITY_DELETE_STATEMENT;        aclObjectIdentityInsertStatement = DEF_ACL_OBJECT_IDENTITY_INSERT_STATEMENT;        aclPermissionDeleteStatement = DEF_ACL_PERMISSION_DELETE_STATEMENT;        aclPermissionInsertStatement = DEF_ACL_PERMISSION_INSERT_STATEMENT;        aclPermissionUpdateStatement = DEF_ACL_PERMISSION_UPDATE_STATEMENT;        lookupPermissionIdQuery = DEF_LOOKUP_PERMISSION_ID_QUERY;    }    //~ Methods ========================================================================================================    public void changeMask(AclObjectIdentity aclObjectIdentity, Object recipient, Integer newMask)        throws DataAccessException {        basicAclEntryCache.removeEntriesFromCache(aclObjectIdentity);        // Retrieve acl_object_identity record details        AclDetailsHolder aclDetailsHolder = lookupAclDetailsHolder(aclObjectIdentity);        // Retrieve applicable acl_permission.id        long permissionId = lookupPermissionId(aclDetailsHolder.getForeignKeyId(), recipient.toString());        if (permissionId == -1) {            throw new DataRetrievalFailureException("Could not locate existing acl_permission for aclObjectIdentity: "                + aclObjectIdentity + ", recipient: " + recipient.toString());        }        // Change permission        aclPermissionUpdate.update(new Long(permissionId), newMask);    }    public void create(BasicAclEntry basicAclEntry) throws DataAccessException {        // Create acl_object_identity record if required        createAclObjectIdentityIfRequired(basicAclEntry);        // Only continue if a recipient is specifed (null recipient indicates        // just wanted to ensure the acl_object_identity was created)        if (basicAclEntry.getRecipient() == null) {            return;        }        // Retrieve acl_object_identity record details        AclDetailsHolder aclDetailsHolder = lookupAclDetailsHolder(basicAclEntry.getAclObjectIdentity());        // Ensure there isn't an existing record for this recipient        long permissionId = lookupPermissionId(aclDetailsHolder.getForeignKeyId(), basicAclEntry.getRecipient());        if (permissionId != -1) {            throw new DataIntegrityViolationException("Recipient '" + basicAclEntry.getRecipient()                + "' already exists for aclObjectIdentity ID " + aclDetailsHolder.getForeignKeyId()                + " (permission ID " + ")");        }        // Create acl_permission        aclPermissionInsert.insert(new Long(aclDetailsHolder.getForeignKeyId()),            basicAclEntry.getRecipient().toString(), new Integer(basicAclEntry.getMask()));    }    /**     * Convenience method that creates an acl_object_identity record if required.     *     * @param basicAclEntry containing the <code>AclObjectIdentity</code> to create     *     * @throws DataAccessException     */    private void createAclObjectIdentityIfRequired(BasicAclEntry basicAclEntry)        throws DataAccessException {        basicAclEntryCache.removeEntriesFromCache(basicAclEntry.getAclObjectIdentity());        String aclObjectIdentityString = convertAclObjectIdentityToString(basicAclEntry.getAclObjectIdentity());        // Lookup the object's main properties from the RDBMS (guaranteed no nulls)        List objects = objectProperties.execute(aclObjectIdentityString);        if (objects.size() == 0) {            if (basicAclEntry.getAclObjectParentIdentity() != null) {                AclDetailsHolder parentDetails = lookupAclDetailsHolder(basicAclEntry.getAclObjectParentIdentity());                // Must create the acl_object_identity record                aclObjectIdentityInsert.insert(aclObjectIdentityString, new Long(parentDetails.getForeignKeyId()),                    basicAclEntry.getClass().getName());            } else {                // Must create the acl_object_identity record                aclObjectIdentityInsert.insert(aclObjectIdentityString, null, basicAclEntry.getClass().getName());            }        }    }    public void delete(AclObjectIdentity aclObjectIdentity)        throws DataAccessException {        basicAclEntryCache.removeEntriesFromCache(aclObjectIdentity);        // Retrieve acl_object_identity record details        AclDetailsHolder aclDetailsHolder = lookupAclDetailsHolder(aclObjectIdentity);        // Retrieve all acl_permissions applying to this acl_object_identity        Iterator acls = aclsByObjectIdentity.execute(aclDetailsHolder.getForeignKeyId()).iterator();        // Delete all existing acl_permissions applying to this acl_object_identity        while (acls.hasNext()) {            AclDetailsHolder permission = (AclDetailsHolder) acls.next();            delete(aclObjectIdentity, permission.getRecipient());        }        // Delete acl_object_identity        aclObjectIdentityDelete.delete(new Long(aclDetailsHolder.getForeignKeyId()));    }    public void delete(AclObjectIdentity aclObjectIdentity, Object recipient)        throws DataAccessException {        basicAclEntryCache.removeEntriesFromCache(aclObjectIdentity);        // Retrieve acl_object_identity record details        AclDetailsHolder aclDetailsHolder = lookupAclDetailsHolder(aclObjectIdentity);        // Delete acl_permission        aclPermissionDelete.delete(new Long(aclDetailsHolder.getForeignKeyId()), recipient.toString());    }    public AclObjectIdentityDelete getAclObjectIdentityDelete() {        return aclObjectIdentityDelete;    }    public String getAclObjectIdentityDeleteStatement() {        return aclObjectIdentityDeleteStatement;    }    public AclObjectIdentityInsert getAclObjectIdentityInsert() {        return aclObjectIdentityInsert;    }    public String getAclObjectIdentityInsertStatement() {        return aclObjectIdentityInsertStatement;    }    public AclPermissionDelete getAclPermissionDelete() {        return aclPermissionDelete;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -