Author: rwatler
Date: Thu May 7 06:48:06 2015
New Revision: 1678139
URL: http://svn.apache.org/r1678139
Log:
JS2-1324: Checkpoint commit with initial JetspeedSecurityPersistenceManager, (JSPM), cache integration.
Added:
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMCache.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMCacheImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMQueryCacheElement.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMQueryEhCacheElementImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMQueryEhCacheImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/java/org/apache/jetspeed/security/spi/TestJSPMCache.java
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/cache/JetspeedCacheEventAdapter.java
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheConfigResource.java
portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-profiler/src/test/resources/cache-test.xml
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/PersistentJetspeedPrincipal.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/SecurityDomainImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/PersistentJetspeedPermissionImpl.java
portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/test/resources/cache-test.xml
portals/jetspeed-2/portal/trunk/components/jetspeed-sso/src/test/resources/cache-test.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/alternate/credentials/security-spi.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/cache.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/security-spi.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/conf/jetspeed/jetspeed.properties
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/db-ojb/distributed-ehcache.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/db-ojb/ehcache.xml
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheConfigResource.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheConfigResource.java?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheConfigResource.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheConfigResource.java Thu May 7 06:48:06 2015
@@ -16,24 +16,21 @@
*/
package org.apache.jetspeed.cache.impl;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Map;
-import java.util.HashMap;
-
import net.sf.ehcache.Cache;
-
+import org.apache.jetspeed.components.util.ConfigurationProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
-import org.springframework.beans.factory.InitializingBean;
-import org.apache.jetspeed.components.util.ConfigurationProperties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
/**
* EhCacheConfigResource
@@ -74,6 +71,11 @@ public class EhCacheConfigResource exten
public static final String EHCACHE_PAGE_MANAGER_MAX_FILES_PROP_NAME = "org.apache.jetspeed.ehcache.pagemanager.maxfiles";
public static final String EHCACHE_PAGE_MANAGER_MAX_FILES_DEFAULT = "1000";
+ public static final String EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME = "org.apache.jetspeed.ehcache.jspm.maxelements";
+ public static final String EHCACHE_JSPM_MAX_ELEMENTS_DEFAULT = "128";
+ public static final String EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME = "org.apache.jetspeed.ehcache.jspm.element.ttl";
+ public static final String EHCACHE_JSPM_ELEMENT_TTL_DEFAULT = "150";
+
// Class Members
private static Map overrideSystemProperties;
@@ -108,7 +110,9 @@ public class EhCacheConfigResource exten
private String defaultPageManagerMaxElements;
private String defaultPageManagerElementTTL;
private String defaultPageManagerMaxFiles;
-
+ private String defaultJSPMMaxElements;
+ private String defaultJSPMElementTTL;
+
private ClassPathResource classPathResource;
// InitializingBean implementation
@@ -169,6 +173,14 @@ public class EhCacheConfigResource exten
{
defaultPageManagerMaxFiles = configuration.getString(EHCACHE_PAGE_MANAGER_MAX_FILES_PROP_NAME);
}
+ if (configuration.getString(EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME) != null)
+ {
+ defaultJSPMMaxElements = configuration.getString(EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME);
+ }
+ if (configuration.getString(EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME) != null)
+ {
+ defaultJSPMElementTTL = configuration.getString(EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME);
+ }
}
// save override system properties
@@ -220,6 +232,16 @@ public class EhCacheConfigResource exten
{
overrideSystemProperties.put(EHCACHE_PAGE_MANAGER_MAX_FILES_PROP_NAME, overridePageManagerMaxFiles);
}
+ String overrideJSPMMaxElements = System.getProperty(EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME);
+ if (overrideJSPMMaxElements != null)
+ {
+ overrideSystemProperties.put(EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME, overrideJSPMMaxElements);
+ }
+ String overrideJSPMElementTTL = System.getProperty(EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME);
+ if (overrideJSPMElementTTL != null)
+ {
+ overrideSystemProperties.put(EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME, overrideJSPMElementTTL);
+ }
}
// set system properties used in global cache configuration
@@ -288,6 +310,28 @@ public class EhCacheConfigResource exten
}
System.setProperty(EHCACHE_PAGE_MANAGER_MAX_FILES_PROP_NAME, setPageManagerMaxFiles);
+ // set system properties used in jetspeed security persistence manager cache configuration
+ String setJSPMMaxElements = (String)overrideSystemProperties.get(EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME);
+ if (setJSPMMaxElements == null)
+ {
+ setJSPMMaxElements = ((defaultJSPMMaxElements != null) ? defaultJSPMMaxElements : EHCACHE_JSPM_MAX_ELEMENTS_DEFAULT);
+ if ((setJSPMMaxElements != null) && (Integer.parseInt(setJSPMMaxElements) < 0))
+ {
+ setJSPMMaxElements = EHCACHE_JSPM_MAX_ELEMENTS_DEFAULT;
+ }
+ }
+ System.setProperty(EHCACHE_JSPM_MAX_ELEMENTS_PROP_NAME, setJSPMMaxElements);
+ String setJSPMElementTTL = (String)overrideSystemProperties.get(EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME);
+ if (setJSPMElementTTL == null)
+ {
+ setJSPMElementTTL = ((defaultJSPMElementTTL != null) ? defaultJSPMElementTTL : EHCACHE_JSPM_ELEMENT_TTL_DEFAULT);
+ if ((setJSPMElementTTL != null) && (Integer.parseInt(setJSPMElementTTL) < 0))
+ {
+ setJSPMElementTTL = EHCACHE_JSPM_ELEMENT_TTL_DEFAULT;
+ }
+ }
+ System.setProperty(EHCACHE_JSPM_ELEMENT_TTL_PROP_NAME, setJSPMElementTTL);
+
// setup delegate ClassPathResource
String configResource = System.getProperty(EHCACHE_CONFIG_RESOURCE_PROP_NAME);
log.info("Configured with resource: "+configResource);
@@ -443,4 +487,20 @@ public class EhCacheConfigResource exten
{
this.defaultPageManagerMaxFiles = defaultPageManagerMaxFiles;
}
+
+ /**
+ * @param defaultJSPMMaxElements the defaultPageManagerMaxElements to set
+ */
+ public void setDefaultJSPMMaxElements(String defaultJSPMMaxElements)
+ {
+ this.defaultJSPMMaxElements = defaultJSPMMaxElements;
+ }
+
+ /**
+ * @param defaultJSPMElementTTL the defaultJSPMElementTTL to set
+ */
+ public void setDefaultJSPMElementTTL(String defaultJSPMElementTTL)
+ {
+ this.defaultJSPMElementTTL = defaultJSPMElementTTL;
+ }
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-cm/src/main/java/org/apache/jetspeed/cache/impl/EhCacheElementImpl.java Thu May 7 06:48:06 2015
@@ -23,7 +23,7 @@ import java.io.Serializable;
public class EhCacheElementImpl implements CacheElement
{
- Element element;
+ protected Element element;
public EhCacheElementImpl(Element element)
{
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-profiler/src/test/resources/cache-test.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-profiler/src/test/resources/cache-test.xml?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-profiler/src/test/resources/cache-test.xml (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-profiler/src/test/resources/cache-test.xml Thu May 7 06:48:06 2015
@@ -330,4 +330,105 @@
<constructor-arg><ref bean="ehPageManagerPrincipalPropertiesPathCache"/></constructor-arg>
</bean>
+ <!-- Jetspeed Security Persistence Manager Caches -->
+ <bean id="ehJSPMPrincipalCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmPrincipalCache"/>
+ </bean>
+
+ <bean id="ehJSPMPermissionCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmPermissionCache"/>
+ </bean>
+
+ <bean id="ehJSPMDomainCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmDomainCache"/>
+ </bean>
+
+ <bean id="ehJSPMPrincipalQueryCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmPrincipalQueryCache"/>
+ </bean>
+
+ <bean id="ehJSPMAssociationQueryCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmAssociationQueryCache"/>
+ </bean>
+
+ <bean id="ehJSPMPasswordCredentialQueryCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmPasswordCredentialQueryCache"/>
+ </bean>
+
+ <bean id="ehJSPMPermissionQueryCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmPermissionQueryCache"/>
+ </bean>
+
+ <bean id="ehJSPMDomainQueryCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
+ <meta key="j2:cat" value="default or cache"/>
+ <property name="cacheManager" ref="cacheManager"/>
+ <property name="cacheName" value="jspmDomainQueryCache"/>
+ </bean>
+
+ <bean id="jspmPrincipalCache" class="org.apache.jetspeed.cache.impl.EhCacheDistributedImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMPrincipalCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmPermissionCache" class="org.apache.jetspeed.cache.impl.EhCacheDistributedImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMPermissionCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmDomainCache" class="org.apache.jetspeed.cache.impl.EhCacheDistributedImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMDomainCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmPrincipalQueryCache" class="org.apache.jetspeed.security.spi.impl.cache.JSPMQueryEhCacheImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMPrincipalQueryCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmAssociationQueryCache" class="org.apache.jetspeed.security.spi.impl.cache.JSPMQueryEhCacheImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMAssociationQueryCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmPasswordCredentialQueryCache" class="org.apache.jetspeed.security.spi.impl.cache.JSPMQueryEhCacheImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMPasswordCredentialQueryCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmPermissionQueryCache" class="org.apache.jetspeed.security.spi.impl.cache.JSPMQueryEhCacheImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMPermissionQueryCache"/></constructor-arg>
+ </bean>
+
+ <bean id="jspmDomainQueryCache" class="org.apache.jetspeed.security.spi.impl.cache.JSPMQueryEhCacheImpl">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="ehJSPMDomainQueryCache"/></constructor-arg>
+ </bean>
+
+ <bean id="org.apache.jetspeed.security.spi.impl.cache.JSPMCache" class="org.apache.jetspeed.security.spi.impl.cache.JSPMCacheImpl"
+ init-method="initialize" destroy-method="terminate">
+ <meta key="j2:cat" value="default or cache"/>
+ <constructor-arg><ref bean="jspmPrincipalCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmPermissionCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmDomainCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmPrincipalQueryCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmAssociationQueryCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmPasswordCredentialQueryCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmPermissionQueryCache"/></constructor-arg>
+ <constructor-arg><ref bean="jspmDomainQueryCache"/></constructor-arg>
+ </bean>
</beans>
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/PersistentJetspeedPrincipal.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/PersistentJetspeedPrincipal.java?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/PersistentJetspeedPrincipal.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/PersistentJetspeedPrincipal.java Thu May 7 06:48:06 2015
@@ -17,12 +17,7 @@
package org.apache.jetspeed.security.impl;
-import java.io.Serializable;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-
+import org.apache.jetspeed.cache.DistributedCacheObject;
import org.apache.jetspeed.security.SecurityAttributes;
import org.apache.jetspeed.security.SecurityException;
import org.apache.jetspeed.security.spi.impl.SynchronizationStateAccess;
@@ -30,11 +25,17 @@ import org.apache.ojb.broker.Persistence
import org.apache.ojb.broker.PersistenceBrokerAware;
import org.apache.ojb.broker.PersistenceBrokerException;
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+
/**
* @version $Id$
*
*/
-public abstract class PersistentJetspeedPrincipal extends TransientJetspeedPrincipal implements PersistenceBrokerAware, Serializable
+public abstract class PersistentJetspeedPrincipal extends TransientJetspeedPrincipal implements PersistenceBrokerAware, DistributedCacheObject, Serializable
{
private Long id;
private Timestamp creationDate;
@@ -193,4 +194,8 @@ public abstract class PersistentJetspeed
return SynchronizationStateAccess.isSynchronizing();
}
+ @Override
+ public void notifyChange(int action)
+ {
+ }
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/SecurityDomainImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/SecurityDomainImpl.java?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/SecurityDomainImpl.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/impl/SecurityDomainImpl.java Thu May 7 06:48:06 2015
@@ -16,6 +16,7 @@
*/
package org.apache.jetspeed.security.impl;
+import org.apache.jetspeed.cache.DistributedCacheObject;
import org.apache.jetspeed.security.SecurityDomain;
@@ -23,7 +24,7 @@ import org.apache.jetspeed.security.Secu
* @author <a href="mailto:[email protected]">Dennis Dam</a>
* @version $Id$
*/
-public class SecurityDomainImpl implements SecurityDomain
+public class SecurityDomainImpl implements SecurityDomain, DistributedCacheObject
{
private Long domainId;
@@ -97,5 +98,9 @@ public class SecurityDomainImpl implemen
{
this.enabled = enabled;
}
-
+
+ @Override
+ public void notifyChange(int action)
+ {
+ }
}
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/JetspeedSecurityPersistenceManager.java Thu May 7 06:48:06 2015
@@ -16,15 +16,6 @@
*/
package org.apache.jetspeed.security.spi.impl;
-import java.io.Serializable;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
import org.apache.jetspeed.components.dao.InitablePersistenceBrokerDaoSupport;
import org.apache.jetspeed.i18n.KeyedMessage;
import org.apache.jetspeed.security.JetspeedPermission;
@@ -52,6 +43,7 @@ import org.apache.jetspeed.security.spi.
import org.apache.jetspeed.security.spi.SecurityDomainStorageManager;
import org.apache.jetspeed.security.spi.UserPasswordCredentialAccessManager;
import org.apache.jetspeed.security.spi.UserPasswordCredentialStorageManager;
+import org.apache.jetspeed.security.spi.impl.cache.JSPMCache;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerException;
import org.apache.ojb.broker.accesslayer.LookupException;
@@ -67,6 +59,15 @@ import org.springframework.dao.DataInteg
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.ojb.PersistenceBrokerCallback;
+import java.io.Serializable;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
/**
* @version $Id$
*/
@@ -84,6 +85,8 @@ public class JetspeedSecurityPersistence
private Long defaultSecurityDomainId;
private JetspeedPrincipalLookupManagerFactory jpplf = null;
+
+ private JSPMCache jspmCache = null;
protected static class ManagedListByQueryCallback implements PersistenceBrokerCallback
{
@@ -100,28 +103,47 @@ public class JetspeedSecurityPersistence
}
}
- public JetspeedSecurityPersistenceManager(String repositoryPath, JetspeedPrincipalLookupManagerFactory lookupManagerFactory)
+ public JetspeedSecurityPersistenceManager(String repositoryPath, JetspeedPrincipalLookupManagerFactory lookupManagerFactory, JSPMCache jspmCache)
{
super(repositoryPath);
this.jpplf = lookupManagerFactory;
-
+ this.jspmCache = jspmCache;
}
@SuppressWarnings("unchecked")
- protected Long getPrincipalId(String name, String type, Long domainId) throws SecurityException
+ public Long getPrincipalId(String name, String type, Long domainId) throws SecurityException
{
Criteria criteria = new Criteria();
criteria.addEqualTo("name", name);
criteria.addEqualTo("type", type);
criteria.addEqualTo("domainId", domainId);
+ // check cache
+ String cacheKey = "getPrincipalId:"+criteria;
+ Object principalId = jspmCache.getPrincipalQuery(cacheKey);
+ if (principalId != null)
+ {
+ if (principalId != JSPMCache.CACHE_NULL)
+ {
+ return (Long)principalId;
+ }
+ throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(type, name));
+ }
+ // perform query
ReportQueryByCriteria query = QueryFactory.newReportQuery(PersistentJetspeedPrincipal.class, criteria);
query.setAttributes(new String[]{"id"});
// need to force OJB to return a Long, otherwise it'll return a Integer causing a CCE
query.setJdbcTypes(new int[]{Types.BIGINT});
for (Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); iter.hasNext(); )
{
- return (Long)iter.next()[0];
- }
+ principalId = iter.next()[0];
+ // put result in cache
+ jspmCache.putPrincipalQuery(cacheKey, (Long)principalId, null, domainId, principalId);
+ // return result
+ return (Long)principalId;
+ }
+ // put null result in cache
+ jspmCache.putPrincipalQuery(cacheKey, JSPMCache.ANY_ID, null, domainId, JSPMCache.CACHE_NULL);
+ // throw result
throw new SecurityException(SecurityException.PRINCIPAL_DOES_NOT_EXIST.createScoped(type, name));
}
@@ -129,19 +151,33 @@ public class JetspeedSecurityPersistence
{
if (principal.getId() == null)
{
- if (principal.getDomainId() != null){
+ if (principal.getDomainId() != null)
+ {
return principalExists(principal.getName(), principal.getType(), principal.getDomainId());
- } else {
+ }
+ else
+ {
return principalExists(principal.getName(), principal.getType());
}
-
}
Criteria criteria = new Criteria();
criteria.addEqualTo("id", principal.getId());
criteria.addEqualTo("type", principal.getType().getName());
criteria.addEqualTo("domainId", principal.getDomainId());
+ // check cache
+ String cacheKey = "principalExists:"+criteria;
+ Boolean principalExists = (Boolean)jspmCache.getPrincipalQuery(cacheKey);
+ if (principalExists != null)
+ {
+ return principalExists;
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class,criteria);
- return getPersistenceBrokerTemplate().getCount(query) == 1;
+ principalExists = (getPersistenceBrokerTemplate().getCount(query) == 1);
+ // put result in cache
+ jspmCache.putPrincipalQuery(cacheKey, (principalExists ? principal.getId() : JSPMCache.ANY_ID), null, principal.getDomainId(), principalExists);
+ // return result
+ return principalExists;
}
public List<JetspeedPrincipal> getAssociatedFrom(String principalFromName, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -161,8 +197,27 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("type", to.getName());
criteria.addEqualTo("associationsTo.from.domainId", fromSecurityDomain);
criteria.addEqualTo("domainId", toSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedFrom:"+criteria;
+ List<JetspeedPrincipal> associatedFrom = (List<JetspeedPrincipal>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedFrom != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(associatedFrom);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class, criteria);
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ associatedFrom = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ try
+ {
+ Long principalFromId = getPrincipalId(principalFromName, from.getName(), fromSecurityDomain);
+ jspmCache.putAssociationQuery(cacheKey, principalFromId, extractPrincipalIds(associatedFrom), fromSecurityDomain, toSecurityDomain, new ArrayList<JetspeedPrincipal>(associatedFrom));
+ }
+ catch (SecurityException se)
+ {
+ }
+ // return result
+ return associatedFrom;
}
public List<JetspeedPrincipal> getAssociatedTo(String principalToName, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -180,8 +235,27 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("associationsFrom.to.type", to.getName());
criteria.addEqualTo("associationsFrom.to.domainId", toSecurityDomain);
criteria.addEqualTo("domainId", fromSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedTo:"+criteria;
+ List<JetspeedPrincipal> associatedTo = (List<JetspeedPrincipal>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedTo != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(associatedTo);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class, criteria);
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ associatedTo = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ try
+ {
+ Long principalToId = getPrincipalId(principalToName, to.getName(), toSecurityDomain);
+ jspmCache.putAssociationQuery(cacheKey, principalToId, extractPrincipalIds(associatedTo), fromSecurityDomain, toSecurityDomain, new ArrayList<JetspeedPrincipal>(associatedTo));
+ }
+ catch (SecurityException se)
+ {
+ }
+ // return result
+ return associatedTo;
}
public List<JetspeedPrincipal> getAssociatedFrom(Long principalFromId, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -199,8 +273,20 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("type", to.getName());
criteria.addEqualTo("associationsTo.from.domainId", fromSecurityDomain);
criteria.addEqualTo("domainId", toSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedFrom:"+criteria;
+ List<JetspeedPrincipal> associatedFrom = (List<JetspeedPrincipal>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedFrom != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(associatedFrom);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class, criteria);
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ associatedFrom = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putAssociationQuery(cacheKey, principalFromId, extractPrincipalIds(associatedFrom), fromSecurityDomain, toSecurityDomain, new ArrayList<JetspeedPrincipal>(associatedFrom));
+ // return result
+ return associatedFrom;
}
public List<JetspeedPrincipal> getAssociatedTo(Long principalToId, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -218,8 +304,40 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("associationsFrom.to.type", to.getName());
criteria.addEqualTo("associationsFrom.to.domainId", toSecurityDomain);
criteria.addEqualTo("domainId", fromSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedTo:"+criteria;
+ List<JetspeedPrincipal> associatedTo = (List<JetspeedPrincipal>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedTo != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(associatedTo);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class, criteria);
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ associatedTo = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putAssociationQuery(cacheKey, principalToId, extractPrincipalIds(associatedTo), fromSecurityDomain, toSecurityDomain, new ArrayList<JetspeedPrincipal>(associatedTo));
+ // return result
+ return associatedTo;
+ }
+
+ /**
+ * Extract principal ids from principals.
+ *
+ * @param principals list of principals
+ * @return array of principal ids
+ */
+ private Long [] extractPrincipalIds(List<JetspeedPrincipal> principals)
+ {
+ if ((principals == null) || principals.isEmpty())
+ {
+ return null;
+ }
+ List<Long> principalIds = new ArrayList<Long>(principals.size());
+ for (JetspeedPrincipal principal : principals)
+ {
+ principalIds.add(principal.getId());
+ }
+ return principalIds.toArray(new Long[principalIds.size()]);
}
public List<String> getAssociatedNamesFrom(String principalFromName, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -237,14 +355,35 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("type", to.getName());
criteria.addEqualTo("associationsTo.from.domainId", fromSecurityDomain);
criteria.addEqualTo("domainId", toSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedNamesFrom:"+criteria;
+ List<String> associatedNamesFrom = (List<String>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedNamesFrom != null)
+ {
+ return new ArrayList<String>(associatedNamesFrom);
+ }
+ // perform query
ReportQueryByCriteria query = QueryFactory.newReportQuery(PersistentJetspeedPrincipal.class, criteria);
- query.setAttributes(new String[]{"name"});
- ArrayList<String> names = new ArrayList<String>();
+ query.setAttributes(new String[]{"name", "id"});
+ associatedNamesFrom = new ArrayList<String>();
+ List<Long> associatedIdsFrom = new ArrayList<Long>();
for (Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); iter.hasNext(); )
{
- names.add((String)iter.next()[0]);
+ Object[] associatedFrom = iter.next();
+ associatedNamesFrom.add((String) associatedFrom[0]);
+ associatedIdsFrom.add(((Integer) associatedFrom[1]).longValue());
}
- return names;
+ // put result in cache
+ try
+ {
+ Long principalFromId = getPrincipalId(principalFromName, from.getName(), fromSecurityDomain);
+ jspmCache.putAssociationQuery(cacheKey, principalFromId, associatedIdsFrom.toArray(new Long[associatedIdsFrom.size()]), fromSecurityDomain, toSecurityDomain, new ArrayList<String>(associatedNamesFrom));
+ }
+ catch (SecurityException se)
+ {
+ }
+ // return result
+ return associatedNamesFrom;
}
public List<String> getAssociatedNamesFrom(Long principalFromId, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -262,14 +401,28 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("type", to.getName());
criteria.addEqualTo("associationsTo.from.domainId", fromSecurityDomain);
criteria.addEqualTo("domainId", toSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedNamesFrom:"+criteria;
+ List<String> associatedNamesFrom = (List<String>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedNamesFrom != null)
+ {
+ return new ArrayList<String>(associatedNamesFrom);
+ }
+ // perform query
ReportQueryByCriteria query = QueryFactory.newReportQuery(PersistentJetspeedPrincipal.class, criteria);
- query.setAttributes(new String[]{"name"});
- ArrayList<String> names = new ArrayList<String>();
+ query.setAttributes(new String[]{"name", "id"});
+ associatedNamesFrom = new ArrayList<String>();
+ List<Long> associatedIdsFrom = new ArrayList<Long>();
for (Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); iter.hasNext(); )
{
- names.add((String)iter.next()[0]);
- }
- return names;
+ Object[] associatedFrom = iter.next();
+ associatedNamesFrom.add((String) associatedFrom[0]);
+ associatedIdsFrom.add(((Integer) associatedFrom[1]).longValue());
+ }
+ // put result in cache
+ jspmCache.putAssociationQuery(cacheKey, principalFromId, associatedIdsFrom.toArray(new Long[associatedIdsFrom.size()]), fromSecurityDomain, toSecurityDomain, new ArrayList<String>(associatedNamesFrom));
+ // return result
+ return associatedNamesFrom;
}
public List<String> getAssociatedNamesTo(String principalToName, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -287,14 +440,35 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("associationsFrom.to.type", to.getName());
criteria.addEqualTo("associationsFrom.to.domainId", toSecurityDomain);
criteria.addEqualTo("domainId", fromSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedNamesTo:"+criteria;
+ List<String> associatedNamesTo = (List<String>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedNamesTo != null)
+ {
+ return new ArrayList<String>(associatedNamesTo);
+ }
+ // perform query
ReportQueryByCriteria query = QueryFactory.newReportQuery(PersistentJetspeedPrincipal.class, criteria);
- query.setAttributes(new String[]{"name"});
- ArrayList<String> names = new ArrayList<String>();
+ query.setAttributes(new String[]{"name", "id"});
+ associatedNamesTo = new ArrayList<String>();
+ List<Long> associatedIdsTo = new ArrayList<Long>();
for (Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); iter.hasNext(); )
{
- names.add((String)iter.next()[0]);
+ Object[] associatedTo = iter.next();
+ associatedNamesTo.add((String) associatedTo[0]);
+ associatedIdsTo.add(((Integer) associatedTo[1]).longValue());
+ }
+ // put result in cache
+ try
+ {
+ Long principalToId = getPrincipalId(principalToName, from.getName(), fromSecurityDomain);
+ jspmCache.putAssociationQuery(cacheKey, principalToId, associatedIdsTo.toArray(new Long[associatedIdsTo.size()]), fromSecurityDomain, toSecurityDomain, new ArrayList<String>(associatedNamesTo));
+ }
+ catch (SecurityException se)
+ {
}
- return names;
+ // return result
+ return associatedNamesTo;
}
public List<String> getAssociatedNamesTo(Long principalToId, JetspeedPrincipalType from, JetspeedPrincipalType to, String associationName){
@@ -312,19 +486,50 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("associationsFrom.to.type", to.getName());
criteria.addEqualTo("associationsFrom.to.domainId", toSecurityDomain);
criteria.addEqualTo("domainId", fromSecurityDomain);
+ // check cache
+ String cacheKey = "getAssociatedNamesTo:"+criteria;
+ List<String> associatedNamesTo = (List<String>)jspmCache.getAssociationQuery(cacheKey);
+ if (associatedNamesTo != null)
+ {
+ return new ArrayList<String>(associatedNamesTo);
+ }
+ // perform query
ReportQueryByCriteria query = QueryFactory.newReportQuery(PersistentJetspeedPrincipal.class, criteria);
- query.setAttributes(new String[]{"name"});
- ArrayList<String> names = new ArrayList<String>();
+ query.setAttributes(new String[]{"name", "id"});
+ associatedNamesTo = new ArrayList<String>();
+ List<Long> associatedIdsTo = new ArrayList<Long>();
for (Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); iter.hasNext(); )
{
- names.add((String)iter.next()[0]);
- }
- return names;
+ Object[] associatedTo = iter.next();
+ associatedNamesTo.add((String) associatedTo[0]);
+ associatedIdsTo.add(((Integer) associatedTo[1]).longValue());
+ }
+ // put result in cache
+ jspmCache.putAssociationQuery(cacheKey, principalToId, associatedIdsTo.toArray(new Long[associatedIdsTo.size()]), fromSecurityDomain, toSecurityDomain, new ArrayList<String>(associatedNamesTo));
+ // return result
+ return associatedNamesTo;
}
public JetspeedPrincipal getPrincipal(Long id)
- {
- return (JetspeedPrincipal)getPersistenceBrokerTemplate().getObjectById(PersistentJetspeedPrincipal.class, id);
+ {
+ // check cache
+ Object principal = jspmCache.getPrincipal(id);
+ if (principal != null)
+ {
+ return ((principal != JSPMCache.CACHE_NULL) ? (JetspeedPrincipal) principal : null);
+ }
+ // perform query
+ try
+ {
+ principal = getPersistenceBrokerTemplate().getObjectById(PersistentJetspeedPrincipal.class, id);
+ }
+ catch (ObjectRetrievalFailureException orfe)
+ {
+ }
+ // put result in cache
+ jspmCache.putPrincipal(id, ((principal != null) ? principal : JSPMCache.CACHE_NULL));
+ // return result
+ return (JetspeedPrincipal) principal;
}
public JetspeedPrincipal getPrincipal(String principalName, JetspeedPrincipalType type)
@@ -338,8 +543,27 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("name", principalName);
criteria.addEqualTo("type", type.getName());
criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "getPrincipal:"+criteria;
+ Object principal = jspmCache.getPrincipalQuery(cacheKey);
+ if (principal != null)
+ {
+ return ((principal != JSPMCache.CACHE_NULL) ? (JetspeedPrincipal) principal : null);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class,criteria);
- return (JetspeedPrincipal)getPersistenceBrokerTemplate().getObjectByQuery(query);
+ principal = getPersistenceBrokerTemplate().getObjectByQuery(query);
+ // put result in cache
+ if (principal != null)
+ {
+ jspmCache.putPrincipalQuery(cacheKey, ((JetspeedPrincipal)principal).getId(), null, securityDomain, principal);
+ }
+ else
+ {
+ jspmCache.putPrincipalQuery(cacheKey, JSPMCache.ANY_ID, null, securityDomain, JSPMCache.CACHE_NULL);
+ }
+ // return result
+ return (JetspeedPrincipal) principal;
}
public List<String> getPrincipalNames(String nameFilter, JetspeedPrincipalType type)
@@ -357,14 +581,25 @@ public class JetspeedSecurityPersistence
}
criteria.addEqualTo("type", type.getName());
criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "getPrincipalNames:"+criteria;
+ List<String> principalNames = (List<String>)jspmCache.getPrincipalQuery(cacheKey);
+ if (principalNames != null)
+ {
+ return new ArrayList<String>(principalNames);
+ }
+ // perform query
ReportQueryByCriteria query = QueryFactory.newReportQuery(PersistentJetspeedPrincipal.class,criteria);
query.setAttributes(new String[]{"name"});
- ArrayList<String> names = new ArrayList<String>();
+ principalNames = new ArrayList<String>();
for (Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); iter.hasNext(); )
{
- names.add((String)iter.next()[0]);
+ principalNames.add((String) iter.next()[0]);
}
- return names;
+ // put result in cache
+ jspmCache.putPrincipalQuery(cacheKey, JSPMCache.ANY_ID, null, securityDomain, new ArrayList<String>(principalNames));
+ // return result
+ return principalNames;
}
public List<JetspeedPrincipal> getPrincipals(String nameFilter, JetspeedPrincipalType type)
@@ -382,8 +617,20 @@ public class JetspeedSecurityPersistence
}
criteria.addEqualTo("type", type.getName());
criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "getPrincipals:"+criteria;
+ List<JetspeedPrincipal> principals = (List<JetspeedPrincipal>)jspmCache.getPrincipalQuery(cacheKey);
+ if (principals != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(principals);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class,criteria);
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ principals = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putPrincipalQuery(cacheKey, JSPMCache.ANY_ID, null, securityDomain, new ArrayList<JetspeedPrincipal>(principals));
+ // return result
+ return principals;
}
public List<JetspeedPrincipal> getPrincipalsByAttribute(String attributeName, String attributeValue, JetspeedPrincipalType type)
@@ -399,8 +646,20 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("attributes.value", attributeValue);
criteria.addEqualTo("type", type.getName());
criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "getPrincipalsByAttribute:"+criteria;
+ List<JetspeedPrincipal> principals = (List<JetspeedPrincipal>)jspmCache.getPrincipalQuery(cacheKey);
+ if (principals != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(principals);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class,criteria);
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ principals = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putPrincipalQuery(cacheKey, JSPMCache.ANY_ID, null, securityDomain, new ArrayList<JetspeedPrincipal>(principals));
+ // return result
+ return principals;
}
public boolean principalExists(String principalName, JetspeedPrincipalType type)
@@ -414,8 +673,34 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("name", principalName);
criteria.addEqualTo("type", type.getName());
criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "principalExists:"+criteria;
+ Boolean principalExists = (Boolean)jspmCache.getPrincipalQuery(cacheKey);
+ if (principalExists != null)
+ {
+ return principalExists;
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class,criteria);
- return getPersistenceBrokerTemplate().getCount(query) == 1;
+ principalExists = (getPersistenceBrokerTemplate().getCount(query) == 1);
+ // put result in cache
+ if (principalExists)
+ {
+ try
+ {
+ Long principalId = getPrincipalId(principalName, type.getName(), securityDomain);
+ jspmCache.putPrincipalQuery(cacheKey, principalId, null, securityDomain, principalExists);
+ }
+ catch (SecurityException se)
+ {
+ }
+ }
+ else
+ {
+ jspmCache.putPrincipalQuery(cacheKey, JSPMCache.ANY_ID, null, securityDomain, principalExists);
+ }
+ // return result
+ return principalExists;
}
//
@@ -424,7 +709,8 @@ public class JetspeedSecurityPersistence
public void addPrincipal(JetspeedPrincipal principal, Set<JetspeedPrincipalAssociationReference> associations)
throws SecurityException
{
- if (principal.getDomainId() == null && principal instanceof TransientJetspeedPrincipal){
+ if (principal.getDomainId() == null && principal instanceof TransientJetspeedPrincipal)
+ {
((TransientJetspeedPrincipal)principal).setDomainId(getDefaultSecurityDomainId());
}
if (principalExists(principal))
@@ -434,6 +720,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(principal);
+ // evict from and put in cache to notify
+ jspmCache.evictPrincipal(principal.getId());
+ jspmCache.putPrincipal(principal.getId(), principal);
}
catch (Exception pbe)
{
@@ -452,7 +741,6 @@ public class JetspeedSecurityPersistence
}
public void removePrincipal(JetspeedPrincipal principal) throws SecurityException
-
{
if (!principalExists(principal))
{
@@ -461,6 +749,8 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().delete(principal);
+ // evict from cache to notify
+ jspmCache.evictPrincipal(principal.getId());
}
catch (Exception pbe)
{
@@ -479,7 +769,6 @@ public class JetspeedSecurityPersistence
}
public void updatePrincipal(JetspeedPrincipal principal) throws SecurityException
-
{
if (!principalExists(principal))
{
@@ -488,6 +777,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(principal);
+ // evict from and put in cache to notify
+ jspmCache.evictPrincipal(principal.getId());
+ jspmCache.putPrincipal(principal.getId(), principal);
}
catch (Exception pbe)
{
@@ -513,19 +805,41 @@ public class JetspeedSecurityPersistence
Criteria criteria = new Criteria();
criteria.addEqualTo("principalId", user.getId());
criteria.addEqualTo("type", PasswordCredential.TYPE_CURRENT);
+ // check cache
+ String cacheKey = "getPasswordCredential:"+criteria;
+ PasswordCredential passwordCredential = (PasswordCredential) jspmCache.getPasswordCredentialQuery(cacheKey);
+ if (passwordCredential != null)
+ {
+ return passwordCredential;
+ }
+ // perform query
Query query = QueryFactory.newQuery(PasswordCredentialImpl.class,criteria);
- PasswordCredentialImpl pwc = (PasswordCredentialImpl)getPersistenceBrokerTemplate().getObjectByQuery(query);
- if (pwc == null)
+ passwordCredential = (PasswordCredential) getPersistenceBrokerTemplate().getObjectByQuery(query);
+ if (passwordCredential != null)
{
- pwc = new PasswordCredentialImpl();
+ // store the user by hand as its configured as auto-retrieve="false"
+ ((PasswordCredentialImpl)passwordCredential).setUser(user);
+ }
+ // put result in cache
+ if (passwordCredential != null)
+ {
+ jspmCache.putPasswordCredentialQuery(cacheKey, user.getId(), user.getDomainId(), passwordCredential);
+ }
+ // return result
+ if (passwordCredential == null)
+ {
+ passwordCredential = new PasswordCredentialImpl();
+ // store the user by hand as its configured as auto-retrieve="false"
+ ((PasswordCredentialImpl)passwordCredential).setUser(user);
}
- // store the user by hand as its configured as auto-retrieve="false"
- pwc.setUser(user);
- return pwc;
+ return passwordCredential;
}
public void storePasswordCredential(PasswordCredential credential) throws SecurityException
{
+ if (credential.getUser() == null) {
+ loadPasswordCredentialUser(credential);
+ }
if (credential.isNewPasswordSet())
{
if (credential.getNewPassword() != null)
@@ -534,11 +848,14 @@ public class JetspeedSecurityPersistence
}
}
getPersistenceBrokerTemplate().store(credential);
+ // evict user principal from cache to notify
+ jspmCache.evictPrincipal(credential.getUser().getId());
}
public PasswordCredential getPasswordCredential(String userName){
return getPasswordCredential(userName,getDefaultSecurityDomainId());
}
+
//
// UserPasswordCredentialAccessManager interface implementation
//
@@ -560,14 +877,39 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("user.enabled",true);
criteria.addEqualTo("type", PasswordCredential.TYPE_CURRENT);
criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "getPasswordCredential:"+criteria;
+ Object passwordCredential = jspmCache.getPasswordCredentialQuery(cacheKey);
+ if (passwordCredential != null)
+ {
+ return ((passwordCredential != JSPMCache.CACHE_NULL) ? (PasswordCredential) passwordCredential : null);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PasswordCredentialImpl.class,criteria);
- PasswordCredentialImpl pwc = (PasswordCredentialImpl)getPersistenceBrokerTemplate().getObjectByQuery(query);
- if (pwc != null)
+ passwordCredential = (PasswordCredential) getPersistenceBrokerTemplate().getObjectByQuery(query);
+ if (passwordCredential != null)
{
// store the userName by hand as the user is configured as auto-retrieve="false"
- pwc.setUserName(userName);
+ ((PasswordCredentialImpl)passwordCredential).setUserName(userName);
}
- return pwc;
+ // put result in cache
+ if (passwordCredential != null)
+ {
+ try
+ {
+ Long principalId = getPrincipalId(userName, JetspeedPrincipalType.USER ,securityDomain);
+ jspmCache.putPasswordCredentialQuery(cacheKey, principalId, securityDomain, passwordCredential);
+ }
+ catch (SecurityException se)
+ {
+ }
+ }
+ else
+ {
+ jspmCache.putPasswordCredentialQuery(cacheKey, JSPMCache.ANY_ID, securityDomain, JSPMCache.CACHE_NULL);
+ }
+ // return result
+ return (PasswordCredential) passwordCredential;
}
public void loadPasswordCredentialUser(final PasswordCredential credential)
@@ -597,14 +939,25 @@ public class JetspeedSecurityPersistence
Criteria criteria = new Criteria();
criteria.addEqualTo("principalId", user.getId());
criteria.addEqualTo("type", PasswordCredential.TYPE_HISTORICAL);
+ // check cache
+ String cacheKey = "getHistoricPasswordCredentials:"+criteria;
+ List<PasswordCredential> passwordCredentials = (List<PasswordCredential>) jspmCache.getPasswordCredentialQuery(cacheKey);
+ if (passwordCredentials != null)
+ {
+ return new ArrayList<PasswordCredential>(passwordCredentials);
+ }
+ // perform query
Query query = QueryFactory.newQuery(PasswordCredentialImpl.class,criteria);
- List<PasswordCredential> list = (List<PasswordCredential>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
- for (PasswordCredential pwc : list)
+ passwordCredentials = (List<PasswordCredential>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ for (PasswordCredential passwordCredential : passwordCredentials)
{
// store the user by hand as its configured as auto-retrieve="false"
- ((PasswordCredentialImpl)pwc).setUser(user);
+ ((PasswordCredentialImpl)passwordCredential).setUser(user);
}
- return list;
+ // put result in cache
+ jspmCache.putPasswordCredentialQuery(cacheKey, user.getId(), user.getDomainId(), new ArrayList<PasswordCredential>(passwordCredentials));
+ // return result
+ return passwordCredentials;
}
//
@@ -623,6 +976,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(new JetspeedPrincipalAssociation(from, to, associationName));
+ // evict principals from cache to notify
+ jspmCache.evictPrincipal(from.getId());
+ jspmCache.evictPrincipal(to.getId());
}
catch (Exception pbe)
{
@@ -653,6 +1009,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().delete(new JetspeedPrincipalAssociation(from, to, associationName));
+ // evict principals from cache to notify
+ jspmCache.evictPrincipal(from.getId());
+ jspmCache.evictPrincipal(to.getId());
}
catch (Exception pbe)
{
@@ -671,10 +1030,22 @@ public class JetspeedSecurityPersistence
@SuppressWarnings("unchecked")
public List<PersistentJetspeedPermission> getPermissions()
{
+ // check cache
+ String cacheKey = "getPermissions:[]";
+ List<PersistentJetspeedPermission> permissions = (List<PersistentJetspeedPermission>) jspmCache.getPermissionQuery(cacheKey);
+ if (permissions != null)
+ {
+ return new ArrayList<PersistentJetspeedPermission>(permissions);
+ }
+ // perform query
QueryByCriteria query = QueryFactory.newQuery(PersistentJetspeedPermissionImpl.class, new Criteria());
query.addOrderByAscending("type");
query.addOrderByAscending("name");
- return (List<PersistentJetspeedPermission>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ permissions = (List<PersistentJetspeedPermission>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putPermissionQuery(cacheKey, null, null, JSPMCache.ANY_ID, null, new ArrayList<PersistentJetspeedPermission>(permissions));
+ // return result
+ return permissions;
}
public List<PersistentJetspeedPermission> getPermissions(String type)
@@ -691,9 +1062,21 @@ public class JetspeedSecurityPersistence
{
criteria.addLike("name", nameFilter+"%");
}
+ // check cache
+ String cacheKey = "getPermissions:"+criteria;
+ List<PersistentJetspeedPermission> permissions = (List<PersistentJetspeedPermission>) jspmCache.getPermissionQuery(cacheKey);
+ if (permissions != null)
+ {
+ return new ArrayList<PersistentJetspeedPermission>(permissions);
+ }
+ // perform query
QueryByCriteria query = QueryFactory.newQuery(PersistentJetspeedPermissionImpl.class, criteria);
query.addOrderByAscending("name");
- return (List<PersistentJetspeedPermission>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ permissions = (List<PersistentJetspeedPermission>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putPermissionQuery(cacheKey, null, null, JSPMCache.ANY_ID, null, new ArrayList<PersistentJetspeedPermission>(permissions));
+ // return result
+ return permissions;
}
public boolean permissionExists(JetspeedPermission permission)
@@ -702,8 +1085,20 @@ public class JetspeedSecurityPersistence
criteria.addEqualTo("type", permission.getType());
criteria.addEqualTo("name", permission.getName());
criteria.addEqualTo("actions", permission.getActions());
+ // check cache
+ String cacheKey = "permissionExists:"+criteria;
+ Boolean permissionExists = (Boolean)jspmCache.getPermissionQuery(cacheKey);
+ if (permissionExists != null)
+ {
+ return permissionExists;
+ }
+ // perform query
Query query = QueryFactory.newQuery(PersistentJetspeedPermissionImpl.class, criteria);
- return getPersistenceBrokerTemplate().getCount(query) == 1;
+ permissionExists = (getPersistenceBrokerTemplate().getCount(query) == 1);
+ // put result in cache
+ jspmCache.putPermissionQuery(cacheKey, null, null, JSPMCache.ANY_ID, null, permissionExists);
+ // return result
+ return permissionExists;
}
@SuppressWarnings("unchecked")
@@ -711,15 +1106,32 @@ public class JetspeedSecurityPersistence
{
Criteria criteria = new Criteria();
criteria.addEqualTo("principals.principalId", principal.getId());
+ // check cache
+ String cacheKey = "getPermissions:"+criteria;
+ List<PersistentJetspeedPermission> permissions = (List<PersistentJetspeedPermission>) jspmCache.getPermissionQuery(cacheKey);
+ if (permissions != null)
+ {
+ return new ArrayList<PersistentJetspeedPermission>(permissions);
+ }
+ // perform query
QueryByCriteria query = QueryFactory.newQuery(PersistentJetspeedPermissionImpl.class, criteria);
query.addOrderByAscending("type");
query.addOrderByAscending("name");
- return (List<PersistentJetspeedPermission>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ permissions = (List<PersistentJetspeedPermission>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putPermissionQuery(cacheKey, principal.getId(), null, JSPMCache.ANY_ID, null, new ArrayList<PersistentJetspeedPermission>(permissions));
+ // return result
+ return permissions;
}
- @SuppressWarnings("unchecked")
public List<JetspeedPrincipal> getPrincipals(PersistentJetspeedPermission permission, String principalType)
{
+ return getPrincipals(permission, principalType, getDefaultSecurityDomainId());
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<JetspeedPrincipal> getPrincipals(PersistentJetspeedPermission permission, String principalType, Long securityDomain)
+ {
Criteria criteria = new Criteria();
if (permission.getId() != null)
{
@@ -734,11 +1146,23 @@ public class JetspeedSecurityPersistence
{
criteria.addEqualTo("type", principalType);
}
- criteria.addEqualTo("domainId", getDefaultSecurityDomainId());
+ criteria.addEqualTo("domainId", securityDomain);
+ // check cache
+ String cacheKey = "getPrincipals:"+criteria;
+ List<JetspeedPrincipal> principals = (List<JetspeedPrincipal>) jspmCache.getPermissionQuery(cacheKey);
+ if (principals != null)
+ {
+ return new ArrayList<JetspeedPrincipal>(principals);
+ }
+ // perform query
QueryByCriteria query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class, criteria);
query.addOrderByAscending("type");
query.addOrderByAscending("name");
- return (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ principals = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putPermissionQuery(cacheKey, null, extractPrincipalIds(principals), ((permission.getId() != null) ? permission.getId(): JSPMCache.ANY_ID), securityDomain, new ArrayList<JetspeedPrincipal>(principals));
+ // return result
+ return principals;
}
//
@@ -753,6 +1177,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(permission);
+ // evict from and put in cache to notify
+ jspmCache.evictPermission(permission.getId());
+ jspmCache.putPermission(permission.getId(), permission);
}
catch (Exception pbe)
{
@@ -788,6 +1215,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(current);
+ // evict from and put in cache to notify
+ jspmCache.evictPermission(current.getId());
+ jspmCache.putPermission(current.getId(), current);
}
catch (Exception pbe)
{
@@ -821,6 +1251,8 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().delete(current);
+ // evict from cache to notify
+ jspmCache.evictPermission(current.getId());
}
catch (Exception pbe)
{
@@ -870,6 +1302,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(new JetspeedPrincipalPermission(principal, permission));
+ // evict from principal and permission caches to notify
+ jspmCache.evictPrincipal(permission.getId());
+ jspmCache.evictPermission(permission.getId());
}
catch (Exception pbe)
{
@@ -882,9 +1317,14 @@ public class JetspeedSecurityPersistence
}
}
- @SuppressWarnings("unchecked")
public void grantPermissionOnlyTo(PersistentJetspeedPermission permission, String principalType, List<JetspeedPrincipal> principals) throws SecurityException
{
+ grantPermissionOnlyTo(permission, principalType, principals, getDefaultSecurityDomainId());
+ }
+
+ @SuppressWarnings("unchecked")
+ public void grantPermissionOnlyTo(PersistentJetspeedPermission permission, String principalType, List<JetspeedPrincipal> principals, Long securityDomain) throws SecurityException
+ {
if (permission.getId() == null)
{
Criteria criteria = new Criteria();
@@ -904,7 +1344,7 @@ public class JetspeedSecurityPersistence
{
criteria.addEqualTo("type", principalType);
}
- criteria.addEqualTo("domainId", getDefaultSecurityDomainId());
+ criteria.addEqualTo("domainId", securityDomain);
QueryByCriteria query = QueryFactory.newQuery(PersistentJetspeedPrincipal.class, criteria);
List<JetspeedPrincipal> currentList = (List<JetspeedPrincipal>) getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
List<JetspeedPrincipal> targetList = new ArrayList<JetspeedPrincipal>(principals);
@@ -946,29 +1386,38 @@ public class JetspeedSecurityPersistence
public void revokePermission(PersistentJetspeedPermission permission, JetspeedPrincipal principal) throws SecurityException
{
Long principalId = null;
- Criteria criteria = new Criteria();
if (principal.isTransient() || principal.getId() == null)
{
- principalId = getPrincipalId(principal.getName(), principal.getType().getName(), getDefaultSecurityDomainId());
+ Long securityDomain = ((principal.getDomainId() != null) ? principal.getDomainId() : getDefaultSecurityDomainId());
+ principalId = getPrincipalId(principal.getName(), principal.getType().getName(), securityDomain);
}
else
{
principalId = principal.getId();
}
- criteria.addEqualTo("principalId", principalId);
if (permission.getId() == null)
{
- criteria.addEqualTo("permission.type", permission.getType());
- criteria.addEqualTo("permission.name", permission.getName());
- }
- else
- {
- criteria.addEqualTo("permissionId", permission.getId());
+ Criteria criteria = new Criteria();
+ criteria.addEqualTo("type", permission.getType());
+ criteria.addEqualTo("name", permission.getName());
+ Query query = QueryFactory.newQuery(PersistentJetspeedPermissionImpl.class, criteria);
+ PersistentJetspeedPermission p = (PersistentJetspeedPermission)getPersistenceBrokerTemplate().getObjectByQuery(query);
+ if (p == null)
+ {
+ throw new SecurityException(SecurityException.PERMISSION_DOES_NOT_EXIST.create(permission.getName()));
+ }
+ permission = p;
}
+ Criteria criteria = new Criteria();
+ criteria.addEqualTo("principalId", principalId);
+ criteria.addEqualTo("permissionId", permission.getId());
Query query = QueryFactory.newQuery(JetspeedPrincipalPermission.class,criteria);
try
{
getPersistenceBrokerTemplate().deleteByQuery(query);
+ // evict from principal cache to notify
+ jspmCache.evictPrincipal(principalId);
+ jspmCache.evictPermission(permission.getId());
}
catch (Exception pbe)
{
@@ -986,7 +1435,8 @@ public class JetspeedSecurityPersistence
Criteria criteria = new Criteria();
if (principal.isTransient() || principal.getId() == null)
{
- principalId = getPrincipalId(principal.getName(), principal.getType().getName(), getDefaultSecurityDomainId());
+ Long securityDomain = ((principal.getDomainId() != null) ? principal.getDomainId() : getDefaultSecurityDomainId());
+ principalId = getPrincipalId(principal.getName(), principal.getType().getName(), securityDomain);
}
else
{
@@ -997,6 +1447,8 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().deleteByQuery(query);
+ // evict from principal cache to notify
+ jspmCache.evictPrincipal(principalId);
}
catch (Exception pbe)
{
@@ -1025,6 +1477,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(domain);
+ // evict from and put in cache to notify
+ jspmCache.evictDomain(domain.getDomainId());
+ jspmCache.putDomain(domain.getDomainId(), domain);
}
catch (Exception pbe)
{
@@ -1038,12 +1493,24 @@ public class JetspeedSecurityPersistence
public SecurityDomain getDomain(Long domainId)
{
- try{
- return (SecurityDomain) getPersistenceBrokerTemplate().getObjectById(SecurityDomainImpl.class, domainId);
- } catch (ObjectRetrievalFailureException ore){
- return null;
+ // check cache
+ Object domain = jspmCache.getDomain(domainId);
+ if (domain != null)
+ {
+ return ((domain != JSPMCache.CACHE_NULL) ? (SecurityDomain) domain : null);
}
-
+ // perform query
+ try
+ {
+ domain = getPersistenceBrokerTemplate().getObjectById(SecurityDomainImpl.class, domainId);
+ }
+ catch (ObjectRetrievalFailureException orfe)
+ {
+ }
+ // put result in cache
+ jspmCache.putDomain(domainId, ((domain != null) ? domain : JSPMCache.CACHE_NULL));
+ // return result
+ return (SecurityDomain) domain;
}
protected Long getDefaultSecurityDomainId()
@@ -1068,16 +1535,47 @@ public class JetspeedSecurityPersistence
{
Criteria criteria = new Criteria();
criteria.addEqualTo("name", domainName);
+ // check cache
+ String cacheKey = "getDomainByName:"+criteria;
+ Object domain = jspmCache.getDomainQuery(cacheKey);
+ if (domain != null)
+ {
+ return ((domain != JSPMCache.CACHE_NULL) ? (SecurityDomain) domain : null);
+ }
+ // perform query
Query query = QueryFactory.newQuery(SecurityDomainImpl.class,criteria);
- return (SecurityDomain) getPersistenceBrokerTemplate().getObjectByQuery(query);
+ domain = getPersistenceBrokerTemplate().getObjectByQuery(query);
+ // put result in cache
+ if (domain != null)
+ {
+ jspmCache.putDomainQuery(cacheKey, ((SecurityDomain)domain).getDomainId(), domain);
+ }
+ else
+ {
+ jspmCache.putDomainQuery(cacheKey, JSPMCache.ANY_ID, JSPMCache.CACHE_NULL);
+ }
+ // return result
+ return (SecurityDomain) domain;
}
@SuppressWarnings("unchecked")
public Collection<SecurityDomain> getAllDomains()
{
+ // check cache
+ String cacheKey = "getDomains:[]";
+ List<SecurityDomain> domains = (List<SecurityDomain>) jspmCache.getDomainQuery(cacheKey);
+ if (domains != null)
+ {
+ return new ArrayList<SecurityDomain>(domains);
+ }
+ // perform query
QueryByCriteria query = QueryFactory.newQuery(SecurityDomainImpl.class, new Criteria());
query.addOrderByAscending("name");
- return (List<SecurityDomain>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ domains = (List<SecurityDomain>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putDomainQuery(cacheKey, JSPMCache.ANY_ID, new ArrayList<SecurityDomain>(domains));
+ // return result
+ return domains;
}
public void removeDomain(SecurityDomain domain) throws SecurityException
@@ -1089,6 +1587,8 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().delete(domain);
+ // evict from cache to notify
+ jspmCache.evictDomain(domain.getDomainId());
}
catch (Exception pbe)
{
@@ -1115,6 +1615,9 @@ public class JetspeedSecurityPersistence
try
{
getPersistenceBrokerTemplate().store(domain);
+ // evict from and put in cache to notify
+ jspmCache.evictDomain(domain.getDomainId());
+ jspmCache.putDomain(domain.getDomainId(), domain);
}
catch (Exception pbe)
{
@@ -1137,9 +1640,21 @@ public class JetspeedSecurityPersistence
{
Criteria criteria = new Criteria();
criteria.addEqualTo("ownerDomainId", ownerDomainId);
+ // check cache
+ String cacheKey = "getDomainsOwnedBy:"+criteria;
+ List<SecurityDomain> domains = (List<SecurityDomain>) jspmCache.getDomainQuery(cacheKey);
+ if (domains != null)
+ {
+ return new ArrayList<SecurityDomain>(domains);
+ }
+ // perform query
QueryByCriteria query = QueryFactory.newQuery(SecurityDomainImpl.class, criteria);
query.addOrderByAscending("name");
- return (List<SecurityDomain>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ domains = (List<SecurityDomain>)getPersistenceBrokerTemplate().execute(new ManagedListByQueryCallback(query));
+ // put result in cache
+ jspmCache.putDomainQuery(cacheKey, JSPMCache.ANY_ID, new ArrayList<SecurityDomain>(domains));
+ // return result
+ return domains;
}
public JetspeedPrincipalResultList getPrincipals(JetspeedPrincipalQueryContext queryContext, JetspeedPrincipalType type) {
@@ -1150,6 +1665,8 @@ public class JetspeedSecurityPersistence
* @see org.apache.jetspeed.security.spi.JetspeedPrincipalAccessManager#getPrincipals(org.apache.jetspeed.security.JetspeedPrincipalQueryContext, org.apache.jetspeed.security.JetspeedPrincipalType, java.lang.Long)
*/
public JetspeedPrincipalResultList getPrincipals(JetspeedPrincipalQueryContext queryContext, JetspeedPrincipalType type, Long securityDomain) {
+ // paged principal queries not cached: used only for UI purposes where
+ // results should reflect exact set of principals in database
JetspeedPrincipalLookupManager jppm = jpplf.getJetspeedPrincipalLookupManager();
queryContext.put(JetspeedPrincipalQueryContext.JETSPEED_PRINCIPAL_TYPE, type.getName());
queryContext.put(JetspeedPrincipalQueryContext.SECURITY_DOMAIN, securityDomain);
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/PersistentJetspeedPermissionImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/PersistentJetspeedPermissionImpl.java?rev=1678139&r1=1678138&r2=1678139&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/PersistentJetspeedPermissionImpl.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/PersistentJetspeedPermissionImpl.java Thu May 7 06:48:06 2015
@@ -17,13 +17,14 @@
package org.apache.jetspeed.security.spi.impl;
+import org.apache.jetspeed.cache.DistributedCacheObject;
import org.apache.jetspeed.security.spi.PersistentJetspeedPermission;
/**
* @version $Id$
*
*/
-public class PersistentJetspeedPermissionImpl implements PersistentJetspeedPermission
+public class PersistentJetspeedPermissionImpl implements PersistentJetspeedPermission, DistributedCacheObject
{
private static final long serialVersionUID = 9200223005769593282L;
private Long id;
@@ -65,4 +66,9 @@ public class PersistentJetspeedPermissio
{
this.actions = actions;
}
+
+ @Override
+ public void notifyChange(int action)
+ {
+ }
}
Added: portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMCache.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMCache.java?rev=1678139&view=auto
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMCache.java (added)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-security/src/main/java/org/apache/jetspeed/security/spi/impl/cache/JSPMCache.java Thu May 7 06:48:06 2015
@@ -0,0 +1,245 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.jetspeed.security.spi.impl.cache;
+
+import org.apache.jetspeed.cache.DistributedCacheObject;
+
+/**
+ * JSPMCache - JetspeedSecurityPersistenceManager cache
+ *
+ * @author <a href="mailto:[email protected]">Randy Watler</a>
+ * @version $Id: $
+ */
+public interface JSPMCache {
+
+ /**
+ * Negative caching null sentinel cache element value.
+ */
+ public static final Object CACHE_NULL = new DistributedCacheObject()
+ {
+ @Override
+ public void notifyChange(int action)
+ {
+ }
+
+ @Override
+ public String toString()
+ {
+ return "JSPMCache.CACHE_NULL";
+ }
+ };
+
+ /**
+ * Cache element wildcard dependent id.
+ */
+ public static final Long ANY_ID = JSPMQueryCacheElement.ANY_ID;
+
+ /**
+ * Get principal from instance cache.
+ *
+ * @param id principal id
+ * @return principal instance or CACHE_NULL
+ */
+ Object getPrincipal(Long id);
+
+ /**
+ * Put principal in instance cache.
+ *
+ * @param id principal id
+ * @param principal principal instance or CACHE_NULL
+ */
+ void putPrincipal(Long id, Object principal);
+
+ /**
+ * Evict principal from instance cache and notify local
+ * and distributed listeners. Also evicts related queries
+ * from query caches.
+ *
+ * @param id principal id
+ */
+ void evictPrincipal(Long id);
+
+ /**
+ * Get permission from instance cache.
+ *
+ * @param id permission id
+ * @return permission instance or CACHE_NULL
+ */
+ Object getPermission(Long id);
+
+ /**
+ * Put permission in instance cache.
+ *
+ * @param id permission id
+ * @param permission permission instance or CACHE_NULL
+ */
+ void putPermission(Long id, Object permission);
+
+ /**
+ * Evict permission from instance cache and notify local
+ * and distributed listeners. Also evicts related queries
+ * from query caches.
+ *
+ * @param id permission id
+ */
+ void evictPermission(Long id);
+
+ /**
+ * Get domain from instance cache.
+ *
+ * @param id domain id
+ * @return domain instance or CACHE_NULL
+ */
+ Object getDomain(Long id);
+
+ /**
+ * Put domain in instance cache.
+ *
+ * @param id domain id
+ * @param domain domain instance or CACHE_NULL
+ */
+ void putDomain(Long id, Object domain);
+
+ /**
+ * Evict domain from instance cache and notify local
+ * and distributed listeners. Also evicts related queries
+ * from query caches.
+ *
+ * @param id domain id
+ */
+ void evictDomain(Long id);
+
+ /**
+ * Get principal query result from query cache.
+ *
+ * @param key principal query key
+ * @return principle query result or CACHE_NULL
+ */
+ Object getPrincipalQuery(String key);
+
+ /**
+ * Put principal query result and dependent instance ids
+ * in query cache. Dependent instance ids are used to
+ * evict based on instance cache notifications.
+ *
+ * @param key principal query key
+ * @param principalId dependent principal id, ANY_ID, or null
+ * @param permissionId dependent permission id, ANY_ID, or null
+ * @param domainId dependent domain id, ANY_ID, or null
+ * @param query query result
+ */
+ void putPrincipalQuery(String key, Long principalId, Long permissionId, Long domainId, Object query);
+
+ /**
+ * Get principal association query result from query cache.
+ *
+ * @param key principal association query key
+ * @return principle association query result or CACHE_NULL
+ */
+ Object getAssociationQuery(String key);
+
+ /**
+ * Put principal association query result and dependent
+ * instance ids in query cache. Dependent instance ids are
+ * used to evict based on instance cache notifications.
+ *
+ * @param key principal association query key
+ * @param principalId dependent principal id, ANY_ID, or null
+ * @param otherPrincipalIds dependent principal ids or null
+ * @param domainId dependent domain id, ANY_ID, or null
+ * @param otherDomainId dependent domain id, ANY_ID, or null
+ * @param query query result
+ */
+ void putAssociationQuery(String key, Long principalId, Long [] otherPrincipalIds, Long domainId, Long otherDomainId,
+ Object query);
+
+ /**
+ * Get principal password credential query result from query cache.
+ *
+ * @param key principal password credential query key
+ * @return principle password credential query result or CACHE_NULL
+ */
+ Object getPasswordCredentialQuery(String key);
+
+ /**
+ * Put principal password credential query result and
+ * dependent instance ids in query cache. Dependent
+ * instance ids are used to evict based on instance cache
+ * notifications.
+ *
+ * @param key principal password credential query key
+ * @param principalId dependent principal id, ANY_ID, or null
+ * @param domainId dependent domain id, ANY_ID, or null
+ * @param query query result
+ */
+ void putPasswordCredentialQuery(String key, Long principalId, Long domainId, Object query);
+
+ /**
+ * Get permission query result from query cache.
+ *
+ * @param key permission query key
+ * @return permission query result or CACHE_NULL
+ */
+ Object getPermissionQuery(String key);
+
+ /**
+ * Put permission query result and dependent instance ids
+ * in query cache. Dependent instance ids are used to
+ * evict based on instance cache notifications.
+ *
+ * @param key permission query key
+ * @param principalId dependent principal id, ANY_ID, or null
+ * @param otherPrincipalIds dependent principal ids or null
+ * @param permissionId dependent permission id, ANY_ID, or null
+ * @param domainId dependent domain id, ANY_ID, or null
+ * @param query query result
+ */
+ void putPermissionQuery(String key, Long principalId, Long [] otherPrincipalIds, Long permissionId, Long domainId,
+ Object query);
+
+ /**
+ * Get domain query result from query cache.
+ *
+ * @param key domain query key
+ * @return domain query result or CACHE_NULL
+ */
+ Object getDomainQuery(String key);
+
+ /**
+ * Put domain query result and dependent instance ids in
+ * query cache. Dependent instance ids are used to evict
+ * based on instance cache notifications.
+ *
+ * @param key domain query key
+ * @param domainId dependent domain id, ANY_ID, or null
+ * @param query query result
+ */
+ void putDomainQuery(String key, Long domainId, Object query);
+
+ /**
+ * Return sum of the number of elements in all instance
+ * and query caches.
+ *
+ * @return cache size
+ */
+ int size();
+
+ /**
+ * Clear all instance and query caches.
+ */
+ void clear();
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.