You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Kevin Sutter <kw...@gmail.com> on 2008/03/25 14:14:29 UTC
[OFFLINE] Re: svn commit: r640685 [1/14] - in /openjpa/trunk: ./ openjpa-all/ openjpa-jdbc-5/ openjpa-jdbc/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-jdbc/src/main/java
Patrick,
When you decide to do something, you don't waste any time, do you? :-) I
like that about you. I just got a kick out of this commit... 1 out of 14
commit messages. Gotta love it!
Thanks for doing this cleanup!
Kevin
On Mon, Mar 24, 2008 at 10:38 PM, <pc...@apache.org> wrote:
> Author: pcl
> Date: Mon Mar 24 20:37:56 2008
> New Revision: 640685
>
> URL: http://svn.apache.org/viewvc?rev=640685&view=rev
> Log:
> OPENJPA-544. Get rid of JDK1.4 support, fold the jdk1.5 modules into their
> siblings, get rid of some ugly reflection that was there for 1.5 support,
> and move to the java.util.concurrent collections classes. This includes a
> wrapper around ConcurrentHashMap that allows nulls, since the old OpenJPA
> concurrent map allowed nulls and we rely on that behavior. The implication
> is that putIfAbsent() and some of the other special JDK1.5 methods don't
> obey the same contracts as in the java.util.concurrent package.
>
> Added:
>
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBC3SavepointManager.java
> (props changed)
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-jdbc-5/src/main/java/org/apache/openjpa/jdbc/kernel/JDBC3SavepointManager.java
>
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EnumValueHandler.java
> (props changed)
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-jdbc-5/src/main/java/org/apache/openjpa/jdbc/meta/strats/EnumValueHandler.java
>
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/XMLValueHandler.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-jdbc-5/src/main/java/org/apache/openjpa/jdbc/meta/strats/XMLValueHandler.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ClassRedefiner.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-kernel-5/src/main/java/org/apache/openjpa/enhance/ClassRedefiner.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-kernel-5/src/main/java/org/apache/openjpa/enhance/InstrumentationFactory.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-kernel-5/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-kernel-5/src/main/java/org/apache/openjpa/enhance/PCClassFileTransformer.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-kernel-5/src/main/java/org/apache/openjpa/enhance/PCEnhancerAgent.java
>
> openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/enhance/TestGetDeclaredMethod.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-kernel-5/src/test/java/org/apache/openjpa/enhance/TestGetDeclaredMethod.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/J2DoPriv5Helper.java
> - copied unchanged from r635113,
> openjpa/trunk/openjpa-lib-5/src/main/java/org/apache/openjpa/lib/util/J2DoPriv5Helper.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/NullSafeConcurrentHashMap.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/SizedConcurrentHashMap.java
>
> openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/concurrent/TestNullSafeConcurrentHashMap.java
> Removed:
> openjpa/trunk/openjpa-jdbc-5/
> openjpa/trunk/openjpa-kernel-5/
> openjpa/trunk/openjpa-lib-5/
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/AbstractCollection.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/AbstractQueue.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/AbstractSet.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/Arrays.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/ConcurrentHashMap.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/ConcurrentHashSet.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/ConcurrentLinkedQueue.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/CondVar.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/Condition.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/CopyOnWriteArrayList.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/CopyOnWriteArraySet.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/FIFOCondVar.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/FIFOWaitQueue.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/Lock.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/NanoTimer.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/Queue.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/ReentrantLock.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/TimeUnit.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/Utils.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/WaitQueue.java
> Modified:
> openjpa/trunk/openjpa-all/pom.xml
> openjpa/trunk/openjpa-jdbc/pom.xml
>
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingDefaultsImpl.java
>
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
> openjpa/trunk/openjpa-kernel/pom.xml
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/DataCacheScheduler.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCDataGenerator.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/RemoteCommitEventManager.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/SingleJVMRemoteCommitProvider.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/TCPRemoteCommitProvider.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/event/TransactionEventManager.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExtentImpl.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/CacheMap.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ProxyManagerImpl.java
>
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/StoreFacadeTypeRegistry.java
> openjpa/trunk/openjpa-lib/pom.xml
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/Configurations.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ObjectValue.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/DecoratingDataSource.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/JDBCEventConnectionDecorator.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/log/LogFactoryAdapter.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/log/LogFactoryImpl.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/log/MultiLogFactory.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/LRUMap.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/Localizer.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/TimestampHelper.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/AbstractConcurrentEventManager.java
>
> openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/concurrent/ConcurrentReferenceHashSet.java
>
> openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/test/AbstractTestCase.java
>
> openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/TestAbstractEventManager.java
>
> openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/util/concurrent/TestConcurrentMap.java
> openjpa/trunk/openjpa-persistence-jdbc/pom.xml
>
> openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestExceptionsFromCallbacks.java
>
> openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/utils/AbstractTestCase.java
>
> openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/discriminator/TestDiscriminatorTypes.java
>
> openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestPessimisticLocking.java
>
> openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestRetainValuesInOptimistic.java
>
> openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/relations/TestHandlerToRelationMaps.java
> openjpa/trunk/openjpa-persistence/pom.xml
> openjpa/trunk/openjpa-xmlstore/pom.xml
> openjpa/trunk/pom.xml
>
> Modified: openjpa/trunk/openjpa-all/pom.xml
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-all/pom.xml?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> --- openjpa/trunk/openjpa-all/pom.xml (original)
> +++ openjpa/trunk/openjpa-all/pom.xml Mon Mar 24 20:37:56 2008
> @@ -84,15 +84,14 @@
>
> <!--
> create enhancer pre-main attribute
> - copied from openjpa-kernel-5/pom.xml
> -->
> <plugin>
> <groupId>org.apache.maven.plugins</groupId>
> <artifactId>maven-jar-plugin</artifactId>
> <configuration>
> - <archive>
> - <manifest>
> - <mainClass>
> org.apache.openjpa.conf.OpenJPAVersion</mainClass>
> + <archive>
> + <manifest>
> + <mainClass>
> org.apache.openjpa.conf.OpenJPAVersion</mainClass>
> </manifest>
> <manifestEntries>
> <Premain-Class>
> @@ -120,19 +119,7 @@
> </dependency>
> <dependency>
> <groupId>org.apache.openjpa</groupId>
> - <artifactId>openjpa-kernel-5</artifactId>
> - <version>${pom.version}</version>
> - <scope>provided</scope>
> - </dependency>
> - <dependency>
> - <groupId>org.apache.openjpa</groupId>
> <artifactId>openjpa-jdbc</artifactId>
> - <version>${pom.version}</version>
> - <scope>provided</scope>
> - </dependency>
> - <dependency>
> - <groupId>org.apache.openjpa</groupId>
> - <artifactId>openjpa-jdbc-5</artifactId>
> <version>${pom.version}</version>
> <scope>provided</scope>
> </dependency>
>
> Modified: openjpa/trunk/openjpa-jdbc/pom.xml
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/pom.xml?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> --- openjpa/trunk/openjpa-jdbc/pom.xml (original)
> +++ openjpa/trunk/openjpa-jdbc/pom.xml Mon Mar 24 20:37:56 2008
> @@ -32,26 +32,6 @@
> <artifactId>openjpa-parent</artifactId>
> <version>1.1.0-SNAPSHOT</version>
> </parent>
> - <profiles>
> - <profile>
> - <id>java14-validate</id>
> - <activation><property><name>java14.jar
> </name></property></activation>
> - <build>
> - <pluginManagement>
> - <plugins>
> - <plugin>
> -
> <artifactId>maven-compiler-plugin</artifactId>
> - <configuration>
> - <compilerArguments>
> - <bootclasspath>${java14.jar
> }</bootclasspath>
> - </compilerArguments>
> - </configuration>
> - </plugin>
> - </plugins>
> - </pluginManagement>
> - </build>
> - </profile>
> - </profiles>
> <dependencies>
> <dependency>
> <groupId>org.apache.openjpa</groupId>
> @@ -60,6 +40,10 @@
> <scope>compile</scope>
> </dependency>
> <dependency>
> + <groupId>javax.xml.bind</groupId>
> + <artifactId>jaxb-api</artifactId>
> + </dependency>
> + <dependency>
> <groupId>hsqldb</groupId>
> <artifactId>hsqldb</artifactId>
> <scope>compile</scope>
> @@ -70,8 +54,8 @@
> <plugin>
> <artifactId>maven-compiler-plugin</artifactId>
> <configuration>
> - <source>1.4</source>
> - <target>1.4</target>
> + <source>1.5</source>
> + <target>1.5</target>
> </configuration>
> </plugin>
> </plugins>
>
> Propchange:
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBC3SavepointManager.java
>
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Modified:
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingDefaultsImpl.java
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingDefaultsImpl.java?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> ---
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingDefaultsImpl.java
> (original)
> +++
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingDefaultsImpl.java
> Mon Mar 24 20:37:56 2008
> @@ -25,6 +25,7 @@
>
> import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
> import org.apache.openjpa.jdbc.meta.strats.UntypedPCValueHandler;
> +import org.apache.openjpa.jdbc.meta.strats.EnumValueHandler;
> import org.apache.openjpa.jdbc.schema.Column;
> import org.apache.openjpa.jdbc.schema.ForeignKey;
> import org.apache.openjpa.jdbc.schema.Index;
> @@ -457,10 +458,11 @@
> if (_stringifyUnmapped && vm.getTypeMapping() != null
> && !vm.getTypeMapping().isMapped())
> return UntypedPCValueHandler.getInstance();
> - if (_ordinalEnum && !vm.isSerialized()
> - && JavaVersions.isEnumeration(type))
> - return "org.apache.openjpa.jdbc.meta.strats.EnumValueHandler"
> - + "(StoreOrdinal=true)";
> + if (type.isEnum() && !vm.isSerialized()) {
> + EnumValueHandler enumHandler = new EnumValueHandler();
> + enumHandler.setStoreOrdinal(_ordinalEnum);
> + return enumHandler;
> + }
> return null;
> }
>
>
> Modified:
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> ---
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
> (original)
> +++
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
> Mon Mar 24 20:37:56 2008
> @@ -102,13 +102,6 @@
>
> private static final Localizer _loc = Localizer.forPackage
> (MappingRepository.class);
> - private static final Map _handlers = new HashMap();
> -
> - static {
> - // register default value handlers
> - _handlers.put("java.lang.Enum",
> - "org.apache.openjpa.jdbc.meta.strats.EnumValueHandler");
> - }
>
> private transient DBDictionary _dict = null;
> private transient MappingDefaults _defaults = null;
> @@ -949,8 +942,6 @@
> return null;
>
> Object strat = _defaults.getStrategy(val, type, adapting);
> - if (strat == null)
> - strat = _handlers.get(type.getName());
>
> // recurse on superclass so that, for example, a registered
> handler
> // for java.lang.Enum will work on all enums
>
> Propchange:
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EnumValueHandler.java
>
> ------------------------------------------------------------------------------
> svn:eol-style = native
>
> Modified: openjpa/trunk/openjpa-kernel/pom.xml
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/pom.xml?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> --- openjpa/trunk/openjpa-kernel/pom.xml (original)
> +++ openjpa/trunk/openjpa-kernel/pom.xml Mon Mar 24 20:37:56 2008
> @@ -32,26 +32,6 @@
> <artifactId>openjpa-parent</artifactId>
> <version>1.1.0-SNAPSHOT</version>
> </parent>
> - <profiles>
> - <profile>
> - <id>java14-validate</id>
> - <activation><property><name>java14.jar
> </name></property></activation>
> - <build>
> - <pluginManagement>
> - <plugins>
> - <plugin>
> -
> <artifactId>maven-compiler-plugin</artifactId>
> - <configuration>
> - <compilerArguments>
> - <bootclasspath>${java14.jar
> }</bootclasspath>
> - </compilerArguments>
> - </configuration>
> - </plugin>
> - </plugins>
> - </pluginManagement>
> - </build>
> - </profile>
> - </profiles>
> <dependencies>
> <dependency>
> <groupId>org.apache.openjpa</groupId>
> @@ -80,8 +60,8 @@
> <plugin>
> <artifactId>maven-compiler-plugin</artifactId>
> <configuration>
> - <source>1.4</source>
> - <target>1.4</target>
> + <source>1.5</source>
> + <target>1.5</target>
> </configuration>
> </plugin>
> <plugin>
>
> Modified:
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> ---
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java
> (original)
> +++
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java
> Mon Mar 24 20:37:56 2008
> @@ -25,7 +25,7 @@
> import org.apache.openjpa.lib.conf.Configuration;
> import org.apache.openjpa.lib.conf.PluginValue;
> import org.apache.openjpa.lib.util.concurrent.ConcurrentMap;
> -import org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap;
> +import java.util.concurrent.ConcurrentHashMap;
> import org.apache.openjpa.lib.util.ParseException;
> import org.apache.openjpa.util.CacheMap;
>
>
> Modified:
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> ---
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java
> (original)
> +++
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractDataCache.java
> Mon Mar 24 20:37:56 2008
> @@ -1,455 +1,455 @@
> -/*
> - * 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.openjpa.datacache;
> -
> -import java.util.ArrayList;
> -import java.util.BitSet;
> -import java.util.Collection;
> -import java.util.HashMap;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
> -
> -import org.apache.openjpa.conf.OpenJPAConfiguration;
> -import org.apache.openjpa.event.RemoteCommitEvent;
> -import org.apache.openjpa.event.RemoteCommitListener;
> -import org.apache.openjpa.lib.conf.Configurable;
> -import org.apache.openjpa.lib.conf.Configuration;
> -import org.apache.openjpa.lib.log.Log;
> -import org.apache.openjpa.lib.util.Localizer;
> -import
> org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager;
> -
> -/**
> - * Abstract {@link DataCache} implementation that provides various
> - * statistics, logging, and timeout functionality common across cache
> - * implementations.
> - *
> - * @author Patrick Linskey
> - * @author Abe White
> - */
> -public abstract class AbstractDataCache
> - extends AbstractConcurrentEventManager
> - implements DataCache, Configurable {
> -
> - private static final BitSet EMPTY_BITSET = new BitSet(0);
> -
> - private static final Localizer s_loc =
> - Localizer.forPackage(AbstractDataCache.class);
> -
> - /**
> - * The configuration set by the system.
> - */
> - protected OpenJPAConfiguration conf;
> -
> - /**
> - * The log to use.
> - */
> - protected Log log;
> -
> - private String _name = null;
> - private boolean _closed = false;
> - private String _schedule = null;
> -
> - public String getName() {
> - return _name;
> - }
> -
> - public void setName(String name) {
> - _name = name;
> - }
> -
> - public String getEvictionSchedule() {
> - return _schedule;
> - }
> -
> - public void setEvictionSchedule(String s) {
> - _schedule = s;
> - }
> -
> - public void initialize(DataCacheManager manager) {
> - if (_schedule != null && !"".equals(_schedule)) {
> - DataCacheScheduler scheduler = manager.getDataCacheScheduler
> ();
> - if (scheduler != null)
> - scheduler.scheduleEviction(this, _schedule);
> - }
> - }
> -
> - public void commit(Collection additions, Collection newUpdates,
> - Collection existingUpdates, Collection deletes) {
> - // remove all objects in deletes list
> - removeAllInternal(deletes);
> -
> - // next, add all the new additions
> - putAllInternal(additions);
> - putAllInternal(newUpdates);
> -
> - // possibly add the existing updates, depending on the
> - // semantics of the cache, as dictated by recacheUpdates()
> - if (recacheUpdates())
> - putAllInternal(existingUpdates);
> -
> - if (log.isTraceEnabled()) {
> - Collection addIds = new ArrayList(additions.size());
> - Collection upIds = new ArrayList(newUpdates.size());
> - Collection exIds = new ArrayList(existingUpdates.size());
> -
> - for (Iterator iter = additions.iterator(); iter.hasNext();)
> - addIds.add(((DataCachePCData) iter.next()).getId());
> - for (Iterator iter = newUpdates.iterator(); iter.hasNext();)
> - upIds.add(((DataCachePCData) iter.next()).getId());
> - for (Iterator iter = existingUpdates.iterator(); iter.hasNext
> ();)
> - exIds.add(((DataCachePCData) iter.next()).getId());
> -
> - log.trace(s_loc.get("cache-commit",
> - new Object[]{ addIds, upIds, exIds, deletes }));
> - }
> - }
> -
> - public boolean contains(Object key) {
> - DataCachePCData o = getInternal(key);
> - if (o != null && o.isTimedOut()) {
> - o = null;
> - removeInternal(key);
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-timeout", key));
> - }
> - return o != null;
> - }
> -
> - public BitSet containsAll(Collection keys) {
> - if (keys.isEmpty())
> - return EMPTY_BITSET;
> -
> - BitSet set = new BitSet(keys.size());
> - int i = 0;
> - for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> - if (contains(iter.next()))
> - set.set(i);
> - return set;
> - }
> -
> - public DataCachePCData get(Object key) {
> - DataCachePCData o = getInternal(key);
> - if (o != null && o.isTimedOut()) {
> - o = null;
> - removeInternal(key);
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-timeout", key));
> - }
> -
> - if (log.isTraceEnabled()) {
> - if (o == null)
> - log.trace(s_loc.get("cache-miss", key));
> - else
> - log.trace(s_loc.get("cache-hit", key));
> - }
> -
> - return o;
> - }
> -
> - public DataCachePCData put(DataCachePCData data) {
> - DataCachePCData o = putInternal(data.getId(), data);
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-put", data.getId()));
> - return (o == null || o.isTimedOut()) ? null : o;
> - }
> -
> - public void update(DataCachePCData data) {
> - if (recacheUpdates())
> - putInternal(data.getId(), data);
> - }
> -
> - public DataCachePCData remove(Object key) {
> - DataCachePCData o = removeInternal(key);
> - if (o != null && o.isTimedOut())
> - o = null;
> - if (log.isTraceEnabled()) {
> - if (o == null)
> - log.trace(s_loc.get("cache-remove-miss", key));
> - else
> - log.trace(s_loc.get("cache-remove-hit", key));
> - }
> - return o;
> - }
> -
> - public BitSet removeAll(Collection keys) {
> - if (keys.isEmpty())
> - return EMPTY_BITSET;
> -
> - BitSet set = new BitSet(keys.size());
> - int i = 0;
> - for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> - if (remove(iter.next()) != null)
> - set.set(i);
> - return set;
> - }
> -
> - /**
> - * Remove the objects of the given class from the cache.
> - */
> - public void removeAll(Class cls, boolean subClasses) {
> - removeAllInternal(cls, subClasses);
> - }
> -
> - public boolean pin(Object key) {
> - boolean bool = pinInternal(key);
> - if (log.isTraceEnabled()) {
> - if (bool)
> - log.trace(s_loc.get("cache-pin-hit", key));
> - else
> - log.trace(s_loc.get("cache-pin-miss", key));
> - }
> - return bool;
> - }
> -
> - public BitSet pinAll(Collection keys) {
> - if (keys.isEmpty())
> - return EMPTY_BITSET;
> -
> - BitSet set = new BitSet(keys.size());
> - int i = 0;
> - for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> - if (pin(iter.next()))
> - set.set(i);
> - return set;
> - }
> -
> - public void pinAll(Class cls, boolean subs) {
> - if (log.isWarnEnabled())
> - log.warn(s_loc.get("cache-class-pin", getName()));
> - }
> -
> - public boolean unpin(Object key) {
> - boolean bool = unpinInternal(key);
> - if (log.isTraceEnabled()) {
> - if (bool)
> - log.trace(s_loc.get("cache-unpin-hit", key));
> - else
> - log.trace(s_loc.get("cache-unpin-miss", key));
> - }
> - return bool;
> - }
> -
> - public BitSet unpinAll(Collection keys) {
> - if (keys.isEmpty())
> - return EMPTY_BITSET;
> -
> - BitSet set = new BitSet(keys.size());
> - int i = 0;
> - for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> - if (unpin(iter.next()))
> - set.set(i);
> - return set;
> - }
> -
> - public void unpinAll(Class cls, boolean subs) {
> - if (log.isWarnEnabled())
> - log.warn(s_loc.get("cache-class-unpin", getName()));
> - }
> -
> - public void clear() {
> - clearInternal();
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-clear", getName()));
> - }
> -
> - public void close() {
> - close(true);
> - }
> -
> - protected void close(boolean clear) {
> - if (!_closed) {
> - if (clear)
> - clearInternal();
> - _closed = true;
> - }
> - }
> -
> - public boolean isClosed() {
> - return _closed;
> - }
> -
> - public void addExpirationListener(ExpirationListener listen) {
> - addListener(listen);
> - }
> -
> - public boolean removeExpirationListener(ExpirationListener listen) {
> - return removeListener(listen);
> - }
> -
> - public String toString() {
> - return "[" + super.toString() + ":" + _name + "]";
> - }
> -
> - /**
> - * This method is part of the {@link RemoteCommitListener} interface.
> If
> - * your cache subclass relies on OpenJPA for clustering support, make
> it
> - * implement <code>RemoteCommitListener</code>. This method will take
> - * care of invalidating entries from remote commits.
> - */
> - public void afterCommit(RemoteCommitEvent event) {
> - if (_closed)
> - return;
> -
> - if (event.getPayloadType() == RemoteCommitEvent.PAYLOAD_EXTENTS)
> {
> - removeAllTypeNamesInternal(event.getUpdatedTypeNames());
> - removeAllTypeNamesInternal(event.getDeletedTypeNames());
> - } else {
> - // drop all the committed OIDs, excepting brand
> - // new OIDs. brand new OIDs either won't be in
> - // the cache, or if they are, will be more up to date
> - removeAllInternal(event.getUpdatedObjectIds());
> - removeAllInternal(event.getDeletedObjectIds());
> - }
> - }
> -
> - /**
> - * Invoke when a key is removed from this cache. Propagates the
> - * expiration event on to all expiration listeners registered
> - * with this class.
> - */
> - protected void keyRemoved(Object key, boolean expired) {
> - // Notify any expiration listeners of the expiration.
> - if (hasListeners())
> - fireEvent(new ExpirationEvent(this, key, expired));
> -
> - if (expired && log.isTraceEnabled())
> - log.trace(s_loc.get("cache-expired", key));
> - }
> -
> - /**
> - * Return <code>true</code> if updates to data already in the
> - * cache (either in {@link #commit} or the {@link #update})
> - * should be put back into the cache. Returns false by default.
> - */
> - protected boolean recacheUpdates() {
> - return false;
> - }
> -
> - /**
> - * Return the object for the given oid.
> - */
> - protected abstract DataCachePCData getInternal(Object oid);
> -
> - /**
> - * Add the given object to the cache, returning the old object under
> the
> - * given oid.
> - */
> - protected abstract DataCachePCData putInternal(Object oid,
> - DataCachePCData pc);
> -
> - /**
> - * All all of the given objects to the cache.
> - */
> - protected void putAllInternal(Collection pcs) {
> - DataCachePCData pc;
> - for (Iterator iter = pcs.iterator(); iter.hasNext();) {
> - pc = (DataCachePCData) iter.next();
> - putInternal(pc.getId(), pc);
> - }
> - }
> -
> - /**
> - * Remove the object under the given oid from the cache.
> - */
> - protected abstract DataCachePCData removeInternal(Object oid);
> -
> - /**
> - * Evict objects in cache by class.
> - */
> - protected abstract void removeAllInternal(Class cls, boolean
> subclasses);
> -
> - /**
> - * Remove all objects under the given oids from the cache.
> - */
> - protected void removeAllInternal(Collection oids) {
> - for (Iterator iter = oids.iterator(); iter.hasNext();)
> - removeInternal(iter.next());
> - }
> -
> - /**
> - * Remove all objects of the given class names from the cache.
> - */
> - protected void removeAllTypeNamesInternal(Collection classNames) {
> - Collection classes = Caches.addTypesByName(conf, classNames,
> null);
> - if (classes == null)
> - return;
> -
> - Class cls;
> - for (Iterator iter = classes.iterator(); iter.hasNext();) {
> - cls = (Class) iter.next();
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-removeclass", cls.getName()));
> - removeAllInternal(cls, false);
> - }
> - }
> -
> - /**
> - * Clear the cache.
> - */
> - protected abstract void clearInternal();
> -
> - /**
> - * Pin an object to the cache.
> - */
> - protected abstract boolean pinInternal(Object oid);
> -
> - /**
> - * Unpin an object from the cache.
> - */
> - protected abstract boolean unpinInternal(Object oid);
> -
> - // ---------- Configurable implementation ----------
> -
> - public void setConfiguration(Configuration conf) {
> - this.conf = (OpenJPAConfiguration) conf;
> - this.log = conf.getLog(OpenJPAConfiguration.LOG_DATACACHE);
> - }
> -
> - public void startConfiguration() {
> - }
> -
> - public void endConfiguration() {
> - if (_name == null)
> - setName(NAME_DEFAULT);
> - }
> -
> - // ---------- AbstractEventManager implementation ----------
> -
> - protected void fireEvent(Object event, Object listener) {
> - ExpirationListener listen = (ExpirationListener) listener;
> - ExpirationEvent ev = (ExpirationEvent) event;
> - try {
> - listen.onExpire(ev);
> - } catch (Exception e) {
> - if (log.isWarnEnabled())
> - log.warn(s_loc.get("exp-listener-ex"), e);
> - }
> - }
> -
> - /**
> - * Returns the objects for the given key List.
> - */
> - public Map getAll(List keys) {
> - Map resultMap = new HashMap(keys.size());
> - for(int i=0; i<keys.size(); i++)
> - resultMap.put(keys.get(i), get(keys.get(i)));
> - return resultMap;
> - }
> -}
> +/*
> + * 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.openjpa.datacache;
> +
> +import java.util.ArrayList;
> +import java.util.BitSet;
> +import java.util.Collection;
> +import java.util.HashMap;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Map;
> +
> +import org.apache.openjpa.conf.OpenJPAConfiguration;
> +import org.apache.openjpa.event.RemoteCommitEvent;
> +import org.apache.openjpa.event.RemoteCommitListener;
> +import org.apache.openjpa.lib.conf.Configurable;
> +import org.apache.openjpa.lib.conf.Configuration;
> +import org.apache.openjpa.lib.log.Log;
> +import org.apache.openjpa.lib.util.Localizer;
> +import
> org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager;
> +
> +/**
> + * Abstract {@link DataCache} implementation that provides various
> + * statistics, logging, and timeout functionality common across cache
> + * implementations.
> + *
> + * @author Patrick Linskey
> + * @author Abe White
> + */
> +public abstract class AbstractDataCache
> + extends AbstractConcurrentEventManager
> + implements DataCache, Configurable {
> +
> + private static final BitSet EMPTY_BITSET = new BitSet(0);
> +
> + private static final Localizer s_loc =
> + Localizer.forPackage(AbstractDataCache.class);
> +
> + /**
> + * The configuration set by the system.
> + */
> + protected OpenJPAConfiguration conf;
> +
> + /**
> + * The log to use.
> + */
> + protected Log log;
> +
> + private String _name = null;
> + private boolean _closed = false;
> + private String _schedule = null;
> +
> + public String getName() {
> + return _name;
> + }
> +
> + public void setName(String name) {
> + _name = name;
> + }
> +
> + public String getEvictionSchedule() {
> + return _schedule;
> + }
> +
> + public void setEvictionSchedule(String s) {
> + _schedule = s;
> + }
> +
> + public void initialize(DataCacheManager manager) {
> + if (_schedule != null && !"".equals(_schedule)) {
> + DataCacheScheduler scheduler = manager.getDataCacheScheduler
> ();
> + if (scheduler != null)
> + scheduler.scheduleEviction(this, _schedule);
> + }
> + }
> +
> + public void commit(Collection additions, Collection newUpdates,
> + Collection existingUpdates, Collection deletes) {
> + // remove all objects in deletes list
> + removeAllInternal(deletes);
> +
> + // next, add all the new additions
> + putAllInternal(additions);
> + putAllInternal(newUpdates);
> +
> + // possibly add the existing updates, depending on the
> + // semantics of the cache, as dictated by recacheUpdates()
> + if (recacheUpdates())
> + putAllInternal(existingUpdates);
> +
> + if (log.isTraceEnabled()) {
> + Collection addIds = new ArrayList(additions.size());
> + Collection upIds = new ArrayList(newUpdates.size());
> + Collection exIds = new ArrayList(existingUpdates.size());
> +
> + for (Iterator iter = additions.iterator(); iter.hasNext();)
> + addIds.add(((DataCachePCData) iter.next()).getId());
> + for (Iterator iter = newUpdates.iterator(); iter.hasNext();)
> + upIds.add(((DataCachePCData) iter.next()).getId());
> + for (Iterator iter = existingUpdates.iterator(); iter.hasNext
> ();)
> + exIds.add(((DataCachePCData) iter.next()).getId());
> +
> + log.trace(s_loc.get("cache-commit",
> + new Object[]{ addIds, upIds, exIds, deletes }));
> + }
> + }
> +
> + public boolean contains(Object key) {
> + DataCachePCData o = getInternal(key);
> + if (o != null && o.isTimedOut()) {
> + o = null;
> + removeInternal(key);
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-timeout", key));
> + }
> + return o != null;
> + }
> +
> + public BitSet containsAll(Collection keys) {
> + if (keys.isEmpty())
> + return EMPTY_BITSET;
> +
> + BitSet set = new BitSet(keys.size());
> + int i = 0;
> + for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> + if (contains(iter.next()))
> + set.set(i);
> + return set;
> + }
> +
> + public DataCachePCData get(Object key) {
> + DataCachePCData o = getInternal(key);
> + if (o != null && o.isTimedOut()) {
> + o = null;
> + removeInternal(key);
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-timeout", key));
> + }
> +
> + if (log.isTraceEnabled()) {
> + if (o == null)
> + log.trace(s_loc.get("cache-miss", key));
> + else
> + log.trace(s_loc.get("cache-hit", key));
> + }
> +
> + return o;
> + }
> +
> + public DataCachePCData put(DataCachePCData data) {
> + DataCachePCData o = putInternal(data.getId(), data);
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-put", data.getId()));
> + return (o == null || o.isTimedOut()) ? null : o;
> + }
> +
> + public void update(DataCachePCData data) {
> + if (recacheUpdates())
> + putInternal(data.getId(), data);
> + }
> +
> + public DataCachePCData remove(Object key) {
> + DataCachePCData o = removeInternal(key);
> + if (o != null && o.isTimedOut())
> + o = null;
> + if (log.isTraceEnabled()) {
> + if (o == null)
> + log.trace(s_loc.get("cache-remove-miss", key));
> + else
> + log.trace(s_loc.get("cache-remove-hit", key));
> + }
> + return o;
> + }
> +
> + public BitSet removeAll(Collection keys) {
> + if (keys.isEmpty())
> + return EMPTY_BITSET;
> +
> + BitSet set = new BitSet(keys.size());
> + int i = 0;
> + for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> + if (remove(iter.next()) != null)
> + set.set(i);
> + return set;
> + }
> +
> + /**
> + * Remove the objects of the given class from the cache.
> + */
> + public void removeAll(Class cls, boolean subClasses) {
> + removeAllInternal(cls, subClasses);
> + }
> +
> + public boolean pin(Object key) {
> + boolean bool = pinInternal(key);
> + if (log.isTraceEnabled()) {
> + if (bool)
> + log.trace(s_loc.get("cache-pin-hit", key));
> + else
> + log.trace(s_loc.get("cache-pin-miss", key));
> + }
> + return bool;
> + }
> +
> + public BitSet pinAll(Collection keys) {
> + if (keys.isEmpty())
> + return EMPTY_BITSET;
> +
> + BitSet set = new BitSet(keys.size());
> + int i = 0;
> + for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> + if (pin(iter.next()))
> + set.set(i);
> + return set;
> + }
> +
> + public void pinAll(Class cls, boolean subs) {
> + if (log.isWarnEnabled())
> + log.warn(s_loc.get("cache-class-pin", getName()));
> + }
> +
> + public boolean unpin(Object key) {
> + boolean bool = unpinInternal(key);
> + if (log.isTraceEnabled()) {
> + if (bool)
> + log.trace(s_loc.get("cache-unpin-hit", key));
> + else
> + log.trace(s_loc.get("cache-unpin-miss", key));
> + }
> + return bool;
> + }
> +
> + public BitSet unpinAll(Collection keys) {
> + if (keys.isEmpty())
> + return EMPTY_BITSET;
> +
> + BitSet set = new BitSet(keys.size());
> + int i = 0;
> + for (Iterator iter = keys.iterator(); iter.hasNext(); i++)
> + if (unpin(iter.next()))
> + set.set(i);
> + return set;
> + }
> +
> + public void unpinAll(Class cls, boolean subs) {
> + if (log.isWarnEnabled())
> + log.warn(s_loc.get("cache-class-unpin", getName()));
> + }
> +
> + public void clear() {
> + clearInternal();
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-clear", getName()));
> + }
> +
> + public void close() {
> + close(true);
> + }
> +
> + protected void close(boolean clear) {
> + if (!_closed) {
> + if (clear)
> + clearInternal();
> + _closed = true;
> + }
> + }
> +
> + public boolean isClosed() {
> + return _closed;
> + }
> +
> + public void addExpirationListener(ExpirationListener listen) {
> + addListener(listen);
> + }
> +
> + public boolean removeExpirationListener(ExpirationListener listen) {
> + return removeListener(listen);
> + }
> +
> + public String toString() {
> + return "[" + super.toString() + ":" + _name + "]";
> + }
> +
> + /**
> + * This method is part of the {@link RemoteCommitListener} interface.
> If
> + * your cache subclass relies on OpenJPA for clustering support, make
> it
> + * implement <code>RemoteCommitListener</code>. This method will take
> + * care of invalidating entries from remote commits.
> + */
> + public void afterCommit(RemoteCommitEvent event) {
> + if (_closed)
> + return;
> +
> + if (event.getPayloadType() == RemoteCommitEvent.PAYLOAD_EXTENTS)
> {
> + removeAllTypeNamesInternal(event.getUpdatedTypeNames());
> + removeAllTypeNamesInternal(event.getDeletedTypeNames());
> + } else {
> + // drop all the committed OIDs, excepting brand
> + // new OIDs. brand new OIDs either won't be in
> + // the cache, or if they are, will be more up to date
> + removeAllInternal(event.getUpdatedObjectIds());
> + removeAllInternal(event.getDeletedObjectIds());
> + }
> + }
> +
> + /**
> + * Invoke when a key is removed from this cache. Propagates the
> + * expiration event on to all expiration listeners registered
> + * with this class.
> + */
> + protected void keyRemoved(Object key, boolean expired) {
> + // Notify any expiration listeners of the expiration.
> + if (hasListeners())
> + fireEvent(new ExpirationEvent(this, key, expired));
> +
> + if (expired && log.isTraceEnabled())
> + log.trace(s_loc.get("cache-expired", key));
> + }
> +
> + /**
> + * Return <code>true</code> if updates to data already in the
> + * cache (either in {@link #commit} or the {@link #update})
> + * should be put back into the cache. Returns false by default.
> + */
> + protected boolean recacheUpdates() {
> + return false;
> + }
> +
> + /**
> + * Return the object for the given oid.
> + */
> + protected abstract DataCachePCData getInternal(Object oid);
> +
> + /**
> + * Add the given object to the cache, returning the old object under
> the
> + * given oid.
> + */
> + protected abstract DataCachePCData putInternal(Object oid,
> + DataCachePCData pc);
> +
> + /**
> + * All all of the given objects to the cache.
> + */
> + protected void putAllInternal(Collection pcs) {
> + DataCachePCData pc;
> + for (Iterator iter = pcs.iterator(); iter.hasNext();) {
> + pc = (DataCachePCData) iter.next();
> + putInternal(pc.getId(), pc);
> + }
> + }
> +
> + /**
> + * Remove the object under the given oid from the cache.
> + */
> + protected abstract DataCachePCData removeInternal(Object oid);
> +
> + /**
> + * Evict objects in cache by class.
> + */
> + protected abstract void removeAllInternal(Class cls, boolean
> subclasses);
> +
> + /**
> + * Remove all objects under the given oids from the cache.
> + */
> + protected void removeAllInternal(Collection oids) {
> + for (Iterator iter = oids.iterator(); iter.hasNext();)
> + removeInternal(iter.next());
> + }
> +
> + /**
> + * Remove all objects of the given class names from the cache.
> + */
> + protected void removeAllTypeNamesInternal(Collection classNames) {
> + Collection classes = Caches.addTypesByName(conf, classNames,
> null);
> + if (classes == null)
> + return;
> +
> + Class cls;
> + for (Iterator iter = classes.iterator(); iter.hasNext();) {
> + cls = (Class) iter.next();
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-removeclass", cls.getName()));
> + removeAllInternal(cls, false);
> + }
> + }
> +
> + /**
> + * Clear the cache.
> + */
> + protected abstract void clearInternal();
> +
> + /**
> + * Pin an object to the cache.
> + */
> + protected abstract boolean pinInternal(Object oid);
> +
> + /**
> + * Unpin an object from the cache.
> + */
> + protected abstract boolean unpinInternal(Object oid);
> +
> + // ---------- Configurable implementation ----------
> +
> + public void setConfiguration(Configuration conf) {
> + this.conf = (OpenJPAConfiguration) conf;
> + this.log = conf.getLog(OpenJPAConfiguration.LOG_DATACACHE);
> + }
> +
> + public void startConfiguration() {
> + }
> +
> + public void endConfiguration() {
> + if (_name == null)
> + setName(NAME_DEFAULT);
> + }
> +
> + // ---------- AbstractEventManager implementation ----------
> +
> + protected void fireEvent(Object event, Object listener) {
> + ExpirationListener listen = (ExpirationListener) listener;
> + ExpirationEvent ev = (ExpirationEvent) event;
> + try {
> + listen.onExpire(ev);
> + } catch (Exception e) {
> + if (log.isWarnEnabled())
> + log.warn(s_loc.get("exp-listener-ex"), e);
> + }
> + }
> +
> + /**
> + * Returns the objects for the given key List.
> + */
> + public Map getAll(List keys) {
> + Map resultMap = new HashMap(keys.size());
> + for(int i=0; i<keys.size(); i++)
> + resultMap.put(keys.get(i), get(keys.get(i)));
> + return resultMap;
> + }
> +}
>
> Modified:
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java
> URL:
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java?rev=640685&r1=640684&r2=640685&view=diff
>
> ==============================================================================
> ---
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java
> (original)
> +++
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/AbstractQueryCache.java
> Mon Mar 24 20:37:56 2008
> @@ -1,322 +1,322 @@
> -/*
> - * 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.openjpa.datacache;
> -
> -import java.util.ArrayList;
> -import java.util.Collection;
> -import java.util.HashSet;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Set;
> -
> -import org.apache.openjpa.conf.OpenJPAConfiguration;
> -import org.apache.openjpa.event.RemoteCommitEvent;
> -import org.apache.openjpa.event.RemoteCommitListener;
> -import org.apache.openjpa.lib.conf.Configurable;
> -import org.apache.openjpa.lib.conf.Configuration;
> -import org.apache.openjpa.lib.log.Log;
> -import org.apache.openjpa.lib.util.Localizer;
> -import
> org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager;
> -import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashSet;
> -import org.apache.openjpa.meta.ClassMetaData;
> -import org.apache.openjpa.meta.MetaDataRepository;
> -import org.apache.openjpa.util.Id;
> -
> -/**
> - * Abstract {@link QueryCache} implementation that provides various
> - * statistics, logging, and timeout functionality common across cache
> - * implementations.
> - *
> - * @author Patrick Linskey
> - * @author Abe White
> - */
> -public abstract class AbstractQueryCache
> - extends AbstractConcurrentEventManager
> - implements QueryCache, Configurable {
> -
> - private static final Localizer s_loc =
> - Localizer.forPackage(AbstractQueryCache.class);
> -
> - /**
> - * The configuration set by the system.
> - */
> - protected OpenJPAConfiguration conf;
> -
> - /**
> - * The log to use.
> - */
> - protected Log log;
> -
> - private boolean _closed = false;
> -
> - public void initialize(DataCacheManager manager) {
> - }
> -
> - public void onTypesChanged(TypesChangedEvent ev) {
> - writeLock();
> - Collection keys = null;
> - try {
> - if (hasListeners())
> - fireEvent(ev);
> - keys = keySet();
> - } finally {
> - writeUnlock();
> - }
> -
> - QueryKey qk;
> - List removes = null;
> - for (Iterator iter = keys.iterator(); iter.hasNext();) {
> - qk = (QueryKey) iter.next();
> - if (qk.changeInvalidatesQuery(ev.getTypes())) {
> - if (removes == null)
> - removes = new ArrayList();
> - removes.add(qk);
> - }
> - }
> - if (removes != null)
> - removeAllInternal(removes);
> - }
> -
> - public QueryResult get(QueryKey key) {
> - QueryResult o = getInternal(key);
> - if (o != null && o.isTimedOut()) {
> - o = null;
> - removeInternal(key);
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-timeout", key));
> - }
> -
> - if (log.isTraceEnabled()) {
> - if (o == null)
> - log.trace(s_loc.get("cache-miss", key));
> - else
> - log.trace(s_loc.get("cache-hit", key));
> - }
> - return o;
> - }
> -
> - public QueryResult put(QueryKey qk, QueryResult oids) {
> - QueryResult o = putInternal(qk, oids);
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-put", qk));
> - return (o == null || o.isTimedOut()) ? null : o;
> - }
> -
> - public QueryResult remove(QueryKey key) {
> - QueryResult o = removeInternal(key);
> - if (o != null && o.isTimedOut())
> - o = null;
> - if (log.isTraceEnabled()) {
> - if (o == null)
> - log.trace(s_loc.get("cache-remove-miss", key));
> - else
> - log.trace(s_loc.get("cache-remove-hit", key));
> - }
> - return o;
> - }
> -
> - public boolean pin(QueryKey key) {
> - boolean bool = pinInternal(key);
> - if (log.isTraceEnabled()) {
> - if (bool)
> - log.trace(s_loc.get("cache-pin-hit", key));
> - else
> - log.trace(s_loc.get("cache-pin-miss", key));
> - }
> - return bool;
> - }
> -
> - public boolean unpin(QueryKey key) {
> - boolean bool = unpinInternal(key);
> - if (log.isTraceEnabled()) {
> - if (bool)
> - log.trace(s_loc.get("cache-unpin-hit", key));
> - else
> - log.trace(s_loc.get("cache-unpin-miss", key));
> - }
> - return bool;
> - }
> -
> - public void clear() {
> - clearInternal();
> - if (log.isTraceEnabled())
> - log.trace(s_loc.get("cache-clear", "<query-cache>"));
> - }
> -
> - public void close() {
> - close(true);
> - }
> -
> - protected void close(boolean clear) {
> - if (!_closed) {
> - if (clear)
> - clearInternal();
> - _closed = true;
> - }
> - }
> -
> - public boolean isClosed() {
> - return _closed;
> - }
> -
> - public void addTypesChangedListener(TypesChangedListener listen) {
> - addListener(listen);
> - }
> -
> - public boolean removeTypesChangedListener(TypesChangedListener
> listen) {
> - return removeListener(listen);
> - }
> -
> - /**
> - * This method is part of the {@link RemoteCommitListener} interface.
> If
> - * your cache subclass relies on OpenJPA for clustering support, make
> it
> - * implement <code>RemoteCommitListener</code>. This method will take
> - * care of invalidating entries from remote commits, by delegating to
> - * {@link #onTypesChanged}.
> - */
> - public void afterCommit(RemoteCommitEvent event) {
> - if (_closed)
> - return;
> -
> - // drop all committed classes
> - Set classes = Caches.addTypesByName(conf,
> - event.getPersistedTypeNames(), null);
> - if (event.getPayloadType() == RemoteCommitEvent.PAYLOAD_EXTENTS)
> {
> - classes = Caches.addTypesByName(conf,
> event.getUpdatedTypeNames(),
> - classes);
> - classes = Caches.addTypesByName(conf,
> event.getDeletedTypeNames(),
> - classes);
> - } else {
> - classes = addTypes(event.getUpdatedObjectIds(), classes);
> - classes = addTypes(event.getDeletedObjectIds(), classes);
> - }
> - if (classes != null)
> - onTypesChanged(new TypesChangedEvent(this, classes));
> - }
> -
> - /**
> - * Build up a set of classes for the given oids.
> - */
> - private Set addTypes(Collection oids, Set classes) {
> - if (oids.isEmpty())
> - return classes;
> - if (classes == null)
> - classes = new HashSet();
> -
> - MetaDataRepository repos = conf.getMetaDataRepositoryInstance();
> - ClassMetaData meta;
> - Object oid;
> - for (Iterator itr = oids.iterator(); itr.hasNext();) {
> - oid = itr.next();
> - if (oid instanceof Id)
> - classes.add(((Id) oid).getType());
> - else {
> - // ok if no metadata for oid; that just means the pc type
> - // probably hasn't been loaded into this JVM yet, and
> therefore
> - // there's no chance that it's in the cache anyway
> - meta = repos.getMetaData(oid, null, false);
> - if (meta != null)
> - classes.add(meta.getDescribedType());
> - }
> - }
> - return classes;
> - }
> -
> - /**
> - * Return a threadsafe view of the keys in this cache. This
> collection
> - * must be iterable without risk of concurrent modification
> exceptions.
> - * It does not have to implement contains() efficiently or use set
> - * semantics.
> - */
> - protected abstract Collection keySet();
> -
> - /**
> - * Return the list for the given key.
> - */
> - protected abstract QueryResult getInternal(QueryKey qk);
> -
> - /**
> - * Add the given result to the cache, returning the old result under
> the
> - * given key.
> - */
> - protected abstract QueryResult putInternal(QueryKey qk, QueryResult
> oids);
> -
> - /**
> - * Remove the result under the given key from the cache.
> - */
> - protected abstract QueryResult removeInternal(QueryKey qk);
> -
> - /**
> - * Remove all results under the given keys from the cache.
> - */
> - protected void removeAllInternal(Collection qks) {
> - for (Iterator iter = qks.iterator(); iter.hasNext();)
> - removeInternal((QueryKey) iter.next());
> - }
> -
> - /**
> - * Clear the cache.
> - */
> - protected abstract void clearInternal();
> -
> - /**
> - * Pin an object to the cache.
> - */
> - protected abstract boolean pinInternal(QueryKey qk);
> -
> - /**
> - * Unpin an object from the cache.
> - */
> - protected abstract boolean unpinInternal(QueryKey qk);
> -
> - // ---------- Configurable implementation ----------
> -
> - public void setConfiguration(Configuration conf) {
> - this.conf = (OpenJPAConfiguration) conf;
> - this.log = conf.getLog(OpenJPAConfiguration.LOG_DATACACHE);
> - }
> -
> - public void startConfiguration() {
> - }
> -
> - public void endConfiguration() {
> - }
> -
> - // ---------- AbstractEventManager implementation ----------
> -
> - protected void fireEvent(Object event, Object listener) {
> - TypesChangedListener listen = (TypesChangedListener) listener;
> - TypesChangedEvent ev = (TypesChangedEvent) event;
> - try {
> - listen.onTypesChanged(ev);
> - } catch (Exception e) {
> - if (log.isWarnEnabled())
> - log.warn(s_loc.get("exp-listener-ex"), e);
> - }
> - }
> -
> - /**
> - * Individual query results will be registered as types changed
> - * listeners. We want such query results to be gc'd once
> - * the only reference is held by the list of expiration listeners.
> - */
> - protected Collection newListenerCollection() {
> - return new ConcurrentReferenceHashSet (
> ConcurrentReferenceHashSet.WEAK);
> - }
> -}
> +/*
> + * 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.openjpa.datacache;
> +
> +import java.util.ArrayList;
> +import java.util.Collection;
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.List;
> +import java.util.Set;
> +
> +import org.apache.openjpa.conf.OpenJPAConfiguration;
> +import org.apache.openjpa.event.RemoteCommitEvent;
> +import org.apache.openjpa.event.RemoteCommitListener;
> +import org.apache.openjpa.lib.conf.Configurable;
> +import org.apache.openjpa.lib.conf.Configuration;
> +import org.apache.openjpa.lib.log.Log;
> +import org.apache.openjpa.lib.util.Localizer;
> +import
> org.apache.openjpa.lib.util.concurrent.AbstractConcurrentEventManager;
> +import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashSet;
> +import org.apache.openjpa.meta.ClassMetaData;
> +import org.apache.openjpa.meta.MetaDataRepository;
> +import org.apache.openjpa.util.Id;
> +
> +/**
> + * Abstract {@link QueryCache} implementation that provides various
> + * statistics, logging, and timeout functionality common across cache
> + * implementations.
> + *
> + * @author Patrick Linskey
> + * @author Abe White
> + */
> +public abstract class AbstractQueryCache
> + extends AbstractConcurrentEventManager
> + implements QueryCache, Configurable {
> +
> + private static final Localizer s_loc =
> + Localizer.forPackage(AbstractQueryCache.class);
> +
> + /**
> + * The configuration set by the system.
> + */
> + protected OpenJPAConfiguration conf;
> +
> + /**
> + * The log to use.
> + */
> + protected Log log;
> +
> + private boolean _closed = false;
> +
> + public void initialize(DataCacheManager manager) {
> + }
> +
> + public void onTypesChanged(TypesChangedEvent ev) {
> + writeLock();
> + Collection keys = null;
> + try {
> + if (hasListeners())
> + fireEvent(ev);
> + keys = keySet();
> + } finally {
> + writeUnlock();
> + }
> +
> + QueryKey qk;
> + List removes = null;
> + for (Iterator iter = keys.iterator(); iter.hasNext();) {
> + qk = (QueryKey) iter.next();
> + if (qk.changeInvalidatesQuery(ev.getTypes())) {
> + if (removes == null)
> + removes = new ArrayList();
> + removes.add(qk);
> + }
> + }
> + if (removes != null)
> + removeAllInternal(removes);
> + }
> +
> + public QueryResult get(QueryKey key) {
> + QueryResult o = getInternal(key);
> + if (o != null && o.isTimedOut()) {
> + o = null;
> + removeInternal(key);
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-timeout", key));
> + }
> +
> + if (log.isTraceEnabled()) {
> + if (o == null)
> + log.trace(s_loc.get("cache-miss", key));
> + else
> + log.trace(s_loc.get("cache-hit", key));
> + }
> + return o;
> + }
> +
> + public QueryResult put(QueryKey qk, QueryResult oids) {
> + QueryResult o = putInternal(qk, oids);
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-put", qk));
> + return (o == null || o.isTimedOut()) ? null : o;
> + }
> +
> + public QueryResult remove(QueryKey key) {
> + QueryResult o = removeInternal(key);
> + if (o != null && o.isTimedOut())
> + o = null;
> + if (log.isTraceEnabled()) {
> + if (o == null)
> + log.trace(s_loc.get("cache-remove-miss", key));
> + else
> + log.trace(s_loc.get("cache-remove-hit", key));
> + }
> + return o;
> + }
> +
> + public boolean pin(QueryKey key) {
> + boolean bool = pinInternal(key);
> + if (log.isTraceEnabled()) {
> + if (bool)
> + log.trace(s_loc.get("cache-pin-hit", key));
> + else
> + log.trace(s_loc.get("cache-pin-miss", key));
> + }
> + return bool;
> + }
> +
> + public boolean unpin(QueryKey key) {
> + boolean bool = unpinInternal(key);
> + if (log.isTraceEnabled()) {
> + if (bool)
> + log.trace(s_loc.get("cache-unpin-hit", key));
> + else
> + log.trace(s_loc.get("cache-unpin-miss", key));
> + }
> + return bool;
> + }
> +
> + public void clear() {
> + clearInternal();
> + if (log.isTraceEnabled())
> + log.trace(s_loc.get("cache-clear", "<query-cache>"));
> + }
> +
> + public void close() {
> + close(true);
> + }
> +
> + protected void close(boolean clear) {
> + if (!_closed) {
> + if (clear)
> + clearInternal();
> + _closed = true;
> + }
> + }
> +
> + public boolean isClosed() {
> + return _closed;
> + }
> +
> + public void addTypesChangedListener(TypesChangedListener listen) {
> + addListener(listen);
> + }
> +
> + public boolean removeTypesChangedListener(TypesChangedListener
> listen) {
> + return removeListener(listen);
> + }
> +
> + /**
> + * This method is part of the {@link RemoteCommitListener} interface.
> If
> + * your cache subclass relies on OpenJPA for clustering support, make
> it
> + * implement <code>RemoteCommitListener</code>. This method will take
> + * care of invalidating entries from remote commits, by delegating to
> + * {@link #onTypesChanged}.
> + */
> + public void afterCommit(RemoteCommitEvent event) {
> + if (_closed)
> + return;
> +
> + // drop all committed classes
> + Set classes = Caches.addTypesByName(conf,
> + event.getPersistedTypeNames(), null);
> + if (event.getPayloadType() == RemoteCommitEvent.PAYLOAD_EXTENTS)
> {
> + classes = Caches.addTypesByName(conf,
> event.getUpdatedTypeNames(),
> + classes);
> + classes = Caches.addTypesByName(conf,
> event.getDeletedTypeNames(),
> + classes);
> + } else {
> + classes = addTypes(event.getUpdatedObjectIds(), classes);
> + classes = addTypes(event.getDeletedObjectIds(), classes);
> + }
> + if (classes != null)
> + onTypesChanged(new TypesChangedEvent(this, classes));
> + }
> +
> + /**
> + * Build up a set of classes for the given oids.
> + */
> + private Set addTypes(Collection oids, Set classes) {
> + if (oids.isEmpty())
> + return classes;
> + if (classes == null)
> + classes = new HashSet();
> +
> + MetaDataRepository repos = conf.getMetaDataRepositoryInstance();
> + ClassMetaData meta;
> + Object oid;
> + for (Iterator itr = oids.iterator(); itr.hasNext();) {
> + oid = itr.next();
> + if (oid instanceof Id)
> + classes.add(((Id) oid).getType());
> + else {
> + // ok if no metadata for oid; that just means the pc type
> + // probably hasn't been loaded into this JVM yet, and
> therefore
> + // there's no chance that it's in the cache anyway
> + meta = repos.getMetaData(oid, null, false);
> + if (meta != null)
> + classes.add(meta.getDescribedType());
> + }
> + }
> + return classes;
> + }
> +
> + /**
> + * Return a threadsafe view of the keys in this cache. This
> collection
> + * must be iterable without risk of concurrent modification
> exceptions.
> + * It does not have to implement contains() efficiently or use set
> + * semantics.
> + */
> + protected abstract Collection keySet();
> +
> + /**
> + * Return the list for the given key.
> + */
> + protected abstract QueryResult getInternal(QueryKey qk);
> +
> + /**
> + * Add the given result to the cache, returning the old result under
> the
> + * given key.
> + */
> + protected abstract QueryResult putInternal(QueryKey qk, QueryResult
> oids);
> +
> + /**
> + * Remove the result under the given key from the cache.
> + */
> + protected abstract QueryResult removeInternal(QueryKey qk);
> +
> + /**
> + * Remove all results under the given keys from the cache.
> + */
> + protected void removeAllInternal(Collection qks) {
> + for (Iterator iter = qks.iterator(); iter.hasNext();)
> + removeInternal((QueryKey) iter.next());
> + }
> +
> + /**
> + * Clear the cache.
> + */
> + protected abstract void clearInternal();
> +
> + /**
> + * Pin an object to the cache.
> + */
> + protected abstract boolean pinInternal(QueryKey qk);
> +
> + /**
> + * Unpin an object from the cache.
> + */
> + protected abstract boolean unpinInternal(QueryKey qk);
> +
> + // ---------- Configurable implementation ----------
> +
> + public void setConfiguration(Configuration conf) {
> + this.conf = (OpenJPAConfiguration) conf;
> + this.log = conf.getLog(OpenJPAConfiguration.LOG_DATACACHE);
> + }
> +
> + public void startConfiguration() {
> + }
> +
> + public void endConfiguration() {
> + }
> +
> + // ---------- AbstractEventManager implementation ----------
> +
> + protected void fireEvent(Object event, Object listener) {
> + TypesChangedListener listen = (TypesChangedListener) listener;
> + TypesChangedEvent ev = (TypesChangedEvent) event;
> + try {
> + listen.onTypesChanged(ev);
> + } catch (Exception e) {
> + if (log.isWarnEnabled())
> + log.warn(s_loc.get("exp-listener-ex"), e);
> + }
> + }
> +
> + /**
> + * Individual query results will be registered as types changed
> + * listeners. We want such query results to be gc'd once
> + * the only reference is held by the list of expiration listeners.
> + */
> + protected Collection newListenerCollection() {
> + return new ConcurrentReferenceHashSet (
> ConcurrentReferenceHashSet.WEAK);
> + }
> +}
>
>
>