JBoss Cache SVN: r6110 - in pojo/tags: 2.2.0.CR5 and 1 other directory.
by jbosscache-commits@lists.jboss.org
Author: jason.greene(a)jboss.com
Date: 2008-06-27 18:06:51 -0400 (Fri, 27 Jun 2008)
New Revision: 6110
Added:
pojo/tags/2.2.0.CR5/
Removed:
pojo/tags/2.2.0.CR1/
Modified:
pojo/tags/2.2.0.CR5/pom.xml
Log:
unify versions to avoid confusion
Copied: pojo/tags/2.2.0.CR5 (from rev 6109, pojo/tags/2.2.0.CR1)
Modified: pojo/tags/2.2.0.CR5/pom.xml
===================================================================
--- pojo/tags/2.2.0.CR1/pom.xml 2008-06-27 22:03:17 UTC (rev 6109)
+++ pojo/tags/2.2.0.CR5/pom.xml 2008-06-27 22:06:51 UTC (rev 6110)
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
- <jbosscache-pojo-version>2.2.0.CR1</jbosscache-pojo-version>
+ <jbosscache-pojo-version>2.2.0.CR5</jbosscache-pojo-version>
<jbosscache-core-version>2.2.0.CR5</jbosscache-core-version>
<jboss.aop.version>2.0.0.CR14</jboss.aop.version>
</properties>
16 years, 6 months
JBoss Cache SVN: r6109 - in pojo/tags: 2.2.0.CR1 and 9 other directories.
by jbosscache-commits@lists.jboss.org
Author: jason.greene(a)jboss.com
Date: 2008-06-27 18:03:17 -0400 (Fri, 27 Jun 2008)
New Revision: 6109
Added:
pojo/tags/2.2.0.CR1/
pojo/tags/2.2.0.CR1/pom.xml
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java
pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java
Removed:
pojo/tags/2.2.0.CR1/pom.xml
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Attach.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/CheckIdValidity.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Detach.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Find.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Reentrant.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Tx.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/TxUndo.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/CheckIdInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/CheckNonSerializableInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/MethodReentrancyStopperInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoBeginInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoEventInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoFailedTxMockupInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxLockInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoSynchronizationInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/StaticFieldInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java
pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java
pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java
pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java
Log:
Tag 2.2.0.CR1
Copied: pojo/tags/2.2.0.CR1 (from rev 6047, pojo/trunk)
Deleted: pojo/tags/2.2.0.CR1/pom.xml
===================================================================
--- pojo/trunk/pom.xml 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/pom.xml 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,337 +0,0 @@
-<?xml version="1.0"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <properties>
- <jbosscache-pojo-version>2.2.0-SNAPSHOT</jbosscache-pojo-version>
- <jbosscache-core-version>2.2.0.CR4</jbosscache-core-version>
- <jboss.aop.version>2.0.0-SNAPSHOT</jboss.aop.version>
- </properties>
- <parent>
- <groupId>org.jboss.cache</groupId>
- <artifactId>jbosscache-common-parent</artifactId>
- <version>1.1</version>
- </parent>
- <groupId>org.jboss.cache</groupId>
- <artifactId>jbosscache-pojo</artifactId>
- <version>${jbosscache-pojo-version}</version>
- <name>JBoss Cache - POJO Edition</name>
- <description>JBoss Cache - POJO Edition</description>
- <packaging>jar</packaging>
- <dependencies>
- <dependency>
- <groupId>org.jboss.aop</groupId>
- <artifactId>jboss-aop</artifactId>
- <version>${jboss.aop.version}</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.cache</groupId>
- <artifactId>jbosscache-core</artifactId>
- <version>${jbosscache-core-version}</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.cache</groupId>
- <artifactId>jbosscache-core</artifactId>
- <version>${jbosscache-core-version}</version>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.0.4</version>
- </dependency>
- <dependency>
- <groupId>net.jcip</groupId>
- <artifactId>jcip-annotations</artifactId>
- <version>1.0</version>
- <optional>true</optional>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>javadoc</goal>
- </goals>
- <configuration>
- <aggregate>${jbosscache.reports.aggregate}</aggregate>
- <links>
- <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
- <link>http://java.sun.com/javaee/5/docs/api/</link>
- <link>http://labs.jboss.org/file-access/default/members/jbosscache/freezone/doc...</link>
- </links>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>2.2-beta-1</version>
- <executions>
- <execution>
- <id>assemble</id>
- <phase>install</phase>
- <goals>
- <goal>attached</goal>
- </goals>
- <configuration>
- <descriptors>
- <descriptor>assembly/bin.xml</descriptor>
- <descriptor>assembly/doc.xml</descriptor>
- <descriptor>assembly/all.xml</descriptor>
- </descriptors>
- <finalName>${artifactId}-${jbosscache-pojo-version}</finalName>
- <outputDirectory>target/distribution</outputDirectory>
- <workDirectory>target/assembly/work</workDirectory>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <systemProperties>
- <property>
- <name>bind.address</name>
- <value>127.0.0.1</value>
- </property>
- <property>
- <name>java.net.preferIPv4Stack</name>
- <value>true</value>
- </property>
- <property>
- <name>jgroups.stack</name>
- <value>udp</value>
- </property>
- </systemProperties>
- <groups>functional</groups>
- <forkMode>always</forkMode>
- <argLine>-Djboss.aop.path=${basedir}/src/main/resources/META-INF/pojocache-aop.xml -javaagent:${settings.localRepository}/org/jboss/aop/jboss-aop/${jboss.aop.version}/jboss-aop-${jboss.aop.version}.jar</argLine>
- <!-- Warning, this does not work right on 2.4-SNAPSHOT, (see SUREFIRE-349) -->
- <!-- This seems to fail in some cases on 2.3 as well, disable for now -->
- <useSystemClassLoader>true</useSystemClassLoader>
- <redirectTestOutputToFile>false</redirectTestOutputToFile>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.jboss.maven.plugins</groupId>
- <artifactId>maven-jbossaop-plugin</artifactId>
- <version>1.0.0-SNAPSHOT</version>
- <!-- HACK: AOP project and plugin has broken deps -->
- <dependencies>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.0.4</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.cache</groupId>
- <artifactId>jbosscache-core</artifactId>
- <version>${jbosscache-core-version}</version>
- </dependency>
- <dependency>
- <groupId>org.jboss.aop</groupId>
- <artifactId>jboss-aop</artifactId>
- <version>${jboss.aop.version}</version>
- </dependency>
- </dependencies>
- <executions>
- <execution>
- <id>aopc</id>
- <phase>compile</phase>
- <goals>
- <goal>compile</goal>
- </goals>
- <configuration>
- <verbose>false</verbose>
- <aoppaths>
- <aoppath>${basedir}/src/main/resources/META-INF/pojocache-aop.xml</aoppath>
- </aoppaths>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <!-- the docbook generation plugin for the user guide -->
- <plugin>
- <groupId>org.jboss.maven.plugins</groupId>
- <artifactId>maven-jdocbook-plugin</artifactId>
- <version>2.0.0</version>
- <extensions>true</extensions>
- <dependencies>
- <dependency>
- <groupId>org.jboss</groupId>
- <artifactId>jbossorg-docbook-xslt</artifactId>
- <version>1.0.0</version>
- </dependency>
- <dependency>
- <groupId>org.jboss</groupId>
- <artifactId>jbossorg-jdocbook-style</artifactId>
- <version>1.0.0</version>
- <type>jdocbook-style</type>
- </dependency>
- <dependency>
- <groupId>com.uwyn</groupId>
- <artifactId>jhighlight</artifactId>
- <version>1.0</version>
- </dependency>
- <dependency>
- <groupId>de.java2html</groupId>
- <artifactId>java2html</artifactId>
- <version>5.0</version>
- </dependency>
- <dependency>
- <groupId>org.richfaces.docs</groupId>
- <artifactId>highlight</artifactId>
- <version>3.1.4.GA</version>
- </dependency>
- </dependencies>
- <executions>
-
- <!-- The User Guide-->
- <execution>
- <id>userguide_en</id>
- <phase>package</phase>
- <goals>
- <goal>resources</goal>
- <goal>generate</goal>
- </goals>
- <configuration>
- <sourceDocumentName>master.xml</sourceDocumentName>
- <sourceDirectory>${basedir}/src/main/docbook/userguide/en</sourceDirectory>
- <imageResource>
- <directory>${basedir}/src/main/docbook/images</directory>
- </imageResource>
- <cssResource>
- <directory>${basedir}/src/main/docbook/css</directory>
- </cssResource>
- <targetDirectory>${basedir}/target/docbook/userguide_en</targetDirectory>
- <formats>
- <format>
- <formatName>pdf</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/main-pdf.xsl</stylesheetResource>
- <finalName>userguide_en.pdf</finalName>
- </format>
- <format>
- <formatName>html</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/main-html.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- <format>
- <formatName>html_single</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/nochunk-html.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- </formats>
- <options>
- <xincludeSupported>false</xincludeSupported>
- </options>
- </configuration>
- </execution>
-
- <!-- The Tutorial -->
- <execution>
- <id>tutorial_en</id>
- <phase>package</phase>
- <goals>
- <goal>resources</goal>
- <goal>generate</goal>
- </goals>
- <configuration>
- <sourceDocumentName>master.xml</sourceDocumentName>
- <sourceDirectory>${basedir}/src/main/docbook/tutorial/en</sourceDirectory>
- <imageResource>
- <directory>${basedir}/src/main/docbook/images</directory>
- </imageResource>
- <cssResource>
- <directory>${basedir}/src/main/docbook/css</directory>
- </cssResource>
- <targetDirectory>${basedir}/target/docbook/tutorial_en</targetDirectory>
- <formats>
- <format>
- <formatName>pdf</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/main-pdf.xsl</stylesheetResource>
- <finalName>tutorial_en.pdf</finalName>
- </format>
- <format>
- <formatName>html</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/main-html.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- <format>
- <formatName>html_single</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/nochunk-html.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- </formats>
- <options>
- <xincludeSupported>false</xincludeSupported>
- </options>
- </configuration>
- </execution>
-
- <!-- the FAQs -->
- <execution>
- <id>faq_en</id>
- <phase>package</phase>
- <goals>
- <goal>resources</goal>
- <goal>generate</goal>
- </goals>
- <configuration>
- <sourceDocumentName>master.xml</sourceDocumentName>
- <sourceDirectory>${basedir}/src/main/docbook/faq/en</sourceDirectory>
- <imageResource>
- <directory>${basedir}/src/main/docbook/images</directory>
- </imageResource>
- <cssResource>
- <directory>${basedir}/src/main/docbook/css</directory>
- </cssResource>
- <targetDirectory>${basedir}/target/docbook/faq_en</targetDirectory>
- <formats>
- <format>
- <formatName>pdf</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/main-pdf.xsl</stylesheetResource>
- <finalName>faq_en.pdf</finalName>
- </format>
- <format>
- <formatName>html</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/main-html.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- <format>
- <formatName>html_single</formatName>
- <stylesheetResource>classpath:/xslt/org/jboss/nochunk-html.xsl</stylesheetResource>
- <finalName>index.html</finalName>
- </format>
- </formats>
- <options>
- <xincludeSupported>false</xincludeSupported>
- </options>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
- <!-- basic JBoss repository so that the common parent POM in jbosscache-support can be found -->
- <repositories>
- <repository>
- <id>snapshots.jboss.org</id>
- <url>http://snapshots.jboss.org/maven2</url>
- </repository>
- <repository>
- <id>repository.jboss.org</id>
- <url>http://repository.jboss.org/maven2</url>
- </repository>
- </repositories>
-</project>
Copied: pojo/tags/2.2.0.CR1/pom.xml (from rev 6108, pojo/trunk/pom.xml)
===================================================================
--- pojo/tags/2.2.0.CR1/pom.xml (rev 0)
+++ pojo/tags/2.2.0.CR1/pom.xml 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,299 @@
+<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <properties>
+ <jbosscache-pojo-version>2.2.0.CR1</jbosscache-pojo-version>
+ <jbosscache-core-version>2.2.0.CR5</jbosscache-core-version>
+ <jboss.aop.version>2.0.0.CR14</jboss.aop.version>
+ </properties>
+ <parent>
+ <groupId>org.jboss.cache</groupId>
+ <artifactId>jbosscache-common-parent</artifactId>
+ <version>1.1</version>
+ </parent>
+ <groupId>org.jboss.cache</groupId>
+ <artifactId>jbosscache-pojo</artifactId>
+ <version>${jbosscache-pojo-version}</version>
+ <name>JBoss Cache - POJO Edition</name>
+ <description>JBoss Cache - POJO Edition</description>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.aop</groupId>
+ <artifactId>jboss-aop</artifactId>
+ <version>${jboss.aop.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.cache</groupId>
+ <artifactId>jbosscache-core</artifactId>
+ <version>${jbosscache-core-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.cache</groupId>
+ <artifactId>jbosscache-core</artifactId>
+ <version>${jbosscache-core-version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.0.4</version>
+ </dependency>
+ <dependency>
+ <groupId>net.jcip</groupId>
+ <artifactId>jcip-annotations</artifactId>
+ <version>1.0</version>
+ <optional>true</optional>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>javadoc</goal>
+ </goals>
+ <configuration>
+ <aggregate>${jbosscache.reports.aggregate}</aggregate>
+ <links>
+ <link>http://java.sun.com/j2se/1.5.0/docs/api/</link>
+ <link>http://java.sun.com/javaee/5/docs/api/</link>
+ <link>http://labs.jboss.org/file-access/default/members/jbosscache/freezone/doc...</link>
+ </links>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.2-beta-1</version>
+ <executions>
+ <execution>
+ <id>assemble</id>
+ <phase>install</phase>
+ <goals>
+ <goal>attached</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+ <descriptor>assembly/bin.xml</descriptor>
+ <descriptor>assembly/doc.xml</descriptor>
+ <descriptor>assembly/all.xml</descriptor>
+ </descriptors>
+ <finalName>${artifactId}-${jbosscache-pojo-version}</finalName>
+ <outputDirectory>target/distribution</outputDirectory>
+ <workDirectory>target/assembly/work</workDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.3</version>
+ <configuration>
+ <systemProperties>
+ <property>
+ <name>bind.address</name>
+ <value>127.0.0.1</value>
+ </property>
+ <property>
+ <name>java.net.preferIPv4Stack</name>
+ <value>true</value>
+ </property>
+ <property>
+ <name>jgroups.stack</name>
+ <value>udp</value>
+ </property>
+ </systemProperties>
+ <groups>functional</groups>
+ <forkMode>always</forkMode>
+ <argLine>-Djboss.aop.path=${basedir}/src/main/resources/META-INF/pojocache-aop.xml -javaagent:${settings.localRepository}/org/jboss/aop/jboss-aop/${jboss.aop.version}/jboss-aop-${jboss.aop.version}.jar</argLine>
+ <!-- Warning, this does not work right on 2.4-SNAPSHOT, (see SUREFIRE-349) -->
+ <!-- This seems to fail in some cases on 2.3 as well, disable for now -->
+ <useSystemClassLoader>true</useSystemClassLoader>
+ <redirectTestOutputToFile>false</redirectTestOutputToFile>
+ </configuration>
+ </plugin>
+ <!-- the docbook generation plugin for the user guide -->
+ <plugin>
+ <groupId>org.jboss.maven.plugins</groupId>
+ <artifactId>maven-jdocbook-plugin</artifactId>
+ <version>2.0.0</version>
+ <extensions>true</extensions>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss</groupId>
+ <artifactId>jbossorg-docbook-xslt</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss</groupId>
+ <artifactId>jbossorg-jdocbook-style</artifactId>
+ <version>1.0.0</version>
+ <type>jdocbook-style</type>
+ </dependency>
+ <dependency>
+ <groupId>com.uwyn</groupId>
+ <artifactId>jhighlight</artifactId>
+ <version>1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>de.java2html</groupId>
+ <artifactId>java2html</artifactId>
+ <version>5.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.richfaces.docs</groupId>
+ <artifactId>highlight</artifactId>
+ <version>3.1.4.GA</version>
+ </dependency>
+ </dependencies>
+ <executions>
+
+ <!-- The User Guide-->
+ <execution>
+ <id>userguide_en</id>
+ <phase>package</phase>
+ <goals>
+ <goal>resources</goal>
+ <goal>generate</goal>
+ </goals>
+ <configuration>
+ <sourceDocumentName>master.xml</sourceDocumentName>
+ <sourceDirectory>${basedir}/src/main/docbook/userguide/en</sourceDirectory>
+ <imageResource>
+ <directory>${basedir}/src/main/docbook/images</directory>
+ </imageResource>
+ <cssResource>
+ <directory>${basedir}/src/main/docbook/css</directory>
+ </cssResource>
+ <targetDirectory>${basedir}/target/docbook/userguide_en</targetDirectory>
+ <formats>
+ <format>
+ <formatName>pdf</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/main-pdf.xsl</stylesheetResource>
+ <finalName>userguide_en.pdf</finalName>
+ </format>
+ <format>
+ <formatName>html</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/main-html.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ <format>
+ <formatName>html_single</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/nochunk-html.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ </formats>
+ <options>
+ <xincludeSupported>false</xincludeSupported>
+ </options>
+ </configuration>
+ </execution>
+
+ <!-- The Tutorial -->
+ <execution>
+ <id>tutorial_en</id>
+ <phase>package</phase>
+ <goals>
+ <goal>resources</goal>
+ <goal>generate</goal>
+ </goals>
+ <configuration>
+ <sourceDocumentName>master.xml</sourceDocumentName>
+ <sourceDirectory>${basedir}/src/main/docbook/tutorial/en</sourceDirectory>
+ <imageResource>
+ <directory>${basedir}/src/main/docbook/images</directory>
+ </imageResource>
+ <cssResource>
+ <directory>${basedir}/src/main/docbook/css</directory>
+ </cssResource>
+ <targetDirectory>${basedir}/target/docbook/tutorial_en</targetDirectory>
+ <formats>
+ <format>
+ <formatName>pdf</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/main-pdf.xsl</stylesheetResource>
+ <finalName>tutorial_en.pdf</finalName>
+ </format>
+ <format>
+ <formatName>html</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/main-html.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ <format>
+ <formatName>html_single</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/nochunk-html.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ </formats>
+ <options>
+ <xincludeSupported>false</xincludeSupported>
+ </options>
+ </configuration>
+ </execution>
+
+ <!-- the FAQs -->
+ <execution>
+ <id>faq_en</id>
+ <phase>package</phase>
+ <goals>
+ <goal>resources</goal>
+ <goal>generate</goal>
+ </goals>
+ <configuration>
+ <sourceDocumentName>master.xml</sourceDocumentName>
+ <sourceDirectory>${basedir}/src/main/docbook/faq/en</sourceDirectory>
+ <imageResource>
+ <directory>${basedir}/src/main/docbook/images</directory>
+ </imageResource>
+ <cssResource>
+ <directory>${basedir}/src/main/docbook/css</directory>
+ </cssResource>
+ <targetDirectory>${basedir}/target/docbook/faq_en</targetDirectory>
+ <formats>
+ <format>
+ <formatName>pdf</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/main-pdf.xsl</stylesheetResource>
+ <finalName>faq_en.pdf</finalName>
+ </format>
+ <format>
+ <formatName>html</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/main-html.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ <format>
+ <formatName>html_single</formatName>
+ <stylesheetResource>classpath:/xslt/org/jboss/nochunk-html.xsl</stylesheetResource>
+ <finalName>index.html</finalName>
+ </format>
+ </formats>
+ <options>
+ <xincludeSupported>false</xincludeSupported>
+ </options>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <!-- basic JBoss repository so that the common parent POM in jbosscache-support can be found -->
+ <repositories>
+ <repository>
+ <id>snapshots.jboss.org</id>
+ <url>http://snapshots.jboss.org/maven2</url>
+ </repository>
+ <repository>
+ <id>repository.jboss.org</id>
+ <url>http://repository.jboss.org/maven2</url>
+ </repository>
+ </repositories>
+</project>
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Attach.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/Attach.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Attach.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,25 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for PojoCache interceptor stack. This one checks for tx.
- *
- * @author Ben Wang
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
-public @interface Attach
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/CheckIdValidity.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/CheckIdValidity.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/CheckIdValidity.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,25 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for PojoCache interceptor stack. This one to check id validity.
- *
- * @author Ben Wang
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
-public @interface CheckIdValidity
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Detach.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/Detach.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Detach.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,25 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for PojoCache interceptor stack. This one checks for tx.
- *
- * @author Ben Wang
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
-public @interface Detach
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Find.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/Find.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Find.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,25 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for PojoCache interceptor stack. This one checks for tx.
- *
- * @author Ben Wang
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
-public @interface Find
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Reentrant.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/Reentrant.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Reentrant.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,26 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annoataion that wraps the Prepare annotation of JBossAop.
- *
- * @author Ben Wang
- * Date: Jan 22, 2006
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.TYPE)
-public @interface Reentrant
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Tx.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/Tx.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/Tx.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,25 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for PojoCache interceptor stack. This one checks for tx.
- *
- * @author Ben Wang
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
-public @interface Tx
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/TxUndo.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/annotation/TxUndo.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/annotation/TxUndo.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,25 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for PojoCache interceptor stack. This one annotates method to provide rollback operation.
- *
- * @author Ben Wang
- * @version $Id$
- */
-(a)Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
-public @interface TxUndo
-{
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,188 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.collection;
-
-import org.jboss.cache.pojo.annotation.Reentrant;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Abstract class for CachedList.
- *
- * @author Scott Marlow
- */
-
-@Reentrant
-abstract class CachedListAbstract implements List
-{
- public void clear()
- {
- // TODO Can use optimization here
- for (int i = size() - 1; i >= 0; i--)
- {
- remove(i);
- }
- }
-
- public boolean isEmpty()
- {
- return size() == 0;
- }
-
- public Object[] toArray()
- {
- Object[] objs = new Object[size()];
- for (int i = 0; i < size(); i++)
- {
- objs[i] = get(i);
- }
- return objs;
- }
-
- public Object[] toArray(Object a[])
- {
- int actualLength = size();
- if (actualLength > a.length) // need to allocate a larger array
- a = new Object[actualLength];
- int looper;
- for (looper = 0; looper < actualLength; looper++)
- {
- a[looper] = get(looper);
- }
- for (; looper < a.length; looper++)
- a[looper] = null; // if the array is larger than needed, set extra slots to null
- return a;
- }
-
- public boolean add(Object o)
- {
- add(size(), o);
- return true;
- }
-
- public boolean contains(Object o)
- {
- if (indexOf(o) != -1) return true;
- return false;
- }
-
- public boolean remove(Object o)
- {
- int i = indexOf(o);
- if (i == -1)
- return false;
-
- remove(i);
- return true;
- }
-
- public boolean addAll(int index, Collection c)
- {
- if (c.size() == 0)
- return false;
- // should optimize this
- for (Object o : c)
- {
- add(index++, o);
- }
- return true;
- }
-
- public boolean addAll(Collection c)
- {
- if (c.size() == 0)
- return false;
- for (Object o : c)
- {
- add(o);
- }
- return true;
- }
-
- public boolean containsAll(Collection c)
- {
- for (Object aC : c)
- {
- if (!contains(aC))
- {
- return false;
- }
- }
- return true;
- }
-
- public boolean removeAll(Collection c)
- {
- for (Object o : c)
- {
- remove(o);
- }
- return true;
- }
-
- public int hashCode()
- {
- int result = 1;
- for (int i = 0; i < size(); i++)
- {
- Object o = get(i);
- result = 31 * result + (o == null ? 0 : o.hashCode());
- }
- return result;
- }
-
- public boolean equals(Object object)
- {
- if (object == this)
- return true;
- if (object == null || !(object instanceof List))
- return false;
- List list = (List) object;
- if (size() != list.size())
- return false;
- for (int i = 0; i < list.size(); i++)
- {
- Object value1 = get(i);
- Object value2 = list.get(i);
- if ((value1 == null && value2 != null) ||
- (value1 != null && !(value1.equals(value2))))
- return false;
- }
- return true;
- }
-
- public String toString()
- {
- StringBuffer buf = new StringBuffer();
- int size = size();
- for (int i = 0; i < size; i++)
- {
- Object key = get(i);
- buf.append("[").append(key).append("]");
- if (i <= size) buf.append(", ");
- }
-
- return buf.toString();
- }
-
- public boolean retainAll(Collection c)
- {
- boolean changedAnything = false;
- Iterator iter = iterator();
- while (iter.hasNext())
- {
- if (!c.contains(iter.next()))
- {
- iter.remove();
- changedAnything = true;
- }
- }
- return changedAnything;
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListAbstract.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,184 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.collection;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Abstract class for CachedList.
+ *
+ * @author Scott Marlow
+ */
+abstract class CachedListAbstract implements List
+{
+ public void clear()
+ {
+ // TODO Can use optimization here
+ for (int i = size() - 1; i >= 0; i--)
+ {
+ remove(i);
+ }
+ }
+
+ public boolean isEmpty()
+ {
+ return size() == 0;
+ }
+
+ public Object[] toArray()
+ {
+ Object[] objs = new Object[size()];
+ for (int i = 0; i < size(); i++)
+ {
+ objs[i] = get(i);
+ }
+ return objs;
+ }
+
+ public Object[] toArray(Object a[])
+ {
+ int actualLength = size();
+ if (actualLength > a.length) // need to allocate a larger array
+ a = new Object[actualLength];
+ int looper;
+ for (looper = 0; looper < actualLength; looper++)
+ {
+ a[looper] = get(looper);
+ }
+ for (; looper < a.length; looper++)
+ a[looper] = null; // if the array is larger than needed, set extra slots to null
+ return a;
+ }
+
+ public boolean add(Object o)
+ {
+ add(size(), o);
+ return true;
+ }
+
+ public boolean contains(Object o)
+ {
+ if (indexOf(o) != -1) return true;
+ return false;
+ }
+
+ public boolean remove(Object o)
+ {
+ int i = indexOf(o);
+ if (i == -1)
+ return false;
+
+ remove(i);
+ return true;
+ }
+
+ public boolean addAll(int index, Collection c)
+ {
+ if (c.size() == 0)
+ return false;
+ // should optimize this
+ for (Object o : c)
+ {
+ add(index++, o);
+ }
+ return true;
+ }
+
+ public boolean addAll(Collection c)
+ {
+ if (c.size() == 0)
+ return false;
+ for (Object o : c)
+ {
+ add(o);
+ }
+ return true;
+ }
+
+ public boolean containsAll(Collection c)
+ {
+ for (Object aC : c)
+ {
+ if (!contains(aC))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean removeAll(Collection c)
+ {
+ for (Object o : c)
+ {
+ remove(o);
+ }
+ return true;
+ }
+
+ public int hashCode()
+ {
+ int result = 1;
+ for (int i = 0; i < size(); i++)
+ {
+ Object o = get(i);
+ result = 31 * result + (o == null ? 0 : o.hashCode());
+ }
+ return result;
+ }
+
+ public boolean equals(Object object)
+ {
+ if (object == this)
+ return true;
+ if (object == null || !(object instanceof List))
+ return false;
+ List list = (List) object;
+ if (size() != list.size())
+ return false;
+ for (int i = 0; i < list.size(); i++)
+ {
+ Object value1 = get(i);
+ Object value2 = list.get(i);
+ if ((value1 == null && value2 != null) ||
+ (value1 != null && !(value1.equals(value2))))
+ return false;
+ }
+ return true;
+ }
+
+ public String toString()
+ {
+ StringBuffer buf = new StringBuffer();
+ int size = size();
+ for (int i = 0; i < size; i++)
+ {
+ Object key = get(i);
+ buf.append("[").append(key).append("]");
+ if (i <= size) buf.append(", ");
+ }
+
+ return buf.toString();
+ }
+
+ public boolean retainAll(Collection c)
+ {
+ boolean changedAnything = false;
+ Iterator iter = iterator();
+ while (iter.hasNext())
+ {
+ if (!c.contains(iter.next()))
+ {
+ iter.remove();
+ changedAnything = true;
+ }
+ }
+ return changedAnything;
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,528 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.collection;
-
-import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
-
-import java.io.ObjectStreamException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.Cache;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Node;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
-import org.jboss.cache.pojo.util.AopUtil;
-import org.jboss.cache.pojo.util.CacheApiUtil;
-import org.jboss.cache.pojo.util.Null;
-
-/**
- * List implementation that uses cache as a backend store.
- *
- * @author Ben Wang
- * @author Scott Marlow
- */
-public class CachedListImpl extends CachedListAbstract
-{
- private static Log log_ = LogFactory.getLog(CachedListImpl.class.getName());
- private Cache<Object, Object> cache;
- private PojoCacheImpl pojoCache;
- private AbstractCollectionInterceptor interceptor;
-
- public CachedListImpl(PojoCacheImpl cache, AbstractCollectionInterceptor interceptor)
- {
- this.pojoCache = cache;
- this.cache = pojoCache.getCache();
- this.interceptor = interceptor;
- }
-
- private Fqn getFqn()
- {
- return interceptor.getFqn();
- }
-
- // implementation of the java.util.List interface
-
- private Set<Node> getNodeChildren()
- {
- return CacheApiUtil.getNodeChildren(cache, getFqn());
- }
-
- /**
- * Serialize a normal ArrayList
- */
- private Object XwriteReplace() throws ObjectStreamException
- {
- log_.warn("writeReplace(): this calss is not suppored to be serialized." +
- " Will substitue with a normal ArryList");
-
- ArrayList toSerialize = new ArrayList();
- toSerialize.addAll(this);
- return toSerialize;
- }
-
- public Object get(int index)
- {
- checkIndex();
- return Null.toNullValue(pojoCache.getObject(AopUtil.constructFqn(getFqn(), IntegerCache.toString(index))));
- }
-
- private static void checkIndex()
- {
- // TODO This is too expensive now to check it everytime from the cache (potentially twice).
- // It is showing up in the JProfiler. So I am disabling it now.
- return;
-/*
- if(size() == 0) return; // No need to check here.
- if( i < 0 || i >= size() ) {
- throw new IndexOutOfBoundsException("Index out of bound at CachedListImpl(). Index is " +i
- + " but size is " +size());
- } */
- }
-
- public int size()
- {
- Set<Node> children = getNodeChildren();
- return children == null ? 0 : children.size();
- }
-
- public Object set(int index, Object element)
- {
- if (index != 0)
- checkIndex(); // Since index can be size().
- return Null.toNullValue(attach(index, element, "SET"));
- }
-
- public void add(int index, Object element)
- {
- if (index != 0)
- checkIndex(); // Since index can be size().
- for (int i = size(); i > index; i--)
- {
- Object obj = detach(i - 1);
- attach(i, obj);
- }
- attach(index, element, "ADD");
- }
-
- private Object attach(int i, Object obj)
- {
- return attach(i, obj, null);
- }
-
- private Object attach(int i, Object obj, String operation)
- {
- Fqn fqn = AopUtil.constructFqn(getFqn(), IntegerCache.toString(i));
- Object o = pojoCache.attach(fqn, Null.toNullObject(obj));
- if (operation != null)
- pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, operation);
-
- return o;
- }
-
- private Object detach(int i)
- {
- return detach(i, null);
- }
-
- private Object detach(int i, String operation)
- {
- Fqn fqn = AopUtil.constructFqn(getFqn(), IntegerCache.toString(i));
- if (operation != null)
- pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, operation);
- return pojoCache.detach(fqn);
- }
-
- public int indexOf(Object o)
- {
- int size = size();
- if (o == null)
- {
- for (int i = 0; i < size; i++)
- {
- if (null == get(i))
- return i;
- }
- } else
- {
- for (int i = 0; i < size; i++)
- {
- if (o.equals(get(i)))
- return i;
- }
- }
- return -1;
- }
-
- public int lastIndexOf(Object o)
- {
- if (o == null)
- {
- for (int i = size() - 1; i >= 0; i--)
- {
- if (null == get(i))
- return i;
- }
- } else
- {
- for (int i = size() - 1; i >= 0; i--)
- {
- if (o.equals(get(i)))
- return i;
- }
- }
- return -1;
- }
-
- public Object remove(int index)
- {
- checkIndex();
- // Object result = cache.removeObject(((Fqn) fqn.clone()).add(new Integer(index)));
- int size = size();
- Object result = Null.toNullValue(detach(index, "REMOVE"));
- if (size == (index + 1))
- {
- return result; // We are the last one.
- }
- for (int i = index; i < size - 1; i++)
- {
- Object obj = detach(i + 1);
- attach(i, obj);
- }
- return result;
- }
-
- public Iterator iterator()
- {
- // TODO: check for concurrent modification
- return new Iterator()
- {
- // Need to share this
- int current = -1;
- int size = size();
-
- public boolean hasNext()
- {
- if (size == 0) return false;
- if (current > size)
- throw new NoSuchElementException("CachedSetImpl.iterator.hasNext(). " +
- " Cursor position " + current + " is greater than the size " + size());
-
- return current < size - 1;
- }
-
- public Object next()
- {
- if (current == size)
- throw new NoSuchElementException("CachedSetImpl.iterator.next(). " +
- " Cursor position " + current + " is greater than the size " + size());
-
- return Null.toNullValue(pojoCache.getObject(AopUtil.constructFqn(getFqn(), IntegerCache.toString(++current))));
- }
-
- public void remove()
- {
- // TODO Need optimization here since set does not care about index
- if (size == 0) return;
- if (current == size)
- throw new IllegalStateException("CachedSetImpl.iterator.remove(). " +
- " Cursor position " + current + " is greater than the size " + size);
- if (current < (size - 1))
- {
- // Need to reshuffle the items.
- Object last = detach(current, "REMOVE");
- for (int i = current + 1; i < size; i++)
- {
- last = detach(i);
- attach(i - 1, last);
- }
- } else
- { // we are the last index.
- // Need to move back the cursor.
- detach(current, "REMOVE");
- }
- current--;
- size--;
- }
- };
- }
-
- public List subList(int fromIndex, int toIndex)
- {
- if (fromIndex < 0)
- throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
- if (toIndex > size())
- throw new IndexOutOfBoundsException("toIndex = " + toIndex + " but size() =" + size());
- if (fromIndex > toIndex)
- throw new IllegalArgumentException("fromIndex (" + fromIndex + ") must be less than toIndex(" + toIndex + ")");
- if (fromIndex == toIndex) // request for empty list?
- return new LinkedList();
- return new MyCachedSubListImpl(this, fromIndex, toIndex);
- }
-
- public ListIterator listIterator()
- {
- return new MyListIterator(this, 0);
- }
-
- public ListIterator listIterator(int index)
- {
- return new MyListIterator(this, index);
- }
-
- static class MyListIterator implements ListIterator
- {
- int index = 0;
- List list_;
-
- public MyListIterator(List list, int index)
- {
- list_ = list;
- if (index < 0 || index > list_.size())
- {
- throw new IndexOutOfBoundsException("CachedListImpl: MyListIterator construction. " +
- " Index is out of bound : " + index);
- }
- this.index = index;
- }
-
- public int nextIndex()
- {
- return index;
- }
-
- public int previousIndex()
- {
- return index - 1;
- }
-
- public void remove()
- {
- int size = list_.size();
- if (size == 0) return;
- if (previousIndex() == size)
- throw new IllegalStateException("CachedSetImpl.MyListIterator.remove(). " +
- " Cursor position " + index + " is greater than the size " + size);
- if (previousIndex() < (size))
- {
- list_.remove(previousIndex());
- index--;
- }
- }
-
- public boolean hasNext()
- {
- return (index < list_.size());
- }
-
- public boolean hasPrevious()
- {
- return (index != 0);
- }
-
- public Object next()
- {
- if (index == list_.size())
- throw new NoSuchElementException();
-
- index++;
- return list_.get(index - 1); // pass zero relative index
- }
-
- public Object previous()
- {
- if (index == 0)
- throw new NoSuchElementException();
-
- index--;
- return list_.get(index);
- }
-
- public void add(Object o)
- {
- int size = list_.size();
- if (size == 0) return;
-
- if (previousIndex() == size)
- throw new IllegalStateException("CachedSetImpl.MyListIterator.add(). " +
- " Cursor position " + index + " is greater than the size " + size);
- if (previousIndex() < (size))
- {
- list_.add(previousIndex(), o);
- }
- }
-
- public void set(Object o)
- {
- int size = list_.size();
- if (size == 0) return;
-
- if (previousIndex() == size)
- throw new IllegalStateException("CachedSetImpl.MyListIterator.set(). " +
- " Cursor position " + index + " is greater than the size " + size);
- if (previousIndex() < (size))
- {
- list_.set(previousIndex(), o);
- }
- }
- }
-
- static public class MyCachedSubListImpl extends CachedListAbstract implements List
- {
-
- private List backStore_;
- private int fromIndex_;
- private int toIndex_;
-
- MyCachedSubListImpl(List backStore, int fromIndex, int toIndex)
- {
- backStore_ = backStore;
- fromIndex_ = fromIndex;
- toIndex_ = toIndex;
- }
-
- public int size()
- {
- int size = backStore_.size();
- if (size > toIndex_)
- size = toIndex_;
- size -= fromIndex_; // subtract number of items ignored at the start of list
- return size;
- }
-
- public Iterator iterator()
- {
- // TODO: check for concurrent modification
- return new Iterator()
- {
- int current = -1;
- Iterator iter_ = initializeIter();
-
- private Iterator initializeIter()
- {
- Iterator iter = backStore_.iterator();
- for (int looper = 0; looper < fromIndex_; looper++)
- if (iter.hasNext()) // skip past to where we need to start from
- iter.next();
- return iter;
- }
-
- public boolean hasNext()
- {
- int size = size();
- if (size == 0) return false;
- if (current > size)
- throw new IllegalStateException("CachedSetImpl.MyCachedSubListImpl.iterator.hasNext(). " +
- " Cursor position " + current + " is greater than the size " + size());
-
- return current < size() - 1;
- }
-
- public Object next()
- {
- if (current == size())
- throw new IllegalStateException("CachedSetImpl.MyCachedSubListImpl.iterator.next(). " +
- " Cursor position " + current + " is greater than the size " + size());
- current++;
- return iter_.next();
- }
-
- public void remove()
- {
- iter_.remove();
- current--;
- }
- };
-
- }
-
- public Object get(int index)
- {
- checkIndex(index);
- return backStore_.get(index + fromIndex_);
- }
-
- public Object set(int index, Object element)
- {
- checkIndex(index);
- return backStore_.set(index + fromIndex_, element);
- }
-
- public void add(int index, Object element)
- {
- backStore_.add(index + fromIndex_, element);
- }
-
- public Object remove(int index)
- {
- return backStore_.remove(index + fromIndex_);
- }
-
- public int indexOf(Object o)
- {
- int index = backStore_.indexOf(o);
- if (index < fromIndex_ || index >= toIndex_)
- index = -1;
- else
- index -= fromIndex_; // convert to be relative to our from/to range
- return index;
- }
-
- public int lastIndexOf(Object o)
- {
- int index = backStore_.lastIndexOf(o);
- if (index < fromIndex_ || index >= toIndex_)
- index = -1;
- else
- index -= fromIndex_; // convert to be relative to our from/to range
- return index;
- }
-
- public ListIterator listIterator()
- {
- return new MyListIterator(this, 0);
- }
-
- public ListIterator listIterator(int index)
- {
- return new MyListIterator(this, index);
- }
-
- public List subList(int fromIndex, int toIndex)
- {
- if (fromIndex < 0)
- throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
- if (toIndex > size())
- throw new IndexOutOfBoundsException("toIndex = " + toIndex + " but size() =" + size());
- if (fromIndex > toIndex)
- throw new IllegalArgumentException("fromIndex (" + fromIndex + ") must be less than toIndex(" + toIndex + ")");
- if (fromIndex == toIndex) // request for empty list?
- return new LinkedList();
- return new MyCachedSubListImpl(this, fromIndex, toIndex);
- }
-
- private void checkIndex(int i)
- {
- if (size() == 0) return; // No need to check here.
- if (i < 0 || i >= size())
- {
- throw new IndexOutOfBoundsException("Index out of bound at CachedListImpl(). Index is " + i
- + " but size is " + size());
- }
- }
-
- }
-
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedListImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,544 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.collection;
+
+import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
+
+import java.io.ObjectStreamException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.Cache;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
+import org.jboss.cache.pojo.util.AopUtil;
+import org.jboss.cache.pojo.util.CacheApiUtil;
+import org.jboss.cache.pojo.util.Null;
+
+/**
+ * List implementation that uses cache as a backend store.
+ *
+ * @author Ben Wang
+ * @author Scott Marlow
+ */
+public class CachedListImpl extends CachedListAbstract
+{
+ private static Log log_ = LogFactory.getLog(CachedListImpl.class.getName());
+ private Cache<Object, Object> cache;
+ private PojoCacheImpl pojoCache;
+ private AbstractCollectionInterceptor interceptor;
+
+ public CachedListImpl(PojoCacheImpl cache, AbstractCollectionInterceptor interceptor)
+ {
+ this.pojoCache = cache;
+ this.cache = pojoCache.getCache();
+ this.interceptor = interceptor;
+ }
+
+ private Fqn getFqn()
+ {
+ return interceptor.getFqn();
+ }
+
+ // implementation of the java.util.List interface
+
+ private Set<Node> getNodeChildren()
+ {
+ return CacheApiUtil.getNodeChildren(cache, getFqn());
+ }
+
+ /**
+ * Serialize a normal ArrayList
+ */
+ private Object XwriteReplace() throws ObjectStreamException
+ {
+ log_.warn("writeReplace(): this calss is not suppored to be serialized." +
+ " Will substitue with a normal ArryList");
+
+ ArrayList toSerialize = new ArrayList();
+ toSerialize.addAll(this);
+ return toSerialize;
+ }
+
+ public Object get(int index)
+ {
+ checkIndex();
+ return Null.toNullValue(pojoCache.find(AopUtil.constructFqn(getFqn(), IntegerCache.toString(index))));
+ }
+
+ private static void checkIndex()
+ {
+ // TODO This is too expensive now to check it everytime from the cache (potentially twice).
+ // It is showing up in the JProfiler. So I am disabling it now.
+ return;
+/*
+ if(size() == 0) return; // No need to check here.
+ if( i < 0 || i >= size() ) {
+ throw new IndexOutOfBoundsException("Index out of bound at CachedListImpl(). Index is " +i
+ + " but size is " +size());
+ } */
+ }
+
+ public int size()
+ {
+ Set<Node> children = getNodeChildren();
+ return children == null ? 0 : children.size();
+ }
+
+ public Object set(int index, Object element)
+ {
+ if (index != 0)
+ checkIndex(); // Since index can be size().
+ return Null.toNullValue(attach(index, element, "SET"));
+ }
+
+ public void add(int index, Object element)
+ {
+ if (index != 0)
+ checkIndex(); // Since index can be size().
+ for (int i = size(); i > index; i--)
+ {
+ Object obj = detach(i - 1);
+ attach(i, obj);
+ }
+ attach(index, element, "ADD");
+ }
+
+ private Object attach(int i, Object obj)
+ {
+ return attach(i, obj, null);
+ }
+
+ private Object attach(int i, Object obj, String operation)
+ {
+ Fqn fqn = AopUtil.constructFqn(getFqn(), IntegerCache.toString(i));
+ Object o = pojoCache.attach(fqn, Null.toNullObject(obj));
+ if (operation != null)
+ pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, operation);
+
+ return o;
+ }
+
+ private Object detach(int i)
+ {
+ return detach(i, null);
+ }
+
+ private Object detach(int i, String operation)
+ {
+ Fqn fqn = AopUtil.constructFqn(getFqn(), IntegerCache.toString(i));
+ if (operation != null)
+ pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, operation);
+ return pojoCache.detach(fqn);
+ }
+
+ public int indexOf(Object o)
+ {
+ int size = size();
+ if (o == null)
+ {
+ for (int i = 0; i < size; i++)
+ {
+ if (null == get(i))
+ return i;
+ }
+ } else
+ {
+ for (int i = 0; i < size; i++)
+ {
+ if (o.equals(get(i)))
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public int lastIndexOf(Object o)
+ {
+ if (o == null)
+ {
+ for (int i = size() - 1; i >= 0; i--)
+ {
+ if (null == get(i))
+ return i;
+ }
+ } else
+ {
+ for (int i = size() - 1; i >= 0; i--)
+ {
+ if (o.equals(get(i)))
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public Object remove(int index)
+ {
+ checkIndex();
+ // Object result = cache.removeObject(((Fqn) fqn.clone()).add(new Integer(index)));
+ int size = size();
+ Object result = Null.toNullValue(detach(index, "REMOVE"));
+ if (size == (index + 1))
+ {
+ return result; // We are the last one.
+ }
+ for (int i = index; i < size - 1; i++)
+ {
+ Object obj = detach(i + 1);
+ attach(i, obj);
+ }
+ return result;
+ }
+
+ public Iterator iterator()
+ {
+ // TODO: check for concurrent modification
+ return new Iterator()
+ {
+ // Need to share this
+ int current = -1;
+ int size = size();
+
+ public boolean hasNext()
+ {
+ if (size == 0) return false;
+ if (current > size)
+ throw new NoSuchElementException("CachedSetImpl.iterator.hasNext(). " +
+ " Cursor position " + current + " is greater than the size " + size());
+
+ return current < size - 1;
+ }
+
+ public Object next()
+ {
+ if (current == size)
+ throw new NoSuchElementException("CachedSetImpl.iterator.next(). " +
+ " Cursor position " + current + " is greater than the size " + size());
+
+ return Null.toNullValue(pojoCache.find(AopUtil.constructFqn(getFqn(), IntegerCache.toString(++current))));
+ }
+
+ public void remove()
+ {
+ // TODO Need optimization here since set does not care about index
+ if (size == 0) return;
+ if (current == size)
+ throw new IllegalStateException("CachedSetImpl.iterator.remove(). " +
+ " Cursor position " + current + " is greater than the size " + size);
+ if (current < (size - 1))
+ {
+ // Need to reshuffle the items.
+ Object last = detach(current, "REMOVE");
+ for (int i = current + 1; i < size; i++)
+ {
+ last = detach(i);
+ attach(i - 1, last);
+ }
+ } else
+ { // we are the last index.
+ // Need to move back the cursor.
+ detach(current, "REMOVE");
+ }
+ current--;
+ size--;
+ }
+ };
+ }
+
+ public List subList(int fromIndex, int toIndex)
+ {
+ if (fromIndex < 0)
+ throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
+ if (toIndex > size())
+ throw new IndexOutOfBoundsException("toIndex = " + toIndex + " but size() =" + size());
+ if (fromIndex > toIndex)
+ throw new IllegalArgumentException("fromIndex (" + fromIndex + ") must be less than toIndex(" + toIndex + ")");
+ if (fromIndex == toIndex) // request for empty list?
+ return new LinkedList();
+ return new MyCachedSubListImpl(this, fromIndex, toIndex);
+ }
+
+ public ListIterator listIterator()
+ {
+ return new MyListIterator(this, 0);
+ }
+
+ public ListIterator listIterator(int index)
+ {
+ return new MyListIterator(this, index);
+ }
+
+ public String toString()
+ {
+ StringBuffer buf = new StringBuffer();
+ int size = size();
+ for (int i = 0; i < size; i++)
+ {
+ Object key = get(i);
+ if (key == interceptor.getBoundProxy())
+ key = "(this list)";
+ buf.append("[").append(key).append("]");
+ if (i <= size) buf.append(", ");
+ }
+
+ return buf.toString();
+ }
+
+ static class MyListIterator implements ListIterator
+ {
+ int index = 0;
+ List list_;
+
+ public MyListIterator(List list, int index)
+ {
+ list_ = list;
+ if (index < 0 || index > list_.size())
+ {
+ throw new IndexOutOfBoundsException("CachedListImpl: MyListIterator construction. " +
+ " Index is out of bound : " + index);
+ }
+ this.index = index;
+ }
+
+ public int nextIndex()
+ {
+ return index;
+ }
+
+ public int previousIndex()
+ {
+ return index - 1;
+ }
+
+ public void remove()
+ {
+ int size = list_.size();
+ if (size == 0) return;
+ if (previousIndex() == size)
+ throw new IllegalStateException("CachedSetImpl.MyListIterator.remove(). " +
+ " Cursor position " + index + " is greater than the size " + size);
+ if (previousIndex() < (size))
+ {
+ list_.remove(previousIndex());
+ index--;
+ }
+ }
+
+ public boolean hasNext()
+ {
+ return (index < list_.size());
+ }
+
+ public boolean hasPrevious()
+ {
+ return (index != 0);
+ }
+
+ public Object next()
+ {
+ if (index == list_.size())
+ throw new NoSuchElementException();
+
+ index++;
+ return list_.get(index - 1); // pass zero relative index
+ }
+
+ public Object previous()
+ {
+ if (index == 0)
+ throw new NoSuchElementException();
+
+ index--;
+ return list_.get(index);
+ }
+
+ public void add(Object o)
+ {
+ int size = list_.size();
+ if (size == 0) return;
+
+ if (previousIndex() == size)
+ throw new IllegalStateException("CachedSetImpl.MyListIterator.add(). " +
+ " Cursor position " + index + " is greater than the size " + size);
+ if (previousIndex() < (size))
+ {
+ list_.add(previousIndex(), o);
+ }
+ }
+
+ public void set(Object o)
+ {
+ int size = list_.size();
+ if (size == 0) return;
+
+ if (previousIndex() == size)
+ throw new IllegalStateException("CachedSetImpl.MyListIterator.set(). " +
+ " Cursor position " + index + " is greater than the size " + size);
+ if (previousIndex() < (size))
+ {
+ list_.set(previousIndex(), o);
+ }
+ }
+ }
+
+ static public class MyCachedSubListImpl extends CachedListAbstract implements List
+ {
+
+ private List backStore_;
+ private int fromIndex_;
+ private int toIndex_;
+
+ MyCachedSubListImpl(List backStore, int fromIndex, int toIndex)
+ {
+ backStore_ = backStore;
+ fromIndex_ = fromIndex;
+ toIndex_ = toIndex;
+ }
+
+ public int size()
+ {
+ int size = backStore_.size();
+ if (size > toIndex_)
+ size = toIndex_;
+ size -= fromIndex_; // subtract number of items ignored at the start of list
+ return size;
+ }
+
+ public Iterator iterator()
+ {
+ // TODO: check for concurrent modification
+ return new Iterator()
+ {
+ int current = -1;
+ Iterator iter_ = initializeIter();
+
+ private Iterator initializeIter()
+ {
+ Iterator iter = backStore_.iterator();
+ for (int looper = 0; looper < fromIndex_; looper++)
+ if (iter.hasNext()) // skip past to where we need to start from
+ iter.next();
+ return iter;
+ }
+
+ public boolean hasNext()
+ {
+ int size = size();
+ if (size == 0) return false;
+ if (current > size)
+ throw new IllegalStateException("CachedSetImpl.MyCachedSubListImpl.iterator.hasNext(). " +
+ " Cursor position " + current + " is greater than the size " + size());
+
+ return current < size() - 1;
+ }
+
+ public Object next()
+ {
+ if (current == size())
+ throw new IllegalStateException("CachedSetImpl.MyCachedSubListImpl.iterator.next(). " +
+ " Cursor position " + current + " is greater than the size " + size());
+ current++;
+ return iter_.next();
+ }
+
+ public void remove()
+ {
+ iter_.remove();
+ current--;
+ }
+ };
+
+ }
+
+ public Object get(int index)
+ {
+ checkIndex(index);
+ return backStore_.get(index + fromIndex_);
+ }
+
+ public Object set(int index, Object element)
+ {
+ checkIndex(index);
+ return backStore_.set(index + fromIndex_, element);
+ }
+
+ public void add(int index, Object element)
+ {
+ backStore_.add(index + fromIndex_, element);
+ }
+
+ public Object remove(int index)
+ {
+ return backStore_.remove(index + fromIndex_);
+ }
+
+ public int indexOf(Object o)
+ {
+ int index = backStore_.indexOf(o);
+ if (index < fromIndex_ || index >= toIndex_)
+ index = -1;
+ else
+ index -= fromIndex_; // convert to be relative to our from/to range
+ return index;
+ }
+
+ public int lastIndexOf(Object o)
+ {
+ int index = backStore_.lastIndexOf(o);
+ if (index < fromIndex_ || index >= toIndex_)
+ index = -1;
+ else
+ index -= fromIndex_; // convert to be relative to our from/to range
+ return index;
+ }
+
+ public ListIterator listIterator()
+ {
+ return new MyListIterator(this, 0);
+ }
+
+ public ListIterator listIterator(int index)
+ {
+ return new MyListIterator(this, index);
+ }
+
+ public List subList(int fromIndex, int toIndex)
+ {
+ if (fromIndex < 0)
+ throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
+ if (toIndex > size())
+ throw new IndexOutOfBoundsException("toIndex = " + toIndex + " but size() =" + size());
+ if (fromIndex > toIndex)
+ throw new IllegalArgumentException("fromIndex (" + fromIndex + ") must be less than toIndex(" + toIndex + ")");
+ if (fromIndex == toIndex) // request for empty list?
+ return new LinkedList();
+ return new MyCachedSubListImpl(this, fromIndex, toIndex);
+ }
+
+ private void checkIndex(int i)
+ {
+ if (size() == 0) return; // No need to check here.
+ if (i < 0 || i >= size())
+ {
+ throw new IndexOutOfBoundsException("Index out of bound at CachedListImpl(). Index is " + i
+ + " but size is " + size());
+ }
+ }
+
+ }
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,403 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.collection;
-
-import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
-
-import java.io.Serializable;
-import java.util.AbstractCollection;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.jboss.aop.Advised;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheSPI;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Node;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.annotation.Reentrant;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
-import org.jboss.cache.pojo.util.CacheApiUtil;
-import org.jboss.cache.pojo.util.Null;
-
-/**
- * Map that uses cache as a backend store.
- *
- * @author Ben Wang
- * @author Scott Marlow
- */
-@Reentrant
-public class CachedMapImpl implements Map
-{
- private PojoCacheImpl pojoCache;
- private Cache<Object, Object> cache;
- private AbstractCollectionInterceptor interceptor;
-
- public CachedMapImpl(PojoCacheImpl pCache, AbstractCollectionInterceptor interceptor)
- {
- this.pojoCache = pCache;
- this.cache = pojoCache.getCache();
- this.interceptor = interceptor;
- }
-
- private static Fqn constructFqn(Fqn baseFqn, Object relative)
- {
- if (!(relative instanceof Serializable) && !(relative instanceof Advised))
- {
- throw new PojoCacheException("Non-serializable for " + relative.getClass().getName());
- }
-
- return new Fqn(baseFqn, relative);
- }
-
- private Fqn getFqn()
- {
- return interceptor.getFqn();
- }
-
- private Object attach(Object key, Object value)
- {
- Fqn fqn = constructFqn(getFqn(), Null.toNullKeyObject(key));
- Object o = pojoCache.attach(fqn, Null.toNullObject(value));
- pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "PUT");
-
- return o;
- }
-
- private Object detach(Object key)
- {
- Fqn fqn = constructFqn(getFqn(), Null.toNullKeyObject(key));
- pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "REMOVE");
-
- return pojoCache.detach(fqn);
- }
-
- // implementation of the java.util.Map interface
-
- private Set<Node> getNodeChildren()
- {
- return CacheApiUtil.getNodeChildren(cache, getFqn());
- }
-
- public Object get(Object key)
- {
- return Null.toNullValue(pojoCache.getObject(constructFqn(getFqn(), Null.toNullKeyObject(key))));
- }
-
- public Object put(Object key, Object value)
- {
- return attach(key, value);
- }
-
- public void putAll(Map map)
- {
- for (Iterator i = map.entrySet().iterator(); i.hasNext();)
- {
- Map.Entry entry = (Map.Entry) i.next();
- put(entry.getKey(), entry.getValue());
- }
- }
-
- public Object remove(Object key)
- {
- return detach(key);
- }
-
- public void clear()
- {
- // Need to clone first to avoid CME
- ArrayList list = new ArrayList(keySet());
- for (int i = 0; i < list.size(); i++)
- {
- remove(list.get(i));
- }
- }
-
- public int size()
- {
- Set<Node> children = getNodeChildren();
- return children == null ? 0 : children.size();
- }
-
- public boolean isEmpty()
- {
- return size() == 0;
- }
-
- public boolean containsKey(Object object)
- {
- Set<Node> children = getNodeChildren();
- if (children == null) return false;
- for (Object n : children)
- {
- if (((Node) n).getFqn().getLastElement().equals(Null.toNullKeyObject(object))) return true;
- }
-
- return false;
- }
-
- public boolean containsValue(Object object)
- {
- return values().contains(Null.toNullObject(object));
- }
-
- public Set entrySet()
- {
- final CachedMapImpl map = this;
-
- return new AbstractSet()
- {
-
- public int size()
- {
- Set<Node> children = getNodeChildren();
- return children == null ? 0 : children.size();
- }
-
- public Iterator iterator()
- {
- Set<Node> children = getNodeChildren();
- final Iterator i =
- children == null
- ? Collections.EMPTY_LIST.iterator()
- : children.iterator();
- return new Iterator()
- {
- Object lastKey; // for remove
-
- public boolean hasNext()
- {
- return i.hasNext();
- }
-
- public Object next()
- {
- return new Entry(lastKey = ((Node) i.next()).getFqn().getLastElement());
- }
-
- public void remove()
- {
- map.remove(lastKey);
- }
- };
- }
- };
- }
-
- public Collection values()
- {
- final CachedMapImpl map = this;
-
- return new AbstractCollection()
- {
-
- public int size()
- {
- Set<Node> children = getNodeChildren();
- return children == null ? 0 : children.size();
- }
-
- public void clear()
- {
- map.clear();
- }
-
- public Iterator iterator()
- {
- Set<Node> children = getNodeChildren();
- final Iterator i =
- children == null
- ? Collections.EMPTY_LIST.iterator()
- : children.iterator();
-
- return new Iterator()
- {
- Object lastKey; // for remove
-
- public boolean hasNext()
- {
- return i.hasNext();
- }
-
- public Object next()
- {
- Fqn f = ((Node) i.next()).getFqn();
- lastKey = f.getLastElement();
- return Null.toNullValue(pojoCache.getObject(f));
- }
-
- public void remove()
- {
- Object key = lastKey;
- if (key != null) // convert from internal Null form to actual null if needed
- key = Null.toNullKeyValue(key);
- map.remove(key);
- }
- };
- }
- };
- }
-
- public Set keySet()
- {
- final CachedMapImpl map = this;
-
- return new AbstractSet()
- {
-
- public int size()
- {
- Set<Node> children = getNodeChildren();
- return children == null ? 0 : children.size();
- }
-
- public Iterator iterator()
- {
- Set<Node> children = getNodeChildren();
- final Iterator i =
- children == null
- ? Collections.EMPTY_LIST.iterator()
- : children.iterator();
-
- return new Iterator()
- {
- Object lastKey; // for remove
-
- public boolean hasNext()
- {
- return i.hasNext();
- }
-
- public Object next()
- {
- lastKey = ((Node) i.next()).getFqn().getLastElement();
- return Null.toNullKeyValue(lastKey);
-
- }
-
- public void remove()
- {
- Object key = lastKey;
- if (key != null) // convert from internal Null form to actual null if needed
- key = Null.toNullKeyValue(key);
- map.remove(key);
- }
- };
-
- }
- };
- }
-
- public int hashCode()
- {
- int result = 0;
- for (Iterator i = entrySet().iterator(); i.hasNext();)
- {
- result += i.next().hashCode();
- }
- return result;
- }
-
- public boolean equals(Object object)
- {
- if (object == this)
- return true;
- if (object == null || !(object instanceof Map))
- return false;
- Map map = (Map) object;
- if (size() != map.size())
- return false;
- for (Iterator i = entrySet().iterator(); i.hasNext();)
- {
- Entry entry = (Entry) i.next();
- Object value = entry.getValue();
- Object key = entry.getKey();
- if (value == null)
- {
- if (!(map.get(key) == null && map.containsKey(key)))
- {
- return false;
- }
- } else
- {
- if (!value.equals(map.get(key)))
- return false;
- }
- }
- return true;
- }
-
- public String toString()
- {
- StringBuffer buf = new StringBuffer();
- Set set = keySet();
- for (Iterator it = set.iterator(); it.hasNext();)
- {
- Object key = it.next();
- buf.append("[").append(key).append(", ").append(get(key)).append("]");
- if (it.hasNext()) buf.append(", ");
- }
-
- return buf.toString();
- }
-
- class Entry implements Map.Entry
- {
-
- Object key;
-
- public Entry(Object key)
- {
- this.key = key;
- }
-
- public Object getKey()
- {
- return Null.toNullValue(key);
- }
-
- public Object getValue()
- {
- return Null.toNullValue(pojoCache.getObject(constructFqn(getFqn(), key)));
- }
-
- public Object setValue(Object value)
- {
- return attach(key, value);
- }
-
- public int hashCode()
- {
- Object value = getValue();
- return ((key == null) ? 0 : key.hashCode())
- ^ ((value == null) ? 0 : value.hashCode());
- }
-
- public boolean equals(Object obj)
- {
- if (!(obj instanceof Entry))
- return false;
- Entry entry = (Entry) obj;
- Object value = getValue();
- return (
- key == null
- ? entry.getKey() == null
- : key.equals(entry.getKey()))
- && (value == null
- ? entry.getValue() == null
- : value.equals(entry.getValue()));
- }
- }
-
-
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedMapImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,406 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.collection;
+
+import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
+
+import java.io.Serializable;
+import java.util.AbstractCollection;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.jboss.aop.Advised;
+import org.jboss.cache.Cache;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
+import org.jboss.cache.pojo.util.CacheApiUtil;
+import org.jboss.cache.pojo.util.Null;
+
+/**
+ * Map that uses cache as a backend store.
+ *
+ * @author Ben Wang
+ * @author Scott Marlow
+ */
+public class CachedMapImpl implements Map
+{
+ private PojoCacheImpl pojoCache;
+ private Cache<Object, Object> cache;
+ private AbstractCollectionInterceptor interceptor;
+
+ public CachedMapImpl(PojoCacheImpl pCache, AbstractCollectionInterceptor interceptor)
+ {
+ this.pojoCache = pCache;
+ this.cache = pojoCache.getCache();
+ this.interceptor = interceptor;
+ }
+
+ private static Fqn constructFqn(Fqn baseFqn, Object relative)
+ {
+ if (!(relative instanceof Serializable) && !(relative instanceof Advised))
+ {
+ throw new PojoCacheException("Non-serializable for " + relative.getClass().getName());
+ }
+
+ return new Fqn(baseFqn, relative);
+ }
+
+ private Fqn getFqn()
+ {
+ return interceptor.getFqn();
+ }
+
+ private Object attach(Object key, Object value)
+ {
+ Fqn fqn = constructFqn(getFqn(), Null.toNullKeyObject(key));
+ Object o = pojoCache.attach(fqn, Null.toNullObject(value));
+ pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "PUT");
+
+ return o;
+ }
+
+ private Object detach(Object key)
+ {
+ Fqn fqn = constructFqn(getFqn(), Null.toNullKeyObject(key));
+ pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "REMOVE");
+
+ return pojoCache.detach(fqn);
+ }
+
+ // implementation of the java.util.Map interface
+
+ private Set<Node> getNodeChildren()
+ {
+ return CacheApiUtil.getNodeChildren(cache, getFqn());
+ }
+
+ public Object get(Object key)
+ {
+ return Null.toNullValue(pojoCache.find(constructFqn(getFqn(), Null.toNullKeyObject(key))));
+ }
+
+ public Object put(Object key, Object value)
+ {
+ return attach(key, value);
+ }
+
+ public void putAll(Map map)
+ {
+ for (Iterator i = map.entrySet().iterator(); i.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) i.next();
+ put(entry.getKey(), entry.getValue());
+ }
+ }
+
+ public Object remove(Object key)
+ {
+ return detach(key);
+ }
+
+ public void clear()
+ {
+ // Need to clone first to avoid CME
+ ArrayList list = new ArrayList(keySet());
+ for (int i = 0; i < list.size(); i++)
+ {
+ remove(list.get(i));
+ }
+ }
+
+ public int size()
+ {
+ Set<Node> children = getNodeChildren();
+ return children == null ? 0 : children.size();
+ }
+
+ public boolean isEmpty()
+ {
+ return size() == 0;
+ }
+
+ public boolean containsKey(Object object)
+ {
+ Set<Node> children = getNodeChildren();
+ if (children == null) return false;
+ for (Object n : children)
+ {
+ if (((Node) n).getFqn().getLastElement().equals(Null.toNullKeyObject(object))) return true;
+ }
+
+ return false;
+ }
+
+ public boolean containsValue(Object object)
+ {
+ return values().contains(Null.toNullObject(object));
+ }
+
+ public Set entrySet()
+ {
+ final CachedMapImpl map = this;
+
+ return new AbstractSet()
+ {
+
+ public int size()
+ {
+ Set<Node> children = getNodeChildren();
+ return children == null ? 0 : children.size();
+ }
+
+ public Iterator iterator()
+ {
+ Set<Node> children = getNodeChildren();
+ final Iterator i =
+ children == null
+ ? Collections.EMPTY_LIST.iterator()
+ : children.iterator();
+ return new Iterator()
+ {
+ Object lastKey; // for remove
+
+ public boolean hasNext()
+ {
+ return i.hasNext();
+ }
+
+ public Object next()
+ {
+ return new Entry(lastKey = ((Node) i.next()).getFqn().getLastElement());
+ }
+
+ public void remove()
+ {
+ map.remove(lastKey);
+ }
+ };
+ }
+ };
+ }
+
+ public Collection values()
+ {
+ final CachedMapImpl map = this;
+
+ return new AbstractCollection()
+ {
+
+ public int size()
+ {
+ Set<Node> children = getNodeChildren();
+ return children == null ? 0 : children.size();
+ }
+
+ public void clear()
+ {
+ map.clear();
+ }
+
+ public Iterator iterator()
+ {
+ Set<Node> children = getNodeChildren();
+ final Iterator i =
+ children == null
+ ? Collections.EMPTY_LIST.iterator()
+ : children.iterator();
+
+ return new Iterator()
+ {
+ Object lastKey; // for remove
+
+ public boolean hasNext()
+ {
+ return i.hasNext();
+ }
+
+ public Object next()
+ {
+ Fqn f = ((Node) i.next()).getFqn();
+ lastKey = f.getLastElement();
+ return Null.toNullValue(pojoCache.find(f));
+ }
+
+ public void remove()
+ {
+ Object key = lastKey;
+ if (key != null) // convert from internal Null form to actual null if needed
+ key = Null.toNullKeyValue(key);
+ map.remove(key);
+ }
+ };
+ }
+ };
+ }
+
+ public Set keySet()
+ {
+ final CachedMapImpl map = this;
+
+ return new AbstractSet()
+ {
+
+ public int size()
+ {
+ Set<Node> children = getNodeChildren();
+ return children == null ? 0 : children.size();
+ }
+
+ public Iterator iterator()
+ {
+ Set<Node> children = getNodeChildren();
+ final Iterator i =
+ children == null
+ ? Collections.EMPTY_LIST.iterator()
+ : children.iterator();
+
+ return new Iterator()
+ {
+ Object lastKey; // for remove
+
+ public boolean hasNext()
+ {
+ return i.hasNext();
+ }
+
+ public Object next()
+ {
+ lastKey = ((Node) i.next()).getFqn().getLastElement();
+ return Null.toNullKeyValue(lastKey);
+
+ }
+
+ public void remove()
+ {
+ Object key = lastKey;
+ if (key != null) // convert from internal Null form to actual null if needed
+ key = Null.toNullKeyValue(key);
+ map.remove(key);
+ }
+ };
+
+ }
+ };
+ }
+
+ public int hashCode()
+ {
+ int result = 0;
+ for (Iterator i = entrySet().iterator(); i.hasNext();)
+ {
+ result += i.next().hashCode();
+ }
+ return result;
+ }
+
+ public boolean equals(Object object)
+ {
+ if (object == this)
+ return true;
+ if (object == null || !(object instanceof Map))
+ return false;
+ Map map = (Map) object;
+ if (size() != map.size())
+ return false;
+ for (Iterator i = entrySet().iterator(); i.hasNext();)
+ {
+ Entry entry = (Entry) i.next();
+ Object value = entry.getValue();
+ Object key = entry.getKey();
+ if (value == null)
+ {
+ if (!(map.get(key) == null && map.containsKey(key)))
+ {
+ return false;
+ }
+ } else
+ {
+ if (!value.equals(map.get(key)))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public String toString()
+ {
+ StringBuffer buf = new StringBuffer();
+ Set set = keySet();
+ for (Iterator it = set.iterator(); it.hasNext();)
+ {
+ Object key = it.next();
+ Object value = get(key);
+ if (key == interceptor.getBoundProxy())
+ key = "(this map)";
+ if (value == interceptor.getBoundProxy())
+ value = "(this map)";
+
+ buf.append("[").append(key).append(", ").append(value).append("]");
+ if (it.hasNext()) buf.append(", ");
+ }
+
+ return buf.toString();
+ }
+
+ class Entry implements Map.Entry
+ {
+
+ Object key;
+
+ public Entry(Object key)
+ {
+ this.key = key;
+ }
+
+ public Object getKey()
+ {
+ return Null.toNullValue(key);
+ }
+
+ public Object getValue()
+ {
+ return Null.toNullValue(pojoCache.find(constructFqn(getFqn(), key)));
+ }
+
+ public Object setValue(Object value)
+ {
+ return attach(key, value);
+ }
+
+ public int hashCode()
+ {
+ Object value = getValue();
+ return ((key == null) ? 0 : key.hashCode())
+ ^ ((value == null) ? 0 : value.hashCode());
+ }
+
+ public boolean equals(Object obj)
+ {
+ if (!(obj instanceof Entry))
+ return false;
+ Entry entry = (Entry) obj;
+ Object value = getValue();
+ return (
+ key == null
+ ? entry.getKey() == null
+ : key.equals(entry.getKey()))
+ && (value == null
+ ? entry.getValue() == null
+ : value.equals(entry.getValue()));
+ }
+ }
+
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,71 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.cache.pojo.collection;
-
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.impl.ArrayInterceptable;
-import org.jboss.cache.pojo.impl.InternalConstant;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.util.AopUtil;
-import org.jboss.cache.pojo.util.Null;
-
-/**
- * A CachedObjectArray is used to back arrays with a component type that extends Object.
- * It currently maps each array element to a cache Node, to support fine-grained locking.
- *
- * @author Jason T. Greene
- */
-public class CachedObjectArray extends CachedArray
-{
- // Used to indicate that the source of the element is an interceptable array
- // so that multi-dimensional arrays can be handled properly
- private static ArrayInterceptable arraySource = new ArrayInterceptable() {};
-
- protected CachedObjectArray(Fqn<?> fqn, Class<?> type, PojoCacheImpl cache)
- {
- super(fqn, type, cache);
- }
-
- public void set(int index, Object element)
- {
- Fqn<?> fqn = AopUtil.constructFqn(this.fqn, IntegerCache.toString(index));
-
- cache.attach(fqn, Null.toNullObject(element), null, arraySource);
- cache.getCache().put(fqn, InternalConstant.POJOCACHE_OPERATION, "SET");
- }
-
- public Object get(int index)
- {
- Fqn<?> fqn = AopUtil.constructFqn(this.fqn, IntegerCache.toString(index));
-
- return Null.toNullValue(cache.getObject(fqn, null, arraySource));
- }
-
- public void destroy()
- {
- // Detach all children to ensure reference cleanup
- for (int i = 0; i < length(); i++)
- cache.detach(AopUtil.constructFqn(this.fqn, IntegerCache.toString(i)), null, arraySource);
-
- super.destroy();
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedObjectArray.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,71 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.cache.pojo.collection;
+
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.impl.ArrayInterceptable;
+import org.jboss.cache.pojo.impl.InternalConstant;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.util.AopUtil;
+import org.jboss.cache.pojo.util.Null;
+
+/**
+ * A CachedObjectArray is used to back arrays with a component type that extends Object.
+ * It currently maps each array element to a cache Node, to support fine-grained locking.
+ *
+ * @author Jason T. Greene
+ */
+public class CachedObjectArray extends CachedArray
+{
+ // Used to indicate that the source of the element is an interceptable array
+ // so that multi-dimensional arrays can be handled properly
+ private static ArrayInterceptable arraySource = new ArrayInterceptable() {};
+
+ protected CachedObjectArray(Fqn<?> fqn, Class<?> type, PojoCacheImpl cache)
+ {
+ super(fqn, type, cache);
+ }
+
+ public void set(int index, Object element)
+ {
+ Fqn<?> fqn = AopUtil.constructFqn(this.fqn, IntegerCache.toString(index));
+
+ cache.attach(fqn, Null.toNullObject(element), null, arraySource);
+ cache.getCache().put(fqn, InternalConstant.POJOCACHE_OPERATION, "SET");
+ }
+
+ public Object get(int index)
+ {
+ Fqn<?> fqn = AopUtil.constructFqn(this.fqn, IntegerCache.toString(index));
+
+ return Null.toNullValue(cache.find(fqn, null, arraySource));
+ }
+
+ public void destroy()
+ {
+ // Detach all children to ensure reference cleanup
+ for (int i = 0; i < length(); i++)
+ cache.detach(AopUtil.constructFqn(this.fqn, IntegerCache.toString(i)), null, arraySource);
+
+ super.destroy();
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,292 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.collection;
-
-import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
-
-import java.util.AbstractSet;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.CacheSPI;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Node;
-import org.jboss.cache.NodeSPI;
-import org.jboss.cache.pojo.annotation.Reentrant;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
-import org.jboss.cache.pojo.util.AopUtil;
-import org.jboss.cache.pojo.util.CacheApiUtil;
-import org.jboss.cache.pojo.util.Null;
-
-/**
- * Set implementation that uses a cache as an underlying backend store.
- * Set data is stored in children nodes named based on the attached Object's hash code
- * in hexidecimal string form.
- * If there are conflicts between two Objects with the same hash code, then a
- * counter (upper 32 bits of 64) is used.
- *
- * @author Ben Wang
- * @author Scott Marlow
- * @author Jussi Pyorre
- */
-@Reentrant
-public class CachedSetImpl extends AbstractSet
-{
- private PojoCacheImpl pojoCache;
- private Cache<Object, Object> cache;
- private AbstractCollectionInterceptor interceptor;
-
- public CachedSetImpl(PojoCacheImpl cache, AbstractCollectionInterceptor interceptor)
- {
- this.pojoCache = cache;
- this.cache = pojoCache.getCache();
- this.interceptor = interceptor;
- }
-
- private Set<Node> getNodeChildren()
- {
- return CacheApiUtil.getNodeChildren(cache, getFqn());
- }
-
- private Fqn getFqn()
- {
- // Cannot cache this as this can be reset
- return interceptor.getFqn();
- }
-
- // java.util.Set implementation
-
- public boolean add(Object o)
- {
- o = Null.toNullObject(o);
- int hashCode = o.hashCode();
- int size = size();
- for (int i = 0; i < size + 1; i++)
- {
- Object key = toLong(hashCode, i);
- Object o2 = getNoUnmask(key);
- if (o2 == null)
- {
- attach(key, o, true);
- return true;
- }
- if (o.equals(o2))
- {
- return false;
- }
- }
- // should never reach here
- throw new CacheException();
- }
-
- public void clear()
- {
- Set<Node> children = getNodeChildren();
- for (Node n : children)
- {
- pojoCache.detach(n.getFqn());
- }
- }
-
- public boolean contains(Object o)
- {
- o = Null.toNullObject(o);
- int hashCode = o.hashCode();
- int size = size();
- for (int i = 0; i < size; i++)
- {
- Object key = toLong(hashCode, i);
- Object o2 = getNoUnmask(key);
- if (o2 == null)
- {
- return false;
- }
- if (o.equals(o2))
- {
- return true;
- }
- }
- return false;
- }
-
- public Iterator iterator()
- {
- Node node = cache.getRoot().getChild(getFqn());
- if (node == null)
- {
- return Collections.EMPTY_SET.iterator();
- }
- return new IteratorImpl(node);
- }
-
- public boolean remove(Object o)
- {
- o = Null.toNullObject(o);
- int hashCode = o.hashCode();
- int size = size();
- boolean removed = false;
- Object oldkey = null;
- for (int i = 0; i < size; i++)
- {
- Object key = toLong(hashCode, i);
- Object o2 = getNoUnmask(key);
- if (o2 == null)
- {
- break;
- }
- if (removed)
- {
- // move o2 to old key
- detach(key);
- attach(oldkey, o2);
- }
- if (o.equals(o2))
- {
- detach(key, true);
- removed = true;
- }
- oldkey = key;
- }
- return removed;
- }
-
- public int size()
- {
- Set<Node> children = getNodeChildren();
- return (children == null) ? 0 : children.size();
- }
-
- public String toString()
- {
- StringBuffer buf = new StringBuffer();
- for (Iterator it = iterator(); it.hasNext();)
- {
- Object key = it.next();
- buf.append("[").append(key).append("]");
- if (it.hasNext()) buf.append(", ");
- }
-
- return buf.toString();
- }
-
- /**
- * Return a long with "count" as the high 32 bits.
- * TODO should be able to use java.lang.Long, but some CacheLoader don't
- * support non-String keys
- */
- private String toLong(long hashCode, long count)
- {
- long key = (hashCode & 0xFFFFL) | (count << 32);
- return Long.toHexString(key);
- }
-
-
- private Object attach(Object key, Object pojo)
- {
- return attach(key, pojo, false);
- }
-
- private Object attach(Object key, Object pojo, boolean add)
- {
- Fqn fqn = AopUtil.constructFqn(getFqn(), key);
- Object o = pojoCache.attach(fqn, pojo);
- if (add)
- pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "ADD");
-
- return o;
- }
-
- private Object detach(Object key)
- {
- return detach(key, false);
- }
-
- private Object detach(Object key, boolean remove)
- {
- Fqn fqn = AopUtil.constructFqn(getFqn(), key);
- if (remove)
- pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "REMOVE");
-
- return pojoCache.detach(fqn);
- }
-
- private Object getNoUnmask(Object key)
- {
- return pojoCache.getObject(AopUtil.constructFqn(getFqn(), key));
- }
-
- public int hashCode()
- {
- int result = super.hashCode();
- result = 29 * result + cache.hashCode();
- result = 29 * result + interceptor.hashCode();
- return result;
- }
-
- public boolean equals(Object o)
- {
- if (o == this)
- {
- return true;
- }
-
- try
- {
- return super.equals(o);
- }
- catch (ClassCastException e)
- {
- return false;
- }
- catch (NullPointerException unused)
- {
- return false;
- }
- }
-
- private class IteratorImpl implements Iterator
- {
- private Iterator<NodeSPI> iterator;
-
- private Node node;
- private Object o;
-
- private IteratorImpl(Node node)
- {
- Collection<NodeSPI> children = new HashSet<NodeSPI>(((NodeSPI) node).getChildrenDirect());
- iterator = children.iterator();
- }
-
- public boolean hasNext()
- {
- return iterator.hasNext();
- }
-
- public Object next()
- {
- node = iterator.next();
- o = Null.toNullValue(pojoCache.getObject(node.getFqn()));
- return o;
- }
-
- public void remove() throws IllegalStateException
- {
- if (node == null)
- {
- throw new IllegalStateException();
- }
- CachedSetImpl.this.remove(o);
- }
-
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CachedSetImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,291 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.collection;
+
+import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
+
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.jboss.cache.Cache;
+import org.jboss.cache.CacheException;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.cache.NodeSPI;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
+import org.jboss.cache.pojo.util.AopUtil;
+import org.jboss.cache.pojo.util.CacheApiUtil;
+import org.jboss.cache.pojo.util.Null;
+
+/**
+ * Set implementation that uses a cache as an underlying backend store.
+ * Set data is stored in children nodes named based on the attached Object's hash code
+ * in hexidecimal string form.
+ * If there are conflicts between two Objects with the same hash code, then a
+ * counter (upper 32 bits of 64) is used.
+ *
+ * @author Ben Wang
+ * @author Scott Marlow
+ * @author Jussi Pyorre
+ */
+public class CachedSetImpl extends AbstractSet
+{
+ private PojoCacheImpl pojoCache;
+ private Cache<Object, Object> cache;
+ private AbstractCollectionInterceptor interceptor;
+
+ public CachedSetImpl(PojoCacheImpl cache, AbstractCollectionInterceptor interceptor)
+ {
+ this.pojoCache = cache;
+ this.cache = pojoCache.getCache();
+ this.interceptor = interceptor;
+ }
+
+ private Set<Node> getNodeChildren()
+ {
+ return CacheApiUtil.getNodeChildren(cache, getFqn());
+ }
+
+ private Fqn getFqn()
+ {
+ // Cannot cache this as this can be reset
+ return interceptor.getFqn();
+ }
+
+ // java.util.Set implementation
+
+ public boolean add(Object o)
+ {
+ o = Null.toNullObject(o);
+ int hashCode = o.hashCode();
+ int size = size();
+ for (int i = 0; i < size + 1; i++)
+ {
+ Object key = toLong(hashCode, i);
+ Object o2 = getNoUnmask(key);
+ if (o2 == null)
+ {
+ attach(key, o, true);
+ return true;
+ }
+ if (o.equals(o2))
+ {
+ return false;
+ }
+ }
+ // should never reach here
+ throw new CacheException();
+ }
+
+ public void clear()
+ {
+ Set<Node> children = getNodeChildren();
+ for (Node n : children)
+ {
+ pojoCache.detach(n.getFqn());
+ }
+ }
+
+ public boolean contains(Object o)
+ {
+ o = Null.toNullObject(o);
+ int hashCode = o.hashCode();
+ int size = size();
+ for (int i = 0; i < size; i++)
+ {
+ Object key = toLong(hashCode, i);
+ Object o2 = getNoUnmask(key);
+ if (o2 == null)
+ {
+ return false;
+ }
+ if (o.equals(o2))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Iterator iterator()
+ {
+ Node node = cache.getRoot().getChild(getFqn());
+ if (node == null)
+ {
+ return Collections.EMPTY_SET.iterator();
+ }
+ return new IteratorImpl(node);
+ }
+
+ public boolean remove(Object o)
+ {
+ o = Null.toNullObject(o);
+ int hashCode = o.hashCode();
+ int size = size();
+ boolean removed = false;
+ Object oldkey = null;
+ for (int i = 0; i < size; i++)
+ {
+ Object key = toLong(hashCode, i);
+ Object o2 = getNoUnmask(key);
+ if (o2 == null)
+ {
+ break;
+ }
+ if (removed)
+ {
+ // move o2 to old key
+ detach(key);
+ attach(oldkey, o2);
+ }
+ if (o.equals(o2))
+ {
+ detach(key, true);
+ removed = true;
+ }
+ oldkey = key;
+ }
+ return removed;
+ }
+
+ public int size()
+ {
+ Set<Node> children = getNodeChildren();
+ return (children == null) ? 0 : children.size();
+ }
+
+ public String toString()
+ {
+ StringBuffer buf = new StringBuffer();
+ for (Iterator it = iterator(); it.hasNext();)
+ {
+ Object key = it.next();
+ if (key == interceptor.getBoundProxy())
+ key = "(this set)";
+ buf.append("[").append(key).append("]");
+ if (it.hasNext()) buf.append(", ");
+ }
+
+ return buf.toString();
+ }
+
+ /**
+ * Return a long with "count" as the high 32 bits.
+ * TODO should be able to use java.lang.Long, but some CacheLoader don't
+ * support non-String keys
+ */
+ private String toLong(long hashCode, long count)
+ {
+ long key = (hashCode & 0xFFFFL) | (count << 32);
+ return Long.toHexString(key);
+ }
+
+
+ private Object attach(Object key, Object pojo)
+ {
+ return attach(key, pojo, false);
+ }
+
+ private Object attach(Object key, Object pojo, boolean add)
+ {
+ Fqn fqn = AopUtil.constructFqn(getFqn(), key);
+ Object o = pojoCache.attach(fqn, pojo);
+ if (add)
+ pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "ADD");
+
+ return o;
+ }
+
+ private Object detach(Object key)
+ {
+ return detach(key, false);
+ }
+
+ private Object detach(Object key, boolean remove)
+ {
+ Fqn fqn = AopUtil.constructFqn(getFqn(), key);
+ if (remove)
+ pojoCache.getCache().put(fqn, POJOCACHE_OPERATION, "REMOVE");
+
+ return pojoCache.detach(fqn);
+ }
+
+ private Object getNoUnmask(Object key)
+ {
+ return pojoCache.find(AopUtil.constructFqn(getFqn(), key));
+ }
+
+ public int hashCode()
+ {
+ int result = super.hashCode();
+ result = 29 * result + cache.hashCode();
+ result = 29 * result + interceptor.hashCode();
+ return result;
+ }
+
+ public boolean equals(Object o)
+ {
+ if (o == this)
+ {
+ return true;
+ }
+
+ try
+ {
+ return super.equals(o);
+ }
+ catch (ClassCastException e)
+ {
+ return false;
+ }
+ catch (NullPointerException unused)
+ {
+ return false;
+ }
+ }
+
+ private class IteratorImpl implements Iterator
+ {
+ private Iterator<NodeSPI> iterator;
+
+ private Node node;
+ private Object o;
+
+ private IteratorImpl(Node node)
+ {
+ Collection<NodeSPI> children = new HashSet<NodeSPI>(((NodeSPI) node).getChildrenDirect());
+ iterator = children.iterator();
+ }
+
+ public boolean hasNext()
+ {
+ return iterator.hasNext();
+ }
+
+ public Object next()
+ {
+ node = iterator.next();
+ o = Null.toNullValue(pojoCache.find(node.getFqn()));
+ return o;
+ }
+
+ public void remove() throws IllegalStateException
+ {
+ if (node == null)
+ {
+ throw new IllegalStateException();
+ }
+ CachedSetImpl.this.remove(o);
+ }
+
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,210 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.collection;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.AspectManager;
-import org.jboss.aop.InstanceAdvisor;
-import org.jboss.aop.advice.AdviceBinding;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.aop.pointcut.ast.ParseException;
-import org.jboss.aop.proxy.ClassProxy;
-import org.jboss.aop.proxy.ClassProxyFactory;
-import org.jboss.aop.util.MethodHashing;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.CachedListInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.CachedMapInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.CachedSetInterceptor;
-import org.jboss.cache.pojo.util.AopUtil;
-
-/**
- * CollectionInterceptorUtil contains helper methods for the interceptors of
- * the different collection types.
- *
- * @author <a href="mailto:harald@gliebe.de">Harald Gliebe</a>
- * @author Ben Wang
- */
-public class CollectionInterceptorUtil
-{
- private static Log log = LogFactory.getLog(CollectionInterceptorUtil.class.getName());
-
- private static ClassProxy createProxy(Class clazz, AbstractCollectionInterceptor interceptor)
- throws Exception
- {
- ClassProxy result = ClassProxyFactory.newInstance(clazz, null, true);
- InstanceAdvisor advisor = result._getInstanceAdvisor();
- advisor.appendInterceptor(interceptor);
-
- return result;
- }
-
- public static ClassProxy createMapProxy(PojoCacheImpl cache, Fqn fqn, Class clazz, Map obj) throws Exception
- {
- return CollectionInterceptorUtil.createProxy(clazz, new CachedMapInterceptor(cache, fqn, clazz, obj));
- }
-
- public static ClassProxy createListProxy(PojoCacheImpl cache, Fqn fqn, Class clazz, List obj) throws Exception
- {
- return CollectionInterceptorUtil.createProxy(clazz, new CachedListInterceptor(cache, fqn, clazz, obj));
- }
-
- public static ClassProxy createSetProxy(PojoCacheImpl cache, Fqn fqn, Class clazz, Set obj) throws Exception
- {
- return CollectionInterceptorUtil.createProxy(clazz, new CachedSetInterceptor(cache, fqn, clazz, obj));
- }
-
- public static AbstractCollectionInterceptor getInterceptor(ClassProxy proxy)
- {
- InstanceAdvisor advisor = proxy._getInstanceAdvisor();
- return (AbstractCollectionInterceptor) AopUtil.findCollectionInterceptor(advisor);
- }
-
- public static Map getMethodMap(Class clazz)
- {
- Map result = ClassProxyFactory.getMethodMap(clazz.getName());
- if (result == null)
- {
- try
- {
- ClassProxyFactory.newInstance(clazz);
- }
- catch (Exception e)
- {
- throw new PojoCacheException(e);
- }
- result = ClassProxyFactory.getMethodMap(clazz.getName());
- }
- return result;
- }
-
- public static Map getManagedMethods(Class clazz)
- {
- Method tostring = null;
- try
- {
- tostring = Object.class.getDeclaredMethod("toString", new Class[0]);
- }
- catch (NoSuchMethodException e)
- {
- throw new PojoCacheException(e);
- }
-
- Map managedMethods = new HashMap();
- try
- {
- Method[] methods = clazz.getDeclaredMethods();
- for (int i = 0; i < methods.length; i++)
- {
- long hash = MethodHashing.methodHash(methods[i]);
- managedMethods.put(hash, methods[i]);
- }
- // Add toString to ManagedMethod
- long hash = MethodHashing.methodHash(tostring);
- managedMethods.put(hash, tostring);
- }
- catch (Exception ignored)
- {
- log.trace(ignored, ignored);
- }
- return managedMethods;
- }
-
- private static boolean skipVerify(Method method)
- {
- String name = method.getName();
- Class<?>[] types = method.getParameterTypes();
- if ("toString".equals(name) && types.length == 0)
- return true;
-
- return false;
- }
-
- public static Object invoke(Invocation invocation,
- AbstractCollectionInterceptor interceptor,
- Object impl,
- Map methodMap, Map managedMethods)
- throws Throwable
- {
-
- try
- {
- if (invocation instanceof MethodInvocation)
- {
- MethodInvocation methodInvocation = (MethodInvocation) invocation;
- Long methodHash = methodInvocation.getMethodHash();
- Method method = (Method) managedMethods.get(methodHash);
- if (log.isTraceEnabled() && method != null)
- {
- log.trace("invoke(): method intercepted " + method.getName());
- }
-
- if (writeReplaceInvocation(methodInvocation)) {
- if (!skipVerify(methodInvocation.getMethod()))
- interceptor.verifyAttached(impl);
-
- return interceptor.getSerializationCopy();
- }
-
- Object[] args = methodInvocation.getArguments();
- if (method != null)
- {
- if (!skipVerify(method))
- interceptor.verifyAttached(impl);
-
- return method.invoke(impl, args);
- } else
- {
- method = methodInvocation.getMethod();
- if (method == null)
- {
- method = (Method) methodMap.get(methodHash);
- }
-
- if (log.isTraceEnabled())
- log.trace("invoke(): non-managed method: " + method.toString());
- Object target = methodInvocation.getTargetObject();
- if (target == null)
- {
- throw new PojoCacheException("CollectionInterceptorUtil.invoke(): targetObject is null." +
- " Can't invoke " + method.toString());
- }
- return method.invoke(target, args);
- // return method.invoke(interceptor, args);
- }
- }
- }
- catch (InvocationTargetException e)
- {
- if (e.getCause() != null)
- throw e.getCause();
- else if (e.getTargetException() != null)
- throw e.getTargetException();
- throw e;
- }
-
- return invocation.invokeNext();
- }
-
- private static boolean writeReplaceInvocation(MethodInvocation methodInvocation)
- {
- Method method = methodInvocation.getMethod();
- return "writeReplace".equals(method.getName()) && method.getParameterTypes().length == 0;
- }
-
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/collection/CollectionInterceptorUtil.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,211 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.collection;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.AspectManager;
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.advice.AdviceBinding;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.joinpoint.MethodInvocation;
+import org.jboss.aop.pointcut.ast.ParseException;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.aop.proxy.ClassProxyFactory;
+import org.jboss.aop.util.MethodHashing;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.CachedListInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.CachedMapInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.CachedSetInterceptor;
+import org.jboss.cache.pojo.util.AopUtil;
+
+/**
+ * CollectionInterceptorUtil contains helper methods for the interceptors of
+ * the different collection types.
+ *
+ * @author <a href="mailto:harald@gliebe.de">Harald Gliebe</a>
+ * @author Ben Wang
+ */
+public class CollectionInterceptorUtil
+{
+ private static Log log = LogFactory.getLog(CollectionInterceptorUtil.class.getName());
+
+ private static ClassProxy createProxy(Class clazz, AbstractCollectionInterceptor interceptor)
+ throws Exception
+ {
+ ClassProxy result = ClassProxyFactory.newInstance(clazz, null, true);
+ InstanceAdvisor advisor = result._getInstanceAdvisor();
+ advisor.appendInterceptor(interceptor);
+ interceptor.setBoundProxy(result);
+
+ return result;
+ }
+
+ public static ClassProxy createMapProxy(PojoCacheImpl cache, Fqn fqn, Class clazz, Map obj) throws Exception
+ {
+ return CollectionInterceptorUtil.createProxy(clazz, new CachedMapInterceptor(cache, fqn, clazz, obj));
+ }
+
+ public static ClassProxy createListProxy(PojoCacheImpl cache, Fqn fqn, Class clazz, List obj) throws Exception
+ {
+ return CollectionInterceptorUtil.createProxy(clazz, new CachedListInterceptor(cache, fqn, clazz, obj));
+ }
+
+ public static ClassProxy createSetProxy(PojoCacheImpl cache, Fqn fqn, Class clazz, Set obj) throws Exception
+ {
+ return CollectionInterceptorUtil.createProxy(clazz, new CachedSetInterceptor(cache, fqn, clazz, obj));
+ }
+
+ public static AbstractCollectionInterceptor getInterceptor(ClassProxy proxy)
+ {
+ InstanceAdvisor advisor = proxy._getInstanceAdvisor();
+ return (AbstractCollectionInterceptor) AopUtil.findCollectionInterceptor(advisor);
+ }
+
+ public static Map getMethodMap(Class clazz)
+ {
+ Map result = ClassProxyFactory.getMethodMap(clazz.getName());
+ if (result == null)
+ {
+ try
+ {
+ ClassProxyFactory.newInstance(clazz);
+ }
+ catch (Exception e)
+ {
+ throw new PojoCacheException(e);
+ }
+ result = ClassProxyFactory.getMethodMap(clazz.getName());
+ }
+ return result;
+ }
+
+ public static Map getManagedMethods(Class clazz)
+ {
+ Method tostring = null;
+ try
+ {
+ tostring = Object.class.getDeclaredMethod("toString", new Class[0]);
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new PojoCacheException(e);
+ }
+
+ Map managedMethods = new HashMap();
+ try
+ {
+ Method[] methods = clazz.getDeclaredMethods();
+ for (int i = 0; i < methods.length; i++)
+ {
+ long hash = MethodHashing.methodHash(methods[i]);
+ managedMethods.put(hash, methods[i]);
+ }
+ // Add toString to ManagedMethod
+ long hash = MethodHashing.methodHash(tostring);
+ managedMethods.put(hash, tostring);
+ }
+ catch (Exception ignored)
+ {
+ log.trace(ignored, ignored);
+ }
+ return managedMethods;
+ }
+
+ private static boolean skipVerify(Method method)
+ {
+ String name = method.getName();
+ Class<?>[] types = method.getParameterTypes();
+ if ("toString".equals(name) && types.length == 0)
+ return true;
+
+ return false;
+ }
+
+ public static Object invoke(Invocation invocation,
+ AbstractCollectionInterceptor interceptor,
+ Object impl,
+ Map methodMap, Map managedMethods)
+ throws Throwable
+ {
+
+ try
+ {
+ if (invocation instanceof MethodInvocation)
+ {
+ MethodInvocation methodInvocation = (MethodInvocation) invocation;
+ Long methodHash = methodInvocation.getMethodHash();
+ Method method = (Method) managedMethods.get(methodHash);
+ if (log.isTraceEnabled() && method != null)
+ {
+ log.trace("invoke(): method intercepted " + method.getName());
+ }
+
+ if (writeReplaceInvocation(methodInvocation)) {
+ if (!skipVerify(methodInvocation.getMethod()))
+ interceptor.verifyAttached(impl);
+
+ return interceptor.getSerializationCopy();
+ }
+
+ Object[] args = methodInvocation.getArguments();
+ if (method != null)
+ {
+ if (!skipVerify(method))
+ interceptor.verifyAttached(impl);
+
+ return method.invoke(impl, args);
+ } else
+ {
+ method = methodInvocation.getMethod();
+ if (method == null)
+ {
+ method = (Method) methodMap.get(methodHash);
+ }
+
+ if (log.isTraceEnabled())
+ log.trace("invoke(): non-managed method: " + method.toString());
+ Object target = methodInvocation.getTargetObject();
+ if (target == null)
+ {
+ throw new PojoCacheException("CollectionInterceptorUtil.invoke(): targetObject is null." +
+ " Can't invoke " + method.toString());
+ }
+ return method.invoke(target, args);
+ // return method.invoke(interceptor, args);
+ }
+ }
+ }
+ catch (InvocationTargetException e)
+ {
+ if (e.getCause() != null)
+ throw e.getCause();
+ else if (e.getTargetException() != null)
+ throw e.getTargetException();
+ throw e;
+ }
+
+ return invocation.invokeNext();
+ }
+
+ private static boolean writeReplaceInvocation(MethodInvocation methodInvocation)
+ {
+ Method method = methodInvocation.getMethod();
+ return "writeReplace".equals(method.getName()) && method.getParameterTypes().length == 0;
+ }
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,257 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.cache.pojo.impl;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.Advised;
-import org.jboss.aop.ClassInstanceAdvisor;
-import org.jboss.aop.InstanceAdvisor;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.interceptors.dynamic.BaseInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
-import org.jboss.cache.pojo.memory.FieldPersistentReference;
-import org.jboss.cache.pojo.util.AopUtil;
-import org.jboss.cache.pojo.util.Instantiator;
-import org.jboss.cache.pojo.util.ObjectUtil;
-
-/**
- * Handling the advised pojo operations. No consideration of object graph here.
- *
- * @author Ben Wang
- * Date: Aug 4, 2005
- * @version $Id$
- */
-class AdvisedPojoHandler extends AbstractHandler
-{
- private final Log log = LogFactory.getLog(AdvisedPojoHandler.class);
- private Cache<Object, Object> cache_;
- private PojoCacheImpl pCache_;
- private PojoUtil util_;
-
- public AdvisedPojoHandler(PojoCacheImpl pCache, InternalHelper internal,
- PojoUtil util)
- {
- pCache_ = pCache;
- cache_ = pCache_.getCache();
- util_ = util;
- }
-
- @Override
- protected Fqn<?> getFqn(Object obj)
- {
- if (obj instanceof Advised)
- {
- InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
- if (advisor == null)
- throw new PojoCacheException("_putObject(): InstanceAdvisor is null for: " + obj);
-
- // Step Check for cross references
- BaseInterceptor interceptor = AopUtil.findCacheInterceptor(advisor);
- if (interceptor != null)
- return interceptor.getFqn();
- }
-
- return null;
- }
-
- @Override
- protected Object get(Fqn<?> fqn, Class<?> clazz, PojoInstance pojoInstance) throws CacheException
- {
- CachedType type = pCache_.getCachedType(clazz);
- Object obj = Instantiator.newInstance(clazz);
-
- // Eager initialize final fields, since these may not be intercepted
-
- try
- {
- for (FieldPersistentReference ref : type.getFinalFields())
- {
- Field field = ref.getField();
- Object result;
-
- if (CachedType.isSimpleAttribute(field))
- result = cache_.get(fqn, field.getName());
- else
- result = pCache_.getObject(fqn, field.getName(), obj);
-
- field.set(obj, result);
- }
- }
- catch (Exception e)
- {
- log.warn("Could not initialize final fields on object: " + ObjectUtil.identityString(obj));
- }
-
- InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
- CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
- interceptor.setAopInstance(pojoInstance);
- util_.attachInterceptor(obj, advisor, interceptor);
- return obj;
- }
-
- @Override
- protected void put(Fqn<?> fqn, Fqn<?> referencingFqn, Object obj) throws CacheException
- {
- CachedType type = pCache_.getCachedType(obj.getClass());
- // We have a clean slate then.
- InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
- // TODO workaround for deserialiased objects
- if (advisor == null)
- {
- advisor = new ClassInstanceAdvisor(obj);
- ((Advised) obj)._setInstanceAdvisor(advisor);
- }
-
- // Let's do batch update via Map instead
- Map map = new HashMap();
- // Always initialize the ref count so we can mark this as an AopNode.
- PojoInstance pojoInstance = InternalHelper.initializeAopInstance(referencingFqn);
- map.put(PojoInstance.KEY, pojoInstance);
- pojoInstance.setPojoClass(type.getType());
- // we will do it recursively.
- // Map of sub-objects that are non-primitive
- Map subPojoMap = new HashMap();
-
- for (Iterator i = type.getFields().iterator(); i.hasNext();)
- {
- Field field = (Field) (((FieldPersistentReference) i.next())).get();
- Object value = null;
- try
- {
- value = field.get(obj);
- }
- catch (IllegalAccessException e)
- {
- throw new CacheException("field access failed", e);
- }
-
- // we simply treat field that has @Serializable as a primitive type.
- if (CachedType.isSimpleAttribute(field))
- {
- // switched using batch update
- map.put(field.getName(), value);
- }
- else
- {
- subPojoMap.put(field, value);
- }
- }
-
- // Use option to skip locking since we have parent lock already.
-// cache_.getInvocationContext().getOptionOverrides().setSuppressLocking(true);
-
- cache_.getRoot().addChild(fqn).putAll(map);
-
- // Insert interceptor after PojoInstance has been written to the cache
- // This prevents JBCACHE-1078 with pessimistic locking, optimistic is still a problem
- CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
- interceptor.setAopInstance(pojoInstance);
- util_.attachInterceptor(obj, advisor, interceptor);
-
-// cache_.getInvocationContext().getOptionOverrides().setSuppressLocking(false);
- // This is in-memory operation only
- InternalHelper.setPojo(pojoInstance, obj);
-
- for (Object o : subPojoMap.keySet())
- {
- Field field = (Field) o;
- Object value = subPojoMap.get(field);
- if (value == null) continue; // really no need to map the POJO.
- pCache_.attach(fqn, value, field.getName(), obj);
- // If it is Collection classes, we replace it with dynamic proxy.
- // But we will have to ignore it if value is null
- if (value instanceof Map || value instanceof List || value instanceof Set)
- {
- Object newValue = pCache_.getObject(fqn, field.getName(), obj);
- util_.inMemorySubstitution(obj, field, newValue);
- }
- }
-
- // Need to make sure this is behind put such that obj.toString is done correctly.
- if (log.isDebugEnabled())
- {
- log.debug("internalPut(): inserting with fqn: " + fqn);
- }
- }
-
- @Override
- protected Object remove(Fqn<?> fqn, Fqn<?> referencingFqn, Object result) throws CacheException
- {
- CachedType type = pCache_.getCachedType(result.getClass());
- InstanceAdvisor advisor = ((Advised) result)._getInstanceAdvisor();
- for (Iterator i = type.getFields().iterator(); i.hasNext();)
- {
- Field field = (Field) (((FieldPersistentReference) i.next())).get();
- Object value = null;
-
- if (! CachedType.isSimpleAttribute(field))
- {
- value = pCache_.detach(fqn, field.getName(), result);
-
- // Check for Collection. If it is, we need to reset the original reference.
- if ((value instanceof Map || value instanceof List || value instanceof Set))
- {
- // If this Collection class, we are returning the original value already
- util_.inMemorySubstitution(result, field, value);
- }
- }
- else
- {
- // Update last known field state
- value = cache_.get(fqn, field.getName());
- util_.inMemorySubstitution(result, field, value);
- }
- }
-
- cache_.removeNode(fqn);
- // Determine if we want to keep the interceptor for later use.
- CacheFieldInterceptor interceptor = (CacheFieldInterceptor) AopUtil.findCacheInterceptor(advisor);
- // Remember to remove the interceptor from in-memory object but make sure it belongs to me first.
- if (interceptor != null)
- {
- if (log.isDebugEnabled())
- {
- log.debug("regularRemoveObject(): removed cache interceptor fqn: " + fqn + " interceptor: " + interceptor);
- }
- util_.detachInterceptor(advisor, interceptor);
- }
-
- return result;
- }
-
- @Override
- protected boolean handles(Class<?> clazz)
- {
- return Advised.class.isAssignableFrom(clazz);
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,257 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.cache.pojo.impl;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.Advised;
+import org.jboss.aop.ClassInstanceAdvisor;
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.cache.Cache;
+import org.jboss.cache.CacheException;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.interceptors.dynamic.BaseInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
+import org.jboss.cache.pojo.memory.FieldPersistentReference;
+import org.jboss.cache.pojo.util.AopUtil;
+import org.jboss.cache.pojo.util.Instantiator;
+import org.jboss.cache.pojo.util.ObjectUtil;
+
+/**
+ * Handling the advised pojo operations. No consideration of object graph here.
+ *
+ * @author Ben Wang
+ * Date: Aug 4, 2005
+ * @version $Id$
+ */
+class AdvisedPojoHandler extends AbstractHandler
+{
+ private final Log log = LogFactory.getLog(AdvisedPojoHandler.class);
+ private Cache<Object, Object> cache_;
+ private PojoCacheImpl pCache_;
+ private PojoUtil util_;
+
+ public AdvisedPojoHandler(PojoCacheImpl pCache, InternalHelper internal,
+ PojoUtil util)
+ {
+ pCache_ = pCache;
+ cache_ = pCache_.getCache();
+ util_ = util;
+ }
+
+ @Override
+ protected Fqn<?> getFqn(Object obj)
+ {
+ if (obj instanceof Advised)
+ {
+ InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
+ if (advisor == null)
+ throw new PojoCacheException("_putObject(): InstanceAdvisor is null for: " + obj);
+
+ // Step Check for cross references
+ BaseInterceptor interceptor = AopUtil.findCacheInterceptor(advisor);
+ if (interceptor != null)
+ return interceptor.getFqn();
+ }
+
+ return null;
+ }
+
+ @Override
+ protected Object get(Fqn<?> fqn, Class<?> clazz, PojoInstance pojoInstance) throws CacheException
+ {
+ CachedType type = pCache_.getCachedType(clazz);
+ Object obj = Instantiator.newInstance(clazz);
+
+ // Eager initialize final fields, since these may not be intercepted
+
+ try
+ {
+ for (FieldPersistentReference ref : type.getFinalFields())
+ {
+ Field field = ref.getField();
+ Object result;
+
+ if (CachedType.isSimpleAttribute(field))
+ result = cache_.get(fqn, field.getName());
+ else
+ result = pCache_.find(fqn, field.getName(), obj);
+
+ field.set(obj, result);
+ }
+ }
+ catch (Exception e)
+ {
+ log.warn("Could not initialize final fields on object: " + ObjectUtil.identityString(obj));
+ }
+
+ InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
+ CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
+ interceptor.setAopInstance(pojoInstance);
+ util_.attachInterceptor(obj, advisor, interceptor);
+ return obj;
+ }
+
+ @Override
+ protected void put(Fqn<?> fqn, Fqn<?> referencingFqn, Object obj) throws CacheException
+ {
+ CachedType type = pCache_.getCachedType(obj.getClass());
+ // We have a clean slate then.
+ InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
+ // TODO workaround for deserialiased objects
+ if (advisor == null)
+ {
+ advisor = new ClassInstanceAdvisor(obj);
+ ((Advised) obj)._setInstanceAdvisor(advisor);
+ }
+
+ // Let's do batch update via Map instead
+ Map map = new HashMap();
+ // Always initialize the ref count so we can mark this as an AopNode.
+ PojoInstance pojoInstance = InternalHelper.initializeAopInstance(referencingFqn);
+ map.put(PojoInstance.KEY, pojoInstance);
+ pojoInstance.setPojoClass(type.getType());
+ // we will do it recursively.
+ // Map of sub-objects that are non-primitive
+ Map subPojoMap = new HashMap();
+
+ for (Iterator i = type.getFields().iterator(); i.hasNext();)
+ {
+ Field field = (Field) (((FieldPersistentReference) i.next())).get();
+ Object value = null;
+ try
+ {
+ value = field.get(obj);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new CacheException("field access failed", e);
+ }
+
+ // we simply treat field that has @Serializable as a primitive type.
+ if (CachedType.isSimpleAttribute(field))
+ {
+ // switched using batch update
+ map.put(field.getName(), value);
+ }
+ else
+ {
+ subPojoMap.put(field, value);
+ }
+ }
+
+ // Use option to skip locking since we have parent lock already.
+// cache_.getInvocationContext().getOptionOverrides().setSuppressLocking(true);
+
+ cache_.getRoot().addChild(fqn).putAll(map);
+
+ // Insert interceptor after PojoInstance has been written to the cache
+ // This prevents JBCACHE-1078 with pessimistic locking, optimistic is still a problem
+ CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
+ interceptor.setAopInstance(pojoInstance);
+ util_.attachInterceptor(obj, advisor, interceptor);
+
+// cache_.getInvocationContext().getOptionOverrides().setSuppressLocking(false);
+ // This is in-memory operation only
+ InternalHelper.setPojo(pojoInstance, obj);
+
+ for (Object o : subPojoMap.keySet())
+ {
+ Field field = (Field) o;
+ Object value = subPojoMap.get(field);
+ if (value == null) continue; // really no need to map the POJO.
+ pCache_.attach(fqn, value, field.getName(), obj);
+ // If it is Collection classes, we replace it with dynamic proxy.
+ // But we will have to ignore it if value is null
+ if (value instanceof Map || value instanceof List || value instanceof Set)
+ {
+ Object newValue = pCache_.find(fqn, field.getName(), obj);
+ util_.inMemorySubstitution(obj, field, newValue);
+ }
+ }
+
+ // Need to make sure this is behind put such that obj.toString is done correctly.
+ if (log.isDebugEnabled())
+ {
+ log.debug("internalPut(): inserting with fqn: " + fqn);
+ }
+ }
+
+ @Override
+ protected Object remove(Fqn<?> fqn, Fqn<?> referencingFqn, Object result) throws CacheException
+ {
+ CachedType type = pCache_.getCachedType(result.getClass());
+ InstanceAdvisor advisor = ((Advised) result)._getInstanceAdvisor();
+ for (Iterator i = type.getFields().iterator(); i.hasNext();)
+ {
+ Field field = (Field) (((FieldPersistentReference) i.next())).get();
+ Object value = null;
+
+ if (! CachedType.isSimpleAttribute(field))
+ {
+ value = pCache_.detach(fqn, field.getName(), result);
+
+ // Check for Collection. If it is, we need to reset the original reference.
+ if ((value instanceof Map || value instanceof List || value instanceof Set))
+ {
+ // If this Collection class, we are returning the original value already
+ util_.inMemorySubstitution(result, field, value);
+ }
+ }
+ else
+ {
+ // Update last known field state
+ value = cache_.get(fqn, field.getName());
+ util_.inMemorySubstitution(result, field, value);
+ }
+ }
+
+ cache_.removeNode(fqn);
+ // Determine if we want to keep the interceptor for later use.
+ CacheFieldInterceptor interceptor = (CacheFieldInterceptor) AopUtil.findCacheInterceptor(advisor);
+ // Remember to remove the interceptor from in-memory object but make sure it belongs to me first.
+ if (interceptor != null)
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("regularRemoveObject(): removed cache interceptor fqn: " + fqn + " interceptor: " + interceptor);
+ }
+ util_.detachInterceptor(advisor, interceptor);
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean handles(Class<?> clazz)
+ {
+ return Advised.class.isAssignableFrom(clazz);
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,293 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.jboss.cache.pojo.impl;
-
-import static org.jboss.cache.notifications.event.Event.Type.TRANSACTION_COMPLETED;
-import static org.jboss.cache.notifications.event.Event.Type.TRANSACTION_REGISTERED;
-import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
-import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_STATUS;
-
-import java.lang.reflect.Field;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.transaction.Transaction;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.notifications.annotation.CacheListener;
-import org.jboss.cache.notifications.annotation.NodeModified;
-import org.jboss.cache.notifications.annotation.TransactionCompleted;
-import org.jboss.cache.notifications.annotation.TransactionRegistered;
-import org.jboss.cache.notifications.event.NodeModifiedEvent;
-import org.jboss.cache.notifications.event.TransactionalEvent;
-import org.jboss.cache.notifications.event.NodeModifiedEvent.ModificationType;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.interceptors.PojoTxLockInterceptor;
-import org.jboss.cache.pojo.notification.NotificationContext;
-import org.jboss.cache.pojo.notification.event.ArrayModifiedEvent;
-import org.jboss.cache.pojo.notification.event.AttachedEvent;
-import org.jboss.cache.pojo.notification.event.DetachedEvent;
-import org.jboss.cache.pojo.notification.event.Event;
-import org.jboss.cache.pojo.notification.event.FieldModifiedEvent;
-import org.jboss.cache.pojo.notification.event.ListModifiedEvent;
-import org.jboss.cache.pojo.notification.event.MapModifiedEvent;
-import org.jboss.cache.pojo.notification.event.SetModifiedEvent;
-import org.jboss.cache.pojo.notification.event.TransactionCompletedEvent;
-import org.jboss.cache.pojo.notification.event.TransactionRegisteredEvent;
-
-// $Id$
-
-/**
- * Adapts the core cache listener API into the POJO listener API.
- *
- * @author Jason T. Greene
- */
-@CacheListener
-public class CacheListenerAdaptor
-{
- private static final HashSet<String> internalKeys = new HashSet<String>();
- private static final Log log = LogFactory.getLog(CacheListenerAdaptor.class);
-
- static
- {
- internalKeys.add(POJOCACHE_STATUS);
- internalKeys.add(POJOCACHE_OPERATION);
- internalKeys.add(PojoInstance.KEY);
- internalKeys.add(PojoReference.KEY);
- internalKeys.add(PojoTxLockInterceptor.LOCK_KEY);
- }
-
- private PojoCacheImpl cache;
- private NotificationDispatcher dispatcher = new NotificationDispatcher();
-
- public CacheListenerAdaptor(PojoCacheImpl cache)
- {
- this.cache = cache;
- }
-
- public PojoCache getPojoCache()
- {
- return this.cache;
- }
-
- private FieldModifiedEvent createModifyEvent(NotificationContext context, Fqn fqn, String key, Object value, boolean local)
- {
- if (value instanceof PojoReference)
- value = cache.find(((PojoReference) value).getFqn().toString());
-
- Object o = cache.find(fqn.toString());
- // Detached
- if (o == null)
- return null;
-
- Field f;
- try
- {
- f = o.getClass().getDeclaredField(key);
- }
- catch (NoSuchFieldException e)
- {
- if (log.isWarnEnabled())
- log.warn("Could not get field " + key + " on class " + o.getClass());
- return null;
- }
-
- return new FieldModifiedEvent(context, o, f, value, local);
- }
-
- private NotificationContext createContext(final TransactionalEvent event)
- {
- return new NotificationContext()
- {
-
- public PojoCache getPojoCache()
- {
- return CacheListenerAdaptor.this.getPojoCache();
- }
-
- public Transaction getTransaction()
- {
- return event.getTransaction();
- }
- };
- }
-
- private void sendNotification(Event notification, Set<NotificationDispatcher.Entry> listeners)
- {
- if (notification == null)
- return;
-
- if (listeners == null)
- dispatcher.dispatch(notification);
- else
- dispatcher.dispatch(notification, listeners);
- }
-
- @TransactionCompleted
- @TransactionRegistered
- public void handleTransaction(TransactionalEvent event)
- {
- if (event.getType() == TRANSACTION_COMPLETED)
- {
- boolean successful = ((org.jboss.cache.notifications.event.TransactionCompletedEvent) event).isSuccessful();
- sendNotification(new TransactionCompletedEvent(createContext(event), successful, event.isOriginLocal()), null);
- }
- else if (event.getType() == TRANSACTION_REGISTERED)
- {
- sendNotification(new TransactionRegisteredEvent(createContext(event), event.isOriginLocal()), null);
- }
- }
-
- @NodeModified
- public void nodeModified(NodeModifiedEvent event)
- {
- Map<Object, Object> data = event.getData();
- boolean pre = event.isPre();
- Fqn fqn = event.getFqn();
- ModificationType modType = event.getModificationType();
- boolean isLocal = event.isOriginLocal();
-
- if (pre)
- return;
-
- //System.out.println(fqn + " " + modType + " " + data);
-
- // If we are filtering, don't load as much as possible
- Set<NotificationDispatcher.Entry> matched = null;
- if (dispatcher.hasFilters())
- {
- matched = matchListeners(fqn);
- if (matched != null && matched.isEmpty())
- return;
- }
-
- if (modType == ModificationType.PUT_DATA)
- {
- if ("ATTACHED".equals(data.get(POJOCACHE_STATUS)))
- {
- Object o = cache.find(fqn.toString());
- sendNotification(new AttachedEvent(createContext(event), o, isLocal), matched);
- }
- else if ("DETACHING".equals(data.get(POJOCACHE_STATUS)))
- {
- Object o = cache.find(fqn.toString());
- sendNotification(new DetachedEvent(createContext(event), o, isLocal), matched);
- }
- else if (data.containsKey(POJOCACHE_OPERATION))
- {
- Object collection = cache.find(fqn.getParent().toString());
- if (collection instanceof List)
- {
- int i = Integer.parseInt(fqn.getLastElementAsString());
- ListModifiedEvent.Operation operation = ListModifiedEvent.Operation.valueOf(data.get(POJOCACHE_OPERATION).toString());
- Object value = cache.find(fqn.toString());
- sendNotification(new ListModifiedEvent(createContext(event), (List) collection, operation, i, value, isLocal), matched);
- }
- else if (collection instanceof Set)
- {
- SetModifiedEvent.Operation operation = SetModifiedEvent.Operation.valueOf(data.get(POJOCACHE_OPERATION).toString());
- Object value = cache.find(fqn.toString());
- sendNotification(new SetModifiedEvent(createContext(event), (Set) collection, operation, value, isLocal), matched);
- }
- else if (collection instanceof Map)
- {
- MapModifiedEvent.Operation operation = MapModifiedEvent.Operation.valueOf(data.get(POJOCACHE_OPERATION).toString());
- Object value = cache.find(fqn.toString());
- sendNotification(new MapModifiedEvent(createContext(event), (Map) collection, operation, fqn.getLastElement(), value, isLocal), matched);
- }
- else if (collection instanceof Object[]) {
- int i = Integer.parseInt(fqn.getLastElementAsString());
- Object value = cache.find(fqn.toString());
- sendNotification(new ArrayModifiedEvent(createContext(event), collection, i, value, isLocal), matched);
- }
- }
- else if ("ATTACHED".equals(cache.getCache().get(fqn, POJOCACHE_STATUS)))
- {
- for (Map.Entry entry : data.entrySet())
- {
- String key = entry.getKey().toString();
- Object value = entry.getValue();
-
- if (internalKeys.contains(key))
- continue;
-
- sendNotification(createModifyEvent(createContext(event), fqn, key, value, isLocal), matched);
- }
- }
- }
- else if (modType == ModificationType.REMOVE_DATA)
- {
- for (Map.Entry entry : data.entrySet())
- {
- String key = entry.getKey().toString();
- if (internalKeys.contains(key))
- continue;
-
- sendNotification(createModifyEvent(createContext(event), fqn, key, null, isLocal), matched);
- }
- }
- }
-
- private Set<NotificationDispatcher.Entry> matchListeners(Fqn fqn)
- {
- PojoInstance instance = (PojoInstance) cache.getCache().get(fqn, PojoInstance.KEY);
- if (instance != null)
- return dispatcher.getListenerEntries(instance.getReferences());
-
- return null;
- }
-
- public boolean isEmpty()
- {
- return dispatcher.isEmpty();
- }
-
- public Collection<Object> getListeners()
- {
- return dispatcher.getListeners();
- }
-
- public void addListener(Object listener)
- {
- dispatcher.add(listener);
- }
-
- public void addListener(Object listener, Pattern pattern)
- {
- if (pattern == null)
- dispatcher.add(listener);
- else
- dispatcher.add(listener, pattern);
- }
-
- public void removeListener(Object listener)
- {
- dispatcher.remove(listener);
- }
-}
\ No newline at end of file
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/CacheListenerAdaptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,293 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.cache.pojo.impl;
+
+import static org.jboss.cache.notifications.event.Event.Type.TRANSACTION_COMPLETED;
+import static org.jboss.cache.notifications.event.Event.Type.TRANSACTION_REGISTERED;
+import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_OPERATION;
+import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_STATUS;
+import static org.jboss.cache.pojo.impl.InternalConstant.POJOCACHE_LOCK;
+
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import javax.transaction.Transaction;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.notifications.annotation.CacheListener;
+import org.jboss.cache.notifications.annotation.NodeModified;
+import org.jboss.cache.notifications.annotation.TransactionCompleted;
+import org.jboss.cache.notifications.annotation.TransactionRegistered;
+import org.jboss.cache.notifications.event.NodeModifiedEvent;
+import org.jboss.cache.notifications.event.TransactionalEvent;
+import org.jboss.cache.notifications.event.NodeModifiedEvent.ModificationType;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.notification.NotificationContext;
+import org.jboss.cache.pojo.notification.event.ArrayModifiedEvent;
+import org.jboss.cache.pojo.notification.event.AttachedEvent;
+import org.jboss.cache.pojo.notification.event.DetachedEvent;
+import org.jboss.cache.pojo.notification.event.Event;
+import org.jboss.cache.pojo.notification.event.FieldModifiedEvent;
+import org.jboss.cache.pojo.notification.event.ListModifiedEvent;
+import org.jboss.cache.pojo.notification.event.MapModifiedEvent;
+import org.jboss.cache.pojo.notification.event.SetModifiedEvent;
+import org.jboss.cache.pojo.notification.event.TransactionCompletedEvent;
+import org.jboss.cache.pojo.notification.event.TransactionRegisteredEvent;
+
+// $Id$
+
+/**
+ * Adapts the core cache listener API into the POJO listener API.
+ *
+ * @author Jason T. Greene
+ */
+@CacheListener
+public class CacheListenerAdaptor
+{
+ private static final HashSet<String> internalKeys = new HashSet<String>();
+ private static final Log log = LogFactory.getLog(CacheListenerAdaptor.class);
+
+ static
+ {
+ internalKeys.add(POJOCACHE_STATUS);
+ internalKeys.add(POJOCACHE_OPERATION);
+ internalKeys.add(PojoInstance.KEY);
+ internalKeys.add(PojoReference.KEY);
+ internalKeys.add(POJOCACHE_LOCK);
+ }
+
+ private PojoCacheImpl cache;
+ private NotificationDispatcher dispatcher = new NotificationDispatcher();
+
+ public CacheListenerAdaptor(PojoCacheImpl cache)
+ {
+ this.cache = cache;
+ }
+
+ public PojoCache getPojoCache()
+ {
+ return this.cache;
+ }
+
+ private FieldModifiedEvent createModifyEvent(NotificationContext context, Fqn fqn, String key, Object value, boolean local)
+ {
+ if (value instanceof PojoReference)
+ value = cache.find(((PojoReference) value).getFqn().toString());
+
+ Object o = cache.find(fqn.toString());
+ // Detached
+ if (o == null)
+ return null;
+
+ Field f;
+ try
+ {
+ f = o.getClass().getDeclaredField(key);
+ }
+ catch (NoSuchFieldException e)
+ {
+ if (log.isWarnEnabled())
+ log.warn("Could not get field " + key + " on class " + o.getClass());
+ return null;
+ }
+
+ return new FieldModifiedEvent(context, o, f, value, local);
+ }
+
+ private NotificationContext createContext(final TransactionalEvent event)
+ {
+ return new NotificationContext()
+ {
+
+ public PojoCache getPojoCache()
+ {
+ return CacheListenerAdaptor.this.getPojoCache();
+ }
+
+ public Transaction getTransaction()
+ {
+ return event.getTransaction();
+ }
+ };
+ }
+
+ private void sendNotification(Event notification, Set<NotificationDispatcher.Entry> listeners)
+ {
+ if (notification == null)
+ return;
+
+ if (listeners == null)
+ dispatcher.dispatch(notification);
+ else
+ dispatcher.dispatch(notification, listeners);
+ }
+
+ @TransactionCompleted
+ @TransactionRegistered
+ public void handleTransaction(TransactionalEvent event)
+ {
+ if (event.getType() == TRANSACTION_COMPLETED)
+ {
+ boolean successful = ((org.jboss.cache.notifications.event.TransactionCompletedEvent) event).isSuccessful();
+ sendNotification(new TransactionCompletedEvent(createContext(event), successful, event.isOriginLocal()), null);
+ }
+ else if (event.getType() == TRANSACTION_REGISTERED)
+ {
+ sendNotification(new TransactionRegisteredEvent(createContext(event), event.isOriginLocal()), null);
+ }
+ }
+
+ @NodeModified
+ public void nodeModified(NodeModifiedEvent event)
+ {
+ Map<Object, Object> data = event.getData();
+ boolean pre = event.isPre();
+ Fqn fqn = event.getFqn();
+ ModificationType modType = event.getModificationType();
+ boolean isLocal = event.isOriginLocal();
+
+ if (pre)
+ return;
+
+ //System.out.println(fqn + " " + modType + " " + data);
+
+ // If we are filtering, don't load as much as possible
+ Set<NotificationDispatcher.Entry> matched = null;
+ if (dispatcher.hasFilters())
+ {
+ matched = matchListeners(fqn);
+ if (matched != null && matched.isEmpty())
+ return;
+ }
+
+ if (modType == ModificationType.PUT_DATA)
+ {
+ if ("ATTACHED".equals(data.get(POJOCACHE_STATUS)))
+ {
+ Object o = cache.find(fqn.toString());
+ sendNotification(new AttachedEvent(createContext(event), o, isLocal), matched);
+ }
+ else if ("DETACHING".equals(data.get(POJOCACHE_STATUS)))
+ {
+ Object o = cache.find(fqn.toString());
+ sendNotification(new DetachedEvent(createContext(event), o, isLocal), matched);
+ }
+ else if (data.containsKey(POJOCACHE_OPERATION))
+ {
+ Object collection = cache.find(fqn.getParent().toString());
+ if (collection instanceof List)
+ {
+ int i = Integer.parseInt(fqn.getLastElementAsString());
+ ListModifiedEvent.Operation operation = ListModifiedEvent.Operation.valueOf(data.get(POJOCACHE_OPERATION).toString());
+ Object value = cache.find(fqn.toString());
+ sendNotification(new ListModifiedEvent(createContext(event), (List) collection, operation, i, value, isLocal), matched);
+ }
+ else if (collection instanceof Set)
+ {
+ SetModifiedEvent.Operation operation = SetModifiedEvent.Operation.valueOf(data.get(POJOCACHE_OPERATION).toString());
+ Object value = cache.find(fqn.toString());
+ sendNotification(new SetModifiedEvent(createContext(event), (Set) collection, operation, value, isLocal), matched);
+ }
+ else if (collection instanceof Map)
+ {
+ MapModifiedEvent.Operation operation = MapModifiedEvent.Operation.valueOf(data.get(POJOCACHE_OPERATION).toString());
+ Object value = cache.find(fqn.toString());
+ sendNotification(new MapModifiedEvent(createContext(event), (Map) collection, operation, fqn.getLastElement(), value, isLocal), matched);
+ }
+ else if (collection instanceof Object[]) {
+ int i = Integer.parseInt(fqn.getLastElementAsString());
+ Object value = cache.find(fqn.toString());
+ sendNotification(new ArrayModifiedEvent(createContext(event), collection, i, value, isLocal), matched);
+ }
+ }
+ else if ("ATTACHED".equals(cache.getCache().get(fqn, POJOCACHE_STATUS)))
+ {
+ for (Map.Entry entry : data.entrySet())
+ {
+ String key = entry.getKey().toString();
+ Object value = entry.getValue();
+
+ if (internalKeys.contains(key))
+ continue;
+
+ sendNotification(createModifyEvent(createContext(event), fqn, key, value, isLocal), matched);
+ }
+ }
+ }
+ else if (modType == ModificationType.REMOVE_DATA)
+ {
+ for (Map.Entry entry : data.entrySet())
+ {
+ String key = entry.getKey().toString();
+ if (internalKeys.contains(key))
+ continue;
+
+ sendNotification(createModifyEvent(createContext(event), fqn, key, null, isLocal), matched);
+ }
+ }
+ }
+
+ private Set<NotificationDispatcher.Entry> matchListeners(Fqn fqn)
+ {
+ PojoInstance instance = (PojoInstance) cache.getCache().get(fqn, PojoInstance.KEY);
+ if (instance != null)
+ return dispatcher.getListenerEntries(instance.getReferences());
+
+ return null;
+ }
+
+ public boolean isEmpty()
+ {
+ return dispatcher.isEmpty();
+ }
+
+ public Collection<Object> getListeners()
+ {
+ return dispatcher.getListeners();
+ }
+
+ public void addListener(Object listener)
+ {
+ dispatcher.add(listener);
+ }
+
+ public void addListener(Object listener, Pattern pattern)
+ {
+ if (pattern == null)
+ dispatcher.add(listener);
+ else
+ dispatcher.add(listener, pattern);
+ }
+
+ public void removeListener(Object listener)
+ {
+ dispatcher.remove(listener);
+ }
+}
\ No newline at end of file
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,31 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.impl;
-
-import org.jboss.cache.Fqn;
-
-/**
- * Internal helper class to handle internal cache sotre, that is, the portion that is not part of
- * user's data.
- *
- * @author Ben Wang
- */
-public class InternalConstant
-{
- public static final String CLASS_INTERNAL = "__jboss:internal:class__";
- public static final String SERIALIZED = "__SERIALIZED__";
- public static final String JBOSS_INTERNAL_STRING = "__JBossInternal__";
- public static final String JBOSS_INTERNAL_ID_SEP_STRING = "_ID_";
- public static final Fqn<String> JBOSS_INTERNAL = new Fqn<String>(JBOSS_INTERNAL_STRING);
- public static final Fqn<String> JBOSS_INTERNAL_ID_SEP = new Fqn<String>(JBOSS_INTERNAL_ID_SEP_STRING);
- public static final Fqn<String> JBOSS_INTERNAL_MAP = new Fqn<String>(InternalConstant.JBOSS_INTERNAL, "__RefMap__");
- public static final String JBOSS_INTERNAL_STATIC = "__jboss:static__";
- public static final String POJOCACHE_KEY_PREFIX = "POJOCache.";
- public static final String POJOCACHE_STATUS = POJOCACHE_KEY_PREFIX + "Status";
- public static final String POJOCACHE_OPERATION = POJOCACHE_KEY_PREFIX + "Operation";
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalConstant.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.impl;
+
+import org.jboss.cache.Fqn;
+
+/**
+ * Internal helper class to handle internal cache sotre, that is, the portion that is not part of
+ * user's data.
+ *
+ * @author Ben Wang
+ */
+public class InternalConstant
+{
+ public static final String CLASS_INTERNAL = "__jboss:internal:class__";
+ public static final String SERIALIZED = "__SERIALIZED__";
+ public static final String JBOSS_INTERNAL_STRING = "__JBossInternal__";
+ public static final String JBOSS_INTERNAL_ID_SEP_STRING = "_ID_";
+ public static final Fqn<String> JBOSS_INTERNAL = new Fqn<String>(JBOSS_INTERNAL_STRING);
+ public static final Fqn<String> JBOSS_INTERNAL_ID_SEP = new Fqn<String>(JBOSS_INTERNAL_ID_SEP_STRING);
+ public static final Fqn<String> JBOSS_INTERNAL_MAP = new Fqn<String>(InternalConstant.JBOSS_INTERNAL, "__RefMap__");
+ public static final String JBOSS_INTERNAL_STATIC = "__jboss:static__";
+ public static final String POJOCACHE_KEY_PREFIX = "POJOCache.";
+ public static final String POJOCACHE_STATUS = POJOCACHE_KEY_PREFIX + "Status";
+ public static final String POJOCACHE_OPERATION = POJOCACHE_KEY_PREFIX + "Operation";
+ public static final String POJOCACHE_LOCK = POJOCACHE_KEY_PREFIX + "LOCK";
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,377 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.impl;
-
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.util.ObjectUtil;
-
-/**
- * Internal helper class to handle internal cache sotre, that is, the portion that is not part of
- * user's data.
- *
- * @author Ben Wang
- */
-public class InternalHelper
-{
- private static Log log = LogFactory.getLog(InternalHelper.class.getName());
-
- private Cache<Object, Object> cache;
- private PojoCache pcache;
-
- InternalHelper(PojoCache pcache)
- {
- this.cache = pcache.getCache();
- this.pcache = pcache;
- }
-
- PojoInstance getPojoInstance(Fqn fqn) throws CacheException
- {
- return (PojoInstance) get(fqn, PojoInstance.KEY, true);
- }
-
- PojoReference getPojoReference(Fqn fqn, String field) throws CacheException
- {
- if (field == null)
- field = PojoReference.KEY;
-
- return (PojoReference) get(fqn, field, true);
- }
-
- PojoReference getPojoReference(Fqn fqn) throws CacheException
- {
- return getPojoReference(fqn, null);
- }
-
-
- static PojoInstance initializeAopInstance(Fqn sourceFqn)
- {
- PojoInstance pojoInstance = new PojoInstance();
-
- pojoInstance.incrementRefCount(sourceFqn);
- return pojoInstance;
- }
-
- /**
- * Increment reference count for the pojo. Note that this is not thread safe or atomic.
- */
- int incrementRefCount(Fqn originalFqn, Fqn referencingFqn) throws CacheException
- {
- PojoInstance pojoInstance = getPojoInstance(originalFqn);
- if (pojoInstance == null)
- throw new PojoCacheException("InternalDelegate.incrementRefCount(): null pojoReference for fqn: " + originalFqn);
-
- int count = pojoInstance.incrementRefCount(referencingFqn);
- // need to update it.
- put(originalFqn, PojoInstance.KEY, pojoInstance);
- return count;
- }
-
- /**
- * Has a delegate method so we can use the switch.
- */
-
- Object get(Fqn fqn, Object key) throws CacheException
- {
- return get(fqn, key, false);
- }
-
- private Object get(Fqn fqn, Object key, boolean gravitate) throws CacheException
- {
- // Only gravitate when we have to and only when the user has enabled it
- if (gravitate && pcache.getThreadContext().isGravitationEnabled())
- {
- cache.getInvocationContext().getOptionOverrides().setForceDataGravitation(true);
- Object obj = cache.get(fqn, key);
- cache.getInvocationContext().getOptionOverrides().setForceDataGravitation(false);
- return obj;
- }
-
- return cache.get(fqn, key);
- }
-
- private void put(Fqn fqn, Object key, Object value) throws CacheException
- {
- cache.put(fqn, key, value);
- }
-
- void put(Fqn fqn, Map map) throws CacheException
- {
- cache.put(fqn, map);
- }
-
-
- /**
- * decrement reference count for the pojo. Note that this is not thread safe or atomic.
- */
- int decrementRefCount(Fqn originalFqn, Fqn referencingFqn) throws CacheException
- {
- PojoInstance pojoInstance = getPojoInstance(originalFqn);
- if (pojoInstance == null)
- throw new PojoCacheException("InternalDelegate.decrementRefCount(): null pojoReference.");
-
- int count = pojoInstance.decrementRefCount(referencingFqn);
-
- if (count < -1) // can't dip below -1
- throw new PojoCacheException("InternalDelegate.decrementRefCount(): null pojoReference.");
-
- // need to update it.
- put(originalFqn, PojoInstance.KEY, pojoInstance);
- return count;
- }
-
- static boolean isReferenced(PojoInstance pojoInstance)
- {
- // If ref counter is greater than 0, we fqn is being referenced.
- return (pojoInstance.getRefCount() > 0);
- }
-
- int getRefCount(Fqn fqn) throws CacheException
- {
- return getPojoInstance(fqn).getRefCount();
- }
-
- String XgetRefFqn(Fqn fqn) throws CacheException
- {
- PojoInstance pojoInstance = getPojoInstance(fqn);
- return getRefFqn(pojoInstance);
- }
-
- String getRefFqn(PojoInstance pojoInstance) throws CacheException
- {
- if (pojoInstance == null)
- return null;
-
- String aliasFqn = pojoInstance.getInternalFqn();
-
- if (aliasFqn == null || aliasFqn.length() == 0) return null;
-
- return getRefFqnFromAlias(aliasFqn);
- }
-
- void setRefFqn(Fqn fqn, String internalFqn) throws CacheException
- {
- PojoInstance pojoInstance = getPojoInstance(fqn);
- if (pojoInstance == null)
- pojoInstance = new PojoInstance();
-
- pojoInstance.setInternalFqn(internalFqn);
- put(fqn, PojoInstance.KEY, pojoInstance);
- }
-
- void removeRefFqn(Fqn fqn) throws CacheException
- {
- PojoInstance pojoInstance = getPojoInstance(fqn);
- if (pojoInstance == null)
- throw new PojoCacheException("InternalDelegate.getInternalFqn(): null pojoReference.");
-
- pojoInstance.removeInternalFqn();
- put(fqn, PojoInstance.KEY, pojoInstance);
- }
-
- Object getPojo(Fqn fqn, String field) throws CacheException
- {
- PojoReference pojoReference = getPojoReference(fqn, field);
- Fqn realFqn = null;
- if (pojoReference != null)
- {
- // This is outward facing node
- realFqn = pojoReference.getFqn();
- }
- else
- {
- // If we are looking for a field then there must be a reference
- if (field != null)
- return null;
-
- // This is the internal node.
- realFqn = fqn;
- }
-
- PojoInstance pojoInstance = getPojoInstance(realFqn);
- if (pojoInstance == null)
- return null;
-
- return pojoInstance.get();
- }
-
- void setPojo(Fqn fqn, Object pojo) throws CacheException
- {
- PojoInstance pojoInstance = getPojoInstance(fqn);
- if (pojoInstance == null)
- {
- pojoInstance = new PojoInstance();
- put(fqn, PojoInstance.KEY, pojoInstance);
- }
-
- pojoInstance.set(pojo);
- // No need to do a cache put since pojo is transient anyway.
- }
-
- static boolean isMultipleReferenced(PojoInstance pojoInstance)
- {
- if (pojoInstance.getRefCount() > (PojoInstance.INITIAL_COUNTER_VALUE + 1)) return true;
-
- return false;
- }
-
- static void setPojo(PojoInstance pojoInstance, Object pojo)
- {
- // No need to do a cache put since pojo is transient anyway.
- pojoInstance.set(pojo);
- }
-
- void setPojo(Fqn fqn, Object pojo, PojoInstance pojoInstance) throws CacheException
- {
- if (pojoInstance == null)
- {
- pojoInstance = new PojoInstance();
- put(fqn, PojoInstance.KEY, pojoInstance);
- }
-
- pojoInstance.set(pojo);
- // No need to do a cache put since pojo is transient anyway.
- }
-
- void putPojoReference(Fqn fqn, PojoReference pojoReference) throws CacheException
- {
- putPojoReference(fqn, pojoReference, PojoReference.KEY);
- }
-
- void putPojoReference(Fqn fqn, PojoReference pojoReference, String field) throws CacheException
- {
- if (field == null)
- field = PojoReference.KEY;
-
- put(fqn, field, pojoReference);
- }
-
- void putAopClazz(Fqn fqn, Class clazz) throws CacheException
- {
- put(fqn, InternalConstant.CLASS_INTERNAL, clazz);
- }
-
- /**
- * We store the class name in string and put it in map instead of directly putting
- * it into cache for optimization.
- */
- static void putAopClazz(Class clazz, Map map)
- {
- map.put(InternalConstant.CLASS_INTERNAL, clazz);
- }
-
- Class peekAopClazz(Fqn fqn) throws CacheException
- {
- return (Class) get(fqn, InternalConstant.CLASS_INTERNAL);
- }
-
- void removeInternalAttributes(Fqn fqn) throws CacheException
- {
- cache.remove(fqn, PojoInstance.KEY);
- cache.remove(fqn, InternalConstant.CLASS_INTERNAL);
- }
-
- void cleanUp(Fqn fqn, String field) throws CacheException
- {
- if (field != null)
- {
- cache.remove(fqn, field);
- return;
- }
-
- // We can't do a brute force remove anymore?
- if (cache.getRoot().getChild(fqn).getChildren().size() == 0)
- {
- // remove everything
- cache.removeNode(fqn);
-// cache_.getRoot().getChild(fqn).clearData();
-// removeNodeWithoutInterceptor(fqn);
- }
- else
- {
- // Assume everything here is all PojoCache data for optimization
- cache.getRoot().getChild(fqn).clearData();
- if (log.isTraceEnabled())
- {
- log.trace("cleanup(): fqn: " + fqn + " is not empty. That means it has sub-pojos. Will not remove node");
- }
- }
- }
-
- String createIndirectFqn(String fqn) throws CacheException
- {
- String indirectFqn = getIndirectFqn(fqn);
- Fqn internalFqn = getInternalFqn(fqn);
- put(internalFqn, indirectFqn, fqn);
- return indirectFqn;
- }
-
- private Fqn getInternalFqn(String fqn)
- {
- if (fqn == null || fqn.length() == 0)
- throw new IllegalStateException("InternalDelegate.getInternalFqn(). fqn is either null or empty!");
-
- String indirectFqn = getIndirectFqn(fqn);
- return new Fqn(InternalConstant.JBOSS_INTERNAL_MAP, indirectFqn);
-// return JBOSS_INTERNAL_MAP;
- }
-
- static String getIndirectFqn(String fqn)
- {
- // TODO This is not unique. Will need to come up with a better one in the future.
- return ObjectUtil.getIndirectFqn(fqn);
- }
-
- void removeIndirectFqn(String oldFqn) throws CacheException
- {
- String indirectFqn = getIndirectFqn(oldFqn);
- cache.remove(getInternalFqn(oldFqn), indirectFqn);
- }
-
- void setIndirectFqn(String oldFqn, String newFqn) throws CacheException
- {
- String indirectFqn = getIndirectFqn(oldFqn);
- Fqn tmpFqn = getInternalFqn(oldFqn);
- put(tmpFqn, indirectFqn, newFqn);
- }
-
- void updateIndirectFqn(Fqn originalFqn, Fqn newFqn) throws CacheException
- {
- put(getInternalFqn(originalFqn.toString()), getIndirectFqn(originalFqn.toString()), newFqn.toString());
- }
-
- private String getRefFqnFromAlias(String aliasFqn) throws CacheException
- {
- return (String) get(getInternalFqn(aliasFqn), aliasFqn, true);
- }
-
- Fqn getNextFqnInLine(Fqn currentFqn) throws CacheException
- {
- PojoInstance ai = getPojoInstance(currentFqn);
- return ai.getAndRemoveFirstFqnInList();
- }
-
- /**
- * Test if this internal node.
- *
- * @param fqn
- */
- public static boolean isInternalNode(Fqn fqn)
- {
- // we ignore all the node events corresponding to JBOSS_INTERNAL
- if (fqn.isChildOrEquals(InternalConstant.JBOSS_INTERNAL)) return true;
-
- return false;
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/InternalHelper.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,416 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.impl;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.Cache;
+import org.jboss.cache.CacheException;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.lock.UpgradeException;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.util.ObjectUtil;
+
+/**
+ * Internal helper class to handle internal cache sotre, that is, the portion that is not part of
+ * user's data.
+ *
+ * @author Ben Wang
+ */
+public class InternalHelper
+{
+ private static Log log = LogFactory.getLog(InternalHelper.class.getName());
+
+ private Cache<Object, Object> cache;
+ private PojoCache pcache;
+
+ InternalHelper(PojoCache pcache)
+ {
+ this.cache = pcache.getCache();
+ this.pcache = pcache;
+ }
+
+ PojoInstance getPojoInstance(Fqn fqn) throws CacheException
+ {
+ return (PojoInstance) get(fqn, PojoInstance.KEY, true);
+ }
+
+ PojoReference getPojoReference(Fqn fqn, String field) throws CacheException
+ {
+ if (field == null)
+ field = PojoReference.KEY;
+
+ return (PojoReference) get(fqn, field, true);
+ }
+
+ PojoReference getPojoReference(Fqn fqn) throws CacheException
+ {
+ return getPojoReference(fqn, null);
+ }
+
+
+ static PojoInstance initializeAopInstance(Fqn sourceFqn)
+ {
+ PojoInstance pojoInstance = new PojoInstance();
+
+ pojoInstance.incrementRefCount(sourceFqn);
+ return pojoInstance;
+ }
+
+ /**
+ * Increment reference count for the pojo. Note that this is not thread safe or atomic.
+ */
+ int incrementRefCount(Fqn originalFqn, Fqn referencingFqn) throws CacheException
+ {
+ PojoInstance pojoInstance = getPojoInstance(originalFqn);
+ if (pojoInstance == null)
+ throw new PojoCacheException("InternalDelegate.incrementRefCount(): null pojoReference for fqn: " + originalFqn);
+
+ int count = pojoInstance.incrementRefCount(referencingFqn);
+ // need to update it.
+ put(originalFqn, PojoInstance.KEY, pojoInstance);
+ return count;
+ }
+
+ /**
+ * Has a delegate method so we can use the switch.
+ */
+
+ Object get(Fqn fqn, Object key) throws CacheException
+ {
+ return get(fqn, key, false);
+ }
+
+ private Object get(Fqn fqn, Object key, boolean gravitate) throws CacheException
+ {
+ // Only gravitate when we have to and only when the user has enabled it
+ if (gravitate && pcache.getThreadContext().isGravitationEnabled())
+ {
+ cache.getInvocationContext().getOptionOverrides().setForceDataGravitation(true);
+ Object obj = cache.get(fqn, key);
+ cache.getInvocationContext().getOptionOverrides().setForceDataGravitation(false);
+ return obj;
+ }
+
+ return cache.get(fqn, key);
+ }
+
+ private void put(Fqn fqn, Object key, Object value) throws CacheException
+ {
+ cache.put(fqn, key, value);
+ }
+
+ void put(Fqn fqn, Map map) throws CacheException
+ {
+ cache.put(fqn, map);
+ }
+
+
+ /**
+ * decrement reference count for the pojo. Note that this is not thread safe or atomic.
+ */
+ int decrementRefCount(Fqn originalFqn, Fqn referencingFqn) throws CacheException
+ {
+ PojoInstance pojoInstance = getPojoInstance(originalFqn);
+ if (pojoInstance == null)
+ throw new PojoCacheException("InternalDelegate.decrementRefCount(): null pojoReference.");
+
+ int count = pojoInstance.decrementRefCount(referencingFqn);
+
+ if (count < -1) // can't dip below -1
+ throw new PojoCacheException("InternalDelegate.decrementRefCount(): null pojoReference.");
+
+ // need to update it.
+ put(originalFqn, PojoInstance.KEY, pojoInstance);
+ return count;
+ }
+
+ static boolean isReferenced(PojoInstance pojoInstance)
+ {
+ // If ref counter is greater than 0, we fqn is being referenced.
+ return (pojoInstance.getRefCount() > 0);
+ }
+
+ int getRefCount(Fqn fqn) throws CacheException
+ {
+ return getPojoInstance(fqn).getRefCount();
+ }
+
+ String XgetRefFqn(Fqn fqn) throws CacheException
+ {
+ PojoInstance pojoInstance = getPojoInstance(fqn);
+ return getRefFqn(pojoInstance);
+ }
+
+ String getRefFqn(PojoInstance pojoInstance) throws CacheException
+ {
+ if (pojoInstance == null)
+ return null;
+
+ String aliasFqn = pojoInstance.getInternalFqn();
+
+ if (aliasFqn == null || aliasFqn.length() == 0) return null;
+
+ return getRefFqnFromAlias(aliasFqn);
+ }
+
+ void setRefFqn(Fqn fqn, String internalFqn) throws CacheException
+ {
+ PojoInstance pojoInstance = getPojoInstance(fqn);
+ if (pojoInstance == null)
+ pojoInstance = new PojoInstance();
+
+ pojoInstance.setInternalFqn(internalFqn);
+ put(fqn, PojoInstance.KEY, pojoInstance);
+ }
+
+ void removeRefFqn(Fqn fqn) throws CacheException
+ {
+ PojoInstance pojoInstance = getPojoInstance(fqn);
+ if (pojoInstance == null)
+ throw new PojoCacheException("InternalDelegate.getInternalFqn(): null pojoReference.");
+
+ pojoInstance.removeInternalFqn();
+ put(fqn, PojoInstance.KEY, pojoInstance);
+ }
+
+ Object getPojo(Fqn fqn, String field) throws CacheException
+ {
+ PojoReference pojoReference = getPojoReference(fqn, field);
+ Fqn realFqn = null;
+ if (pojoReference != null)
+ {
+ // This is outward facing node
+ realFqn = pojoReference.getFqn();
+ }
+ else
+ {
+ // If we are looking for a field then there must be a reference
+ if (field != null)
+ return null;
+
+ // This is the internal node.
+ realFqn = fqn;
+ }
+
+ PojoInstance pojoInstance = getPojoInstance(realFqn);
+ if (pojoInstance == null)
+ return null;
+
+ return pojoInstance.get();
+ }
+
+ void setPojo(Fqn fqn, Object pojo) throws CacheException
+ {
+ PojoInstance pojoInstance = getPojoInstance(fqn);
+ if (pojoInstance == null)
+ {
+ pojoInstance = new PojoInstance();
+ put(fqn, PojoInstance.KEY, pojoInstance);
+ }
+
+ pojoInstance.set(pojo);
+ // No need to do a cache put since pojo is transient anyway.
+ }
+
+ static boolean isMultipleReferenced(PojoInstance pojoInstance)
+ {
+ if (pojoInstance.getRefCount() > (PojoInstance.INITIAL_COUNTER_VALUE + 1)) return true;
+
+ return false;
+ }
+
+ static void setPojo(PojoInstance pojoInstance, Object pojo)
+ {
+ // No need to do a cache put since pojo is transient anyway.
+ pojoInstance.set(pojo);
+ }
+
+ void setPojo(Fqn fqn, Object pojo, PojoInstance pojoInstance) throws CacheException
+ {
+ if (pojoInstance == null)
+ {
+ pojoInstance = new PojoInstance();
+ put(fqn, PojoInstance.KEY, pojoInstance);
+ }
+
+ pojoInstance.set(pojo);
+ // No need to do a cache put since pojo is transient anyway.
+ }
+
+ void putPojoReference(Fqn fqn, PojoReference pojoReference) throws CacheException
+ {
+ putPojoReference(fqn, pojoReference, PojoReference.KEY);
+ }
+
+ void putPojoReference(Fqn fqn, PojoReference pojoReference, String field) throws CacheException
+ {
+ if (field == null)
+ field = PojoReference.KEY;
+
+ put(fqn, field, pojoReference);
+ }
+
+ void putAopClazz(Fqn fqn, Class clazz) throws CacheException
+ {
+ put(fqn, InternalConstant.CLASS_INTERNAL, clazz);
+ }
+
+ /**
+ * We store the class name in string and put it in map instead of directly putting
+ * it into cache for optimization.
+ */
+ static void putAopClazz(Class clazz, Map map)
+ {
+ map.put(InternalConstant.CLASS_INTERNAL, clazz);
+ }
+
+ Class peekAopClazz(Fqn fqn) throws CacheException
+ {
+ return (Class) get(fqn, InternalConstant.CLASS_INTERNAL);
+ }
+
+ void removeInternalAttributes(Fqn fqn) throws CacheException
+ {
+ cache.remove(fqn, PojoInstance.KEY);
+ cache.remove(fqn, InternalConstant.CLASS_INTERNAL);
+ }
+
+ void cleanUp(Fqn fqn, String field) throws CacheException
+ {
+ if (field != null)
+ {
+ cache.remove(fqn, field);
+ return;
+ }
+
+ // We can't do a brute force remove anymore?
+ if (cache.getRoot().getChild(fqn).getChildren().size() == 0)
+ {
+ // remove everything
+ cache.removeNode(fqn);
+// cache_.getRoot().getChild(fqn).clearData();
+// removeNodeWithoutInterceptor(fqn);
+ }
+ else
+ {
+ // Assume everything here is all PojoCache data for optimization
+ cache.getRoot().getChild(fqn).clearData();
+ if (log.isTraceEnabled())
+ {
+ log.trace("cleanup(): fqn: " + fqn + " is not empty. That means it has sub-pojos. Will not remove node");
+ }
+ }
+ }
+
+ String createIndirectFqn(String fqn) throws CacheException
+ {
+ String indirectFqn = getIndirectFqn(fqn);
+ Fqn internalFqn = getInternalFqn(fqn);
+ put(internalFqn, indirectFqn, fqn);
+ return indirectFqn;
+ }
+
+ private Fqn getInternalFqn(String fqn)
+ {
+ if (fqn == null || fqn.length() == 0)
+ throw new IllegalStateException("InternalDelegate.getInternalFqn(). fqn is either null or empty!");
+
+ String indirectFqn = getIndirectFqn(fqn);
+ return new Fqn(InternalConstant.JBOSS_INTERNAL_MAP, indirectFqn);
+// return JBOSS_INTERNAL_MAP;
+ }
+
+ static String getIndirectFqn(String fqn)
+ {
+ // TODO This is not unique. Will need to come up with a better one in the future.
+ return ObjectUtil.getIndirectFqn(fqn);
+ }
+
+ void removeIndirectFqn(String oldFqn) throws CacheException
+ {
+ String indirectFqn = getIndirectFqn(oldFqn);
+ cache.remove(getInternalFqn(oldFqn), indirectFqn);
+ }
+
+ void setIndirectFqn(String oldFqn, String newFqn) throws CacheException
+ {
+ String indirectFqn = getIndirectFqn(oldFqn);
+ Fqn tmpFqn = getInternalFqn(oldFqn);
+ put(tmpFqn, indirectFqn, newFqn);
+ }
+
+ void updateIndirectFqn(Fqn originalFqn, Fqn newFqn) throws CacheException
+ {
+ put(getInternalFqn(originalFqn.toString()), getIndirectFqn(originalFqn.toString()), newFqn.toString());
+ }
+
+ private String getRefFqnFromAlias(String aliasFqn) throws CacheException
+ {
+ return (String) get(getInternalFqn(aliasFqn), aliasFqn, true);
+ }
+
+ Fqn getNextFqnInLine(Fqn currentFqn) throws CacheException
+ {
+ PojoInstance ai = getPojoInstance(currentFqn);
+ return ai.getAndRemoveFirstFqnInList();
+ }
+
+ /**
+ * Test if this internal node.
+ *
+ * @param fqn
+ */
+ public static boolean isInternalNode(Fqn fqn)
+ {
+ // we ignore all the node events corresponding to JBOSS_INTERNAL
+ if (fqn.isChildOrEquals(InternalConstant.JBOSS_INTERNAL)) return true;
+
+ return false;
+ }
+
+ public boolean lockPojo(Fqn id) throws CacheException
+ {
+ final int RETRY = 5;
+
+ if (log.isDebugEnabled())
+ log.debug("lockPojo(): id:" + id);
+
+ boolean isNeeded = true;
+ int retry = 0;
+
+ while (isNeeded)
+ {
+ try
+ {
+ cache.put(id, InternalConstant.POJOCACHE_LOCK, "LOCK");
+ isNeeded = false;
+ }
+ catch (UpgradeException upe)
+ {
+ log.warn("lockPojo(): can't upgrade the lock during lockPojo. Will re-try. id: " + id
+ + " retry times: " + retry);
+ if (retry++ > RETRY)
+ return false;
+
+ // try to sleep a little as well.
+ try
+ {
+ Thread.sleep(10);
+ }
+ catch (InterruptedException e)
+ {
+ }
+ }
+ }
+
+ return true;
+ }
+}
\ No newline at end of file
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,138 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.impl;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-
-/**
- * Handle the object graph management.
- *
- * @author Ben Wang
- * Date: Aug 4, 2005
- * @version $Id$
- */
-class ObjectGraphHandler extends AbstractHandler
-{
- private PojoCacheImpl cache;
- private InternalHelper internal_;
- private final static Log log = LogFactory.getLog(ObjectGraphHandler.class);
-
- public ObjectGraphHandler(PojoCacheImpl cache, InternalHelper internal)
- {
- this.cache = cache;
- internal_ = internal;
- }
-
- protected Fqn<?> getFqn(Object obj)
- {
- return null;
- }
-
- protected boolean handles(Class<?> clazz)
- {
- return false;
- }
-
- @Override
- protected Object get(Fqn<?> fqn, Class<?> clazz, PojoInstance pojoInstance) throws CacheException
- {
- // Note this is actually the aliasFqn, not the real fqn!
- Object obj;
-
- obj = cache.getObject(fqn);
- if (obj == null)
- throw new PojoCacheException("ObjectGraphHandler.get(): null object from internal ref node." +
- " Internal ref node: " + fqn);
-
- return obj; // No need to set the instance under fqn. It is located in refFqn anyway.
- }
-
- @Override
- protected void put(Fqn<?> fqn, Fqn<?> referencingFqn, Object obj) throws CacheException
- {
- setupRefCounting(fqn, referencingFqn);
- }
-
- boolean isMultipleReferenced(Fqn<?> internalFqn)
- {
- // Note this is actually the aliasFqn, not the real fqn!
- PojoInstance pojoInstance = null;
- try
- {
- pojoInstance = internal_.getPojoInstance(internalFqn);
- }
- catch (CacheException e)
- {
- throw new PojoCacheException("Exception in isMultipleReferenced", e);
- }
- // check if this is a refernce
- return InternalHelper.isMultipleReferenced(pojoInstance);
-
- }
-
- @Override
- protected Object remove(Fqn<?> fqn, Fqn<?> referencingFqn, Object pojo)
- throws CacheException
- {
- if (log.isDebugEnabled())
- {
- log.debug("remove(): removing object fqn: " + referencingFqn
- + " Will just de-reference it.");
- }
- removeFromReference(fqn, referencingFqn);
-
- return null;
- }
-
- /**
- * Remove the object from the the reference fqn, meaning just decrement the ref counter.
- */
- private void removeFromReference(Fqn<?> originalFqn, Fqn<?> referencingFqn) throws CacheException
- {
- synchronized (originalFqn)
- { // we lock the internal fqn here so no one else has access.
- // Decrement ref counting on the internal node
- if (decrementRefCount(originalFqn, referencingFqn) == PojoInstance.INITIAL_COUNTER_VALUE)
- {
- // No one is referring it so it is safe to remove
- // TODO we should make sure the parent nodes are also removed they are empty as well.
- cache.detach(originalFqn);
- }
- }
- }
-
- /**
- * 1. increment reference counter
- * 2. put in refFqn so we can get it.
- *
- * @param fqn The original fqn node
- * @param refFqn The new internal fqn node
- */
- private void setupRefCounting(Fqn<?> fqn, Fqn<?> referencingFqn) throws CacheException
- {
- synchronized (fqn)
- {
- // increment the reference counting
- incrementRefCount(fqn, referencingFqn);
- }
- }
-
- private int incrementRefCount(Fqn<?> originalFqn, Fqn<?> referencingFqn) throws CacheException
- {
- return internal_.incrementRefCount(originalFqn, referencingFqn);
- }
-
- private int decrementRefCount(Fqn<?> originalFqn, Fqn<?> referencingFqn) throws CacheException
- {
- return internal_.decrementRefCount(originalFqn, referencingFqn);
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/ObjectGraphHandler.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,138 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.impl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.CacheException;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheException;
+
+/**
+ * Handle the object graph management.
+ *
+ * @author Ben Wang
+ * Date: Aug 4, 2005
+ * @version $Id$
+ */
+class ObjectGraphHandler extends AbstractHandler
+{
+ private PojoCacheImpl cache;
+ private InternalHelper internal_;
+ private final static Log log = LogFactory.getLog(ObjectGraphHandler.class);
+
+ public ObjectGraphHandler(PojoCacheImpl cache, InternalHelper internal)
+ {
+ this.cache = cache;
+ internal_ = internal;
+ }
+
+ protected Fqn<?> getFqn(Object obj)
+ {
+ return null;
+ }
+
+ protected boolean handles(Class<?> clazz)
+ {
+ return false;
+ }
+
+ @Override
+ protected Object get(Fqn<?> fqn, Class<?> clazz, PojoInstance pojoInstance) throws CacheException
+ {
+ // Note this is actually the aliasFqn, not the real fqn!
+ Object obj;
+
+ obj = cache.find(fqn);
+ if (obj == null)
+ throw new PojoCacheException("ObjectGraphHandler.get(): null object from internal ref node." +
+ " Internal ref node: " + fqn);
+
+ return obj; // No need to set the instance under fqn. It is located in refFqn anyway.
+ }
+
+ @Override
+ protected void put(Fqn<?> fqn, Fqn<?> referencingFqn, Object obj) throws CacheException
+ {
+ setupRefCounting(fqn, referencingFqn);
+ }
+
+ boolean isMultipleReferenced(Fqn<?> internalFqn)
+ {
+ // Note this is actually the aliasFqn, not the real fqn!
+ PojoInstance pojoInstance = null;
+ try
+ {
+ pojoInstance = internal_.getPojoInstance(internalFqn);
+ }
+ catch (CacheException e)
+ {
+ throw new PojoCacheException("Exception in isMultipleReferenced", e);
+ }
+ // check if this is a refernce
+ return InternalHelper.isMultipleReferenced(pojoInstance);
+
+ }
+
+ @Override
+ protected Object remove(Fqn<?> fqn, Fqn<?> referencingFqn, Object pojo)
+ throws CacheException
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("remove(): removing object fqn: " + referencingFqn
+ + " Will just de-reference it.");
+ }
+ removeFromReference(fqn, referencingFqn);
+
+ return null;
+ }
+
+ /**
+ * Remove the object from the the reference fqn, meaning just decrement the ref counter.
+ */
+ private void removeFromReference(Fqn<?> originalFqn, Fqn<?> referencingFqn) throws CacheException
+ {
+ synchronized (originalFqn)
+ { // we lock the internal fqn here so no one else has access.
+ // Decrement ref counting on the internal node
+ if (decrementRefCount(originalFqn, referencingFqn) == PojoInstance.INITIAL_COUNTER_VALUE)
+ {
+ // No one is referring it so it is safe to remove
+ // TODO we should make sure the parent nodes are also removed they are empty as well.
+ cache.detach(originalFqn);
+ }
+ }
+ }
+
+ /**
+ * 1. increment reference counter
+ * 2. put in refFqn so we can get it.
+ *
+ * @param fqn The original fqn node
+ * @param refFqn The new internal fqn node
+ */
+ private void setupRefCounting(Fqn<?> fqn, Fqn<?> referencingFqn) throws CacheException
+ {
+ synchronized (fqn)
+ {
+ // increment the reference counting
+ incrementRefCount(fqn, referencingFqn);
+ }
+ }
+
+ private int incrementRefCount(Fqn<?> originalFqn, Fqn<?> referencingFqn) throws CacheException
+ {
+ return internal_.incrementRefCount(originalFqn, referencingFqn);
+ }
+
+ private int decrementRefCount(Fqn<?> originalFqn, Fqn<?> referencingFqn) throws CacheException
+ {
+ return internal_.decrementRefCount(originalFqn, referencingFqn);
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,357 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.impl;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.Advised;
-import org.jboss.aop.Advisor;
-import org.jboss.aop.InstanceAdvisor;
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.proxy.ClassProxy;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.CacheSPI;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Node;
-import org.jboss.cache.Region;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.collection.CollectionInterceptorUtil;
-import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.BaseInterceptor;
-import org.jboss.cache.pojo.memory.FieldPersistentReference;
-import org.jboss.cache.pojo.util.AopUtil;
-
-import java.lang.reflect.Field;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Delegate class for PojoCache, the real implementation code happens here.
- *
- * @author Ben Wang
- */
-public class PojoCacheDelegate
-{
- private PojoCacheImpl pojoCache;
- private Cache<Object, Object> cache;
- private final static Log log = LogFactory.getLog(PojoCacheDelegate.class);
- private InternalHelper internal_;
- private AdvisedPojoHandler advisedHandler_;
- private ObjectGraphHandler graphHandler_;
- private CollectionClassHandler collectionHandler_;
- private ArrayHandler arrayHandler;
- private SerializableObjectHandler serializableHandler_;
- // Use ThreadLocal to hold a boolean isBulkRemove
- private ThreadLocal<Boolean> bulkRemove_ = new ThreadLocal<Boolean>();
- private final String DETACH = "DETACH";
- private PojoUtil util_ = new PojoUtil();
-
- public PojoCacheDelegate(PojoCacheImpl cache)
- {
- pojoCache = cache;
- this.cache = pojoCache.getCache();
- internal_ = new InternalHelper(cache);
- graphHandler_ = new ObjectGraphHandler(pojoCache, internal_);
- collectionHandler_ = new CollectionClassHandler(pojoCache, internal_);
- serializableHandler_ = new SerializableObjectHandler(pojoCache, internal_);
- advisedHandler_ = new AdvisedPojoHandler(pojoCache, internal_, util_);
- arrayHandler = new ArrayHandler(pojoCache);
- }
-
- public void setBulkRemove(boolean bulk)
- {
- bulkRemove_.set(bulk);
- }
-
- private boolean getBulkRemove()
- {
- return bulkRemove_.get();
- }
-
- public Object getObject(Fqn fqn, String field, Object source) throws CacheException
- {
- // TODO Must we really to couple with BR? JBCACHE-669
- Object pojo = internal_.getPojo(fqn, field);
- if (pojo != null)
- {
- // we already have an advised instance
- if (log.isDebugEnabled())
- {
- log.debug("getObject(): id: " + fqn + " retrieved from existing instance directly. ");
- }
- return pojo;
- }
-
- // OK. So we are here meaning that this is a failover or passivation since the transient
- // pojo instance is not around. Let's also make sure the right classloader is used
- // as well.
- ClassLoader prevCL = Thread.currentThread().getContextClassLoader();
- try
- {
- Region region = cache.getRegion(fqn, false);
- if (region != null && region.getClassLoader() != null)
- Thread.currentThread().setContextClassLoader(region.getClassLoader());
-
- return getObjectInternal(fqn, field, source);
- }
- finally
- {
- Thread.currentThread().setContextClassLoader(prevCL);
- }
- }
-
- /**
- * Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
- */
- public Object putObject(Fqn fqn, Object obj, String field, Object source) throws CacheException
- {
- // Skip some un-necessary update if obj is the same class as the old one
- Object oldValue = internal_.getPojo(fqn, field);
- boolean allowArray = source instanceof ArrayInterceptable;
- if (oldValue == obj && skipDuplicateAttach(obj, allowArray))
- {
- if (log.isDebugEnabled())
- {
- log.debug("putObject(): id: " + fqn + " pojo is already in the cache. Return right away.");
- }
- return obj;
- }
-
- // remove old value before overwriting it. This is necessary to detach any interceptor.
- // TODO Or can we simply walk thru that somewhere? Well, there is also implication of Collection though
- pojoCache.detach(fqn, field, source);
-
- if (obj == null)
- return oldValue;// we are done
-
- AbstractHandler handler = getHandler(obj.getClass(), allowArray);
- Fqn<?> internalFqn = handler.getFqn(obj);
-
- if (internalFqn != null)
- {
- graphHandler_.put(internalFqn, fqn, obj);
- }
- else
- {
- internalFqn = createInternalFqn(fqn, obj);
- if (log.isDebugEnabled())
- log.debug("attach(): id: " + fqn + " will store the pojo in the internal area: " + internalFqn);
-
- handler.put(internalFqn, fqn, obj);
-
- // Used by notification sub-system
- cache.put(internalFqn, InternalConstant.POJOCACHE_STATUS, "ATTACHED");
- }
-
- setPojoReference(fqn, obj, field, internalFqn);
-
- return oldValue;
- }
-
- private boolean skipDuplicateAttach(Object obj, boolean allowArray)
- {
- return obj == null || getHandler(obj.getClass(), allowArray) != serializableHandler_;
- }
-
- private AbstractHandler getHandler(Class<?> clazz, boolean allowArray)
- {
- if (advisedHandler_.handles(clazz))
- return advisedHandler_;
-
- if (collectionHandler_.handles(clazz))
- return collectionHandler_;
-
- if (allowArray && arrayHandler.handles(clazz))
- return arrayHandler;
-
- if (serializableHandler_.handles(clazz))
- return serializableHandler_;
-
- throw new CacheException("Can not manage object. It must be either instrumented, a collection, an array, or Serializable: "
- + clazz.getName());
- }
-
-
- private Fqn createInternalFqn(Fqn fqn, Object obj) throws CacheException
- {
- // Create an internal Fqn name
- return AopUtil.createInternalFqn(fqn, cache);
- }
-
- private Fqn setPojoReference(Fqn fqn, Object obj, String field, Fqn internalFqn) throws CacheException
- {
- // Create PojoReference
- CachedType type = pojoCache.getCachedType(obj.getClass());
- PojoReference pojoReference = new PojoReference();
- pojoReference.setPojoClass(type.getType());
-
- // store PojoReference
- pojoReference.setFqn(internalFqn);
- internal_.putPojoReference(fqn, pojoReference, field);
- if (log.isDebugEnabled())
- {
- log.debug("put(): inserting PojoReference with id: " + fqn);
- }
- // store obj in the internal fqn
- return internalFqn;
- }
-
- private void createChildNodeFirstWithoutLocking(Fqn internalFqn)
- {
- int size = internalFqn.size();
- Fqn f = internalFqn.getSubFqn(0, size - 1);
- Fqn child = internalFqn.getSubFqn(size - 1, size);
-
- Node base = cache.getRoot().getChild(f);
- if (base == null)
- {
- log.debug("The node retrieved is null from fqn: " + f);
- return;
- }
- base.addChild(child);
- }
-
- /**
- * Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
- *
- * @param fqn
- * @return detached object
- * @throws CacheException
- */
- public Object removeObject(Fqn fqn, String field, Object source) throws CacheException
- {
- // the class attribute is implicitly stored as an immutable read-only attribute
- PojoReference pojoReference = internal_.getPojoReference(fqn, field);
- if (pojoReference == null)
- {
- // clazz and pojoReference can be not null if this node is the replicated brother node.
- if (log.isTraceEnabled())
- {
- log.trace("removeObject(): clazz is null. id: " + fqn + " No need to remove.");
- }
- return null;
- }
-
- Fqn<?> internalFqn = pojoReference.getFqn();
-
- if (log.isDebugEnabled())
- {
- log.debug("removeObject(): removing object from id: " + fqn
- + " with the corresponding internal id: " + internalFqn);
- }
-
- Object result = pojoCache.getObject(internalFqn);
- if (result == null)
- return null;
-
- if (graphHandler_.isMultipleReferenced(internalFqn))
- {
- graphHandler_.remove(internalFqn, fqn, result);
- }
- else
- {
- cache.put(internalFqn, InternalConstant.POJOCACHE_STATUS, "DETACHING");
- boolean allowArray = source instanceof ArrayInterceptable;
- result = getHandler(result.getClass(), allowArray).remove(internalFqn, fqn, result);
- }
-
- internal_.cleanUp(fqn, field);
- return result;
- }
-
- public Map findObjects(Fqn fqn) throws CacheException
- {
-
- // Traverse from fqn to do getObject, if it return a pojo we then stop.
- Map map = new HashMap();
- Object pojo = getObject(fqn, null, null);
- if (pojo != null)
- {
- map.put(fqn, pojo);// we are done!
- return map;
- }
-
- findChildObjects(fqn, map);
- if (log.isDebugEnabled())
- {
- log.debug("_findObjects(): id: " + fqn + " size of pojos found: " + map.size());
- }
- return map;
- }
-
- private Object getObjectInternal(Fqn<?> fqn, String field, Object source) throws CacheException
- {
- Fqn<?> internalFqn = fqn;
- PojoReference pojoReference = internal_.getPojoReference(fqn, field);
- if (pojoReference != null)
- {
- internalFqn = pojoReference.getFqn();
- }
- else if (field != null)
- {
- return null;
- }
-
- if (log.isDebugEnabled())
- log.debug("getObject(): id: " + fqn + " with a corresponding internal id: " + internalFqn);
-
- /**
- * Reconstruct the managed POJO
- */
- Object obj;
-
- PojoInstance pojoInstance = internal_.getPojoInstance(internalFqn);
-
- if (pojoInstance == null)
- return null;
- //throw new PojoCacheException("PojoCacheDelegate.getObjectInternal(): null PojoInstance for fqn: " + internalFqn);
-
- Class<?> clazz = pojoInstance.getPojoClass();
- boolean allowArray = source instanceof ArrayInterceptable;
- obj = getHandler(clazz, allowArray).get(internalFqn, clazz, pojoInstance);
-
- InternalHelper.setPojo(pojoInstance, obj);
- return obj;
- }
-
- private void findChildObjects(Fqn fqn, Map map) throws CacheException
- {
- // We need to traverse then
- Node root = cache.getRoot();
- Node current = root.getChild(fqn);
-
- if (current == null) return;
-
- Collection<Node> col = current.getChildren();
- if (col == null) return;
- for (Node n : col)
- {
- Fqn newFqn = n.getFqn();
- if (InternalHelper.isInternalNode(newFqn)) continue;// skip
-
- Object pojo = getObject(newFqn, null, null);
- if (pojo != null)
- {
- map.put(newFqn, pojo);
- }
- else
- {
- findChildObjects(newFqn, map);
- }
- }
- }
-
- public boolean exists(Fqn<?> id)
- {
- return internal_.getPojoReference(id, null) != null || internal_.getPojoInstance(id) != null;
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheDelegate.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,349 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.impl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.Advised;
+import org.jboss.aop.Advisor;
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.cache.Cache;
+import org.jboss.cache.CacheException;
+import org.jboss.cache.CacheSPI;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+import org.jboss.cache.Region;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.collection.CollectionInterceptorUtil;
+import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.BaseInterceptor;
+import org.jboss.cache.pojo.memory.FieldPersistentReference;
+import org.jboss.cache.pojo.util.AopUtil;
+
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Delegate class for PojoCache, the real implementation code happens here.
+ *
+ * @author Ben Wang
+ */
+public class PojoCacheDelegate
+{
+ private PojoCacheImpl pojoCache;
+ private Cache<Object, Object> cache;
+ private final static Log log = LogFactory.getLog(PojoCacheDelegate.class);
+ private InternalHelper internal_;
+ private AdvisedPojoHandler advisedHandler_;
+ private ObjectGraphHandler graphHandler_;
+ private CollectionClassHandler collectionHandler_;
+ private ArrayHandler arrayHandler;
+ private SerializableObjectHandler serializableHandler_;
+ // Use ThreadLocal to hold a boolean isBulkRemove
+ private PojoUtil util_ = new PojoUtil();
+
+ public PojoCacheDelegate(PojoCacheImpl cache)
+ {
+ pojoCache = cache;
+ this.cache = pojoCache.getCache();
+ internal_ = new InternalHelper(cache);
+ graphHandler_ = new ObjectGraphHandler(pojoCache, internal_);
+ collectionHandler_ = new CollectionClassHandler(pojoCache, internal_);
+ serializableHandler_ = new SerializableObjectHandler(pojoCache, internal_);
+ advisedHandler_ = new AdvisedPojoHandler(pojoCache, internal_, util_);
+ arrayHandler = new ArrayHandler(pojoCache);
+ }
+
+ public Object getObject(Fqn fqn, String field, Object source) throws CacheException
+ {
+ // TODO Must we really to couple with BR? JBCACHE-669
+ Object pojo = internal_.getPojo(fqn, field);
+ if (pojo != null)
+ {
+ // we already have an advised instance
+ if (log.isDebugEnabled())
+ {
+ log.debug("getObject(): id: " + fqn + " retrieved from existing instance directly. ");
+ }
+ return pojo;
+ }
+
+ // OK. So we are here meaning that this is a failover or passivation since the transient
+ // pojo instance is not around. Let's also make sure the right classloader is used
+ // as well.
+ ClassLoader prevCL = Thread.currentThread().getContextClassLoader();
+ try
+ {
+ Region region = cache.getRegion(fqn, false);
+ if (region != null && region.getClassLoader() != null)
+ Thread.currentThread().setContextClassLoader(region.getClassLoader());
+
+ return getObjectInternal(fqn, field, source);
+ }
+ finally
+ {
+ Thread.currentThread().setContextClassLoader(prevCL);
+ }
+ }
+
+ /**
+ * Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
+ */
+ public Object putObject(Fqn fqn, Object obj, String field, Object source) throws CacheException
+ {
+ internal_.lockPojo(fqn);
+
+ // Skip some un-necessary update if obj is the same class as the old one
+ Object oldValue = internal_.getPojo(fqn, field);
+ boolean allowArray = source instanceof ArrayInterceptable;
+ if (oldValue == obj && skipDuplicateAttach(obj, allowArray))
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("putObject(): id: " + fqn + " pojo is already in the cache. Return right away.");
+ }
+ return obj;
+ }
+
+ // remove old value before overwriting it. This is necessary to detach any interceptor.
+ // TODO Or can we simply walk thru that somewhere? Well, there is also implication of Collection though
+ pojoCache.detach(fqn, field, source);
+
+ if (obj == null)
+ return oldValue;// we are done
+
+ AbstractHandler handler = getHandler(obj.getClass(), allowArray);
+ Fqn<?> internalFqn = handler.getFqn(obj);
+
+ if (internalFqn != null)
+ {
+ graphHandler_.put(internalFqn, fqn, obj);
+ }
+ else
+ {
+ internalFqn = createInternalFqn(fqn, obj);
+ if (log.isDebugEnabled())
+ log.debug("attach(): id: " + fqn + " will store the pojo in the internal area: " + internalFqn);
+
+ handler.put(internalFqn, fqn, obj);
+
+ // Used by notification sub-system
+ cache.put(internalFqn, InternalConstant.POJOCACHE_STATUS, "ATTACHED");
+ }
+
+ setPojoReference(fqn, obj, field, internalFqn);
+
+ return oldValue;
+ }
+
+ private boolean skipDuplicateAttach(Object obj, boolean allowArray)
+ {
+ return obj == null || getHandler(obj.getClass(), allowArray) != serializableHandler_;
+ }
+
+ private AbstractHandler getHandler(Class<?> clazz, boolean allowArray)
+ {
+ if (advisedHandler_.handles(clazz))
+ return advisedHandler_;
+
+ if (collectionHandler_.handles(clazz))
+ return collectionHandler_;
+
+ if (allowArray && arrayHandler.handles(clazz))
+ return arrayHandler;
+
+ if (serializableHandler_.handles(clazz))
+ return serializableHandler_;
+
+ throw new CacheException("Can not manage object. It must be either instrumented, a collection, an array, or Serializable: "
+ + clazz.getName());
+ }
+
+
+ private Fqn createInternalFqn(Fqn fqn, Object obj) throws CacheException
+ {
+ // Create an internal Fqn name
+ return AopUtil.createInternalFqn(fqn, cache);
+ }
+
+ private Fqn setPojoReference(Fqn fqn, Object obj, String field, Fqn internalFqn) throws CacheException
+ {
+ // Create PojoReference
+ CachedType type = pojoCache.getCachedType(obj.getClass());
+ PojoReference pojoReference = new PojoReference();
+ pojoReference.setPojoClass(type.getType());
+
+ // store PojoReference
+ pojoReference.setFqn(internalFqn);
+ internal_.putPojoReference(fqn, pojoReference, field);
+ if (log.isDebugEnabled())
+ {
+ log.debug("put(): inserting PojoReference with id: " + fqn);
+ }
+ // store obj in the internal fqn
+ return internalFqn;
+ }
+
+ private void createChildNodeFirstWithoutLocking(Fqn internalFqn)
+ {
+ int size = internalFqn.size();
+ Fqn f = internalFqn.getSubFqn(0, size - 1);
+ Fqn child = internalFqn.getSubFqn(size - 1, size);
+
+ Node base = cache.getRoot().getChild(f);
+ if (base == null)
+ {
+ log.debug("The node retrieved is null from fqn: " + f);
+ return;
+ }
+ base.addChild(child);
+ }
+
+ /**
+ * Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
+ *
+ * @param fqn
+ * @return detached object
+ * @throws CacheException
+ */
+ public Object removeObject(Fqn fqn, String field, Object source) throws CacheException
+ {
+ internal_.lockPojo(fqn);
+
+ // the class attribute is implicitly stored as an immutable read-only attribute
+ PojoReference pojoReference = internal_.getPojoReference(fqn, field);
+ if (pojoReference == null)
+ {
+ // clazz and pojoReference can be not null if this node is the replicated brother node.
+ if (log.isTraceEnabled())
+ {
+ log.trace("removeObject(): clazz is null. id: " + fqn + " No need to remove.");
+ }
+ return null;
+ }
+
+ Fqn<?> internalFqn = pojoReference.getFqn();
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("removeObject(): removing object from id: " + fqn
+ + " with the corresponding internal id: " + internalFqn);
+ }
+
+ Object result = pojoCache.find(internalFqn);
+ if (result == null)
+ return null;
+
+ if (graphHandler_.isMultipleReferenced(internalFqn))
+ {
+ graphHandler_.remove(internalFqn, fqn, result);
+ }
+ else
+ {
+ cache.put(internalFqn, InternalConstant.POJOCACHE_STATUS, "DETACHING");
+ boolean allowArray = source instanceof ArrayInterceptable;
+ result = getHandler(result.getClass(), allowArray).remove(internalFqn, fqn, result);
+ }
+
+ internal_.cleanUp(fqn, field);
+ return result;
+ }
+
+ public Map findObjects(Fqn fqn) throws CacheException
+ {
+
+ // Traverse from fqn to do getObject, if it return a pojo we then stop.
+ Map map = new HashMap();
+ Object pojo = getObject(fqn, null, null);
+ if (pojo != null)
+ {
+ map.put(fqn, pojo);// we are done!
+ return map;
+ }
+
+ findChildObjects(fqn, map);
+ if (log.isDebugEnabled())
+ {
+ log.debug("_findObjects(): id: " + fqn + " size of pojos found: " + map.size());
+ }
+ return map;
+ }
+
+ private Object getObjectInternal(Fqn<?> fqn, String field, Object source) throws CacheException
+ {
+ Fqn<?> internalFqn = fqn;
+ PojoReference pojoReference = internal_.getPojoReference(fqn, field);
+ if (pojoReference != null)
+ {
+ internalFqn = pojoReference.getFqn();
+ }
+ else if (field != null)
+ {
+ return null;
+ }
+
+ if (log.isDebugEnabled())
+ log.debug("getObject(): id: " + fqn + " with a corresponding internal id: " + internalFqn);
+
+ /**
+ * Reconstruct the managed POJO
+ */
+ Object obj;
+
+ PojoInstance pojoInstance = internal_.getPojoInstance(internalFqn);
+
+ if (pojoInstance == null)
+ return null;
+ //throw new PojoCacheException("PojoCacheDelegate.getObjectInternal(): null PojoInstance for fqn: " + internalFqn);
+
+ Class<?> clazz = pojoInstance.getPojoClass();
+ boolean allowArray = source instanceof ArrayInterceptable;
+ obj = getHandler(clazz, allowArray).get(internalFqn, clazz, pojoInstance);
+
+ InternalHelper.setPojo(pojoInstance, obj);
+ return obj;
+ }
+
+ private void findChildObjects(Fqn fqn, Map map) throws CacheException
+ {
+ // We need to traverse then
+ Node root = cache.getRoot();
+ Node current = root.getChild(fqn);
+
+ if (current == null) return;
+
+ Collection<Node> col = current.getChildren();
+ if (col == null) return;
+ for (Node n : col)
+ {
+ Fqn newFqn = n.getFqn();
+ if (InternalHelper.isInternalNode(newFqn)) continue;// skip
+
+ Object pojo = getObject(newFqn, null, null);
+ if (pojo != null)
+ {
+ map.put(newFqn, pojo);
+ }
+ else
+ {
+ findChildObjects(newFqn, map);
+ }
+ }
+ }
+
+ public boolean exists(Fqn<?> id)
+ {
+ return internal_.getPojoReference(id, null) != null || internal_.getPojoInstance(id) != null;
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,356 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.impl;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.regex.Pattern;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.CacheSPI;
-import org.jboss.cache.DefaultCacheFactory;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Version;
-import org.jboss.cache.config.Configuration;
-import org.jboss.cache.factories.XmlConfigurationParser;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.PojoCacheThreadContext;
-import org.jboss.cache.pojo.annotation.Attach;
-import org.jboss.cache.pojo.annotation.Detach;
-import org.jboss.cache.pojo.annotation.Find;
-
-/**
- * Implementation class for PojoCache interface
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoCacheImpl implements PojoCache
-{
- private CacheSPI<Object, Object> cache = null;
- protected final Log log_ = LogFactory.getLog(PojoCacheImpl.this.getClass());
- private PojoCacheDelegate delegate_;
- // Class -> CachedType
- // use WeakHashMap to allow class reloading
- private Map cachedTypes_ = new WeakHashMap();
- private boolean hasCreate_ = false;
- private CacheListenerAdaptor listenerAdaptor = new CacheListenerAdaptor(this);
- private PojoCacheThreadContext threadContext = new PojoCacheThreadContextImpl();
-
- public PojoCacheImpl(String configStr, boolean toStart)
- {
- try
- {
- // cache_ = new PojoTreeCache();
- // cache_.setConfiguration(new XmlConfigurationParser().parseFile(configStr));
-
- XmlConfigurationParser parser = new XmlConfigurationParser();
- Configuration expected = parser.parseFile(configStr);
-
- init(expected, toStart);
- }
- catch (Exception e)
- {
- throw new PojoCacheException("Failed to start " + configStr, e);
- }
- }
-
- public PojoCacheImpl(Configuration config, boolean toStart)
- {
- init(config, toStart);
- }
-
- private void init(Configuration config, boolean toStart)
- {
- try
- {
- cache = (CacheSPI<Object, Object>) DefaultCacheFactory.getInstance().createCache(config, toStart);
- }
- catch (Exception e)
- {
- throw new PojoCacheException("init " + config + " failed", e);
- }
-
- delegate_ = new PojoCacheDelegate(this);
- }
-
- public CacheSPI<Object, Object> getCacheSPI()
- {
- return cache;
- }
-
- public Object attach(String id, Object pojo) throws PojoCacheException
- {
- return attach(Fqn.fromString(id), pojo);
- }
-
- @Attach
- public Object attach(Fqn<?> id, Object pojo) throws PojoCacheException
- {
- try
- {
- Object obj = putObject(id, pojo, null, null);
- return obj;
- }
- catch (CacheException e)
- {
- throw new PojoCacheException("putObject failed " + id, e);
- }
- }
-
- @Attach
- public Object attach(Fqn<?> id, Object pojo, String field, Object source) throws PojoCacheException
- {
- try
- {
- Object obj = putObject(id, pojo, field, source);
- return obj;
- }
- catch (CacheException e)
- {
- throw new PojoCacheException("putObject failed " + id, e);
- }
- }
-
- /**
- * This public API is called from internal package only.
- */
- public Object putObject(Fqn<?> id, Object pojo, String field, Object source) throws CacheException
- {
- return delegate_.putObject(id, pojo, field, source);
- }
-
- public Object detach(String id) throws PojoCacheException
- {
- return detach(Fqn.fromString(id));
- }
-
- @Detach
- public Object detach(Fqn<?> id, String field, Object source) throws PojoCacheException
- {
- try
- {
- Object pojo = getObject(id, field, source);// TODO need optimization here since it will be redundant here
- if (pojo == null) return pojo;
-
- Object obj = removeObject(id, field, source);
- return obj;
- }
- catch (CacheException e)
- {
- throw new PojoCacheException("detach " + id + " failed", e);
- }
- }
-
- public Object detach(Fqn<?> id) throws PojoCacheException
- {
- return detach(id, null, null);
- }
-
- public Object removeObject(Fqn<?> id, String field, Object source) throws CacheException
- {
- delegate_.setBulkRemove(false);
- return delegate_.removeObject(id, field, source);
- }
-
- public String getPojoID(Object pojo)
- {
- throw new PojoCacheException("getPojoID not yet implemented");
- }
-
- public boolean exists(Fqn<?> id)
- {
- return delegate_.exists(id);
- }
-
- public Object find(String id) throws PojoCacheException
- {
- return find(Fqn.fromString(id));
- }
-
- @Find
- public Object find(Fqn<?> id) throws PojoCacheException
- {
- try
- {
- return getObject(id);
- }
- catch (CacheException e)
- {
- throw new PojoCacheException("find " + id + " failed ", e);
- }
- }
-
- public Object getObject(Fqn<?> id) throws CacheException
- {
- return getObject(id, null, null);
- }
-
- public Object getObject(Fqn<?> id, String field, Object source) throws CacheException
- {
- return delegate_.getObject(id, field, source);
- }
-
-
- public Map<Fqn<?>, Object> findAll(String id) throws PojoCacheException
- {
- return findAll(Fqn.fromString(id));
- }
-
- @Find
- public Map<Fqn<?>, Object> findAll(Fqn<?> id) throws PojoCacheException
- {
- // Should produce "/"
- if (id == null) id = Fqn.ROOT;
-
- try
- {
- return delegate_.findObjects(id);
- }
- catch (CacheException e)
- {
- throw new PojoCacheException("findAll " + id + " failed", e);
- }
- }
-
- public String getVersion()
- {
- return Version.printVersion();
- }
-
- public void create() throws PojoCacheException
- {
- log_.info("PojoCache version: " + getVersion());
- try
- {
- cache.create();
- }
- catch (Exception e)
- {
- throw new PojoCacheException("PojoCache create exception", e);
- }
-
- hasCreate_ = true;
- }
-
- public void start() throws PojoCacheException
- {
- if (!hasCreate_)
- {
- create();
- }
-
- try
- {
- log_.info("PojoCache version: " + getVersion());
- cache.start();
- }
- catch (Exception e)
- {
- throw new PojoCacheException("Failed starting " + e, e);
- }
- }
-
- public void stop() throws PojoCacheException
- {
- cache.stop();
- }
-
- public void destroy() throws PojoCacheException
- {
- cache.destroy();
- }
-
- public Collection<Object> getListeners()
- {
- return listenerAdaptor.getListeners();
- }
-
- public void addListener(Object listener)
- {
- addListener(listener, null);
- }
-
- public void addListener(Object listener, Pattern pattern)
- {
- // Add and remove listner operations must be serialized to ensure that
- // the adaptor is always present only once, when at least one listener
- // is registered.
- synchronized (listenerAdaptor)
- {
- try
- {
- boolean wasEmpty = listenerAdaptor.isEmpty();
- listenerAdaptor.addListener(listener, pattern);
- if (wasEmpty)
- cache.addCacheListener(listenerAdaptor);
- }
- catch (IllegalArgumentException e)
- {
- // simplify stack trace for user
- e.fillInStackTrace();
- throw e;
- }
- }
- }
-
- public void removeListener(Object listener)
- {
- synchronized (listenerAdaptor)
- {
- listenerAdaptor.removeListener(listener);
- if (listenerAdaptor.isEmpty())
- cache.removeCacheListener(listenerAdaptor);
- }
- }
-
- public PojoCacheThreadContext getThreadContext()
- {
- return threadContext;
- }
-
- public Cache<Object,Object> getCache()
- {
- return cache;
- }
-
- /**
- * Obtain a cache aop type for user to traverse the defined "primitive" types in aop.
- * Note that this is not a synchronized call now for speed optimization.
- *
- * @param clazz The original pojo class
- * @return CachedType
- */
- public synchronized CachedType getCachedType(Class clazz)
- {
- CachedType type = (CachedType) cachedTypes_.get(clazz);
- if (type == null)
- {
- type = new CachedType(clazz);
- cachedTypes_.put(clazz, type);
- return type;
- }
- else
- {
- return type;
- }
- }
-
- public String toString()
- {
- return getClass().getName() +
- " cache=" + cache +
- " delegate=" + delegate_ +
- " types=" + cachedTypes_.size();
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoCacheImpl.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,411 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.impl;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.regex.Pattern;
+
+import javax.transaction.Status;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.Cache;
+import org.jboss.cache.CacheException;
+import org.jboss.cache.CacheSPI;
+import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Version;
+import org.jboss.cache.config.Configuration;
+import org.jboss.cache.factories.XmlConfigurationParser;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.PojoCacheThreadContext;
+import org.jboss.cache.pojo.interceptors.PojoTxSynchronizationHandler;
+import org.jboss.cache.transaction.BatchModeTransactionManager;
+
+/**
+ * Implementation class for PojoCache interface
+ *
+ * @author Ben Wang
+ * @version $Id$
+ */
+public class PojoCacheImpl implements PojoCache
+{
+ private CacheSPI<Object, Object> cache = null;
+ protected final Log log_ = LogFactory.getLog(PojoCacheImpl.this.getClass());
+ private PojoCacheDelegate delegate_;
+ // Class -> CachedType
+ // use WeakHashMap to allow class reloading
+ private Map cachedTypes_ = new WeakHashMap();
+ private boolean hasCreate_ = false;
+ private CacheListenerAdaptor listenerAdaptor = new CacheListenerAdaptor(this);
+ private PojoCacheThreadContext threadContext = new PojoCacheThreadContextImpl();
+
+ public PojoCacheImpl(String configStr, boolean toStart)
+ {
+ try
+ {
+ // cache_ = new PojoTreeCache();
+ // cache_.setConfiguration(new XmlConfigurationParser().parseFile(configStr));
+
+ XmlConfigurationParser parser = new XmlConfigurationParser();
+ Configuration expected = parser.parseFile(configStr);
+
+ init(expected, toStart);
+ }
+ catch (Exception e)
+ {
+ throw new PojoCacheException("Failed to start " + configStr, e);
+ }
+ }
+
+ public PojoCacheImpl(Configuration config, boolean toStart)
+ {
+ init(config, toStart);
+ }
+
+ private void init(Configuration config, boolean toStart)
+ {
+ try
+ {
+ cache = (CacheSPI<Object, Object>) DefaultCacheFactory.getInstance().createCache(config, toStart);
+ }
+ catch (Exception e)
+ {
+ throw new PojoCacheException("init " + config + " failed", e);
+ }
+
+ delegate_ = new PojoCacheDelegate(this);
+ }
+
+ public CacheSPI<Object, Object> getCacheSPI()
+ {
+ return cache;
+ }
+
+ public Object attach(String id, Object pojo) throws PojoCacheException
+ {
+ return attach(Fqn.fromString(id), pojo);
+ }
+
+ public Object attach(Fqn<?> id, Object pojo) throws PojoCacheException
+ {
+ return attach(id, pojo, null, null);
+ }
+
+ public Object attach(Fqn<?> id, Object pojo, String field, Object source) throws PojoCacheException
+ {
+ TransactionManager tm = getTransactionManager();
+ boolean createdTransaction = setupTransaction(tm);
+ try
+ {
+ Object obj = delegate_.putObject(id, pojo, field, source);
+ return obj;
+ }
+ catch (Throwable t)
+ {
+ setRollbackOnly(tm);
+ throw new PojoCacheException("attach failed " + id, t);
+ }
+ finally
+ {
+ if (createdTransaction)
+ endTransaction(tm, id);
+ }
+ }
+
+ public Object detach(Fqn<?> id, String field, Object source) throws PojoCacheException
+ {
+ TransactionManager tm = getTransactionManager();
+ boolean createdTransaction = setupTransaction(tm);
+ try
+ {
+ Object obj = delegate_.removeObject(id, field, source);
+ return obj;
+ }
+ catch (Throwable t)
+ {
+ setRollbackOnly(tm);
+ throw new PojoCacheException("detach failed " + id, t);
+ }
+ finally
+ {
+ if (createdTransaction)
+ endTransaction(tm, id);
+ }
+ }
+
+ private void endTransaction(TransactionManager tm, Fqn<?> id)
+ {
+ try
+ {
+ switch (tm.getStatus())
+ {
+ case Status.STATUS_PREPARING:
+ case Status.STATUS_PREPARED:
+ case Status.STATUS_ACTIVE:
+ tm.commit();
+ break;
+ case Status.STATUS_MARKED_ROLLBACK:
+ tm.rollback();
+ break;
+ }
+ }
+ catch (Throwable t)
+ {
+ if (log_.isWarnEnabled())
+ log_.warn("Could not end transaction for operation on: " + id, t);
+ }
+ }
+
+ private void setRollbackOnly(TransactionManager tm)
+ {
+ try
+ {
+ if (tm.getStatus() != Status.STATUS_MARKED_ROLLBACK)
+ tm.setRollbackOnly();
+ }
+ catch (Throwable t)
+ {
+ if (log_.isWarnEnabled())
+ log_.warn("Could not rollback transaction!", t);
+ }
+ }
+
+ private boolean setupTransaction(TransactionManager tm)
+ {
+ boolean created = false;
+ try
+ {
+ Transaction transaction = tm.getTransaction();
+ if (transaction == null)
+ {
+ tm.begin();
+ transaction = tm.getTransaction();
+ created = true;
+ }
+
+ transaction.registerSynchronization(PojoTxSynchronizationHandler.create());
+ }
+ catch (Exception e)
+ {
+ throw new PojoCacheException("Error creating transaction", e);
+ }
+
+ return created;
+ }
+
+ private TransactionManager getTransactionManager()
+ {
+ TransactionManager tm = cache.getConfiguration().getRuntimeConfig().getTransactionManager();
+ if (tm == null)
+ tm = BatchModeTransactionManager.getInstance();
+
+ return tm;
+ }
+
+ public Object detach(String id) throws PojoCacheException
+ {
+ return detach(Fqn.fromString(id));
+ }
+
+
+
+ public Object detach(Fqn<?> id) throws PojoCacheException
+ {
+ return detach(id, null, null);
+ }
+
+ public String getPojoID(Object pojo)
+ {
+ throw new PojoCacheException("getPojoID not yet implemented");
+ }
+
+ public boolean exists(Fqn<?> id)
+ {
+ return delegate_.exists(id);
+ }
+
+ public Object find(String id) throws PojoCacheException
+ {
+ return find(Fqn.fromString(id));
+ }
+
+ public Object find(Fqn<?> id) throws PojoCacheException
+ {
+ try
+ {
+ return find(id, null, null);
+ }
+ catch (CacheException e)
+ {
+ throw new PojoCacheException("find " + id + " failed ", e);
+ }
+ }
+
+ public Object find(Fqn<?> id, String field, Object source) throws CacheException
+ {
+ return delegate_.getObject(id, field, source);
+ }
+
+
+ public Map<Fqn<?>, Object> findAll(String id) throws PojoCacheException
+ {
+ return findAll(Fqn.fromString(id));
+ }
+
+ public Map<Fqn<?>, Object> findAll(Fqn<?> id) throws PojoCacheException
+ {
+ // Should produce "/"
+ if (id == null) id = Fqn.ROOT;
+
+ try
+ {
+ return delegate_.findObjects(id);
+ }
+ catch (CacheException e)
+ {
+ throw new PojoCacheException("findAll " + id + " failed", e);
+ }
+ }
+
+ public String getVersion()
+ {
+ return Version.printVersion();
+ }
+
+ public void create() throws PojoCacheException
+ {
+ log_.info("PojoCache version: " + getVersion());
+ try
+ {
+ cache.create();
+ }
+ catch (Exception e)
+ {
+ throw new PojoCacheException("PojoCache create exception", e);
+ }
+
+ hasCreate_ = true;
+ }
+
+ public void start() throws PojoCacheException
+ {
+ if (!hasCreate_)
+ {
+ create();
+ }
+
+ try
+ {
+ log_.info("PojoCache version: " + getVersion());
+ cache.start();
+ }
+ catch (Exception e)
+ {
+ throw new PojoCacheException("Failed starting " + e, e);
+ }
+ }
+
+ public void stop() throws PojoCacheException
+ {
+ cache.stop();
+ }
+
+ public void destroy() throws PojoCacheException
+ {
+ cache.destroy();
+ }
+
+ public Collection<Object> getListeners()
+ {
+ return listenerAdaptor.getListeners();
+ }
+
+ public void addListener(Object listener)
+ {
+ addListener(listener, null);
+ }
+
+ public void addListener(Object listener, Pattern pattern)
+ {
+ // Add and remove listner operations must be serialized to ensure that
+ // the adaptor is always present only once, when at least one listener
+ // is registered.
+ synchronized (listenerAdaptor)
+ {
+ try
+ {
+ boolean wasEmpty = listenerAdaptor.isEmpty();
+ listenerAdaptor.addListener(listener, pattern);
+ if (wasEmpty)
+ cache.addCacheListener(listenerAdaptor);
+ }
+ catch (IllegalArgumentException e)
+ {
+ // simplify stack trace for user
+ e.fillInStackTrace();
+ throw e;
+ }
+ }
+ }
+
+ public void removeListener(Object listener)
+ {
+ synchronized (listenerAdaptor)
+ {
+ listenerAdaptor.removeListener(listener);
+ if (listenerAdaptor.isEmpty())
+ cache.removeCacheListener(listenerAdaptor);
+ }
+ }
+
+ public PojoCacheThreadContext getThreadContext()
+ {
+ return threadContext;
+ }
+
+ public Cache<Object,Object> getCache()
+ {
+ return cache;
+ }
+
+ /**
+ * Obtain a cache aop type for user to traverse the defined "primitive" types in aop.
+ * Note that this is not a synchronized call now for speed optimization.
+ *
+ * @param clazz The original pojo class
+ * @return CachedType
+ */
+ public synchronized CachedType getCachedType(Class clazz)
+ {
+ CachedType type = (CachedType) cachedTypes_.get(clazz);
+ if (type == null)
+ {
+ type = new CachedType(clazz);
+ cachedTypes_.put(clazz, type);
+ return type;
+ }
+ else
+ {
+ return type;
+ }
+ }
+
+ public String toString()
+ {
+ return getClass().getName() +
+ " cache=" + cache +
+ " delegate=" + delegate_ +
+ " types=" + cachedTypes_.size();
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,173 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.impl;
-
-import java.lang.reflect.Field;
-import java.util.List;
-
-import org.jboss.aop.Advised;
-import org.jboss.aop.Domain;
-import org.jboss.aop.InstanceAdvisor;
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.annotation.TxUndo;
-import org.jboss.cache.pojo.collection.CachedArray;
-import org.jboss.cache.pojo.collection.CachedArrayRegistry;
-import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
-
-/**
- * Utility class for method wrappers that we are interested to rollback (i.e., rollback).
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoUtil
-{
- private static final String BindingName = "ReentrancyStopperInterceptor.";
-
- @TxUndo
- public void attachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor)
- {
- _attachInterceptor(pojo, advisor, interceptor);
- }
-
- @TxUndo
- public void detachInterceptor(InstanceAdvisor advisor, Interceptor interceptor)
- {
- _detachInterceptor(advisor, interceptor);
- }
-
- @TxUndo
- public void detachCollectionInterceptor(AbstractCollectionInterceptor interceptor) {
- interceptor.detach(true);
- }
-
- @TxUndo
- public void attachArray(Object array, CachedArray cached) {
- CachedArrayRegistry.register(array, cached);
- }
-
- @TxUndo
- public void detachArray(Object array, CachedArray cached) {
- CachedArrayRegistry.unregister(array);
- }
-
- public void undoAttachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor)
- {
- _detachInterceptor(advisor, interceptor);
- }
-
- public void undoDetachInterceptor(InstanceAdvisor advisor, Interceptor interceptor)
- {
- Object pojo = ((CacheFieldInterceptor) interceptor).getAopInstance().get();
- if (pojo == null)
- {
- throw new PojoCacheException("PojoUtil.detachInterceptor(): null pojo");
- }
-
- _attachInterceptor(pojo, advisor, interceptor);
- }
-
- public void undoDetachCollectionInterceptor(AbstractCollectionInterceptor interceptor) {
- interceptor.attach(null, false);
- }
-
- public void undoAttachArray(Object array, CachedArray cached) {
- CachedArrayRegistry.unregister(array);
- }
-
- public void undoDetachArray(Object array, CachedArray cached) {
- CachedArrayRegistry.register(array, cached);
- }
-
-
- @TxUndo
- public void inMemorySubstitution(Object obj, Field field, Object newValue)
- {
- _inMemorySubstitution(obj, field, newValue);
- }
-
- public void undoInMemorySubstitution(Object obj, Field field, Object oldValue)
- {
- _inMemorySubstitution(obj, field, oldValue);
- }
-
- private void _attachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor)
- {
- advisor.appendInterceptor(interceptor);
- }
-
- private Domain getInstanceDomain(Object obj)
- {
- Advised advised = ((Advised) obj);
- InstanceAdvisor advisor = advised._getInstanceAdvisor();
- return advisor.getDomain();
- }
-
- private void _inMemorySubstitution(Object obj, Field field, Object newValue)
- {
- try
- {
- field.set(obj, newValue);
- }
- catch (IllegalAccessException e)
- {
- throw new PojoCacheException(
- "PojoUtil.inMemorySubstitution(): Can't swap out the class of field \" " +
- "+field.getLastElementAsString()," + e);
- }
- }
-
- private void _detachInterceptor(InstanceAdvisor advisor, Interceptor interceptor)
- {
- advisor.removeInterceptor(interceptor.getName());
- // retrieve pojo
- Object pojo = ((CacheFieldInterceptor) interceptor).getAopInstance().get();
-
- if (pojo == null)
- {
- throw new PojoCacheException("PojoUtil.detachInterceptor(): null pojo");
- }
- }
-
- @TxUndo
- public int incrementReferenceCount(Fqn sourceFqn, int count, List refList)
- {
- return _incrementReferenceCount(sourceFqn, count, refList);
- }
-
- public int undoIncrementReferenceCount(Fqn sourceFqn, int count, List refList)
- {
- return _decrementReferenceCount(sourceFqn, count, refList);
- }
-
- private int _incrementReferenceCount(Fqn sourceFqn, int count, List refList)
- {
- refList.add(sourceFqn);
- return count + 1;
- }
-
- @TxUndo
- public int decrementReferenceCount(Fqn sourceFqn, int count, List refList)
- {
- return _decrementReferenceCount(sourceFqn, count, refList);
- }
-
- public int undoDecrementReferenceCount(Fqn sourceFqn, int count, List refList)
- {
- return _incrementReferenceCount(sourceFqn, count, refList);
- }
-
- private int _decrementReferenceCount(Fqn sourceFqn, int count, List refList)
- {
- refList.remove(sourceFqn);
- return count - 1;
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/impl/PojoUtil.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,201 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.impl;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.jboss.aop.InstanceAdvisor;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.collection.CachedArray;
+import org.jboss.cache.pojo.collection.CachedArrayRegistry;
+import org.jboss.cache.pojo.interceptors.PojoTxSynchronizationHandler;
+import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
+import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
+import org.jboss.cache.pojo.util.MethodCall;
+
+/**
+ * Utility class for method wrappers that we are interested to rollback (i.e., rollback).
+ *
+ * @author Ben Wang
+ * @version $Id$
+ */
+public class PojoUtil
+{
+ public void attachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor)
+ {
+ _attachInterceptor(pojo, advisor, interceptor);
+ Method method = MethodDeclarations.undoAttachInterceptor;
+ MethodCall mc = new MethodCall(method, new Object[] {pojo, advisor, interceptor}, this);
+ addUndo(mc);
+ }
+
+ public void detachInterceptor(InstanceAdvisor advisor, Interceptor interceptor)
+ {
+ _detachInterceptor(advisor, interceptor);
+ Method method = MethodDeclarations.undoDetachInterceptor;
+ MethodCall mc = new MethodCall(method, new Object[] {advisor, interceptor}, this);
+ addUndo(mc);
+ }
+
+ private void addUndo(MethodCall mc)
+ {
+ PojoTxSynchronizationHandler handler = PojoTxSynchronizationHandler.current();
+ if (handler != null)
+ handler.addToList(mc);
+ }
+
+ public void detachCollectionInterceptor(AbstractCollectionInterceptor interceptor) {
+ interceptor.detach(true);
+ Method method = MethodDeclarations.undoDetachCollectionInterceptor;
+ MethodCall mc = new MethodCall(method, new Object[] {interceptor}, this);
+ addUndo(mc);
+ }
+
+ public void attachArray(Object array, CachedArray cached) {
+ CachedArrayRegistry.register(array, cached);
+ Method method = MethodDeclarations.undoAttachArray;
+ MethodCall mc = new MethodCall(method, new Object[] {array, cached}, this);
+ addUndo(mc);
+ }
+
+ public void detachArray(Object array, CachedArray cached) {
+ CachedArrayRegistry.unregister(array);
+ Method method = MethodDeclarations.undoDetachArray;
+ MethodCall mc = new MethodCall(method, new Object[] {array, cached}, this);
+ addUndo(mc);
+ }
+
+ public void undoAttachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor)
+ {
+ _detachInterceptor(advisor, interceptor);
+ }
+
+ public void undoDetachInterceptor(InstanceAdvisor advisor, Interceptor interceptor)
+ {
+ Object pojo = ((CacheFieldInterceptor) interceptor).getAopInstance().get();
+ if (pojo == null)
+ {
+ throw new PojoCacheException("PojoUtil.detachInterceptor(): null pojo");
+ }
+
+ _attachInterceptor(pojo, advisor, interceptor);
+ }
+
+ public void undoDetachCollectionInterceptor(AbstractCollectionInterceptor interceptor) {
+ interceptor.attach(null, false);
+ }
+
+ public void undoAttachArray(Object array, CachedArray cached) {
+ CachedArrayRegistry.unregister(array);
+ }
+
+ public void undoDetachArray(Object array, CachedArray cached) {
+ CachedArrayRegistry.register(array, cached);
+ }
+
+ public void inMemorySubstitution(Object obj, Field field, Object newValue)
+ {
+ Method method = MethodDeclarations.undoInMemorySubstitution;
+ Object[] args;
+ try
+ {
+ args = new Object[]{obj, field, field.get(obj)};
+ }
+ catch (Throwable t)
+ {
+ throw new PojoCacheException("Severe error building undo list", t);
+ }
+
+ _inMemorySubstitution(obj, field, newValue);
+
+ MethodCall mc = new MethodCall(method, args, this);
+ addUndo(mc);
+ }
+
+ public void undoInMemorySubstitution(Object obj, Field field, Object oldValue)
+ {
+ _inMemorySubstitution(obj, field, oldValue);
+ }
+
+ private void _attachInterceptor(Object pojo, InstanceAdvisor advisor, Interceptor interceptor)
+ {
+ advisor.appendInterceptor(interceptor);
+ }
+
+ private void _inMemorySubstitution(Object obj, Field field, Object newValue)
+ {
+ try
+ {
+ field.set(obj, newValue);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new PojoCacheException(
+ "PojoUtil.inMemorySubstitution(): Can't swap out the class of field \" " +
+ "+field.getLastElementAsString()," + e);
+ }
+ }
+
+ private void _detachInterceptor(InstanceAdvisor advisor, Interceptor interceptor)
+ {
+ advisor.removeInterceptor(interceptor.getName());
+ // retrieve pojo
+ Object pojo = ((CacheFieldInterceptor) interceptor).getAopInstance().get();
+
+ if (pojo == null)
+ {
+ throw new PojoCacheException("PojoUtil.detachInterceptor(): null pojo");
+ }
+ }
+
+ public int incrementReferenceCount(Fqn<?> sourceFqn, int count, List<?> refList)
+ {
+ int ret = _incrementReferenceCount(sourceFqn, count, refList);
+ Method method = MethodDeclarations.undoIncrementReferenceCount;
+ Object[] args = new Object[]{sourceFqn, count, refList};
+ MethodCall mc = new MethodCall(method, args, this);
+ addUndo(mc);
+ return ret;
+ }
+
+ public int undoIncrementReferenceCount(Fqn sourceFqn, int count, List refList)
+ {
+ return _decrementReferenceCount(sourceFqn, count, refList);
+ }
+
+ private int _incrementReferenceCount(Fqn sourceFqn, int count, List refList)
+ {
+ refList.add(sourceFqn);
+ return count + 1;
+ }
+
+ public int decrementReferenceCount(Fqn<?> sourceFqn, int count, List<?> refList)
+ {
+ int ret = _decrementReferenceCount(sourceFqn, count, refList);
+ Method method = MethodDeclarations.undoDecrementReferenceCount;
+ Object[] args = new Object[]{sourceFqn, count, refList};
+ MethodCall mc = new MethodCall(method, args, this);
+ addUndo(mc);
+ return ret;
+ }
+
+ public int undoDecrementReferenceCount(Fqn sourceFqn, int count, List refList)
+ {
+ return _incrementReferenceCount(sourceFqn, count, refList);
+ }
+
+ private int _decrementReferenceCount(Fqn sourceFqn, int count, List refList)
+ {
+ refList.remove(sourceFqn);
+ return count - 1;
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/CheckIdInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/CheckIdInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/CheckIdInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,50 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Fqn;
-
-/**
- * Interceptor (done via aop advice) to check the validity of the id specified by the user.
- *
- * @version $Id$
- */
-public class CheckIdInterceptor extends AbstractInterceptor
-{
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("CheckIdInterceptor.invoke(): invocation not MethodInvocation");
- }
-
- MethodInvocation invocation = (MethodInvocation) in;
- invocation.getAdvisor();
- try
- {
- checkFqnValidity((Fqn) invocation.getArguments()[0]);
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- finally
- {
- }
- }
-
-
- private static void checkFqnValidity(Fqn id)
- {
- // throws exception is fqn is JBossInternal
-// if (id.hasElement(InternalConstant.JBOSS_INTERNAL_STRING))
-// {
-// throw new IllegalArgumentException("CheckIdIntercepto.checkFqnValidity(): fqn is not valid: " + id);
-// }
- }
-}
-
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/CheckNonSerializableInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/CheckNonSerializableInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/CheckNonSerializableInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,57 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.util.AopUtil;
-
-/**
- * Interceptor (done via aop advice) to check the validity of the id specified by the user.
- *
- * @version $Id$
- */
-public class CheckNonSerializableInterceptor extends AbstractInterceptor
-{
- private boolean marshallNonSerializable_ = false;
-
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("CheckIdInterceptor.invoke(): invocation not MethodInvocation");
- }
-
- MethodInvocation invocation = (MethodInvocation) in;
- Fqn id = (Fqn) invocation.getArguments()[0];
- Object obj = invocation.getArguments()[1];
- if (!marshallNonSerializable_)
- {
- AopUtil.checkObjectType(obj);
- }
- else
- {
- log.debug("invoke(): marshallNonSerializable is set to true. We will skip object type checking for id:"
- + id.toString());
- }
-
- try
- {
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- finally
- {
- }
- }
-
- public void setMarshallNonSerializable(boolean isTrue)
- {
- marshallNonSerializable_ = isTrue;
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/MethodReentrancyStopperInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/MethodReentrancyStopperInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/MethodReentrancyStopperInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,88 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.pojo.PojoCacheException;
-
-import java.lang.reflect.Method;
-
-/**
- * @author Ben Wang
- */
-
-public class MethodReentrancyStopperInterceptor implements Interceptor
-{
- private final Log log_ = LogFactory.getLog(MethodReentrancyStopperInterceptor.class);
- private ThreadLocal<Boolean> done;
- private String methodName;
-
- public MethodReentrancyStopperInterceptor()
- {
- done = new ThreadLocal<Boolean>();
- done.set(false);
- }
-
- public void setMethodName(String mname)
- {
- methodName = mname;
- }
-
- public String getName()
- {
- return MethodReentrancyStopperInterceptor.class.getName() + "-" + methodName;
- }
-
- public Object invoke(Invocation invocation) throws Throwable
- {
- boolean wasDone = done.get();
-
- try
- {
- if (!wasDone)
- {
- done.set(true);
- return invocation.invokeNext();
- }
- else
- {
- //Needs adding, and will invoke target joinpoint skipping the rest of the chain
- if (log_.isDebugEnabled())
- {
- Method method = ((MethodInvocation) invocation).getMethod();
- log_.debug("Detect recursive interception. Will call the target directly: " + method.getName());
- }
-
- if (methodName.equals("toString"))
- {
- return invocation.getTargetObject().getClass().getName();
- }
- else if (methodName.equals("hashCode"))
- {
- return 0;
- }
- else
- {
- throw new PojoCacheException("MethodReentrancyStopperInterceptor.invoke(): unknown method name"
- + methodName);
- }
- }
- }
- finally
- {
- if (!wasDone)
- {
- done.set(false);
- }
- }
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoBeginInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoBeginInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoBeginInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.aop.metadata.SimpleMetaData;
-
-/**
- * The first interceptor that deals initialization.
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoBeginInterceptor extends AbstractInterceptor
-{
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("BeginInterceptor.invoke(): invocation not MethodInvocation");
- }
- MethodInvocation invocation = (MethodInvocation) in;
- // Let's initialize the metadata
- SimpleMetaData simple = new SimpleMetaData();
- invocation.setMetaData(simple);
-
- try
- {
- log.debug("**** Entering method: **** " + invocation.getMethod());
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- finally
- {
-// reset(); // reset
- log.debug("Leaving method: " + invocation.getMethod());
- }
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoEventInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoEventInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoEventInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,38 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-
-/**
- * Handles the POJO event notification.
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoEventInterceptor extends AbstractInterceptor
-{
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("PojoEventInterceptor.invoke(): invocation not MethodInvocation");
- }
- MethodInvocation invocation = (MethodInvocation) in;
- try
- {
- System.out.println("**** Entering method: **** " + invocation.getMethod());
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- finally
- {
- System.out.println("Leaving method: " + invocation.getMethod());
- }
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoFailedTxMockupInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoFailedTxMockupInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoFailedTxMockupInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,65 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.impl.InternalConstant;
-
-import javax.transaction.Transaction;
-
-/**
- * Interceptor to mockup tx failure that resulting in rollback. User can simulate a rollback
- * by setting the static method <code>setRollback</code>. Note that you will need to use
- * setRollback for every method call, that is, it will reset itself after a rollback
- * has been performed.
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoFailedTxMockupInterceptor extends AbstractInterceptor
-{
- public static boolean TX_ROLLBACK = false;
-
- public static void setTxRollback(boolean isTrue)
- {
- TX_ROLLBACK = isTrue;
- }
-
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException(
- "PojoFailedTxMockupInterceptor.invoke(): invocation not MethodInvocation");
- }
- MethodInvocation invocation = (MethodInvocation) in;
- try
- {
- Object obj = null;
- obj = invocation.invokeNext(); // proceed to next advice or actual call
- if(TX_ROLLBACK)
- {
- Transaction tx = (Transaction)
- invocation.getMetaData().getMetaData(PojoTxInterceptor.TAG, PojoTxInterceptor.TX);
-
- Fqn id = (Fqn) invocation.getArguments()[0];
-
- if(!id.isChildOrEquals(InternalConstant.JBOSS_INTERNAL))
- {
- tx.setRollbackOnly();
- TX_ROLLBACK = false;
- }
- }
- return obj;
- } finally
- {
- }
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,145 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.transaction.BatchModeTransactionManager;
-
-import javax.transaction.RollbackException;
-import javax.transaction.Status;
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-
-/**
- * Interceptor (done via aop advice) for transaction
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoTxInterceptor extends AbstractInterceptor
-{
- private TransactionManager localTm_ = null;
- private TransactionManager txManager_;
- public static final String TAG = "PC";
- public static final String TX = "TX";
-
-
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("TxInterceptor.invoke(): invocation not MethodInvocation");
- }
- MethodInvocation invocation = (MethodInvocation) in;
-
- if (txManager_ == null)
- {
- txManager_ = getCache(invocation).getTransactionManager();
- }
-
- Transaction tx = null;
- if (txManager_ != null)
- {
- // Use the configured one if so setup.
- localTm_ = txManager_;
- }
- else
- {
- localTm_ = BatchModeTransactionManager.getInstance();
- }
-
- tx = localTm_.getTransaction();
-
- boolean needTx = false;
- if (tx == null) needTx = true;
- Fqn id = null;
- try
- {
- if (needTx)
- {
- id = (Fqn) invocation.getArguments()[0];
- log.debug("Initiating a local transaction for batch processing with id: " + id.toString());
- // Start one of our own as batch processing.
- try
- {
- localTm_.begin();
- tx = localTm_.getTransaction();
- // Stuff tx context into the metadata
- invocation.getMetaData().addMetaData(TAG, TX, tx);
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- catch (Exception e)
- {
- log.warn(invocation.getMethod().getName() + ": exception occurred: " + e);
- try
- {
- localTm_.setRollbackOnly();
- }
- catch (Exception e2)
- {
- log.error("setRollbackOnly", e2);
- }
-
- throw new PojoCacheException("PojoCache operation will be rollback. id: " + id
- + ". Operation: " + invocation.getMethod().getName(), e);
- }
- }
- else
- {
- invocation.getMetaData().addMetaData(TAG, TX, tx);
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- }
- finally
- {
- if (needTx)
- {
- endTransaction(id);
- }
- }
- }
-
- private void endTransaction(Fqn id)
- {
- if (localTm_ == null)
- {
- log.warn("endTransaction(): tm is null for id: " + id);
- return;
- }
-
-
- try
- {
- if (localTm_.getTransaction().getStatus() != Status.STATUS_MARKED_ROLLBACK)
- {
- localTm_.commit();
- }
- else if (localTm_.getTransaction().getStatus() == Status.STATUS_ROLLEDBACK)
- {
- log.info("endTransaction(): has been rolled back for id: " + id);
- }
- else
- {
- log.info("endTransaction(): rolling back tx for id: " + id);
- localTm_.rollback();
- }
- }
- catch (RollbackException re)
- {
- // Do nothing here since cache may rollback automatically.
- log.warn("endTransaction(): rolling back transaction with exception: " + re);
- }
- catch (Exception e)
- {
- log.warn("endTransaction(): Failed with exception: " + e);
- }
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxLockInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxLockInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxLockInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,96 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Cache;
-import org.jboss.cache.CacheException;
-import org.jboss.cache.CacheSPI;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.lock.UpgradeException;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.impl.InternalConstant;
-
-/**
- * Interceptor that handles the parent node lock associated with transaction.
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoTxLockInterceptor extends AbstractInterceptor
-{
- public static final String LOCK_KEY = InternalConstant.POJOCACHE_KEY_PREFIX + "LOCK";
- // retry times for lockPojo just in case there is upgrade exception during concurrent access.
- private final int RETRY = 5;
-
- public Object invoke(Invocation in) throws Throwable
- {
- MethodInvocation invocation = (MethodInvocation) in;
- try
- {
- handleLock(invocation);
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- finally
- {
-// handleUnLock(invocation);
- }
- }
-
- private void handleLock(MethodInvocation invocation) throws Throwable
- {
- Fqn id = (Fqn) invocation.getArguments()[0];
- Cache<Object, Object> cache = getCache(invocation);
-// Object owner = cache.getLockOwner();
- Object owner = null;
- if (!lockPojo(owner, id, cache))
- {
- throw new PojoCacheException("PojoCache.removeObject(): Can't obtain the pojo lock under id: " + id);
- }
- }
-
- private boolean lockPojo(Object owner, Fqn id, Cache<Object, Object> cache) throws CacheException
- {
- if (log.isDebugEnabled())
- {
- log.debug("lockPojo(): id:" + id + " Owner: " + owner);
- }
-
- boolean isNeeded = true;
- int retry = 0;
-
- while (isNeeded)
- {
- try
- {
- cache.put(id, LOCK_KEY, "LOCK");
- isNeeded = false;
- }
- catch (UpgradeException upe)
- {
- log.warn("lockPojo(): can't upgrade the lock during lockPojo. Will re-try. id: " + id
- + " retry times: " + retry);
- if (retry++ > RETRY)
- {
- return false;
- }
- // try to sleep a little as well.
- try
- {
- Thread.sleep(10);
- }
- catch (InterruptedException e)
- {
- }
- }
- }
-
- return true;
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,95 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.util.MethodCall;
-
-import javax.transaction.Status;
-import javax.transaction.Synchronization;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Handling the rollback operation for PojoCache level, specifically interceptor add/remove, etc.
- *
- * @author Ben Wang
- * @version $Id$
- */
-
-class PojoTxSynchronizationHandler implements Synchronization
-{
- private static Log log = LogFactory.getLog(PojoTxSynchronizationHandler.class.getName());
- private List undoList_ = new ArrayList();
-
- PojoTxSynchronizationHandler()
- {
- }
-
- public void beforeCompletion()
- {
- // Not interested
- }
-
- public void afterCompletion(int status)
- {
- try
- {
- switch (status)
- {
- case Status.STATUS_COMMITTED:
- break;
- case Status.STATUS_MARKED_ROLLBACK:
- case Status.STATUS_ROLLEDBACK:
- log.debug("Running Pojo rollback phase");
- runRollbackPhase();
- log.debug("Finished rollback phase");
- break;
-
- default:
- throw new IllegalStateException("illegal status: " + status);
- }
- }
- finally
- {
- resetUndoOp();
- }
- }
-
- private void runRollbackPhase()
- {
- // Rollback the pojo interceptor add/remove
- for (int i = (undoList_.size() - 1); i >= 0; i--)
- {
- MethodCall mc = (MethodCall) undoList_.get(i);
- try
- {
- mc.invoke();
- }
- catch (Throwable t)
- {
- throw new PojoCacheException(
- "PojoTxSynchronizationHandler.runRollbackPhase(): error: " + t, t);
- }
- }
- }
-
- public void addToList(MethodCall mc)
- {
- undoList_.add(mc);
- }
-
- public void resetUndoOp()
- {
- undoList_.clear();
- PojoTxUndoSynchronizationInterceptor.reset();
- }
-}
-
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxSynchronizationHandler.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,115 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.interceptors;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.util.MethodCall;
+
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Handling the rollback operation for PojoCache level, specifically interceptor add/remove, etc.
+ *
+ * @author Ben Wang
+ * @version $Id$
+ */
+
+public class PojoTxSynchronizationHandler implements Synchronization
+{
+ private static Log log = LogFactory.getLog(PojoTxSynchronizationHandler.class.getName());
+ private List undoList_ = new ArrayList();
+
+ private static ThreadLocal<PojoTxSynchronizationHandler> handler = new ThreadLocal<PojoTxSynchronizationHandler>();
+
+ PojoTxSynchronizationHandler()
+ {
+ }
+
+ public static PojoTxSynchronizationHandler current()
+ {
+ return handler.get();
+ }
+
+ public static PojoTxSynchronizationHandler create()
+ {
+ PojoTxSynchronizationHandler current = handler.get();
+ if (current == null)
+ {
+ current = new PojoTxSynchronizationHandler();
+ handler.set(current);
+ }
+
+ return current;
+ }
+
+ public void beforeCompletion()
+ {
+ // Not interested
+ }
+
+ public void afterCompletion(int status)
+ {
+ try
+ {
+ switch (status)
+ {
+ case Status.STATUS_COMMITTED:
+ break;
+ case Status.STATUS_MARKED_ROLLBACK:
+ case Status.STATUS_ROLLEDBACK:
+ log.debug("Running Pojo rollback phase");
+ runRollbackPhase();
+ log.debug("Finished rollback phase");
+ break;
+
+ default:
+ throw new IllegalStateException("illegal status: " + status);
+ }
+ }
+ finally
+ {
+ resetUndoOp();
+ }
+ }
+
+ private void runRollbackPhase()
+ {
+ // Rollback the pojo interceptor add/remove
+ for (int i = (undoList_.size() - 1); i >= 0; i--)
+ {
+ MethodCall mc = (MethodCall) undoList_.get(i);
+ try
+ {
+ mc.invoke();
+ }
+ catch (Throwable t)
+ {
+ throw new PojoCacheException(
+ "PojoTxSynchronizationHandler.runRollbackPhase(): error: " + t, t);
+ }
+ }
+ }
+
+ public void addToList(MethodCall mc)
+ {
+ undoList_.add(mc);
+ }
+
+ public void resetUndoOp()
+ {
+ undoList_.clear();
+ handler.set(null);
+ //PojoTxUndoSynchronizationInterceptor.reset();
+ }
+}
+
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,123 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.impl.MethodDeclarations;
-import org.jboss.cache.pojo.util.MethodCall;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.List;
-
-/**
- * Interceptor (done via aop advice) for transaction rollback. This is is attached to the
- * operation that needs a corresponding rollback, e.g., attachInterceptor.
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoTxUndoInterceptor extends AbstractInterceptor
-{
- /// Just that AOP requires an extra key.
- public static final String TAG = "PojoCache";
-
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("TxUndoInterceptor.invoke(): invocation not MethodInvocation");
- }
- MethodInvocation invocation = (MethodInvocation) in;
-
- PojoTxSynchronizationHandler handler =
- PojoTxUndoSynchronizationInterceptor.getSynchronizationHandler();
-
- if (handler == null)
- {
- return invocation.invokeNext();
-// TODO handler is null can mean we are not calling the right interceptor stack. Need to revisit.
-// E.g., a fresh getObject or find will trigger this.
-// throw new IllegalStateException("PojoTxUndoInterceptor.invoke(): PojoTxSynchronizationHandler is null");
- }
-
- // Add to the rollback list
- String methodName = invocation.getMethod().getName();
- // TODO Needs to handle Collection interceptor as well.
- if (methodName.equals(MethodDeclarations.attachInterceptor.getName()))
- {
- Method method = MethodDeclarations.undoAttachInterceptor;
- MethodCall mc = new MethodCall(method, invocation.getArguments(), invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.detachInterceptor.getName()))
- {
- Method method = MethodDeclarations.undoDetachInterceptor;
- MethodCall mc = new MethodCall(method, invocation.getArguments(), invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.detachCollectionInterceptor.getName()))
- {
- Method method = MethodDeclarations.undoDetachCollectionInterceptor;
- MethodCall mc = new MethodCall(method, invocation.getArguments(), invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.attachArray.getName()))
- {
- Method method = MethodDeclarations.undoAttachArray;
- MethodCall mc = new MethodCall(method, invocation.getArguments(), invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.detachArray.getName()))
- {
- Method method = MethodDeclarations.undoDetachArray;
- MethodCall mc = new MethodCall(method, invocation.getArguments(), invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.inMemorySubstitution.getName()))
- {
- Method method = MethodDeclarations.undoInMemorySubstitution;
- Object obj = invocation.getArguments()[0];
- Field field = (Field) invocation.getArguments()[1];
- Object oldValue = field.get(obj);
- Object[] args = new Object[]{obj, field, oldValue};
- MethodCall mc = new MethodCall(method, args, invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.incrementReferenceCount.getName()))
- {
- Method method = MethodDeclarations.undoIncrementReferenceCount;
- Fqn fqn = (Fqn) invocation.getArguments()[0];
- int count = (Integer) invocation.getArguments()[1];
- List referenceList = (List) invocation.getArguments()[2];
- Object[] args = new Object[]{fqn, count, referenceList};
- MethodCall mc = new MethodCall(method, args, invocation.getTargetObject());
- handler.addToList(mc);
- }
- else if (methodName.equals(MethodDeclarations.decrementReferenceCount.getName()))
- {
- Method method = MethodDeclarations.undoDecrementReferenceCount;
- Fqn fqn = (Fqn) invocation.getArguments()[0];
- int count = (Integer) invocation.getArguments()[1];
- List referenceList = (List) invocation.getArguments()[2];
- Object[] args = new Object[]{fqn, count, referenceList};
- MethodCall mc = new MethodCall(method, args, invocation.getTargetObject());
- handler.addToList(mc);
- }
- else
- {
- throw new PojoCacheException("PojoTxUndoInterceptor: invalid invocation name: " + methodName);
- }
-
- return invocation.invokeNext();
- }
-
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoSynchronizationInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoSynchronizationInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/PojoTxUndoSynchronizationInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,92 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.pojo.PojoCacheException;
-
-import javax.transaction.RollbackException;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
-
-/**
- * Interceptor that handles registration of tx synchronization for rollback
- * operations.
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class PojoTxUndoSynchronizationInterceptor extends AbstractInterceptor
-{
- // We stores the handler in thread local since the afterCompletion won't be
- // called untill tx.commit(). Note that this is static since it can be
- // recursive call to attach/detach.
- private static ThreadLocal synchronizationHandler_ = new ThreadLocal();
-
- public Object invoke(Invocation in) throws Throwable
- {
- if (!(in instanceof MethodInvocation))
- {
- throw new IllegalArgumentException("TxSyncrhonizationInterceptor.invoke(): invocation not MethodInvocation");
- }
- MethodInvocation invocation = (MethodInvocation) in;
- try
- {
- registerTxHandler(invocation);
- return invocation.invokeNext(); // proceed to next advice or actual call
- }
- finally
- {
- }
- }
-
- private void registerTxHandler(MethodInvocation invocation) throws PojoCacheException
- {
- try
- {
- // Need to have this in case of rollback
- PojoTxSynchronizationHandler handler = (PojoTxSynchronizationHandler) synchronizationHandler_.get();
- if (handler == null)
- {
- // First entry point for this transaction scope.
- Transaction tx = (Transaction) invocation.getMetaData(PojoTxInterceptor.TAG, PojoTxInterceptor.TX);
- if (tx == null)
- {
- throw new IllegalStateException("PojoCache.registerTxHanlder(). Can't have null tx handle.");
- }
-
- handler = new PojoTxSynchronizationHandler();
-
- log.debug("Registering PojoTxSynchronizationHandler for rollback if ncessary " + handler);
- // Register so we can rollback if necessary
- tx.registerSynchronization(handler);
-
- synchronizationHandler_.set(handler);
- }
- }
- catch (RollbackException e)
- {
- throw new PojoCacheException("PojoTxUndoSynchronizationInterceptor.registerTxHandler(): Exception: " + e);
- }
- catch (SystemException e)
- {
- throw new PojoCacheException("PojoTxUndoSynchronizationInterceptor.registerTxHandler(): Exception: " + e);
- }
- }
-
- public static PojoTxSynchronizationHandler getSynchronizationHandler()
- {
- return (PojoTxSynchronizationHandler) synchronizationHandler_.get();
- }
-
- public static void reset()
- {
- synchronizationHandler_.set(null);
- }
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/StaticFieldInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/StaticFieldInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/StaticFieldInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,110 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.interceptors;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.cache.CacheSPI;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.impl.InternalConstant;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-
-import java.lang.reflect.Field;
-
-/**
- * interceptor to intercept for static field replication.
- *
- * @author Ben Wang
- */
-
-public class StaticFieldInterceptor implements Interceptor
-{
- private final Log log_ = LogFactory.getLog(StaticFieldInterceptor.class);
- private PojoCacheImpl pCache_;
- private Fqn fqn_;
- private String name_;
- private String key_;
-
- public StaticFieldInterceptor()
- {
- }
-
- public String getName()
- {
- if (name_ == null)
- {
- this.name_ = "StaticFieldInterceptor on [" + fqn_ + "]";
- }
- return name_;
- }
-
- public Object invoke(Invocation invocation) throws Throwable
- {
- /*
- // Kind of ad hoc now. MethodInvocation should not invoke this.
- if(invocation instanceof MethodInvocation)
- return invocation.invokeNext();
-
- needInit(((FieldInvocation)invocation).getField());
- if (invocation instanceof FieldWriteInvocation)
- {
- FieldInvocation fieldInvocation =
- (FieldInvocation) invocation;
-
- Advisor advisor = fieldInvocation.getAdvisor();
- Field field = fieldInvocation.getField();
- if(log_.isTraceEnabled())
- {
- log_.trace("invoke(): field write interception for fqn: " +fqn_ + " and field: " +field);
- }
-
- // Only if this field is replicatable. static, transient and final are not.
- Object value = ((FieldWriteInvocation) fieldInvocation).getValue();
-
- cache_.put(fqn_, key_, value);
- Object obj = fieldInvocation.getTargetObject();
- } else if (invocation instanceof FieldReadInvocation)
- {
- FieldInvocation fieldInvocation =
- (FieldInvocation) invocation;
- Field field = fieldInvocation.getField();
- Advisor advisor = fieldInvocation.getAdvisor();
- return cache_.get(fqn_, key_);
- }
- */
- return invocation.invokeNext();
-
- }
-
- private void needInit(Field field)
- {
- if (pCache_ == null)
- {
- String cn = field.getDeclaringClass().getName();
- fqn_ = Fqn.fromString(InternalConstant.JBOSS_INTERNAL_STATIC + "/" + cn);
- key_ = field.getName();
- }
- }
-
- boolean isChildOf(Fqn parentFqn)
- {
- return fqn_.isChildOf(parentFqn);
- }
-
- public Fqn getFqn()
- {
- return fqn_;
- }
-
- public void setFqn(Fqn fqn)
- {
- this.fqn_ = fqn;
- }
-
-}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,130 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.interceptors.dynamic;
-
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheAlreadyDetachedException;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.impl.PojoInstance;
-import org.jboss.cache.pojo.util.ObjectUtil;
-
-/**
- * Abstract base class for collection interceptor.
- *
- * @author Ben Wang
- * @version $Id$
- */
-@SuppressWarnings({"CanBeFinal"})
-public abstract class AbstractCollectionInterceptor implements BaseInterceptor
-{
- Fqn fqn;
- PojoCacheImpl cache;
-
- private boolean attached_ = true;
- private PojoInstance pojoInstance_;
-
- AbstractCollectionInterceptor(PojoCacheImpl cache, Fqn fqn)
- {
- this.fqn = fqn;
- this.cache = cache;
- }
-
- @SuppressWarnings({"CanBeFinal"})
- public Fqn getFqn()
- {
- return fqn;
- }
-
- @SuppressWarnings({"CanBeFinal"})
- public void setFqn(Fqn fqn)
- {
- this.fqn = fqn;
- }
-
- @SuppressWarnings({"CanBeFinal"})
- public PojoInstance getAopInstance()
- {
- return pojoInstance_;
- }
-
- public void setAopInstance(PojoInstance pojoInstance)
- {
- this.pojoInstance_ = pojoInstance;
- }
-
- /**
- * Attaching the Collection to PojoCache.
- */
- public void attach(Fqn fqn, boolean copyToCache)
- {
- // This is a hook to allow re-attching the Collection without specifying the fqn.
- if (fqn != null)
- {
- setFqn(fqn);
- }
- attached_ = true;
- // Reattach anything in-memory to cache
- }
-
- public void detach(boolean removeFromCache)
- {
- attached_ = false;
- // Detach by tranferring the cache content to in-memory copy
- }
-
- public boolean isAttached()
- {
- return attached_;
- }
-
- // Verify an attached collection is truly attached
- public void verifyAttached(Object target)
- {
- // If locally detached, we use the local in-memory copy
- if (! isAttached())
- return;
-
- if (cache.getCache().get(fqn, PojoInstance.KEY) != null)
- return;
-
- String identity = ObjectUtil.identityString(target);
- throw new PojoCacheAlreadyDetachedException(identity + " has possibly been detached remotely. Internal id: " + fqn);
- }
-
- Object copyOrConstruct(Object mem)
- {
- if (mem instanceof Cloneable) {
- try
- {
- return mem.getClass().getMethod("clone").invoke(mem);
- }
- catch (Exception e)
- {
- }
- }
-
- try
- {
- return mem.getClass().newInstance();
- }
- catch (Exception e)
- {
- }
-
- return null;
- }
-
- abstract void setInMemoryCopy(Object obj);
- abstract Object getInMemoryCopy();
- public abstract Object getSerializationCopy();
- abstract void setCacheCopy(Object obj);
- abstract Object getCacheCopy();
- abstract void setCurrentCopy(Object obj);
- public abstract Object getCurrentCopy();
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/AbstractCollectionInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,141 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.interceptors.dynamic;
+
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheAlreadyDetachedException;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.impl.PojoInstance;
+import org.jboss.cache.pojo.util.ObjectUtil;
+
+/**
+ * Abstract base class for collection interceptor.
+ *
+ * @author Ben Wang
+ * @version $Id$
+ */
+@SuppressWarnings({"CanBeFinal"})
+public abstract class AbstractCollectionInterceptor implements BaseInterceptor
+{
+ Fqn fqn;
+ PojoCacheImpl cache;
+ ClassProxy boundProxy;
+
+ private boolean attached_ = true;
+ private PojoInstance pojoInstance_;
+
+ AbstractCollectionInterceptor(PojoCacheImpl cache, Fqn fqn)
+ {
+ this.fqn = fqn;
+ this.cache = cache;
+ }
+
+ @SuppressWarnings({"CanBeFinal"})
+ public Fqn getFqn()
+ {
+ return fqn;
+ }
+
+ @SuppressWarnings({"CanBeFinal"})
+ public void setFqn(Fqn fqn)
+ {
+ this.fqn = fqn;
+ }
+
+ @SuppressWarnings({"CanBeFinal"})
+ public PojoInstance getAopInstance()
+ {
+ return pojoInstance_;
+ }
+
+ public void setAopInstance(PojoInstance pojoInstance)
+ {
+ this.pojoInstance_ = pojoInstance;
+ }
+
+ /**
+ * Attaching the Collection to PojoCache.
+ */
+ public void attach(Fqn fqn, boolean copyToCache)
+ {
+ // This is a hook to allow re-attching the Collection without specifying the fqn.
+ if (fqn != null)
+ {
+ setFqn(fqn);
+ }
+ attached_ = true;
+ // Reattach anything in-memory to cache
+ }
+
+ public void detach(boolean removeFromCache)
+ {
+ attached_ = false;
+ // Detach by tranferring the cache content to in-memory copy
+ }
+
+ public boolean isAttached()
+ {
+ return attached_;
+ }
+
+ // Verify an attached collection is truly attached
+ public void verifyAttached(Object target)
+ {
+ // If locally detached, we use the local in-memory copy
+ if (! isAttached())
+ return;
+
+ if (cache.getCache().get(fqn, PojoInstance.KEY) != null)
+ return;
+
+ String identity = ObjectUtil.identityString(target);
+ throw new PojoCacheAlreadyDetachedException(identity + " has possibly been detached remotely. Internal id: " + fqn);
+ }
+
+ Object copyOrConstruct(Object mem)
+ {
+ if (mem instanceof Cloneable) {
+ try
+ {
+ return mem.getClass().getMethod("clone").invoke(mem);
+ }
+ catch (Exception e)
+ {
+ }
+ }
+
+ try
+ {
+ return mem.getClass().newInstance();
+ }
+ catch (Exception e)
+ {
+ }
+
+ return null;
+ }
+
+ abstract void setInMemoryCopy(Object obj);
+ abstract Object getInMemoryCopy();
+ public abstract Object getSerializationCopy();
+ abstract void setCacheCopy(Object obj);
+ abstract Object getCacheCopy();
+ abstract void setCurrentCopy(Object obj);
+ public abstract Object getCurrentCopy();
+
+ public ClassProxy getBoundProxy()
+ {
+ return boundProxy;
+ }
+
+ public void setBoundProxy(ClassProxy boundProxy)
+ {
+ this.boundProxy = boundProxy;
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,204 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.interceptors.dynamic;
-
-import java.lang.reflect.Field;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.Advisor;
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.aop.array.ArrayRegistry;
-import org.jboss.aop.joinpoint.FieldInvocation;
-import org.jboss.aop.joinpoint.FieldReadInvocation;
-import org.jboss.aop.joinpoint.FieldWriteInvocation;
-import org.jboss.aop.joinpoint.Invocation;
-import org.jboss.aop.joinpoint.MethodInvocation;
-import org.jboss.cache.Cache;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheAlreadyDetachedException;
-import org.jboss.cache.pojo.collection.CachedArray;
-import org.jboss.cache.pojo.collection.CachedArrayRegistry;
-import org.jboss.cache.pojo.impl.CachedType;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-import org.jboss.cache.pojo.impl.PojoInstance;
-import org.jboss.cache.pojo.impl.PojoUtil;
-import org.jboss.cache.pojo.util.ObjectUtil;
-
-/**
- * Main dynamic interceptor to intercept for field replication.
- *
- * @author Ben Wang
- */
-
-public class CacheFieldInterceptor implements BaseInterceptor
-{
- private final Log log_ = LogFactory.getLog(CacheFieldInterceptor.class);
- Cache<Object, Object> cache_;
- private PojoCacheImpl pCache_;
- Fqn fqn_;
- private String name_;
- private PojoInstance pojoInstance_;
- private PojoUtil util_;
-
- public CacheFieldInterceptor(PojoCacheImpl pCache, Fqn fqn, CachedType type)
- {
- this.pCache_ = pCache;
- this.cache_ = pCache_.getCache();
- this.fqn_ = fqn;
- util_ = new PojoUtil();
- }
-
- private CacheFieldInterceptor()
- {
- }
-
- public PojoInstance getAopInstance()
- {
- return pojoInstance_;
- }
-
- public Object clone()
- {
- BaseInterceptor interceptor = new CacheFieldInterceptor();
- interceptor.setFqn(getFqn());
- interceptor.setAopInstance(getAopInstance());
- return interceptor;
- }
-
- public void setInterceptor(Interceptor intcptr)
- {
- BaseInterceptor interceptor = (BaseInterceptor) intcptr;
- setFqn(interceptor.getFqn());
- setAopInstance(interceptor.getAopInstance());
- }
-
- public void setAopInstance(PojoInstance pojoInstance)
- {
- this.pojoInstance_ = pojoInstance;
- }
-
- public String getName()
- {
- if (name_ == null)
- {
- this.name_ = "CacheFieldInterceptor on [" + fqn_ + "]";
- }
- return name_;
- }
-
- public Object invoke(Invocation invocation) throws Throwable
- {
- // Kind of ad hoc now. MethodInvocation should not invoke this.
- if (invocation instanceof MethodInvocation)
- return invocation.invokeNext();
-
- if (invocation instanceof FieldWriteInvocation)
- {
- Object target = invocation.getTargetObject();
- FieldInvocation fieldInvocation =
- (FieldInvocation) invocation;
-
- Advisor advisor = fieldInvocation.getAdvisor();
- Field field = fieldInvocation.getField();
- if (log_.isTraceEnabled())
- {
- log_.trace("invoke(): field write interception for fqn: " + fqn_ + " and field: " + field);
- }
-
- verifyAttached(target);
-
- // Only if this field is replicatable. static, transient and final are not.
- CachedType fieldType = pCache_.getCachedType(field.getType());
- Object value = ((FieldWriteInvocation) fieldInvocation).getValue();
- if (!CachedType.isNonReplicable(field))
- {
- if (CachedType.isSimpleAttribute(field))
- {
- cache_.put(fqn_, field.getName(), value);
- }
- else
- {
- pCache_.attach(fqn_, value, field.getName(), target);
- }
- }
-
- util_.inMemorySubstitution(target, field, value);
- }
- else if (invocation instanceof FieldReadInvocation)
- {
- Object target = invocation.getTargetObject();
- FieldInvocation fieldInvocation =
- (FieldInvocation) invocation;
- Field field = fieldInvocation.getField();
- Advisor advisor = fieldInvocation.getAdvisor();
-
- // Only if this field is replicatable
- CachedType fieldType = pCache_.getCachedType(field.getType());
- if (!CachedType.isNonReplicable(field))
- {
- Object result;
- if (CachedType.isSimpleAttribute(field))
- {
- result = cache_.get(fqn_, field.getName());
- }
- else
- {
- result = pCache_.getObject(fqn_, field.getName(), target);
-
- // Work around AOP issue with field reads
- if (result != null && result.getClass().isArray())
- registerArrayWithAOP(target, field.getName(), result);
- }
-
- // If the result is null, the object might have been detached
- if (result == null)
- verifyAttached(target);
-
- // Update last known state associated with this pojo.
- util_.inMemorySubstitution(target, field, result);
-
- // Allow interceptor chain to process, but ignore the result
- invocation.invokeNext();
-
- return result;
- }
- }
-
- return invocation.invokeNext();
- }
-
- private void registerArrayWithAOP(Object owner, String fieldName, Object array)
- {
- CachedArray cached = CachedArrayRegistry.lookup(array);
- if (cached != null)
- ArrayRegistry.getInstance().addFieldReference(owner, fieldName, array);
- }
-
- /**
- * Check if the pojo is detached already.
- */
- private void verifyAttached(Object target)
- {
- if (cache_.get(fqn_, PojoInstance.KEY) != null)
- return;
-
- String identity = ObjectUtil.identityString(target);
- throw new PojoCacheAlreadyDetachedException(identity + " has possibly been detached remotely. Internal id: " + fqn_);
- }
-
- public Fqn getFqn()
- {
- return fqn_;
- }
-
- public void setFqn(Fqn fqn)
- {
- this.fqn_ = fqn;
- }
-
-}
\ No newline at end of file
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CacheFieldInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,204 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.interceptors.dynamic;
+
+import java.lang.reflect.Field;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.Advisor;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.array.ArrayRegistry;
+import org.jboss.aop.joinpoint.FieldInvocation;
+import org.jboss.aop.joinpoint.FieldReadInvocation;
+import org.jboss.aop.joinpoint.FieldWriteInvocation;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.joinpoint.MethodInvocation;
+import org.jboss.cache.Cache;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheAlreadyDetachedException;
+import org.jboss.cache.pojo.collection.CachedArray;
+import org.jboss.cache.pojo.collection.CachedArrayRegistry;
+import org.jboss.cache.pojo.impl.CachedType;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+import org.jboss.cache.pojo.impl.PojoInstance;
+import org.jboss.cache.pojo.impl.PojoUtil;
+import org.jboss.cache.pojo.util.ObjectUtil;
+
+/**
+ * Main dynamic interceptor to intercept for field replication.
+ *
+ * @author Ben Wang
+ */
+
+public class CacheFieldInterceptor implements BaseInterceptor
+{
+ private final Log log_ = LogFactory.getLog(CacheFieldInterceptor.class);
+ Cache<Object, Object> cache_;
+ private PojoCacheImpl pCache_;
+ Fqn fqn_;
+ private String name_;
+ private PojoInstance pojoInstance_;
+ private PojoUtil util_;
+
+ public CacheFieldInterceptor(PojoCacheImpl pCache, Fqn fqn, CachedType type)
+ {
+ this.pCache_ = pCache;
+ this.cache_ = pCache_.getCache();
+ this.fqn_ = fqn;
+ util_ = new PojoUtil();
+ }
+
+ private CacheFieldInterceptor()
+ {
+ }
+
+ public PojoInstance getAopInstance()
+ {
+ return pojoInstance_;
+ }
+
+ public Object clone()
+ {
+ BaseInterceptor interceptor = new CacheFieldInterceptor();
+ interceptor.setFqn(getFqn());
+ interceptor.setAopInstance(getAopInstance());
+ return interceptor;
+ }
+
+ public void setInterceptor(Interceptor intcptr)
+ {
+ BaseInterceptor interceptor = (BaseInterceptor) intcptr;
+ setFqn(interceptor.getFqn());
+ setAopInstance(interceptor.getAopInstance());
+ }
+
+ public void setAopInstance(PojoInstance pojoInstance)
+ {
+ this.pojoInstance_ = pojoInstance;
+ }
+
+ public String getName()
+ {
+ if (name_ == null)
+ {
+ this.name_ = "CacheFieldInterceptor on [" + fqn_ + "]";
+ }
+ return name_;
+ }
+
+ public Object invoke(Invocation invocation) throws Throwable
+ {
+ // Kind of ad hoc now. MethodInvocation should not invoke this.
+ if (invocation instanceof MethodInvocation)
+ return invocation.invokeNext();
+
+ if (invocation instanceof FieldWriteInvocation)
+ {
+ Object target = invocation.getTargetObject();
+ FieldInvocation fieldInvocation =
+ (FieldInvocation) invocation;
+
+ Advisor advisor = fieldInvocation.getAdvisor();
+ Field field = fieldInvocation.getField();
+ if (log_.isTraceEnabled())
+ {
+ log_.trace("invoke(): field write interception for fqn: " + fqn_ + " and field: " + field);
+ }
+
+ verifyAttached(target);
+
+ // Only if this field is replicatable. static, transient and final are not.
+ CachedType fieldType = pCache_.getCachedType(field.getType());
+ Object value = ((FieldWriteInvocation) fieldInvocation).getValue();
+ if (!CachedType.isNonReplicable(field))
+ {
+ if (CachedType.isSimpleAttribute(field))
+ {
+ cache_.put(fqn_, field.getName(), value);
+ }
+ else
+ {
+ pCache_.attach(fqn_, value, field.getName(), target);
+ }
+ }
+
+ util_.inMemorySubstitution(target, field, value);
+ }
+ else if (invocation instanceof FieldReadInvocation)
+ {
+ Object target = invocation.getTargetObject();
+ FieldInvocation fieldInvocation =
+ (FieldInvocation) invocation;
+ Field field = fieldInvocation.getField();
+ Advisor advisor = fieldInvocation.getAdvisor();
+
+ // Only if this field is replicatable
+ CachedType fieldType = pCache_.getCachedType(field.getType());
+ if (!CachedType.isNonReplicable(field))
+ {
+ Object result;
+ if (CachedType.isSimpleAttribute(field))
+ {
+ result = cache_.get(fqn_, field.getName());
+ }
+ else
+ {
+ result = pCache_.find(fqn_, field.getName(), target);
+
+ // Work around AOP issue with field reads
+ if (result != null && result.getClass().isArray())
+ registerArrayWithAOP(target, field.getName(), result);
+ }
+
+ // If the result is null, the object might have been detached
+ if (result == null)
+ verifyAttached(target);
+
+ // Update last known state associated with this pojo.
+ util_.inMemorySubstitution(target, field, result);
+
+ // Allow interceptor chain to process, but ignore the result
+ invocation.invokeNext();
+
+ return result;
+ }
+ }
+
+ return invocation.invokeNext();
+ }
+
+ private void registerArrayWithAOP(Object owner, String fieldName, Object array)
+ {
+ CachedArray cached = CachedArrayRegistry.lookup(array);
+ if (cached != null)
+ ArrayRegistry.getInstance().addFieldReference(owner, fieldName, array);
+ }
+
+ /**
+ * Check if the pojo is detached already.
+ */
+ private void verifyAttached(Object target)
+ {
+ if (cache_.get(fqn_, PojoInstance.KEY) != null)
+ return;
+
+ String identity = ObjectUtil.identityString(target);
+ throw new PojoCacheAlreadyDetachedException(identity + " has possibly been detached remotely. Internal id: " + fqn_);
+ }
+
+ public Fqn getFqn()
+ {
+ return fqn_;
+ }
+
+ public void setFqn(Fqn fqn)
+ {
+ this.fqn_ = fqn;
+ }
+
+}
\ No newline at end of file
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,216 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.pojo.interceptors.dynamic;
-
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.pojo.PojoCacheException;
-import org.jboss.cache.pojo.collection.CachedMapImpl;
-import org.jboss.cache.pojo.collection.CollectionInterceptorUtil;
-import org.jboss.cache.pojo.impl.PojoCacheImpl;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Map interceptor that delegates to the underlying impl.
- *
- * @author Ben Wang
- */
-@SuppressWarnings({"CanBeFinal"})
-public class CachedMapInterceptor extends AbstractCollectionInterceptor
-{
-
- // protected static final Log log_ = LogFactory.getLog(CachedMapInterceptor.class);
- private static final Map managedMethods_ =
- CollectionInterceptorUtil.getManagedMethods(Map.class);
- private Map methodMap_;
- private Map cacheImpl_;
- private Map inMemImpl_;
- private Map current_;
-
- public CachedMapInterceptor(PojoCacheImpl cache, Fqn fqn, Class clazz, Map obj)
- {
- super(cache, fqn);
- methodMap_ = CollectionInterceptorUtil.getMethodMap(clazz);
- cacheImpl_ = new CachedMapImpl(cache, this);
- inMemImpl_ = obj;
- current_ = cacheImpl_;
- }
-
- private CachedMapInterceptor(PojoCacheImpl cache, Fqn fqn)
- {
- super(cache, fqn);
- }
-
- public Object clone()
- {
- CachedMapInterceptor interceptor = new CachedMapInterceptor(cache, fqn);
- interceptor.setFqn(getFqn());
- interceptor.setAopInstance(getAopInstance());
- interceptor.setCurrentCopy(getCurrentCopy());
- interceptor.setInMemoryCopy(getInMemoryCopy());
- interceptor.setCacheCopy(getCacheCopy());
- return interceptor;
- }
-
- public void setInterceptor(Interceptor intcptr)
- {
- CachedMapInterceptor interceptor = (CachedMapInterceptor) intcptr;
- setFqn(interceptor.getFqn());
- setAopInstance(interceptor.getAopInstance());
- setCurrentCopy(interceptor.getCurrentCopy());
- setInMemoryCopy(interceptor.getInMemoryCopy());
- setCacheCopy(interceptor.getCacheCopy());
- }
-
- public Object getCurrentCopy()
- {
- return current_;
- }
-
- void setInMemoryCopy(Object obj)
- {
- inMemImpl_ = (Map) obj;
- }
-
- Object getInMemoryCopy()
- {
- return inMemImpl_;
- }
-
- void setCacheCopy(Object obj)
- {
- cacheImpl_ = (Map) obj;
- }
-
- Object getCacheCopy()
- {
- return cacheImpl_;
- }
-
- void setCurrentCopy(Object obj)
- {
- current_ = (Map) obj;
- }
-
- /**
- * When we want to associate this proxy with the cache again. We will need to translate the in-memory
- * content to the cache store first.
- */
- public void attach(Fqn fqn, boolean copyToCache)
- {
- super.attach(fqn, copyToCache);
-
- if (copyToCache)
- toCache();
-
- current_ = cacheImpl_;
- }
-
- private void toCache()
- {
- if (inMemImpl_ == null)
- throw new IllegalStateException("CachedMapInterceptor.toCache(). inMemImpl is null.");
-
- for (Object key : inMemImpl_.keySet())
- {
- Object val = inMemImpl_.get(key);
- cacheImpl_.put(key, val);
- }
-
- inMemImpl_.clear();
- inMemImpl_ = null; // we are done with this.
- }
-
- /**
- * When we want to separate this proxy from the cache. We will destroy the cache content and copy them to
- * the in-memory copy.
- */
- public void detach(boolean removeFromCache)
- {
- super.detach(removeFromCache);
-
- toMemory(removeFromCache);
-
- current_ = inMemImpl_;
- }
-
- private void toMemory(boolean removeFromCache)
- {
- if (inMemImpl_ == null)
- {
- inMemImpl_ = new HashMap();
- }
-
- Iterator it = cacheImpl_.keySet().iterator();
- inMemImpl_.clear();
- while (it.hasNext())
- {
- Object key = it.next();
- Object val = null;
- if (removeFromCache)
- {
- val = cacheImpl_.remove(key);
- }
- else
- {
- val = cacheImpl_.get(key);
- }
- inMemImpl_.put(key, val);
- }
- }
-
- public Object getSerializationCopy()
- {
- if (current_ == inMemImpl_)
- return inMemImpl_;
-
- Map map;
- Object mem = inMemImpl_;
- if (mem == null)
- {
- map = new HashMap();
- }
- else
- {
- map = (Map) copyOrConstruct(mem);
- if (map == null)
- throw new PojoCacheException("Could not serialize class, since it can not be copied: " + mem.getClass().getName());
- }
-
- map.clear();
- Iterator it = cacheImpl_.keySet().iterator();
- while (it.hasNext())
- {
- Object key = it.next();
- Object val = cacheImpl_.get(key);
- map.put(key, val);
- }
- return map;
- }
-
- public String getName()
- {
- return "CachedMapInterceptor";
- }
-
- public Object invoke(org.jboss.aop.joinpoint.Invocation invocation) throws Throwable
- {
- if (current_ == null)
- throw new IllegalStateException("CachedMapInterceptor.invoke(). current_ is null.");
-
- return CollectionInterceptorUtil.invoke(invocation,
- this,
- current_,
- methodMap_, managedMethods_);
- }
-
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/interceptors/dynamic/CachedMapInterceptor.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,217 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.pojo.interceptors.dynamic;
+
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.pojo.PojoCacheException;
+import org.jboss.cache.pojo.collection.CachedMapImpl;
+import org.jboss.cache.pojo.collection.CollectionInterceptorUtil;
+import org.jboss.cache.pojo.impl.PojoCacheImpl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Map interceptor that delegates to the underlying impl.
+ *
+ * @author Ben Wang
+ */
+@SuppressWarnings({"CanBeFinal"})
+public class CachedMapInterceptor extends AbstractCollectionInterceptor
+{
+
+ // protected static final Log log_ = LogFactory.getLog(CachedMapInterceptor.class);
+ private static final Map managedMethods_ =
+ CollectionInterceptorUtil.getManagedMethods(Map.class);
+ private Map methodMap_;
+ private Map cacheImpl_;
+ private Map inMemImpl_;
+ private Map current_;
+
+ public CachedMapInterceptor(PojoCacheImpl cache, Fqn fqn, Class clazz, Map obj)
+ {
+ super(cache, fqn);
+ methodMap_ = CollectionInterceptorUtil.getMethodMap(clazz);
+ cacheImpl_ = new CachedMapImpl(cache, this);
+ inMemImpl_ = obj;
+ current_ = cacheImpl_;
+ }
+
+ private CachedMapInterceptor(PojoCacheImpl cache, Fqn fqn)
+ {
+ super(cache, fqn);
+ }
+
+ public Object clone()
+ {
+ CachedMapInterceptor interceptor = new CachedMapInterceptor(cache, fqn);
+ interceptor.setFqn(getFqn());
+ interceptor.setAopInstance(getAopInstance());
+ interceptor.setCurrentCopy(getCurrentCopy());
+ interceptor.setInMemoryCopy(getInMemoryCopy());
+ interceptor.setCacheCopy(getCacheCopy());
+ return interceptor;
+ }
+
+ public void setInterceptor(Interceptor intcptr)
+ {
+ CachedMapInterceptor interceptor = (CachedMapInterceptor) intcptr;
+ setFqn(interceptor.getFqn());
+ setAopInstance(interceptor.getAopInstance());
+ setCurrentCopy(interceptor.getCurrentCopy());
+ setInMemoryCopy(interceptor.getInMemoryCopy());
+ setCacheCopy(interceptor.getCacheCopy());
+ }
+
+ public Object getCurrentCopy()
+ {
+ return current_;
+ }
+
+ void setInMemoryCopy(Object obj)
+ {
+ inMemImpl_ = (Map) obj;
+ }
+
+ Object getInMemoryCopy()
+ {
+ return inMemImpl_;
+ }
+
+ void setCacheCopy(Object obj)
+ {
+ cacheImpl_ = (Map) obj;
+ }
+
+ Object getCacheCopy()
+ {
+ return cacheImpl_;
+ }
+
+ void setCurrentCopy(Object obj)
+ {
+ current_ = (Map) obj;
+ }
+
+ /**
+ * When we want to associate this proxy with the cache again. We will need to translate the in-memory
+ * content to the cache store first.
+ */
+ public void attach(Fqn fqn, boolean copyToCache)
+ {
+ super.attach(fqn, copyToCache);
+
+ if (copyToCache)
+ toCache();
+
+ current_ = cacheImpl_;
+ }
+
+ private void toCache()
+ {
+ if (inMemImpl_ == null)
+ throw new IllegalStateException("CachedMapInterceptor.toCache(). inMemImpl is null.");
+
+ for (Object key : inMemImpl_.keySet())
+ {
+ Object val = inMemImpl_.get(key);
+ cacheImpl_.put(key, val);
+ }
+
+ inMemImpl_.clear();
+ inMemImpl_ = null; // we are done with this.
+ }
+
+ /**
+ * When we want to separate this proxy from the cache. We will destroy the cache content and copy them to
+ * the in-memory copy.
+ */
+ public void detach(boolean removeFromCache)
+ {
+ super.detach(removeFromCache);
+
+ toMemory(removeFromCache);
+
+ current_ = inMemImpl_;
+ }
+
+ private void toMemory(boolean removeFromCache)
+ {
+ if (inMemImpl_ == null)
+ {
+ inMemImpl_ = new HashMap();
+ }
+
+ Iterator it = cacheImpl_.keySet().iterator();
+ inMemImpl_.clear();
+ while (it.hasNext())
+ {
+ Object key = it.next();
+ Object val = null;
+ if (removeFromCache)
+ {
+ val = cacheImpl_.remove(key);
+ }
+ else
+ {
+ val = cacheImpl_.get(key);
+ }
+ inMemImpl_.put(key, val);
+ }
+ }
+
+ public Object getSerializationCopy()
+ {
+ if (current_ == inMemImpl_)
+ return inMemImpl_;
+
+ Map map;
+ Object mem = inMemImpl_;
+ if (mem == null)
+ {
+ map = new HashMap();
+ }
+ else
+ {
+ map = (Map) copyOrConstruct(mem);
+ if (map == null)
+ throw new PojoCacheException("Could not serialize class, since it can not be copied: " + mem.getClass().getName());
+ }
+
+ map.clear();
+ Iterator it = cacheImpl_.keySet().iterator();
+ while (it.hasNext())
+ {
+ Object key = it.next();
+ Object val = cacheImpl_.get(key);
+ map.put(key, val);
+ }
+ return map;
+ }
+
+ public String getName()
+ {
+ return "CachedMapInterceptor";
+ }
+
+ public Object invoke(org.jboss.aop.joinpoint.Invocation invocation) throws Throwable
+ {
+ if (current_ == null)
+ throw new IllegalStateException("CachedMapInterceptor.invoke(). current_ is null.");
+
+ return CollectionInterceptorUtil.invoke(invocation,
+ this,
+ current_,
+ methodMap_, managedMethods_);
+ }
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java
===================================================================
--- pojo/trunk/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,29 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.util;
-
-import java.util.Set;
-
-import org.jboss.cache.Cache;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.Node;
-
-/**
- * Utility for the 2.0 Cache API
- *
- * @author Ben Wang
- * @version $Id$
- */
-public class CacheApiUtil
-{
- public static Set<Node> getNodeChildren(Cache<Object, Object> cache, Fqn fqn)
- {
- Node n = cache.getRoot().getChild(fqn);
- return n != null ? n.getChildren() : null;
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java (from rev 6048, pojo/trunk/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/java/org/jboss/cache/pojo/util/CacheApiUtil.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.util;
+
+import java.util.Set;
+
+import org.jboss.cache.Cache;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.Node;
+
+/**
+ * Utility for the 2.0 Cache API
+ *
+ * @author Ben Wang
+ * @version $Id$
+ */
+public class CacheApiUtil
+{
+ public static Set<Node> getNodeChildren(Cache<Object, Object> cache, Fqn fqn)
+ {
+ Node n = cache.getRoot().getChild(fqn);
+ return n != null ? n.getChildren() : null;
+ }
+
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml
===================================================================
--- pojo/trunk/src/main/resources/META-INF/pojocache-aop.xml 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,160 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- This is the PojoCache configuration file that specifies:
- 1. Interceptor stack for API
- 2. Annotation binding for POJO (via "prepare" element)
-
- Basically, this is a variant of jboss-aop.xml. Note that
- except for the customization of interceptor stack, you should
- not need to modify this file.
-
- To run PojoCache, you will need to define a system property:
- jboss.aop.path that contains the path to this file such that JBoss Aop
- can locate it.
--->
-<aop>
-
- <!--
- This defines the PojoCache 2.0 interceptor stack. Unless necessary, don't modify the stack here!
- -->
-
- <!-- Check id range validity -->
- <interceptor name="CheckId" class="org.jboss.cache.pojo.interceptors.CheckIdInterceptor"
- scope="PER_INSTANCE"/>
-
- <!-- Track Tx undo operation -->
- <interceptor name="Undo" class="org.jboss.cache.pojo.interceptors.PojoTxUndoInterceptor"
- scope="PER_INSTANCE"/>
-
- <!-- Begining of interceptor chain -->
- <interceptor name="Start" class="org.jboss.cache.pojo.interceptors.PojoBeginInterceptor"
- scope="PER_INSTANCE">
- </interceptor>
-
- <!-- Check if we need a local tx for batch processing -->
- <interceptor name="Tx" class="org.jboss.cache.pojo.interceptors.PojoTxInterceptor"
- scope="PER_INSTANCE"/>
-
- <!--
- Mockup failed tx for testing. You will need to set PojoFailedTxMockupInterceptor.setRollback(true)
- to activate it.
- -->
- <interceptor name="MockupTx" class="org.jboss.cache.pojo.interceptors.PojoFailedTxMockupInterceptor"
- scope="PER_INSTANCE"/>
-
- <!-- Perform parent level node locking -->
- <interceptor name="TxLock" class="org.jboss.cache.pojo.interceptors.PojoTxLockInterceptor"
- scope="PER_INSTANCE"/>
-
- <!-- Interceptor to perform Pojo level rollback -->
- <interceptor name="TxUndo" class="org.jboss.cache.pojo.interceptors.PojoTxUndoSynchronizationInterceptor"
- scope="PER_INSTANCE"/>
-
- <!-- Interceptor to used to check recursive field interception. -->
- <interceptor name="ReentrantToString" class="org.jboss.cache.pojo.interceptors.MethodReentrancyStopperInterceptor"
- scope="PER_INSTANCE">
- <attribute name="MethodName">toString</attribute>
- </interceptor>
-
- <interceptor name="ReentrantHashCode" class="org.jboss.cache.pojo.interceptors.MethodReentrancyStopperInterceptor"
- scope="PER_INSTANCE">
- <attribute name="MethodName">hashCode</attribute>
- </interceptor>
-
- <!-- Whether to allow non-serializable pojo. Default is false. -->
- <interceptor name="MarshallNonSerializable"
- class="org.jboss.cache.pojo.interceptors.CheckNonSerializableInterceptor"
- scope="PER_INSTANCE">
- <attribute name="marshallNonSerializable">false</attribute>
- </interceptor>
-
- <!-- This defines the stack macro -->
- <stack name="Attach">
- <interceptor-ref name="Start"/>
- <interceptor-ref name="CheckId"/>
- <interceptor-ref name="MarshallNonSerializable"/>
- <interceptor-ref name="Tx"/>
- <!-- NOTE: You can comment this out during production although leaving it here is OK. -->
- <interceptor-ref name="MockupTx"/>
- <interceptor-ref name="TxLock"/>
- <interceptor-ref name="TxUndo"/>
- </stack>
-
- <stack name="Detach">
- <interceptor-ref name="Start"/>
- <interceptor-ref name="CheckId"/>
- <interceptor-ref name="Tx"/>
- <!-- NOTE: You can comment this out during production although leaving it here is OK. -->
- <interceptor-ref name="MockupTx"/>
- <interceptor-ref name="TxLock"/>
- <interceptor-ref name="TxUndo"/>
- </stack>
-
- <stack name="Find">
- <interceptor-ref name="Start"/>
- <interceptor-ref name="CheckId"/>
- </stack>
-
- <!--
- The following section should be READ-ONLY!! It defines the annotation binding to the stack.
- -->
-
- <!-- This binds the jointpoint to specific in-memory operations. Currently in PojoUtil. -->
- <bind pointcut="execution(*
- @org.jboss.cache.pojo.annotation.Reentrant->toString())">
- <interceptor-ref name="ReentrantToString"/>
- </bind>
-
- <bind pointcut="execution(*
- @org.jboss.cache.pojo.annotation.Reentrant->hashCode())">
- <interceptor-ref name="ReentrantHashCode"/>
- </bind>
-
- <bind pointcut="execution(*
- org.jboss.cache.pojo.impl.PojoUtil->@org.jboss.cache.pojo.annotation.TxUndo(..))">
- <interceptor-ref name="Undo"/>
- </bind>
-
- <bind pointcut="execution(* org.jboss.cache.pojo.impl.PojoCacheImpl->@org.jboss.cache.pojo.annotation.Attach(..))">
- <stack-ref name="Attach"/>
- </bind>
-
- <bind pointcut="execution(* org.jboss.cache.pojo.impl.PojoCacheImpl->@org.jboss.cache.pojo.annotation.Detach(..))">
- <stack-ref name="Detach"/>
- </bind>
-
- <bind pointcut="execution(* org.jboss.cache.pojo.impl.PojoCacheImpl->@org.jboss.cache.pojo.annotation.Find(..))">
- <stack-ref name="Find"/>
- </bind>
-
-
- <!--
- Following is declaration for JDK50 annotation. You use the specific annotation on your
- POJO such that it can be instrumented. Idea is user will then need only to annotate like:
- @org.jboss.cache.pojo.annotation.Replicable
- in his POJO. There will be no need of jboss-aop.xml from user's side.
- Note that this annotation is inheritant, meaning the subclass will be
- instrumented as well.
- -->
-
- <!-- If a POJO has Replicable annotation, it will be asepectized. -->
- <!--
- Supports inheritance and polymorphism. It can either be a concrete class
- or an interface. All sub-classes or interface implementors will be instrumeneted.
- -->
- <prepare expr="field(* $instanceof{(a)org.jboss.cache.pojo.annotation.Replicable}->*)" />
-
- <!-- Work around that ensures annotated classes which do not access fields are instrumented -->
-
-
- <!-- Array support -->
- <!-- Comment entire section to disable -->
- <arrayreplacement expr="class($instanceof{(a)org.jboss.cache.pojo.annotation.Replicable})"/>
- <interceptor name="pojocache-array" class="org.jboss.cache.pojo.interceptors.dynamic.ArrayInterceptor"/>
- <introduction expr="class($instanceof{(a)org.jboss.cache.pojo.annotation.Replicable})">
- <interfaces>org.jboss.cache.pojo.impl.ArrayInterceptable</interfaces>
- </introduction>
- <arraybind name="pojocache-array" type="READ_WRITE">
- <interceptor-ref name="pojocache-array"/>
- </arraybind>
-</aop>
Copied: pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml (from rev 6048, pojo/trunk/src/main/resources/META-INF/pojocache-aop.xml)
===================================================================
--- pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml (rev 0)
+++ pojo/tags/2.2.0.CR1/src/main/resources/META-INF/pojocache-aop.xml 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ This is a variant of jboss-aop.xml.
+-->
+<aop>
+ <!-- If a POJO has a Replicable annotation, it will be asepectized. -->
+
+ <!--
+ Supports inheritance and polymorphism. It can either be a concrete class
+ or an interface. All sub-classes or interface implementors will be instrumeneted.
+ -->
+ <prepare expr="field(* $instanceof{(a)org.jboss.cache.pojo.annotation.Replicable}->*)" />
+
+ <!-- Work around that ensures annotated classes which do not access fields are instrumented -->
+ <introduction expr="class($instanceof{(a)org.jboss.cache.pojo.annotation.Replicable})"/>
+
+ <!-- Array support -->
+ <!-- Comment entire section to disable -->
+ <arrayreplacement expr="class($instanceof{(a)org.jboss.cache.pojo.annotation.Replicable})"/>
+ <interceptor name="pojocache-array" class="org.jboss.cache.pojo.interceptors.dynamic.ArrayInterceptor"/>
+ <introduction expr="class($instanceof{(a)org.jboss.cache.pojo.annotation.Replicable})">
+ <interfaces>org.jboss.cache.pojo.impl.ArrayInterceptable</interfaces>
+ </introduction>
+ <arraybind name="pojocache-array" type="READ_WRITE">
+ <interceptor-ref name="pojocache-array"/>
+ </arraybind>
+</aop>
Deleted: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java
===================================================================
--- pojo/trunk/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,82 +0,0 @@
-package org.jboss.cache.pojo.collection;
-
-import static org.testng.AssertJUnit.fail;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.config.Configuration.CacheMode;
-import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheFactory;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- * List implementation testing.
- *
- * @author Ben Wang
- */
-
-@Test(groups = {"functional"})
-public class CachedListImplTest
-{
- Log log = LogFactory.getLog(CachedListImplTest.class);
- PojoCache cache_, cache1_;
-
- @BeforeMethod(alwaysRun = true)
- protected void setUp() throws Exception
- {
- log.info("setUp() ....");
- boolean toStart = false;
- cache_ = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
- cache_.getCache().getConfiguration().setFetchInMemoryState(false);
- cache1_ = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
- cache1_.getCache().getConfiguration().setFetchInMemoryState(false);
- cache_.start();
- cache1_.start();
- }
-
- @AfterMethod(alwaysRun = true)
- protected void tearDown() throws Exception
- {
- cache_.stop();
- cache1_.stop();
- }
-
- @SuppressWarnings("unchecked")
- public void testSimpleRepl()
- {
- List<String> list = new ArrayList<String>();
- list.add("1");
- list.add("2");
-
- cache_.attach("list", list);
-
- // proxy now
- list = (List<String>) cache_.find("list");
-
- // test repl
- try {
- cache_.getCache().put(Fqn.fromString("test"), "1", list);
- fail("Should have a non-serializable exception on list: " +list);
- } catch (Exception ex)
- {
- // OK. It works
- }
-
- // JBCACHE-975
- list = (List<String>) cache_.detach("list");
-
- // test repl
- cache_.getCache().put(Fqn.fromString("test"), "1", list);
-
- ArrayList<String> l1 = (ArrayList<String>) cache1_.getCache().get(Fqn.fromString("test"), "1");
- System.out.println(" list : " + l1);
- }
-}
-
Copied: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java (from rev 6048, pojo/trunk/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/collection/CachedListImplTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,73 @@
+package org.jboss.cache.pojo.collection;
+
+import static org.testng.AssertJUnit.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * List implementation testing.
+ *
+ * @author Ben Wang
+ */
+
+@Test(groups = {"functional"})
+public class CachedListImplTest
+{
+ Log log = LogFactory.getLog(CachedListImplTest.class);
+ PojoCache cache_, cache1_;
+
+ @BeforeMethod(alwaysRun = true)
+ protected void setUp() throws Exception
+ {
+ log.info("setUp() ....");
+ boolean toStart = false;
+ cache_ = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
+ cache_.getCache().getConfiguration().setFetchInMemoryState(false);
+ cache1_ = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
+ cache1_.getCache().getConfiguration().setFetchInMemoryState(false);
+ cache_.start();
+ cache1_.start();
+ }
+
+ @AfterMethod(alwaysRun = true)
+ protected void tearDown() throws Exception
+ {
+ cache_.stop();
+ cache1_.stop();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testSimpleRepl()
+ {
+ List<String> list = new ArrayList<String>();
+ list.add("1");
+ list.add("2");
+
+ cache_.attach("list", list);
+
+ // proxy now
+ list = (List<String>) cache_.find("list");
+
+ // JBCACHE-975
+ list = (List<String>) cache_.detach("list");
+
+ // test repl
+ cache_.getCache().put(Fqn.fromString("test"), "1", list);
+
+ ArrayList<String> l1 = (ArrayList<String>) cache1_.getCache().get(Fqn.fromString("test"), "1");
+ System.out.println(" list : " + l1);
+ }
+}
+
Deleted: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java
===================================================================
--- pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,139 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.rollback;
-
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.util.ArrayList;
-
-import javax.transaction.TransactionManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.proxy.ClassProxy;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheFactory;
-import org.jboss.cache.pojo.interceptors.PojoFailedTxMockupInterceptor;
-import org.jboss.cache.pojo.test.Person;
-import org.jboss.cache.transaction.DummyTransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- * Additional basic tests
- *
- * @author Ben Wang
- */
-
-@Test(groups = {"functional"})
-public class ListUndoTest
-{
- Log log_ = LogFactory.getLog(ListUndoTest.class);
- PojoCache cache_;
- TransactionManager tx_mgr;
-
-
- @BeforeMethod(alwaysRun = true)
- protected void setUp() throws Exception
- {
- log_.info("setUp() ....");
- String configFile = "META-INF/local-service.xml";
- boolean toStart = false;
- cache_ = PojoCacheFactory.createCache(configFile, toStart);
- cache_.start();
- tx_mgr = DummyTransactionManager.getInstance();
-
- }
-
- @AfterMethod(alwaysRun = true)
- protected void tearDown() throws Exception
- {
- cache_.stop();
- }
-
-// public void testDummy() {}
-
- private void setTxRollback(boolean isTrue)
- {
- PojoFailedTxMockupInterceptor.TX_ROLLBACK = isTrue;
- }
-
- public void testSimple() throws Exception
- {
- ArrayList<String> list = new ArrayList<String>();
- list.add("test1");
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", list);
- }
- catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", isProxy(list));
-
- cache_.attach("/a", list);
- }
-
- public void testSimpleTxWithRollback1() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- ArrayList<String> list = new ArrayList<String>();
- list.add("English");
- test.setLanguages(list);
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", test);
- }
- catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", isProxy(test.getLanguages()));
-
- cache_.attach("/a", test);
- }
-
- private boolean isProxy(Object pojo)
- {
- if (pojo instanceof ClassProxy) return true;
- return false;
- }
-
- public void testSimpleTxWithRollback2() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- ArrayList<String> list = new ArrayList<String>();
- list.add("English");
- test.setLanguages(list);
-
- cache_.attach("/a", test);
-
- setTxRollback(true);
- try
- {
- cache_.detach("/a");
- }
- catch (Exception e)
- {
- }
-
- assertTrue("Should still have cache interceptor ", isProxy(test.getLanguages()));
- cache_.detach("/a");
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java (from rev 6048, pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ListUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,136 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.rollback;
+
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.ArrayList;
+
+import javax.transaction.TransactionManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheFactory;
+import org.jboss.cache.pojo.test.Person;
+import org.jboss.cache.transaction.DummyTransactionManager;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * Additional basic tests
+ *
+ * @author Ben Wang
+ */
+
+@Test(groups = {"functional"})
+public class ListUndoTest
+{
+ Log log_ = LogFactory.getLog(ListUndoTest.class);
+ PojoCache cache_;
+ TransactionManager tx_mgr;
+
+
+ @BeforeMethod(alwaysRun = true)
+ protected void setUp() throws Exception
+ {
+ log_.info("setUp() ....");
+ String configFile = "META-INF/local-service.xml";
+ boolean toStart = false;
+ cache_ = PojoCacheFactory.createCache(configFile, toStart);
+ cache_.start();
+ tx_mgr = DummyTransactionManager.getInstance();
+
+ }
+
+ @AfterMethod(alwaysRun = true)
+ protected void tearDown() throws Exception
+ {
+ cache_.stop();
+ }
+
+// public void testDummy() {}
+
+ public void testSimple() throws Exception
+ {
+ ArrayList<String> list = new ArrayList<String>();
+ list.add("test1");
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", list);
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", isProxy(list));
+
+ cache_.attach("/a", list);
+ }
+
+ public void testSimpleTxWithRollback1() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ ArrayList<String> list = new ArrayList<String>();
+ list.add("English");
+ test.setLanguages(list);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", test);
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", isProxy(test.getLanguages()));
+
+ cache_.attach("/a", test);
+ }
+
+ private boolean isProxy(Object pojo)
+ {
+ if (pojo instanceof ClassProxy) return true;
+ return false;
+ }
+
+ public void testSimpleTxWithRollback2() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ ArrayList<String> list = new ArrayList<String>();
+ list.add("English");
+ test.setLanguages(list);
+
+ cache_.attach("/a", test);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.detach("/a");
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+
+ assertTrue("Should still have cache interceptor ", isProxy(test.getLanguages()));
+ cache_.detach("/a");
+ }
+}
Deleted: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java
===================================================================
--- pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,120 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.rollback;
-
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
-
-import javax.transaction.TransactionManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.Advised;
-import org.jboss.aop.advice.Interceptor;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheFactory;
-import org.jboss.cache.pojo.interceptors.PojoFailedTxMockupInterceptor;
-import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
-import org.jboss.cache.pojo.test.Person;
-import org.jboss.cache.transaction.DummyTransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- * Additional basic tests
- *
- * @author Ben Wang
- */
-
-@Test(groups = {"functional"})
-public class LocalUndoTest
-{
- Log log_ = LogFactory.getLog(LocalUndoTest.class);
- PojoCache cache_;
- TransactionManager tx_mgr;
-
-
- @BeforeMethod(alwaysRun = true)
- protected void setUp() throws Exception
- {
- log_.info("setUp() ....");
- String configFile = "META-INF/local-service.xml";
- boolean toStart = false;
- cache_ = PojoCacheFactory.createCache(configFile, toStart);
- cache_.start();
- tx_mgr = DummyTransactionManager.getInstance();
-
- }
-
- @AfterMethod(alwaysRun = true)
- protected void tearDown() throws Exception
- {
- cache_.stop();
- }
-
-// public void testDummy() {}
-
- private void setTxRollback(boolean isTrue)
- {
- PojoFailedTxMockupInterceptor.TX_ROLLBACK = isTrue;
- }
-
- public void testSimpleTxWithRollback1() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", test);
- }
- catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", hasCacheInterceptor(test));
- }
-
- private boolean hasCacheInterceptor(Object pojo)
- {
- Interceptor[] interceptors = ((Advised) pojo)._getInstanceAdvisor().getInterceptors();
- for (int i = 0; i < interceptors.length; i++)
- {
- if (interceptors[i] instanceof CacheFieldInterceptor)
- return true;
- }
- return false;
- }
-
- public void testSimpleTxWithRollback2() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- cache_.attach("/a", test);
-
- setTxRollback(true);
- try
- {
- cache_.detach("/a");
- }
- catch (Exception e)
- {
- }
-
- assertTrue("Should still have cache interceptor ", hasCacheInterceptor(test));
- }
-
-
-
-
-}
Copied: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java (from rev 6048, pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/LocalUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,116 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.rollback;
+
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import javax.transaction.TransactionManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.Advised;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheFactory;
+import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
+import org.jboss.cache.pojo.test.Person;
+import org.jboss.cache.transaction.DummyTransactionManager;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * Additional basic tests
+ *
+ * @author Ben Wang
+ */
+
+@Test(groups = {"functional"})
+public class LocalUndoTest
+{
+ Log log_ = LogFactory.getLog(LocalUndoTest.class);
+ PojoCache cache_;
+ TransactionManager tx_mgr;
+
+
+ @BeforeMethod(alwaysRun = true)
+ protected void setUp() throws Exception
+ {
+ log_.info("setUp() ....");
+ String configFile = "META-INF/local-service.xml";
+ boolean toStart = false;
+ cache_ = PojoCacheFactory.createCache(configFile, toStart);
+ cache_.start();
+ tx_mgr = DummyTransactionManager.getInstance();
+
+ }
+
+ @AfterMethod(alwaysRun = true)
+ protected void tearDown() throws Exception
+ {
+ cache_.stop();
+ }
+
+// public void testDummy() {}
+
+ public void testSimpleTxWithRollback1() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", test);
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", hasCacheInterceptor(test));
+ }
+
+ private boolean hasCacheInterceptor(Object pojo)
+ {
+ Interceptor[] interceptors = ((Advised) pojo)._getInstanceAdvisor().getInterceptors();
+ for (int i = 0; i < interceptors.length; i++)
+ {
+ if (interceptors[i] instanceof CacheFieldInterceptor)
+ return true;
+ }
+ return false;
+ }
+
+ public void testSimpleTxWithRollback2() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ cache_.attach("/a", test);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.detach("/a");
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+
+ assertTrue("Should still have cache interceptor ", hasCacheInterceptor(test));
+ }
+
+
+
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java
===================================================================
--- pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,143 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.rollback;
-
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.util.HashMap;
-
-import javax.transaction.TransactionManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.proxy.ClassProxy;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheFactory;
-import org.jboss.cache.pojo.interceptors.PojoFailedTxMockupInterceptor;
-import org.jboss.cache.pojo.test.Person;
-import org.jboss.cache.transaction.DummyTransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- * Additional basic tests
- *
- * @author Ben Wang
- */
-
-@Test(groups = {"functional"})
-public class MapUndoTest
-{
- Log log_ = LogFactory.getLog(MapUndoTest.class);
- PojoCache cache_;
- TransactionManager tx_mgr;
-
-
- @BeforeMethod(alwaysRun = true)
- protected void setUp() throws Exception
- {
- log_.info("setUp() ....");
- String configFile = "META-INF/local-service.xml";
- boolean toStart = false;
- cache_ = PojoCacheFactory.createCache(configFile, toStart);
- cache_.start();
- tx_mgr = DummyTransactionManager.getInstance();
-
- }
-
- @AfterMethod(alwaysRun = true)
- protected void tearDown() throws Exception
- {
- cache_.stop();
- }
-
-// public void testDummy() {}
-
- private void setTxRollback(boolean isTrue)
- {
- PojoFailedTxMockupInterceptor.TX_ROLLBACK = isTrue;
- }
-
- public void testSimple() throws Exception
- {
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("1", "test1");
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", map);
- }
- catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", isProxy(map));
-
- cache_.attach("/a", map);
- }
-
- public void testSimpleTxWithRollback1() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("1", "English");
- test.setHobbies(map);
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", test);
- }
- catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", isProxy(test.getHobbies()));
-
- cache_.attach("/a", test);
- }
-
- private boolean isProxy(Object pojo)
- {
- if (pojo instanceof ClassProxy) return true;
- return false;
- }
-
- public void testSimpleTxWithRollback2() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- HashMap<String, String> map = new HashMap<String, String>();
- map.put("1", "English");
- test.setHobbies(map);
-
- cache_.attach("/a", test);
-
- setTxRollback(true);
- try
- {
- cache_.detach("/a");
- }
- catch (Exception e)
- {
- }
-
- assertTrue("Should still have cache interceptor ", isProxy(test.getHobbies()));
- cache_.detach("/a");
- }
-
-
-
-
-}
Copied: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java (from rev 6048, pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/MapUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,140 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.rollback;
+
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.HashMap;
+
+import javax.transaction.TransactionManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheFactory;
+import org.jboss.cache.pojo.test.Person;
+import org.jboss.cache.transaction.DummyTransactionManager;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * Additional basic tests
+ *
+ * @author Ben Wang
+ */
+
+@Test(groups = {"functional"})
+public class MapUndoTest
+{
+ Log log_ = LogFactory.getLog(MapUndoTest.class);
+ PojoCache cache_;
+ TransactionManager tx_mgr;
+
+
+ @BeforeMethod(alwaysRun = true)
+ protected void setUp() throws Exception
+ {
+ log_.info("setUp() ....");
+ String configFile = "META-INF/local-service.xml";
+ boolean toStart = false;
+ cache_ = PojoCacheFactory.createCache(configFile, toStart);
+ cache_.start();
+ tx_mgr = DummyTransactionManager.getInstance();
+
+ }
+
+ @AfterMethod(alwaysRun = true)
+ protected void tearDown() throws Exception
+ {
+ cache_.stop();
+ }
+
+// public void testDummy() {}
+
+ public void testSimple() throws Exception
+ {
+ HashMap<String, String> map = new HashMap<String, String>();
+ map.put("1", "test1");
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", map);
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", isProxy(map));
+
+ cache_.attach("/a", map);
+ }
+
+ public void testSimpleTxWithRollback1() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ HashMap<String, String> map = new HashMap<String, String>();
+ map.put("1", "English");
+ test.setHobbies(map);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", test);
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", isProxy(test.getHobbies()));
+
+ cache_.attach("/a", test);
+ }
+
+ private boolean isProxy(Object pojo)
+ {
+ if (pojo instanceof ClassProxy) return true;
+ return false;
+ }
+
+ public void testSimpleTxWithRollback2() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ HashMap<String, String> map = new HashMap<String, String>();
+ map.put("1", "English");
+ test.setHobbies(map);
+
+ cache_.attach("/a", test);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.detach("/a");
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+
+ assertTrue("Should still have cache interceptor ", isProxy(test.getHobbies()));
+ cache_.detach("/a");
+ }
+
+
+
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java
===================================================================
--- pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,393 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.rollback;
-
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.fail;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.transaction.NotSupportedException;
-import javax.transaction.RollbackException;
-import javax.transaction.SystemException;
-import javax.transaction.UserTransaction;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.cache.config.Configuration.CacheMode;
-import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
-import org.jboss.cache.util.TestingUtil;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheFactory;
-import org.jboss.cache.pojo.test.Person;
-import org.jboss.cache.transaction.DummyTransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- */
-
-@Test(groups = {"functional"})
-public class ReplicatedTxTest
-{
- Log log = LogFactory.getLog(org.jboss.cache.pojo.rollback.ReplicatedTxTest.class);
- PojoCache cache, cache1;
- final String FACTORY = "org.jboss.cache.transaction.DummyContextFactory";
- DummyTransactionManager tx_mgr;
- Throwable t1_ex, t2_ex;
- long start = 0;
-
-
-
- @BeforeMethod(alwaysRun = true)
- protected void setUp() throws Exception
- {
- log.info("setUp() ....");
- boolean toStart = false;
- cache = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
- cache.start();
- cache1 = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
- cache1.start();
-
- System.setProperty(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
-
- tx_mgr = DummyTransactionManager.getInstance();
- t1_ex = t2_ex = null;
- }
-
- @AfterMethod(alwaysRun = true)
- protected void tearDown() throws Exception
- {
- cache.stop();
- cache1.stop();
-
- DummyTransactionManager.destroy();
- }
-
-// public void testDummy() {}
-
- UserTransaction getTransaction() throws SystemException, NotSupportedException, NamingException
- {
- Properties prop = new Properties();
- prop.put(Context.INITIAL_CONTEXT_FACTORY,
- "org.jboss.cache.transaction.DummyContextFactory");
- return (UserTransaction) new InitialContext(prop).lookup("UserTransaction");
- }
-
- private Person createPerson(String id, String name, int age)
- {
- Person p = new Person();
- p.setName(name);
- p.setAge(age);
- return p;
- }
-
- public void testSimple() throws Exception
- {
- log.info("testSimple() ....");
- UserTransaction tx = getTransaction();
- tx.begin();
- Person p = createPerson("/person/test1", "Harald Gliebe", 32);
- cache.attach("/person/test1", p);
-
- tx.commit();
- tx.begin();
- p.setName("Benoit");
- tx.commit();
- Person p1 = (Person) cache1.find("/person/test1");
- assertEquals("Benoit", p.getName());
- assertEquals("Benoit", p1.getName());
- tx.begin();
- p1.setAge(61);
- tx.commit();
- assertEquals(61, p.getAge());
- assertEquals(61, p1.getAge());
- }
-
- /**
- * Concurrent puts (whole POJO) from the same cache instance (different threads) with rollback.
- */
- public void testConcurrentPuts() throws Exception
- {
- Thread t1 = new Thread()
- {
- public void run()
- {
- try
- {
- Person p = createPerson("/person/test6", "p6", 50);
- List<String> lang = new ArrayList<String>();
- lang.add("German");
- p.setLanguages(lang);
- UserTransaction tx = getTransaction();
- tx.begin();
- cache.attach("/person/test6", p);
- TestingUtil.sleepThread(17000);
- tx.commit();
- }
- catch (RollbackException rollback)
- {
- ;
- }
- catch (Exception ex)
- {
- t1_ex = ex;
- }
- }
- };
-
- Thread t2 = new Thread()
- {
- public void run()
- {
- UserTransaction tx = null;
- Person p = createPerson("/person/test6", "p6", 50);
- try
- {
- TestingUtil.sleepThread(1000); // give Thread1 time to createPerson
- List<String> lang = new ArrayList<String>();
- lang.add("German");
- p.setLanguages(lang);
- tx = getTransaction();
- tx.begin();
- cache.attach("/person/test6", p);
- tx.commit();
- }
- catch (RollbackException rollback)
- {
- ;
- }
- catch (Exception ex)
- {
- try
- {
- tx.rollback();
- }
- catch (SystemException e)
- {
- e.printStackTrace();
- t2_ex = e;
- }
- }
-
- cache.attach("/person/test6", p);
-
- }
- };
-
- t1.start();
- t2.start();
-
- t1.join();
- t2.join();
-
- // t2 should rollback due to timeout while t2 should succeed
- if (t2_ex != null)
- fail("Thread1 failed: " + t2_ex);
- if (t1_ex != null)
- fail("Thread2 failed: " + t1_ex);
-
- int size = ((Person) cache.find("/person/test6")).getLanguages().size();
- assertEquals("number of languages", 1, size);
- size = ((Person) cache1.find("/person/test6")).getLanguages().size();
- assertEquals("number of languages", 1, size);
- }
-
- /**
- * Concurrent puts from the same cache instance (different threads) with rollback.
- */
- public void testConcurrentPuts1() throws Exception
- {
- Thread t1 = new Thread()
- {
- public void run()
- {
- try
- {
- List<String> lang = ((Person) cache.find("/person/test6")).getLanguages();
- UserTransaction tx = getTransaction();
- tx.begin();
- lang.add("German");
- TestingUtil.sleepThread(17000);
- tx.commit();
- }
- catch (RollbackException rollback)
- {
- ;
- }
- catch (Exception ex)
- {
- t1_ex = ex;
- }
- }
- };
-
- Thread t2 = new Thread()
- {
- public void run()
- {
- UserTransaction tx = null;
- try
- {
- TestingUtil.sleepThread(1000); // give Thread1 time to createPerson
- List<String> lang = ((Person) cache1.find("/person/test6")).getLanguages();
- tx = getTransaction();
- tx.begin();
- lang.add("English");
- tx.commit();
- }
- catch (RollbackException rollback)
- {
- ;
- }
- catch (Exception ex)
- {
- try
- {
- tx.rollback();
- }
- catch (SystemException e)
- {
- e.printStackTrace();
- t2_ex = e;
- }
- }
- }
- };
-
- Person p = createPerson("/person/test6", "p6", 50);
- cache.attach("/person/test6", p);
- List<String> lang = new ArrayList<String>();
- lang.add("German");
- p.setLanguages(lang);
-
- t1.start();
- t2.start();
-
- t1.join();
- t2.join();
-
- // t2 should rollback due to timeout while t2 should succeed
- if (t2_ex != null)
- fail("Thread1 failed: " + t2_ex);
- if (t1_ex != null)
- fail("Thread2 failed: " + t1_ex);
-
- int size = ((Person) cache.find("/person/test6")).getLanguages().size();
- assertEquals("number of languages", 2, size);
- size = ((Person) cache1.find("/person/test6")).getLanguages().size();
- assertEquals("number of languages", 2, size);
- }
-
- /**
- * Concurrent puts from the different cache instances (different threads) with rollback.
- */
- public void testConcurrentPuts2() throws Exception
- {
- Thread t1 = new Thread()
- {
- public void run()
- {
- try
- {
- List<String> lang = ((Person) cache.find("/person/test6")).getLanguages();
- UserTransaction tx = getTransaction();
- tx.begin();
- lang.add("German");
- TestingUtil.sleepThread(17000);
- tx.commit();
- }
- catch (RollbackException rollback)
- {
- ;
- }
- catch (Exception ex)
- {
- t1_ex = ex;
- }
- }
- };
-
- Thread t2 = new Thread()
- {
- public void run()
- {
- UserTransaction tx = null;
- try
- {
- TestingUtil.sleepThread(1000); // give Thread1 time to createPerson
- List<String> lang = ((Person) cache.find("/person/test6")).getLanguages();
- tx = getTransaction();
- tx.begin();
- lang.add("English");
- tx.commit();
- }
- catch (RollbackException rollback)
- {
- ;
- }
- catch (Exception ex)
- {
- try
- {
- tx.rollback();
- }
- catch (SystemException e)
- {
- e.printStackTrace();
- t2_ex = e;
- }
- }
- }
- };
-
- Person p = createPerson("/person/test6", "p6", 50);
- cache.attach("/person/test6", p);
- List<String> lang = new ArrayList<String>();
- lang.add("German");
- p.setLanguages(lang);
-
- t1.start();
- t2.start();
-
- t1.join();
- t2.join();
-
- // t2 should rollback due to timeout while t2 should succeed
- if (t2_ex != null)
- fail("Thread1 failed: " + t2_ex);
- if (t1_ex != null)
- fail("Thread2 failed: " + t1_ex);
-
- int size = ((Person) cache.find("/person/test6")).getLanguages().size();
- assertEquals("number of languages", 2, size);
- size = ((Person) cache1.find("/person/test6")).getLanguages().size();
- assertEquals("number of languages", 2, size);
- }
-
- void log(String s)
- {
- long now;
- if (start == 0)
- start = System.currentTimeMillis();
- now = System.currentTimeMillis();
-
- System.out.println("[" + Thread.currentThread().getName() + "] [" + (now - start) + "] " + s);
- }
-
-
-
-
-
-}
Copied: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java (from rev 6048, pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/ReplicatedTxTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,395 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.rollback;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
+import org.jboss.cache.util.TestingUtil;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheFactory;
+import org.jboss.cache.pojo.test.Person;
+import org.jboss.cache.transaction.DummyTransactionManager;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ */
+
+@Test(groups = {"functional"})
+public class ReplicatedTxTest
+{
+ Log log = LogFactory.getLog(org.jboss.cache.pojo.rollback.ReplicatedTxTest.class);
+ PojoCache cache, cache1;
+ final String FACTORY = "org.jboss.cache.transaction.DummyContextFactory";
+ DummyTransactionManager tx_mgr;
+ Throwable t1_ex, t2_ex;
+ long start = 0;
+
+
+
+ @BeforeMethod(alwaysRun = true)
+ protected void setUp() throws Exception
+ {
+ log.info("setUp() ....");
+ boolean toStart = false;
+ cache = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
+ cache.start();
+ cache1 = PojoCacheFactory.createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), toStart);
+ cache1.start();
+
+ System.setProperty(Context.INITIAL_CONTEXT_FACTORY, FACTORY);
+
+ tx_mgr = DummyTransactionManager.getInstance();
+ t1_ex = t2_ex = null;
+ }
+
+ @AfterMethod(alwaysRun = true)
+ protected void tearDown() throws Exception
+ {
+ cache.stop();
+ cache1.stop();
+
+ DummyTransactionManager.destroy();
+ }
+
+// public void testDummy() {}
+
+ UserTransaction getTransaction() throws SystemException, NotSupportedException, NamingException
+ {
+ Properties prop = new Properties();
+ prop.put(Context.INITIAL_CONTEXT_FACTORY,
+ "org.jboss.cache.transaction.DummyContextFactory");
+ return (UserTransaction) new InitialContext(prop).lookup("UserTransaction");
+ }
+
+ private Person createPerson(String id, String name, int age)
+ {
+ Person p = new Person();
+ p.setName(name);
+ p.setAge(age);
+ return p;
+ }
+
+ public void testSimple() throws Exception
+ {
+ log.info("testSimple() ....");
+ UserTransaction tx = getTransaction();
+ tx.begin();
+ Person p = createPerson("/person/test1", "Harald Gliebe", 32);
+ cache.attach("/person/test1", p);
+
+ tx.commit();
+ tx.begin();
+ p.setName("Benoit");
+ tx.commit();
+ Person p1 = (Person) cache1.find("/person/test1");
+ assertEquals("Benoit", p.getName());
+ assertEquals("Benoit", p1.getName());
+ tx.begin();
+ p1.setAge(61);
+ tx.commit();
+ assertEquals(61, p.getAge());
+ assertEquals(61, p1.getAge());
+ }
+
+ /**
+ * Concurrent puts (whole POJO) from the same cache instance (different threads) with rollback.
+ */
+ public void testConcurrentPuts() throws Exception
+ {
+ Thread t1 = new Thread()
+ {
+ public void run()
+ {
+ try
+ {
+ Person p = createPerson("/person/test6", "p6", 50);
+ List<String> lang = new ArrayList<String>();
+ lang.add("German");
+ p.setLanguages(lang);
+ UserTransaction tx = getTransaction();
+ tx.begin();
+ cache.attach("/person/test6", p);
+ TestingUtil.sleepThread(17000);
+ tx.commit();
+ }
+ catch (RollbackException rollback)
+ {
+ ;
+ }
+ catch (Exception ex)
+ {
+ t1_ex = ex;
+ }
+ }
+ };
+
+ Thread t2 = new Thread()
+ {
+ public void run()
+ {
+ UserTransaction tx = null;
+ Person p = createPerson("/person/test6", "p6", 50);
+ try
+ {
+ TestingUtil.sleepThread(1000); // give Thread1 time to createPerson
+ List<String> lang = new ArrayList<String>();
+ lang.add("German");
+ p.setLanguages(lang);
+ tx = getTransaction();
+ tx.begin();
+ cache.attach("/person/test6", p);
+ tx.commit();
+ }
+ catch (RollbackException rollback)
+ {
+ ;
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ tx.rollback();
+ }
+ catch (SystemException e)
+ {
+ e.printStackTrace();
+ t2_ex = e;
+ }
+ }
+
+ cache.attach("/person/test6", p);
+
+ }
+ };
+
+ t1.start();
+ t2.start();
+
+ t1.join();
+ t2.join();
+
+ // t2 should rollback due to timeout while t2 should succeed
+ if (t2_ex != null)
+ fail("Thread1 failed: " + t2_ex);
+ if (t1_ex != null)
+ fail("Thread2 failed: " + t1_ex);
+
+ int size = ((Person) cache.find("/person/test6")).getLanguages().size();
+ assertEquals("number of languages", 1, size);
+ size = ((Person) cache1.find("/person/test6")).getLanguages().size();
+ assertEquals("number of languages", 1, size);
+ }
+
+ /**
+ * Concurrent puts from the same cache instance (different threads) with rollback.
+ */
+ public void testConcurrentPuts1() throws Exception
+ {
+ Thread t1 = new Thread()
+ {
+ public void run()
+ {
+ try
+ {
+ List<String> lang = ((Person) cache.find("/person/test6")).getLanguages();
+ UserTransaction tx = getTransaction();
+ tx.begin();
+ lang.add("German");
+ TestingUtil.sleepThread(17000);
+ tx.commit();
+ }
+ catch (RollbackException rollback)
+ {
+ ;
+ }
+ catch (Exception ex)
+ {
+ t1_ex = ex;
+ }
+ }
+ };
+
+ Thread t2 = new Thread()
+ {
+ public void run()
+ {
+ UserTransaction tx = null;
+ try
+ {
+ TestingUtil.sleepThread(1000); // give Thread1 time to createPerson
+ List<String> lang = ((Person) cache1.find("/person/test6")).getLanguages();
+ System.out.println(lang == null);
+ tx = getTransaction();
+ tx.begin();
+ lang.add("English");
+ tx.commit();
+ System.out.println("Successful!");
+ }
+ catch (RollbackException rollback)
+ {
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ try
+ {
+ tx.rollback();
+ }
+ catch (SystemException e)
+ {
+ e.printStackTrace();
+ t2_ex = e;
+ }
+ }
+ }
+ };
+
+ Person p = createPerson("/person/test6", "p6", 50);
+ cache.attach("/person/test6", p);
+ List<String> lang = new ArrayList<String>();
+ lang.add("German");
+ p.setLanguages(lang);
+
+ t1.start();
+ t2.start();
+
+ t1.join();
+ t2.join();
+
+ // t2 should rollback due to timeout while t2 should succeed
+ if (t2_ex != null)
+ fail("Thread1 failed: " + t2_ex);
+ if (t1_ex != null)
+ fail("Thread2 failed: " + t1_ex);
+
+ int size = ((Person) cache.find("/person/test6")).getLanguages().size();
+ assertEquals("number of languages", 2, size);
+ size = ((Person) cache1.find("/person/test6")).getLanguages().size();
+ assertEquals("number of languages", 2, size);
+ }
+
+ /**
+ * Concurrent puts from the different cache instances (different threads) with rollback.
+ */
+ public void testConcurrentPuts2() throws Exception
+ {
+ Thread t1 = new Thread()
+ {
+ public void run()
+ {
+ try
+ {
+ List<String> lang = ((Person) cache.find("/person/test6")).getLanguages();
+ UserTransaction tx = getTransaction();
+ tx.begin();
+ lang.add("German");
+ TestingUtil.sleepThread(17000);
+ tx.commit();
+ }
+ catch (RollbackException rollback)
+ {
+ ;
+ }
+ catch (Exception ex)
+ {
+ t1_ex = ex;
+ }
+ }
+ };
+
+ Thread t2 = new Thread()
+ {
+ public void run()
+ {
+ UserTransaction tx = null;
+ try
+ {
+ TestingUtil.sleepThread(1000); // give Thread1 time to createPerson
+ List<String> lang = ((Person) cache.find("/person/test6")).getLanguages();
+ tx = getTransaction();
+ tx.begin();
+ lang.add("English");
+ tx.commit();
+ }
+ catch (RollbackException rollback)
+ {
+ ;
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ tx.rollback();
+ }
+ catch (SystemException e)
+ {
+ e.printStackTrace();
+ t2_ex = e;
+ }
+ }
+ }
+ };
+
+ Person p = createPerson("/person/test6", "p6", 50);
+ cache.attach("/person/test6", p);
+ List<String> lang = new ArrayList<String>();
+ lang.add("German");
+ p.setLanguages(lang);
+
+ t1.start();
+ t2.start();
+
+ t1.join();
+ t2.join();
+
+ // t2 should rollback due to timeout while t2 should succeed
+ if (t2_ex != null)
+ fail("Thread1 failed: " + t2_ex);
+ if (t1_ex != null)
+ fail("Thread2 failed: " + t1_ex);
+
+ int size = ((Person) cache.find("/person/test6")).getLanguages().size();
+ assertEquals("number of languages", 2, size);
+ size = ((Person) cache1.find("/person/test6")).getLanguages().size();
+ assertEquals("number of languages", 2, size);
+ }
+
+ void log(String s)
+ {
+ long now;
+ if (start == 0)
+ start = System.currentTimeMillis();
+ now = System.currentTimeMillis();
+
+ System.out.println("[" + Thread.currentThread().getName() + "] [" + (now - start) + "] " + s);
+ }
+
+
+
+
+
+}
Deleted: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java
===================================================================
--- pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java 2008-06-25 18:35:22 UTC (rev 6047)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -1,137 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package org.jboss.cache.pojo.rollback;
-
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.util.HashSet;
-
-import javax.transaction.TransactionManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jboss.aop.proxy.ClassProxy;
-import org.jboss.cache.pojo.PojoCache;
-import org.jboss.cache.pojo.PojoCacheFactory;
-import org.jboss.cache.pojo.interceptors.PojoFailedTxMockupInterceptor;
-import org.jboss.cache.pojo.test.Person;
-import org.jboss.cache.transaction.DummyTransactionManager;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- * Additional basic tests
- *
- * @author Ben Wang
- */
-
-@Test(groups = {"functional"})
-public class SetUndoTest
-{
- Log log_ = LogFactory.getLog(SetUndoTest.class);
- PojoCache cache_;
- TransactionManager tx_mgr;
-
-
- @BeforeMethod(alwaysRun = true)
- protected void setUp() throws Exception
- {
- log_.info("setUp() ....");
- String configFile = "META-INF/local-service.xml";
- boolean toStart = false;
- cache_ = PojoCacheFactory.createCache(configFile, toStart);
- cache_.start();
- tx_mgr = DummyTransactionManager.getInstance();
-
- }
-
- @AfterMethod(alwaysRun = true)
- protected void tearDown() throws Exception
- {
- cache_.stop();
- }
-
-// public void testDummy() {}
-
- private void setTxRollback(boolean isTrue)
- {
- PojoFailedTxMockupInterceptor.TX_ROLLBACK = isTrue;
- }
-
- public void testSimple() throws Exception
- {
- HashSet<String> set = new HashSet<String>();
- set.add("test1");
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", set);
- }
- catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", isProxy(set));
-
- cache_.attach("/a", set);
- }
-
- public void testSimpleTxWithRollback1() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- HashSet<String> set = new HashSet<String>();
- set.add("English");
- test.setSkills(set);
-
- setTxRollback(true);
- try
- {
- cache_.attach("/a", test);
- } catch (Exception e)
- {
- }
- assertFalse("Should not have cache interceptor ", isProxy(test.getSkills()));
-
- cache_.attach("/a", test);
- }
-
- private boolean isProxy(Object pojo)
- {
- if (pojo instanceof ClassProxy) return true;
- return false;
- }
-
- public void testSimpleTxWithRollback2() throws Exception
- {
- log_.info("testSimpleTxWithRollback1() ....");
- Person test = new Person();
- test.setName("Ben");
- test.setAge(10);
- HashSet<String> set = new HashSet<String>();
- set.add("English");
- test.setSkills(set);
-
- cache_.attach("/a", test);
-
- setTxRollback(true);
- try
- {
- cache_.detach("/a");
- } catch (Exception e)
- {
- }
-
- assertTrue("Should still have cache interceptor ", isProxy(test.getSkills()));
- cache_.detach("/a");
- }
-}
Copied: pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java (from rev 6048, pojo/trunk/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java)
===================================================================
--- pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java (rev 0)
+++ pojo/tags/2.2.0.CR1/src/test/java/org/jboss/cache/pojo/rollback/SetUndoTest.java 2008-06-27 22:03:17 UTC (rev 6109)
@@ -0,0 +1,132 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.cache.pojo.rollback;
+
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.HashSet;
+
+import javax.transaction.TransactionManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jboss.aop.proxy.ClassProxy;
+import org.jboss.cache.pojo.PojoCache;
+import org.jboss.cache.pojo.PojoCacheFactory;
+import org.jboss.cache.pojo.test.Person;
+import org.jboss.cache.transaction.DummyTransactionManager;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ * Additional basic tests
+ *
+ * @author Ben Wang
+ */
+
+@Test(groups = {"functional"})
+public class SetUndoTest
+{
+ Log log_ = LogFactory.getLog(SetUndoTest.class);
+ PojoCache cache_;
+ TransactionManager tx_mgr;
+
+
+ @BeforeMethod(alwaysRun = true)
+ protected void setUp() throws Exception
+ {
+ log_.info("setUp() ....");
+ String configFile = "META-INF/local-service.xml";
+ boolean toStart = false;
+ cache_ = PojoCacheFactory.createCache(configFile, toStart);
+ cache_.start();
+ tx_mgr = DummyTransactionManager.getInstance();
+
+ }
+
+ @AfterMethod(alwaysRun = true)
+ protected void tearDown() throws Exception
+ {
+ cache_.stop();
+ }
+
+ public void testSimple() throws Exception
+ {
+ HashSet<String> set = new HashSet<String>();
+ set.add("test1");
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", set);
+ tx_mgr.rollback();
+ }
+ catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", isProxy(set));
+
+ cache_.attach("/a", set);
+ }
+
+ public void testSimpleTxWithRollback1() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ HashSet<String> set = new HashSet<String>();
+ set.add("English");
+ test.setSkills(set);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.attach("/a", test);
+ tx_mgr.rollback();
+ } catch (Exception e)
+ {
+ }
+ assertFalse("Should not have cache interceptor ", isProxy(test.getSkills()));
+
+ cache_.attach("/a", test);
+ }
+
+ private boolean isProxy(Object pojo)
+ {
+ if (pojo instanceof ClassProxy) return true;
+ return false;
+ }
+
+ public void testSimpleTxWithRollback2() throws Exception
+ {
+ log_.info("testSimpleTxWithRollback1() ....");
+ Person test = new Person();
+ test.setName("Ben");
+ test.setAge(10);
+ HashSet<String> set = new HashSet<String>();
+ set.add("English");
+ test.setSkills(set);
+
+ cache_.attach("/a", test);
+
+ try
+ {
+ tx_mgr.begin();
+ cache_.detach("/a");
+ tx_mgr.rollback();
+ } catch (Exception e)
+ {
+ }
+
+ assertTrue("Should still have cache interceptor ", isProxy(test.getSkills()));
+ cache_.detach("/a");
+ }
+}
16 years, 6 months
JBoss Cache SVN: r6108 - pojo/trunk.
by jbosscache-commits@lists.jboss.org
Author: jason.greene(a)jboss.com
Date: 2008-06-27 17:51:20 -0400 (Fri, 27 Jun 2008)
New Revision: 6108
Modified:
pojo/trunk/pom.xml
Log:
Update deps to latest CRs
Modified: pojo/trunk/pom.xml
===================================================================
--- pojo/trunk/pom.xml 2008-06-27 21:25:42 UTC (rev 6107)
+++ pojo/trunk/pom.xml 2008-06-27 21:51:20 UTC (rev 6108)
@@ -5,8 +5,8 @@
<modelVersion>4.0.0</modelVersion>
<properties>
<jbosscache-pojo-version>2.2.0-SNAPSHOT</jbosscache-pojo-version>
- <jbosscache-core-version>2.2.0.CR4</jbosscache-core-version>
- <jboss.aop.version>2.0.0-SNAPSHOT</jboss.aop.version>
+ <jbosscache-core-version>2.2.0.CR5</jbosscache-core-version>
+ <jboss.aop.version>2.0.0.CR14</jboss.aop.version>
</properties>
<parent>
<groupId>org.jboss.cache</groupId>
16 years, 6 months
JBoss Cache SVN: r6107 - core/trunk/src/test/java/org/jboss/cache/api/mvcc.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 17:25:42 -0400 (Fri, 27 Jun 2008)
New Revision: 6107
Removed:
core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java
Log:
More MVCC tests
Deleted: core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java 2008-06-27 17:28:57 UTC (rev 6106)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java 2008-06-27 21:25:42 UTC (rev 6107)
@@ -1,12 +0,0 @@
-package org.jboss.cache.api.mvcc;
-
-import org.testng.annotations.Test;
-
-@Test(groups = {"functional", "mvcc"})
-public class LockParentForChildInsertRemoveTest extends LockTest
-{
- public LockParentForChildInsertRemoveTest()
- {
- lockParentForInsertRemove = true;
- }
-}
Deleted: core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java 2008-06-27 17:28:57 UTC (rev 6106)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java 2008-06-27 21:25:42 UTC (rev 6107)
@@ -1,423 +0,0 @@
-package org.jboss.cache.api.mvcc;
-
-import org.jboss.cache.Cache;
-import org.jboss.cache.DefaultCacheFactory;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.config.Configuration.CacheMode;
-import org.jboss.cache.config.Configuration.NodeLockingScheme;
-import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
-import org.jboss.cache.invocation.InvocationContextContainer;
-import org.jboss.cache.lock.IsolationLevel;
-import org.jboss.cache.lock.LockManager;
-import org.jboss.cache.lock.MVCCLockManager.LockContainer;
-import org.jboss.cache.transaction.DummyTransactionManagerLookup;
-import org.jboss.cache.util.TestingUtil;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-import java.util.Collections;
-
-/**
- * @author Manik Surtani (<a href="mailto:manik@jboss.org">manik(a)jboss.org</a>)
- * @since 3.0
- */
-@Test(groups = {"functional", "mvcc"})
-public class LockTest
-{
- Cache<String, String> cache;
- TransactionManager tm;
- Fqn A = Fqn.fromString("/a");
- Fqn AB = Fqn.fromString("/a/b");
- Fqn ABC = Fqn.fromString("/a/b/c");
- Fqn ABCD = Fqn.fromString("/a/b/c/d");
- LockManager lockManager;
- InvocationContextContainer icc;
- boolean lockParentForInsertRemove = false;
- boolean repeatableRead = true;
-
-
- @BeforeMethod
- public void setUp()
- {
- cache = new DefaultCacheFactory<String, String>().createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.LOCAL), false);
- cache.getConfiguration().setNodeLockingScheme(NodeLockingScheme.MVCC);
- cache.getConfiguration().setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
- cache.getConfiguration().setLockParentForChildInsertRemove(lockParentForInsertRemove);
- cache.getConfiguration().setIsolationLevel(repeatableRead ? IsolationLevel.REPEATABLE_READ : IsolationLevel.READ_COMMITTED);
- cache.start();
- lockManager = TestingUtil.extractComponentRegistry(cache).getComponent(LockManager.class);
- icc = TestingUtil.extractComponentRegistry(cache).getComponent(InvocationContextContainer.class);
- tm = TestingUtil.extractComponentRegistry(cache).getComponent(TransactionManager.class);
- }
-
- @AfterMethod
- public void tearDown()
- {
- TestingUtil.killCaches(cache);
- }
-
- private void assertLocked(Fqn fqn)
- {
- assert lockManager.isLocked(fqn) : fqn + " not locked!";
- assert icc.get().getLocks().contains(fqn) : "Lock not recorded for " + fqn;
- }
-
- private void assertNotLocked(Fqn fqn)
- {
- // can't rely on the negative test since other nodes may share the same lock with lock striping.
-// assert !lockManager.isLocked(fqn) : fqn + " is locked!";
- assert !icc.get().getLocks().contains(fqn) : fqn + " lock recorded!";
- }
-
- private void assertNoLocks()
- {
- LockContainer lc = (LockContainer) TestingUtil.extractField(lockManager, "lockContainer");
- assert lc.getNumLocksHeld() == 0 : "Stale locks exist!" + lockManager.printLockInfo();
- assert icc.get().getLocks().isEmpty() : "Stale (?) locks recorded! " + icc.get().getLocks();
- }
-
- public void testLocksOnPutKeyVal() throws Exception
- {
- tm.begin();
- cache.put(AB, "k", "v");
- if (lockParentForInsertRemove)
- assertLocked(Fqn.ROOT);
- else
- assertNotLocked(Fqn.ROOT);
- assertLocked(A);
- assertLocked(AB);
- assertNotLocked(ABC);
- tm.commit();
-
- assertNoLocks();
-
- tm.begin();
- assert cache.get(AB, "k").equals("v");
- assertNotLocked(Fqn.ROOT);
- assertNotLocked(A);
- assertNotLocked(AB);
- assertNotLocked(ABC);
- tm.commit();
-
- assertNoLocks();
-
- tm.begin();
- cache.put(ABC, "k", "v");
- assertNotLocked(Fqn.ROOT);
- assertNotLocked(A);
- if (lockParentForInsertRemove)
- assertLocked(AB);
- else
- assertNotLocked(AB);
- assertLocked(ABC);
- tm.commit();
-
- assertNoLocks();
- }
-
- public void testLocksOnPutData() throws Exception
- {
- tm.begin();
- cache.put(AB, Collections.singletonMap("k", "v"));
- if (lockParentForInsertRemove)
- assertLocked(Fqn.ROOT);
- else
- assertNotLocked(Fqn.ROOT);
- assertLocked(A);
- assertLocked(AB);
- assertNotLocked(ABC);
- tm.commit();
-
- assertNoLocks();
-
- tm.begin();
- assert cache.get(AB, "k").equals("v");
- assertNotLocked(Fqn.ROOT);
- assertNotLocked(A);
- assertNotLocked(AB);
- assertNotLocked(ABC);
- tm.commit();
-
- assertNoLocks();
-
- tm.begin();
- cache.put(ABC, Collections.singletonMap("k", "v"));
- assertNotLocked(Fqn.ROOT);
- assertNotLocked(A);
- if (lockParentForInsertRemove)
- assertLocked(AB);
- else
- assertNotLocked(AB);
- assertLocked(ABC);
- tm.commit();
-
- assertNoLocks();
- }
-
- public void testLocksOnRemoveNode() throws Exception
- {
- // init some data on a node
- cache.put(AB, Collections.singletonMap("k", "v"));
-
- assert "v".equals(cache.get(AB, "k"));
-
- tm.begin();
- cache.removeNode(AB);
- assertLocked(AB);
- if (lockParentForInsertRemove)
- assertLocked(A);
- else
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.getNode(AB) == null : "Should not exist";
- assertNoLocks();
- }
-
- public void testLocksOnEvictNode() throws Exception
- {
- // init some data on a node
- cache.put(AB, Collections.singletonMap("k", "v"));
-
- assert "v".equals(cache.get(AB, "k"));
-
- tm.begin();
- cache.evict(AB);
- assertLocked(AB);
- if (lockParentForInsertRemove)
- assertLocked(A);
- else
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.getNode(AB) == null : "Should not exist";
- assertNoLocks();
- }
-
- public void testLocksOnEvictRecursiveNode() throws Exception
- {
- // init some data on a node
- cache.put(AB, Collections.singletonMap("k", "v"));
- cache.put(ABC, Collections.singletonMap("k", "v"));
- cache.put(ABCD, Collections.singletonMap("k", "v"));
-
- assert "v".equals(cache.get(AB, "k"));
- assert "v".equals(cache.get(ABC, "k"));
- assert "v".equals(cache.get(ABCD, "k"));
-
- tm.begin();
- cache.evict(AB, true);
- assertLocked(AB);
- assertLocked(ABC);
- assertLocked(ABCD);
- if (lockParentForInsertRemove)
- assertLocked(A);
- else
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.getNode(AB) == null : "Should not exist";
- assertNoLocks();
- }
-
- public void testLocksOnRemoveNonexistentNode() throws Exception
- {
- assert cache.getNode(AB) == null : "Should not exist";
-
- tm.begin();
- cache.removeNode(AB);
- assertLocked(AB);
- if (lockParentForInsertRemove)
- assertLocked(A);
- else
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.getNode(AB) == null : "Should not exist";
- assertNoLocks();
- }
-
- public void testLocksOnEvictNonexistentNode() throws Exception
- {
- assert cache.getNode(AB) == null : "Should not exist";
-
- tm.begin();
- cache.evict(AB);
- assertLocked(AB);
- if (lockParentForInsertRemove)
- assertLocked(A);
- else
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.getNode(AB) == null : "Should not exist";
- assertNoLocks();
- }
-
- public void testLocksOnRemoveData() throws Exception
- {
- // init some data on a node
- cache.put(AB, "k", "v");
- cache.put(AB, "k2", "v2");
-
- assert "v".equals(cache.get(AB, "k"));
- assert "v2".equals(cache.get(AB, "k2"));
-
- // remove
- tm.begin();
- Object x = cache.remove(AB, "k");
- assert x.equals("v");
- assertLocked(AB);
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.get(AB, "k") == null : "Should not exist";
- assert "v2".equals(cache.get(AB, "k2"));
- assertNoLocks();
-
- // clearData
- tm.begin();
- cache.clearData(AB);
- assertLocked(AB);
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
-
- assert cache.get(AB, "k") == null : "Should not exist";
- assert cache.get(AB, "k2") == null : "Should not exist";
- assertNoLocks();
-
- // nonexistent key
- assert cache.get(AB, "k3") == null : "Should not exist";
- tm.begin();
- cache.remove(AB, "k3");
- assertLocked(AB);
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assertNoLocks();
- }
-
- public void testLocksOnRemoveDataNonExistentNode() throws Exception
- {
- assert cache.getNode(AB) == null : "Should not exist";
-
- tm.begin();
- cache.remove(AB, "k");
- assertNotLocked(AB);
- assertNotLocked(A);
- assertNotLocked(Fqn.ROOT);
- tm.commit();
- assert cache.getNode(AB) == null : "Should not exist";
- }
-
- public void testReadMethods() throws Exception
- {
- cache.put(AB, "k", "v");
-
- tm.begin();
- assert "v".equals(cache.get(AB, "k"));
- assertNoLocks();
- tm.commit();
- assertNoLocks();
-
- tm.begin();
- assert cache.getData(AB).containsKey("k");
- assertNoLocks();
- tm.commit();
- assertNoLocks();
-
- tm.begin();
- assert cache.getKeys(AB).contains("k");
- assertNoLocks();
- tm.commit();
- assertNoLocks();
-
- tm.begin();
- assert cache.getNode(AB) != null;
- assertNoLocks();
- tm.commit();
- assertNoLocks();
-
- tm.begin();
- assert !(cache.getNode(A).getChildrenNames().isEmpty());
- assertNoLocks();
- tm.commit();
- assertNoLocks();
- }
-
- public void testWriteDoesntBlockRead() throws Exception
- {
- cache.put(AB, "k", "v");
-
- // start a write.
- tm.begin();
- cache.put(AB, "k2", "v2");
- assertLocked(AB);
- Transaction write = tm.suspend();
-
- // now start a read and confirm that the write doesn't block it.
- tm.begin();
- assert "v".equals(cache.get(AB, "k"));
- assert null == cache.get(AB, "k2") : "Should not see uncommitted changes";
- Transaction read = tm.suspend();
-
- // commit the write
- tm.resume(write);
- tm.commit();
-
- assertNoLocks();
-
- tm.resume(read);
- if (repeatableRead)
- assert null == cache.get(AB, "k2") : "Should have repeatable read";
- else
- assert "v2".equals(cache.get(AB, "k2")) : "Read committed should see committed changes";
- tm.commit();
- assertNoLocks();
- }
-
- public void testWriteDoesntBlockReadNonexistent() throws Exception
- {
- // start a write.
- tm.begin();
- cache.put(AB, "k", "v");
- assertLocked(AB);
- Transaction write = tm.suspend();
-
- // now start a read and confirm that the write doesn't block it.
- tm.begin();
- assert null == cache.get(AB, "k") : "Should not see uncommitted changes";
- assert null == cache.getNode(AB);
- Transaction read = tm.suspend();
-
- // commit the write
- tm.resume(write);
- tm.commit();
-
- assertNoLocks();
-
- tm.resume(read);
- if (repeatableRead)
- {
- assert null == cache.get(AB, "k") : "Should have repeatable read";
- assert null == cache.getNode(AB);
- }
- else
- {
- assert "v".equals(cache.get(AB, "k")) : "Read committed should see committed changes";
- assert null != cache.getNode(AB);
- }
- tm.commit();
- assertNoLocks();
- }
-
- // TODO: Test write conflicts - with and without allowing write skew. Multiple cases involving concurrent removes, concurrent put + remove, etc.
- // TODO: Test Replication with MVCC
- // TODO: Test state transfer with MVCC
- // TODO: Test Cache loading with MVCC
- // TODO: Test spreading of Fqns among locks. Need a better algorithm?
-}
16 years, 6 months
JBoss Cache SVN: r6106 - in core/tags/2.2.0.CR5: src/main/java/org/jboss/cache and 1 other directory.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 13:28:57 -0400 (Fri, 27 Jun 2008)
New Revision: 6106
Modified:
core/tags/2.2.0.CR5/pom.xml
core/tags/2.2.0.CR5/src/main/java/org/jboss/cache/Version.java
Log:
Modified: core/tags/2.2.0.CR5/pom.xml
===================================================================
--- core/tags/2.2.0.CR5/pom.xml 2008-06-27 17:25:39 UTC (rev 6105)
+++ core/tags/2.2.0.CR5/pom.xml 2008-06-27 17:28:57 UTC (rev 6106)
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
- <jbosscache-core-version>2.2.0-SNAPSHOT</jbosscache-core-version>
+ <jbosscache-core-version>2.2.0.CR5</jbosscache-core-version>
<!-- By default only run tests in the "unit" group -->
<defaultTestGroup>unit</defaultTestGroup>
<!-- By default only generate Javadocs when we install the module. -->
@@ -410,7 +410,7 @@
<activeByDefault>false</activeByDefault>
</activation>
<properties>
- <jbosscache-core-version>2.2.0-SNAPSHOT-JBossAS</jbosscache-core-version>
+ <jbosscache-core-version>2.2.0.CR5-JBossAS</jbosscache-core-version>
</properties>
<dependencies>
<dependency>
Modified: core/tags/2.2.0.CR5/src/main/java/org/jboss/cache/Version.java
===================================================================
--- core/tags/2.2.0.CR5/src/main/java/org/jboss/cache/Version.java 2008-06-27 17:25:39 UTC (rev 6105)
+++ core/tags/2.2.0.CR5/src/main/java/org/jboss/cache/Version.java 2008-06-27 17:28:57 UTC (rev 6106)
@@ -14,7 +14,7 @@
public static final String version = "2.2.0-SNAPSHOT";
public static final String codename = "Poblano";
//public static final String cvs = "$Id: Version.java 4592 2007-10-10 16:44:36Z manik.surtani(a)jboss.com $";
- static final byte[] version_id = {'0', '2', '2', '0', 'S'};
+ static final byte[] version_id = {'0', '2', '2', '0', 'C', '5'};
private static final int MAJOR_SHIFT = 11;
private static final int MINOR_SHIFT = 6;
16 years, 6 months
JBoss Cache SVN: r6105 - core/tags.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 13:25:39 -0400 (Fri, 27 Jun 2008)
New Revision: 6105
Added:
core/tags/2.2.0.CR5/
Log:
CR5
Copied: core/tags/2.2.0.CR5 (from rev 6104, core/branches/2.2.X)
16 years, 6 months
JBoss Cache SVN: r6104 - in core/trunk/src/test/java/org/jboss/cache/api/mvcc: read_committed and 1 other directories.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 13:16:50 -0400 (Fri, 27 Jun 2008)
New Revision: 6104
Added:
core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTestBase.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/
core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedLockTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedWithParentLockTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/
core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewLockTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewWithParentLockTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewLockTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewWithParentLockTest.java
Log:
More MVCC tests
Copied: core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTestBase.java (from rev 6103, core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java)
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTestBase.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTestBase.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,541 @@
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.Cache;
+import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.Fqn;
+import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
+import org.jboss.cache.invocation.InvocationContextContainer;
+import org.jboss.cache.lock.IsolationLevel;
+import org.jboss.cache.lock.LockManager;
+import org.jboss.cache.lock.MVCCLockManager.LockContainer;
+import org.jboss.cache.lock.TimeoutException;
+import org.jboss.cache.transaction.DummyTransactionManagerLookup;
+import org.jboss.cache.util.TestingUtil;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * @author Manik Surtani (<a href="mailto:manik@jboss.org">manik(a)jboss.org</a>)
+ * @since 3.0
+ */
+@Test(groups = {"functional", "mvcc"})
+public abstract class LockTestBase
+{
+ Cache<String, String> cache;
+ TransactionManager tm;
+ Fqn A = Fqn.fromString("/a");
+ Fqn AB = Fqn.fromString("/a/b");
+ Fqn ABC = Fqn.fromString("/a/b/c");
+ Fqn ABCD = Fqn.fromString("/a/b/c/d");
+ LockManager lockManager;
+ InvocationContextContainer icc;
+ protected boolean lockParentForInsertRemove = false;
+ protected boolean repeatableRead = true;
+ protected boolean allowWriteSkew = false;
+
+ @BeforeMethod
+ public void setUp()
+ {
+ cache = new DefaultCacheFactory<String, String>().createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.LOCAL), false);
+ cache.getConfiguration().setNodeLockingScheme(NodeLockingScheme.MVCC);
+ cache.getConfiguration().setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
+ cache.getConfiguration().setLockParentForChildInsertRemove(lockParentForInsertRemove);
+ cache.getConfiguration().setIsolationLevel(repeatableRead ? IsolationLevel.REPEATABLE_READ : IsolationLevel.READ_COMMITTED);
+ cache.start();
+ lockManager = TestingUtil.extractComponentRegistry(cache).getComponent(LockManager.class);
+ icc = TestingUtil.extractComponentRegistry(cache).getComponent(InvocationContextContainer.class);
+ tm = TestingUtil.extractComponentRegistry(cache).getComponent(TransactionManager.class);
+ }
+
+ @AfterMethod
+ public void tearDown()
+ {
+ TestingUtil.killCaches(cache);
+ }
+
+ private void assertLocked(Fqn fqn)
+ {
+ assert lockManager.isLocked(fqn) : fqn + " not locked!";
+ assert icc.get().getLocks().contains(fqn) : "Lock not recorded for " + fqn;
+ }
+
+ private void assertNotLocked(Fqn fqn)
+ {
+ // can't rely on the negative test since other nodes may share the same lock with lock striping.
+// assert !lockManager.isLocked(fqn) : fqn + " is locked!";
+ assert !icc.get().getLocks().contains(fqn) : fqn + " lock recorded!";
+ }
+
+ private void assertNoLocks()
+ {
+ LockContainer lc = (LockContainer) TestingUtil.extractField(lockManager, "lockContainer");
+ assert lc.getNumLocksHeld() == 0 : "Stale locks exist!" + lockManager.printLockInfo();
+ assert icc.get().getLocks().isEmpty() : "Stale (?) locks recorded! " + icc.get().getLocks();
+ }
+
+ public void testLocksOnPutKeyVal() throws Exception
+ {
+ tm.begin();
+ cache.put(AB, "k", "v");
+ if (lockParentForInsertRemove)
+ assertLocked(Fqn.ROOT);
+ else
+ assertNotLocked(Fqn.ROOT);
+ assertLocked(A);
+ assertLocked(AB);
+ assertNotLocked(ABC);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.get(AB, "k").equals("v");
+ assertNotLocked(Fqn.ROOT);
+ assertNotLocked(A);
+ assertNotLocked(AB);
+ assertNotLocked(ABC);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.begin();
+ cache.put(ABC, "k", "v");
+ assertNotLocked(Fqn.ROOT);
+ assertNotLocked(A);
+ if (lockParentForInsertRemove)
+ assertLocked(AB);
+ else
+ assertNotLocked(AB);
+ assertLocked(ABC);
+ tm.commit();
+
+ assertNoLocks();
+ }
+
+ public void testLocksOnPutData() throws Exception
+ {
+ tm.begin();
+ cache.put(AB, Collections.singletonMap("k", "v"));
+ if (lockParentForInsertRemove)
+ assertLocked(Fqn.ROOT);
+ else
+ assertNotLocked(Fqn.ROOT);
+ assertLocked(A);
+ assertLocked(AB);
+ assertNotLocked(ABC);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.get(AB, "k").equals("v");
+ assertNotLocked(Fqn.ROOT);
+ assertNotLocked(A);
+ assertNotLocked(AB);
+ assertNotLocked(ABC);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.begin();
+ cache.put(ABC, Collections.singletonMap("k", "v"));
+ assertNotLocked(Fqn.ROOT);
+ assertNotLocked(A);
+ if (lockParentForInsertRemove)
+ assertLocked(AB);
+ else
+ assertNotLocked(AB);
+ assertLocked(ABC);
+ tm.commit();
+
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveNode() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, Collections.singletonMap("k", "v"));
+
+ assert "v".equals(cache.get(AB, "k"));
+
+ tm.begin();
+ cache.removeNode(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnEvictNode() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, Collections.singletonMap("k", "v"));
+
+ assert "v".equals(cache.get(AB, "k"));
+
+ tm.begin();
+ cache.evict(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnEvictRecursiveNode() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, Collections.singletonMap("k", "v"));
+ cache.put(ABC, Collections.singletonMap("k", "v"));
+ cache.put(ABCD, Collections.singletonMap("k", "v"));
+
+ assert "v".equals(cache.get(AB, "k"));
+ assert "v".equals(cache.get(ABC, "k"));
+ assert "v".equals(cache.get(ABCD, "k"));
+
+ tm.begin();
+ cache.evict(AB, true);
+ assertLocked(AB);
+ assertLocked(ABC);
+ assertLocked(ABCD);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveNonexistentNode() throws Exception
+ {
+ assert cache.getNode(AB) == null : "Should not exist";
+
+ tm.begin();
+ cache.removeNode(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnEvictNonexistentNode() throws Exception
+ {
+ assert cache.getNode(AB) == null : "Should not exist";
+
+ tm.begin();
+ cache.evict(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveData() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, "k", "v");
+ cache.put(AB, "k2", "v2");
+
+ assert "v".equals(cache.get(AB, "k"));
+ assert "v2".equals(cache.get(AB, "k2"));
+
+ // remove
+ tm.begin();
+ Object x = cache.remove(AB, "k");
+ assert x.equals("v");
+ assertLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.get(AB, "k") == null : "Should not exist";
+ assert "v2".equals(cache.get(AB, "k2"));
+ assertNoLocks();
+
+ // clearData
+ tm.begin();
+ cache.clearData(AB);
+ assertLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+
+ assert cache.get(AB, "k") == null : "Should not exist";
+ assert cache.get(AB, "k2") == null : "Should not exist";
+ assertNoLocks();
+
+ // nonexistent key
+ assert cache.get(AB, "k3") == null : "Should not exist";
+ tm.begin();
+ cache.remove(AB, "k3");
+ assertLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveDataNonExistentNode() throws Exception
+ {
+ assert cache.getNode(AB) == null : "Should not exist";
+
+ tm.begin();
+ cache.remove(AB, "k");
+ assertNotLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ }
+
+ public void testReadMethods() throws Exception
+ {
+ cache.put(AB, "k", "v");
+
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.getData(AB).containsKey("k");
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.getKeys(AB).contains("k");
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.getNode(AB) != null;
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert !(cache.getNode(A).getChildrenNames().isEmpty());
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testWriteDoesntBlockRead() throws Exception
+ {
+ cache.put(AB, "k", "v");
+
+ // start a write.
+ tm.begin();
+ cache.put(AB, "k2", "v2");
+ assertLocked(AB);
+ Transaction write = tm.suspend();
+
+ // now start a read and confirm that the write doesn't block it.
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ assert null == cache.get(AB, "k2") : "Should not see uncommitted changes";
+ Transaction read = tm.suspend();
+
+ // commit the write
+ tm.resume(write);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.resume(read);
+ if (repeatableRead)
+ assert null == cache.get(AB, "k2") : "Should have repeatable read";
+ else
+ assert "v2".equals(cache.get(AB, "k2")) : "Read committed should see committed changes";
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testWriteDoesntBlockReadNonexistent() throws Exception
+ {
+ // start a write.
+ tm.begin();
+ cache.put(AB, "k", "v");
+ assertLocked(AB);
+ Transaction write = tm.suspend();
+
+ // now start a read and confirm that the write doesn't block it.
+ tm.begin();
+ assert null == cache.get(AB, "k") : "Should not see uncommitted changes";
+ assert null == cache.getNode(AB);
+ Transaction read = tm.suspend();
+
+ // commit the write
+ tm.resume(write);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.resume(read);
+ if (repeatableRead)
+ {
+ assert null == cache.get(AB, "k") : "Should have repeatable read";
+ assert null == cache.getNode(AB);
+ }
+ else
+ {
+ assert "v".equals(cache.get(AB, "k")) : "Read committed should see committed changes";
+ assert null != cache.getNode(AB);
+ }
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testConcurrentWriters() throws Exception
+ {
+ tm.begin();
+ cache.put(AB, "k", "v");
+ Transaction t1 = tm.suspend();
+
+ tm.begin();
+ try
+ {
+ cache.put(AB, "k", "v");
+ assert false : "Should fail lock acquisition";
+ }
+ catch (TimeoutException expected)
+ {
+
+ }
+ tm.commit();
+ tm.resume(t1);
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testRollbacks() throws Exception
+ {
+ cache.put(AB, "k", "v");
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ Transaction reader = tm.suspend();
+
+ tm.begin();
+ cache.put(AB, "k", "v2");
+ tm.rollback();
+
+ tm.resume(reader);
+ assert "v".equals(cache.get(AB, "k"));
+ tm.commit();
+
+ // even after commit
+ assert "v".equals(cache.get(AB, "k"));
+ assertNoLocks();
+ }
+
+ public void testWriteSkew() throws Exception
+ {
+ if (repeatableRead)
+ {
+ cache.put(AB, "k", "v");
+ final Set<Exception> w1exceptions = new HashSet<Exception>();
+ final Set<Exception> w2exceptions = new HashSet<Exception>();
+ final CountDownLatch w1Signal = new CountDownLatch(1);
+ final CountDownLatch w2Signal = new CountDownLatch(1);
+
+ Thread w1 = new Thread()
+ {
+ public void run()
+ {
+ try
+ {
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ w1Signal.await();
+ cache.put(AB, "k", "v2");
+ tm.commit();
+ }
+ catch (Exception e)
+ {
+ w1exceptions.add(e);
+ }
+ }
+ };
+
+ Thread w2 = new Thread()
+ {
+ public void run()
+ {
+ try
+ {
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ w2Signal.await();
+ cache.put(AB, "k", "v3");
+ tm.commit();
+ }
+ catch (Exception e)
+ {
+ w2exceptions.add(e);
+ }
+ }
+ };
+
+ w1.start();
+ w2.start();
+
+ // now. both txs have read.
+ // let tx1 start writing
+ w1Signal.countDown();
+ w1.join();
+
+ w2Signal.countDown();
+ w2.join();
+
+ if (allowWriteSkew)
+ {
+ assert "v3".equals(cache.get(AB, "k")) : "W2 should have overwritten W1's work!";
+ // should have no exceptions!!
+ assert w2exceptions.size() == 0;
+ assert w1exceptions.size() == 0;
+ }
+ else
+ {
+ assert "v2".equals(cache.get(AB, "k")) : "W2 should NOT have overwritten W1's work!";
+ // there should be a single exception from w2.
+ assert w2exceptions.size() == 1;
+ assert w1exceptions.size() == 0;
+ }
+
+ assertNoLocks();
+ }
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedLockTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedLockTest.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,14 @@
+package org.jboss.cache.api.mvcc.read_committed;
+
+import org.jboss.cache.api.mvcc.LockTestBase;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class ReadCommittedLockTest extends LockTestBase
+{
+ public ReadCommittedLockTest()
+ {
+ repeatableRead = false;
+ lockParentForInsertRemove = false;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedWithParentLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedWithParentLockTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/read_committed/ReadCommittedWithParentLockTest.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,14 @@
+package org.jboss.cache.api.mvcc.read_committed;
+
+import org.jboss.cache.api.mvcc.LockTestBase;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class ReadCommittedWithParentLockTest extends LockTestBase
+{
+ public ReadCommittedWithParentLockTest()
+ {
+ repeatableRead = false;
+ lockParentForInsertRemove = true;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewLockTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewLockTest.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.mvcc.repeatable_read;
+
+import org.jboss.cache.api.mvcc.LockTestBase;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class RepeatableReadNoWriteSkewLockTest extends LockTestBase
+{
+ public RepeatableReadNoWriteSkewLockTest()
+ {
+ repeatableRead = true;
+ allowWriteSkew = false;
+ lockParentForInsertRemove = false;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewWithParentLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewWithParentLockTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadNoWriteSkewWithParentLockTest.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.mvcc.repeatable_read;
+
+import org.jboss.cache.api.mvcc.LockTestBase;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class RepeatableReadNoWriteSkewWithParentLockTest extends LockTestBase
+{
+ public RepeatableReadNoWriteSkewWithParentLockTest()
+ {
+ repeatableRead = true;
+ allowWriteSkew = false;
+ lockParentForInsertRemove = true;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewLockTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewLockTest.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.mvcc.repeatable_read;
+
+import org.jboss.cache.api.mvcc.LockTestBase;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class RepeatableReadWriteSkewLockTest extends LockTestBase
+{
+ public RepeatableReadWriteSkewLockTest()
+ {
+ repeatableRead = true;
+ allowWriteSkew = true;
+ lockParentForInsertRemove = false;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewWithParentLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewWithParentLockTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/repeatable_read/RepeatableReadWriteSkewWithParentLockTest.java 2008-06-27 17:16:50 UTC (rev 6104)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.mvcc.repeatable_read;
+
+import org.jboss.cache.api.mvcc.LockTestBase;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class RepeatableReadWriteSkewWithParentLockTest extends LockTestBase
+{
+ public RepeatableReadWriteSkewWithParentLockTest()
+ {
+ repeatableRead = true;
+ allowWriteSkew = true;
+ lockParentForInsertRemove = true;
+ }
+}
16 years, 6 months
JBoss Cache SVN: r6103 - in core/trunk/src/test/java/org/jboss/cache: lock and 1 other directories.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 12:55:51 -0400 (Fri, 27 Jun 2008)
New Revision: 6103
Modified:
core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheAPIMVCCTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeAPIMVCCTest.java
core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerNoTxTest.java
core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerRecordingTest.java
core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerTest.java
core/trunk/src/test/java/org/jboss/cache/util/concurrent/locks/OwnableReentrantLockTest.java
Log:
MVCC tests
Modified: core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheAPIMVCCTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheAPIMVCCTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheAPIMVCCTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -8,7 +8,7 @@
/**
* MVCC version of {@link org.jboss.cache.api.CacheAPITest}
*/
-@Test(groups = "functional")
+@Test(groups = {"functional", "mvcc"})
public class CacheAPIMVCCTest extends CacheAPITest
{
@Override
Modified: core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockParentForChildInsertRemoveTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -2,7 +2,7 @@
import org.testng.annotations.Test;
-@Test(groups = "functional")
+@Test(groups = {"functional", "mvcc"})
public class LockParentForChildInsertRemoveTest extends LockTest
{
public LockParentForChildInsertRemoveTest()
Modified: core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/LockTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -7,6 +7,7 @@
import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
import org.jboss.cache.invocation.InvocationContextContainer;
+import org.jboss.cache.lock.IsolationLevel;
import org.jboss.cache.lock.LockManager;
import org.jboss.cache.lock.MVCCLockManager.LockContainer;
import org.jboss.cache.transaction.DummyTransactionManagerLookup;
@@ -15,6 +16,7 @@
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import java.util.Collections;
@@ -22,7 +24,7 @@
* @author Manik Surtani (<a href="mailto:manik@jboss.org">manik(a)jboss.org</a>)
* @since 3.0
*/
-@Test(groups = "functional")
+@Test(groups = {"functional", "mvcc"})
public class LockTest
{
Cache<String, String> cache;
@@ -30,10 +32,13 @@
Fqn A = Fqn.fromString("/a");
Fqn AB = Fqn.fromString("/a/b");
Fqn ABC = Fqn.fromString("/a/b/c");
+ Fqn ABCD = Fqn.fromString("/a/b/c/d");
LockManager lockManager;
InvocationContextContainer icc;
boolean lockParentForInsertRemove = false;
+ boolean repeatableRead = true;
+
@BeforeMethod
public void setUp()
{
@@ -41,6 +46,7 @@
cache.getConfiguration().setNodeLockingScheme(NodeLockingScheme.MVCC);
cache.getConfiguration().setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
cache.getConfiguration().setLockParentForChildInsertRemove(lockParentForInsertRemove);
+ cache.getConfiguration().setIsolationLevel(repeatableRead ? IsolationLevel.REPEATABLE_READ : IsolationLevel.READ_COMMITTED);
cache.start();
lockManager = TestingUtil.extractComponentRegistry(cache).getComponent(LockManager.class);
icc = TestingUtil.extractComponentRegistry(cache).getComponent(InvocationContextContainer.class);
@@ -151,8 +157,264 @@
assertNoLocks();
}
- // TODO: Test other major API methods - remove, etc.
- // TODO: Test that writes don't block reads.
+ public void testLocksOnRemoveNode() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, Collections.singletonMap("k", "v"));
+
+ assert "v".equals(cache.get(AB, "k"));
+
+ tm.begin();
+ cache.removeNode(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnEvictNode() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, Collections.singletonMap("k", "v"));
+
+ assert "v".equals(cache.get(AB, "k"));
+
+ tm.begin();
+ cache.evict(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnEvictRecursiveNode() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, Collections.singletonMap("k", "v"));
+ cache.put(ABC, Collections.singletonMap("k", "v"));
+ cache.put(ABCD, Collections.singletonMap("k", "v"));
+
+ assert "v".equals(cache.get(AB, "k"));
+ assert "v".equals(cache.get(ABC, "k"));
+ assert "v".equals(cache.get(ABCD, "k"));
+
+ tm.begin();
+ cache.evict(AB, true);
+ assertLocked(AB);
+ assertLocked(ABC);
+ assertLocked(ABCD);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveNonexistentNode() throws Exception
+ {
+ assert cache.getNode(AB) == null : "Should not exist";
+
+ tm.begin();
+ cache.removeNode(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnEvictNonexistentNode() throws Exception
+ {
+ assert cache.getNode(AB) == null : "Should not exist";
+
+ tm.begin();
+ cache.evict(AB);
+ assertLocked(AB);
+ if (lockParentForInsertRemove)
+ assertLocked(A);
+ else
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveData() throws Exception
+ {
+ // init some data on a node
+ cache.put(AB, "k", "v");
+ cache.put(AB, "k2", "v2");
+
+ assert "v".equals(cache.get(AB, "k"));
+ assert "v2".equals(cache.get(AB, "k2"));
+
+ // remove
+ tm.begin();
+ Object x = cache.remove(AB, "k");
+ assert x.equals("v");
+ assertLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.get(AB, "k") == null : "Should not exist";
+ assert "v2".equals(cache.get(AB, "k2"));
+ assertNoLocks();
+
+ // clearData
+ tm.begin();
+ cache.clearData(AB);
+ assertLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+
+ assert cache.get(AB, "k") == null : "Should not exist";
+ assert cache.get(AB, "k2") == null : "Should not exist";
+ assertNoLocks();
+
+ // nonexistent key
+ assert cache.get(AB, "k3") == null : "Should not exist";
+ tm.begin();
+ cache.remove(AB, "k3");
+ assertLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testLocksOnRemoveDataNonExistentNode() throws Exception
+ {
+ assert cache.getNode(AB) == null : "Should not exist";
+
+ tm.begin();
+ cache.remove(AB, "k");
+ assertNotLocked(AB);
+ assertNotLocked(A);
+ assertNotLocked(Fqn.ROOT);
+ tm.commit();
+ assert cache.getNode(AB) == null : "Should not exist";
+ }
+
+ public void testReadMethods() throws Exception
+ {
+ cache.put(AB, "k", "v");
+
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.getData(AB).containsKey("k");
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.getKeys(AB).contains("k");
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert cache.getNode(AB) != null;
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+
+ tm.begin();
+ assert !(cache.getNode(A).getChildrenNames().isEmpty());
+ assertNoLocks();
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testWriteDoesntBlockRead() throws Exception
+ {
+ cache.put(AB, "k", "v");
+
+ // start a write.
+ tm.begin();
+ cache.put(AB, "k2", "v2");
+ assertLocked(AB);
+ Transaction write = tm.suspend();
+
+ // now start a read and confirm that the write doesn't block it.
+ tm.begin();
+ assert "v".equals(cache.get(AB, "k"));
+ assert null == cache.get(AB, "k2") : "Should not see uncommitted changes";
+ Transaction read = tm.suspend();
+
+ // commit the write
+ tm.resume(write);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.resume(read);
+ if (repeatableRead)
+ assert null == cache.get(AB, "k2") : "Should have repeatable read";
+ else
+ assert "v2".equals(cache.get(AB, "k2")) : "Read committed should see committed changes";
+ tm.commit();
+ assertNoLocks();
+ }
+
+ public void testWriteDoesntBlockReadNonexistent() throws Exception
+ {
+ // start a write.
+ tm.begin();
+ cache.put(AB, "k", "v");
+ assertLocked(AB);
+ Transaction write = tm.suspend();
+
+ // now start a read and confirm that the write doesn't block it.
+ tm.begin();
+ assert null == cache.get(AB, "k") : "Should not see uncommitted changes";
+ assert null == cache.getNode(AB);
+ Transaction read = tm.suspend();
+
+ // commit the write
+ tm.resume(write);
+ tm.commit();
+
+ assertNoLocks();
+
+ tm.resume(read);
+ if (repeatableRead)
+ {
+ assert null == cache.get(AB, "k") : "Should have repeatable read";
+ assert null == cache.getNode(AB);
+ }
+ else
+ {
+ assert "v".equals(cache.get(AB, "k")) : "Read committed should see committed changes";
+ assert null != cache.getNode(AB);
+ }
+ tm.commit();
+ assertNoLocks();
+ }
+
// TODO: Test write conflicts - with and without allowing write skew. Multiple cases involving concurrent removes, concurrent put + remove, etc.
// TODO: Test Replication with MVCC
// TODO: Test state transfer with MVCC
Modified: core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeAPIMVCCTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeAPIMVCCTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeAPIMVCCTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -11,7 +11,7 @@
/**
* An MVCC version of {@link org.jboss.cache.api.NodeAPITest}
*/
-@Test(groups = "functional")
+@Test(groups = {"functional", "mvcc"})
public class NodeAPIMVCCTest extends NodeAPITest
{
protected NodeLockingScheme getNodeLockingScheme()
Modified: core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerNoTxTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerNoTxTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerNoTxTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -4,7 +4,7 @@
import javax.transaction.TransactionManager;
-@Test(groups = "unit")
+@Test(groups = {"unit", "mvcc"})
public class MVCCLockManagerNoTxTest extends MVCCLockManagerTest
{
@Override
Modified: core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerRecordingTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerRecordingTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerRecordingTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -17,7 +17,7 @@
* @author Manik Surtani (<a href="mailto:manik@jboss.org">manik(a)jboss.org</a>)
* @since 3.0
*/
-@Test(groups = "unit")
+@Test(groups = {"unit", "mvcc"})
public class MVCCLockManagerRecordingTest extends AbstractLockManagerRecordingTest
{
@BeforeMethod
Modified: core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/lock/MVCCLockManagerTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -15,7 +15,7 @@
import javax.transaction.TransactionManager;
-@Test(groups = "unit")
+@Test(groups = {"unit", "mvcc"})
public class MVCCLockManagerTest
{
MVCCLockManager lm;
Modified: core/trunk/src/test/java/org/jboss/cache/util/concurrent/locks/OwnableReentrantLockTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/util/concurrent/locks/OwnableReentrantLockTest.java 2008-06-27 16:55:10 UTC (rev 6102)
+++ core/trunk/src/test/java/org/jboss/cache/util/concurrent/locks/OwnableReentrantLockTest.java 2008-06-27 16:55:51 UTC (rev 6103)
@@ -13,7 +13,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
-@Test(groups = "unit")
+@Test(groups = {"unit", "mvcc"})
public class OwnableReentrantLockTest
{
private InvocationContextContainer getInvocationContextContainer()
16 years, 6 months
JBoss Cache SVN: r6102 - in core/trunk/src/test/java/org/jboss/cache/api: mvcc and 3 other directories.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 12:55:10 -0400 (Fri, 27 Jun 2008)
New Revision: 6102
Added:
core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheSPIMVCCTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/DeletedChildResurrectionMvccTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeMoveMvccTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeReplicatedMoveMvccTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplMvccTest.java
core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplTxMvccTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedMvccNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalMvccNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedMvccNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationAsyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationSyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplAsyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplSyncTest.java
Removed:
core/trunk/src/test/java/org/jboss/cache/api/CacheAPIOptimisticTest.java
core/trunk/src/test/java/org/jboss/cache/api/NodeAPIOptimisticTest.java
core/trunk/src/test/java/org/jboss/cache/api/NodeMoveOptimisticTest.java
core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveOptimisticTest.java
Modified:
core/trunk/src/test/java/org/jboss/cache/api/NodeMoveAPITest.java
core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedOptNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedPessNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalOptNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalPessNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/NodeValidityTestBase.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedOptNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedPessNodeValidityTest.java
core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeMoveOptimisticTest.java
core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeReplicatedMoveOptimisticTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationAsyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationSyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplAsyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplSyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationAsyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationSyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplAsyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplSyncTest.java
core/trunk/src/test/java/org/jboss/cache/api/pfer/PutForExternalReadTestBase.java
Log:
Improved tests
Deleted: core/trunk/src/test/java/org/jboss/cache/api/CacheAPIOptimisticTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/CacheAPIOptimisticTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/CacheAPIOptimisticTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,19 +0,0 @@
-package org.jboss.cache.api;
-
-import org.jboss.cache.config.Configuration.NodeLockingScheme;
-import org.testng.annotations.Test;
-
-
-/**
- * Optimistically locked version of {@link org.jboss.cache.api.CacheAPITest}
- */
-@Test(groups = {"functional", "optimistic"})
-public class CacheAPIOptimisticTest extends CacheAPITest
-{
- @Override
- protected NodeLockingScheme getNodeLockingScheme()
- {
- return NodeLockingScheme.OPTIMISTIC;
- }
-
-}
Deleted: core/trunk/src/test/java/org/jboss/cache/api/NodeAPIOptimisticTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/NodeAPIOptimisticTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/NodeAPIOptimisticTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,33 +0,0 @@
-package org.jboss.cache.api;
-
-import org.jboss.cache.config.Configuration.NodeLockingScheme;
-import org.jboss.cache.interceptors.OptimisticNodeInterceptor;
-import org.jboss.cache.interceptors.PessimisticLockInterceptor;
-import org.jboss.cache.interceptors.base.CommandInterceptor;
-import org.testng.annotations.Test;
-
-/**
- * An optimistic version of {@link org.jboss.cache.api.NodeAPITest}
- */
-@Test(groups = {"functional", "optimistic"})
-public class NodeAPIOptimisticTest extends NodeAPITest
-{
- protected NodeLockingScheme getNodeLockingScheme()
- {
- return NodeLockingScheme.OPTIMISTIC;
- }
-
- protected void assertNodeLockingScheme()
- {
- assert cache.getConfiguration().getNodeLockingScheme() == NodeLockingScheme.OPTIMISTIC;
- boolean interceptorChainOK = false;
-
- for (CommandInterceptor i : cache.getInterceptorChain())
- {
- if (i instanceof PessimisticLockInterceptor) assert false : "Not an optimistic locking chain!!";
- if (i instanceof OptimisticNodeInterceptor) interceptorChainOK = true;
- }
-
- assert interceptorChainOK : "Not an optimistic locking chain!!";
- }
-}
Modified: core/trunk/src/test/java/org/jboss/cache/api/NodeMoveAPITest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/NodeMoveAPITest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/NodeMoveAPITest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -8,7 +8,7 @@
import org.jboss.cache.Node;
import org.jboss.cache.NodeNotExistsException;
import org.jboss.cache.config.CacheLoaderConfig;
-import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.config.parsing.XmlConfigHelper;
import org.jboss.cache.config.parsing.element.LoadersElementParser;
import org.jboss.cache.loader.DummyInMemoryCacheLoader;
@@ -41,14 +41,14 @@
protected static final Fqn<String> A = Fqn.fromString("/a"), B = Fqn.fromString("/b"), C = Fqn.fromString("/c"), D = Fqn.fromString("/d"), E = Fqn.fromString("/e");
protected Object k = "key", vA = "valueA", vB = "valueB", vC = "valueC", vD = "valueD", vE = "valueE";
- protected boolean optimistic = false;
+ protected NodeLockingScheme nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception
{
// start a single cache instance
- cache = (CacheSPI<Object, Object>) new DefaultCacheFactory().createCache("META-INF/conf-test/local-tx-service.xml", false);
- cache.getConfiguration().setNodeLockingScheme(optimistic ? Configuration.NodeLockingScheme.OPTIMISTIC : Configuration.NodeLockingScheme.PESSIMISTIC);
+ cache = (CacheSPI<Object, Object>) new DefaultCacheFactory<Object, Object>().createCache("META-INF/conf-test/local-tx-service.xml", false);
+ cache.getConfiguration().setNodeLockingScheme(nodeLockingScheme);
cache.start();
rootNode = cache.getRoot();
tm = cache.getTransactionManager();
@@ -239,7 +239,7 @@
cache.move(nodeB.getFqn(), Fqn.ROOT);
// need to think of a way to test the same with optimistically locked nodes
- if (!optimistic)
+ if (!isOptimistic())
{
assertEquals(rootNode, nodeA.getParent());
assertEquals(rootNode, nodeB.getParent());
@@ -405,8 +405,8 @@
@Test(groups = {"functional"})
public void testConcurrency() throws InterruptedException
{
- // FIXME: investigate intermittent failure when in optimistic mode.
- if (optimistic) return;
+ // FIXME: investigate intermittent failure when in isOptimistic() mode.
+ if (isOptimistic()) return;
final int N = 3;// number of threads
final int loops = 1 << 6;// number of loops
@@ -549,4 +549,9 @@
LoadersElementParser elementParser = new LoadersElementParser();
return elementParser.parseLoadersElement(element);
}
+
+ protected boolean isOptimistic()
+ {
+ return nodeLockingScheme == NodeLockingScheme.OPTIMISTIC;
+ }
}
Deleted: core/trunk/src/test/java/org/jboss/cache/api/NodeMoveOptimisticTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/NodeMoveOptimisticTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/NodeMoveOptimisticTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,42 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.api;
-
-import org.testng.annotations.Test;
-
-@Test(groups = {"functional", "optimistic"})
-public class NodeMoveOptimisticTest extends NodeMoveAPITest
-{
- public NodeMoveOptimisticTest()
- {
- optimistic = true;
- }
-
- public void testLocks()
- {
- // no op
- }
-
- public void testLocksDeepMove()
- {
- // no op
- }
-
- @Override
- @Test(groups = {"functional"})
- public void testWithCacheloaders() throws Exception
- {
- super.testWithCacheloaders(); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- @Override
- @Test(groups = {"functional"})
- public void testWithPassivation() throws Exception
- {
- super.testWithPassivation(); //To change body of overridden methods use File | Settings | File Templates.
- }
-}
Deleted: core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveOptimisticTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveOptimisticTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveOptimisticTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,18 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.jboss.cache.api;
-
-import org.testng.annotations.Test;
-
-@Test(groups = {"functional", "optimistic"})
-public class NodeReplicatedMoveOptimisticTest extends NodeReplicatedMoveTest
-{
- public NodeReplicatedMoveOptimisticTest()
- {
- optimistic = true;
- }
-}
Modified: core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/NodeReplicatedMoveTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -15,6 +15,7 @@
import org.jboss.cache.NodeSPI;
import org.jboss.cache.config.Configuration;
import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
@@ -34,7 +35,7 @@
protected static final Fqn<String> A = Fqn.fromString("/a"), B = Fqn.fromString("/b"), C = Fqn.fromString("/c"), D = Fqn.fromString("/d"), E = Fqn.fromString("/e");
protected Object k = "key", vA = "valueA", vB = "valueB", vC = "valueC", vD = "valueD", vE = "valueE";
- protected boolean optimistic = false;
+ protected NodeLockingScheme nodeLockingScheme;
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception
@@ -43,7 +44,7 @@
cache1 = (CacheSPI<Object, Object>) new DefaultCacheFactory().createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), false);
cache1.getConfiguration().setSyncCommitPhase(true);
cache1.getConfiguration().setSyncRollbackPhase(true);
- cache1.getConfiguration().setNodeLockingScheme(optimistic ? Configuration.NodeLockingScheme.OPTIMISTIC : Configuration.NodeLockingScheme.PESSIMISTIC);
+ cache1.getConfiguration().setNodeLockingScheme(nodeLockingScheme);
cache1.start();
rootNode = cache1.getRoot();
tm = cache1.getTransactionManager();
@@ -52,7 +53,7 @@
cache2 = (CacheSPI<Object, Object>) new DefaultCacheFactory().createCache(UnitTestCacheConfigurationFactory.createConfiguration(CacheMode.REPL_SYNC), false);
cache2.getConfiguration().setSyncCommitPhase(true);
cache2.getConfiguration().setSyncRollbackPhase(true);
- cache2.getConfiguration().setNodeLockingScheme(optimistic ? Configuration.NodeLockingScheme.OPTIMISTIC : Configuration.NodeLockingScheme.PESSIMISTIC);
+ cache2.getConfiguration().setNodeLockingScheme(nodeLockingScheme);
cache2.start();
}
@@ -94,7 +95,7 @@
cache2.stop();
cache1.destroy();
cache2.destroy();
- if (optimistic)
+ if (isOptimistic())
{
cache1.getConfiguration().setNodeLockingScheme(Configuration.NodeLockingScheme.OPTIMISTIC);
cache2.getConfiguration().setNodeLockingScheme(Configuration.NodeLockingScheme.OPTIMISTIC);
@@ -113,8 +114,8 @@
assertEquals(vA, cache1.getRoot().getChild(A).get(k));
assertEquals(vB, cache1.getRoot().getChild(A).getChild(B).get(k));
- assertInvalidated(cache2, A, "Should be invalidated", optimistic);
- assertInvalidated(cache2, Fqn.fromRelativeElements(A, B.getLastElement()), "Should be invalidated", optimistic);
+ assertInvalidated(cache2, A, "Should be invalidated");
+ assertInvalidated(cache2, Fqn.fromRelativeElements(A, B.getLastElement()), "Should be invalidated");
// now move...
cache1.move(nodeB.getFqn(), Fqn.ROOT);
@@ -122,8 +123,8 @@
assertEquals(vA, cache1.getRoot().getChild(A).get(k));
assertEquals(vB, cache1.getRoot().getChild(B).get(k));
- assertInvalidated(cache2, A, "Should be invalidated", optimistic);
- assertInvalidated(cache2, B, "Should be invalidated", optimistic);
+ assertInvalidated(cache2, A, "Should be invalidated");
+ assertInvalidated(cache2, B, "Should be invalidated");
// now make sure a node exists on cache 2
cache2.getRoot().addChild(A).put("k2", "v2");
@@ -132,20 +133,20 @@
try
{
cache1.move(B, A);// should throw an NPE
- if (!optimistic) assert false : "Should throw an exception!";
+ if (!isOptimistic()) assert false : "Should throw an exception!";
}
catch (NodeNotExistsException expected)
{
- if (optimistic) assert false : "Should not have thrown an exception!";
+ if (isOptimistic()) assert false : "Should not have thrown an exception!";
}
}
- private void assertInvalidated(Cache cache, Fqn fqn, String msg, boolean optimistic)
+ private void assertInvalidated(Cache cache, Fqn fqn, String msg)
{
assert cache.getRoot().getChild(fqn) == null : msg;
NodeSPI n = ((CacheSPI) cache).peek(fqn, true, true);
- assert n == null || optimistic : msg;
- assert !optimistic || !n.isValid() : msg;
+ assert n == null || isOptimistic() : msg;
+ assert !isOptimistic() || !n.isValid() : msg;
}
public void testReplTxCommit() throws Exception
@@ -206,4 +207,9 @@
assertEquals(vA, cache2.getRoot().getChild(A).get(k));
assertEquals(vB, cache2.getRoot().getChild(A).getChild(B).get(k));
}
+
+ protected boolean isOptimistic()
+ {
+ return nodeLockingScheme == NodeLockingScheme.OPTIMISTIC;
+ }
}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheSPIMVCCTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheSPIMVCCTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/CacheSPIMVCCTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,14 @@
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.api.CacheSPITest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class CacheSPIMVCCTest extends CacheSPITest
+{
+ public CacheSPIMVCCTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/DeletedChildResurrectionMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/DeletedChildResurrectionMvccTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/DeletedChildResurrectionMvccTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,14 @@
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.api.DeletedChildResurrectionTest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class DeletedChildResurrectionMvccTest extends DeletedChildResurrectionTest
+{
+ public DeletedChildResurrectionMvccTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeMoveMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeMoveMvccTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeMoveMvccTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,20 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.api.NodeMoveAPITest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class NodeMoveMvccTest extends NodeMoveAPITest
+{
+ public NodeMoveMvccTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeReplicatedMoveMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeReplicatedMoveMvccTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/NodeReplicatedMoveMvccTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,20 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.api.NodeReplicatedMoveTest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class NodeReplicatedMoveMvccTest extends NodeReplicatedMoveTest
+{
+ public NodeReplicatedMoveMvccTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplMvccTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplMvccTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,14 @@
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.api.SyncReplTest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "jgroups", "mvcc"})
+public class SyncReplMvccTest extends SyncReplTest
+{
+ public SyncReplMvccTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplTxMvccTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplTxMvccTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/mvcc/SyncReplTxMvccTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,14 @@
+package org.jboss.cache.api.mvcc;
+
+import org.jboss.cache.api.SyncReplTxTest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "jgroups", "transaction", "mvcc"})
+public class SyncReplTxMvccTest extends SyncReplTxTest
+{
+ public SyncReplTxMvccTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedMvccNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedMvccNodeValidityTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedMvccNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,13 @@
+package org.jboss.cache.api.nodevalidity;
+
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class InvalidatedMvccNodeValidityTest extends InvalidatedOptNodeValidityTest
+{
+ public InvalidatedMvccNodeValidityTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedOptNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedOptNodeValidityTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedOptNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -2,6 +2,7 @@
import org.jboss.cache.CacheSPI;
import org.jboss.cache.NodeSPI;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.optimistic.DefaultDataVersion;
import org.testng.annotations.Test;
@@ -14,7 +15,7 @@
{
public InvalidatedOptNodeValidityTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
}
public void testTombstoneRevival()
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedPessNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedPessNodeValidityTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/InvalidatedPessNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -6,6 +6,7 @@
import org.jboss.cache.DefaultCacheFactory;
import org.jboss.cache.config.CacheLoaderConfig;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.loader.DummyInMemoryCacheLoader;
import org.jboss.cache.loader.DummySharedInMemoryCacheLoader;
import org.testng.annotations.AfterMethod;
@@ -23,6 +24,7 @@
public InvalidatedPessNodeValidityTest()
{
invalidation = true;
+ nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
}
protected Cache<String, String> createObserver()
@@ -43,10 +45,10 @@
protected Cache<String, String> newCache()
{
- CacheFactory<String, String> f = new DefaultCacheFactory();
+ CacheFactory<String, String> f = new DefaultCacheFactory<String, String>();
Cache<String, String> cache = f.createCache(false);
cache.getConfiguration().setCacheMode(Configuration.CacheMode.INVALIDATION_SYNC);
- optimisticConfiguration(cache.getConfiguration());
+ nodeLockingSchemeSpecificSetup(cache.getConfiguration());
// need a cache loader as a shared data source between the 2 instances
CacheLoaderConfig.IndividualCacheLoaderConfig iclc = new CacheLoaderConfig.IndividualCacheLoaderConfig();
Added: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalMvccNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalMvccNodeValidityTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalMvccNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,13 @@
+package org.jboss.cache.api.nodevalidity;
+
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class LocalMvccNodeValidityTest extends LocalPessNodeValidityTest
+{
+ public LocalMvccNodeValidityTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalOptNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalOptNodeValidityTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalOptNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,5 +1,6 @@
package org.jboss.cache.api.nodevalidity;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
/**
@@ -11,6 +12,6 @@
{
public LocalOptNodeValidityTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
}
}
\ No newline at end of file
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalPessNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalPessNodeValidityTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/LocalPessNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -3,6 +3,7 @@
import org.jboss.cache.Cache;
import org.jboss.cache.CacheFactory;
import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.util.TestingUtil;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
@@ -19,6 +20,7 @@
public LocalPessNodeValidityTest()
{
clustered = false;
+ nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
}
@AfterMethod
@@ -38,9 +40,9 @@
{
if (cache == null)
{
- CacheFactory<String, String> f = new DefaultCacheFactory();
+ CacheFactory<String, String> f = new DefaultCacheFactory<String, String>();
cache = f.createCache(false);
- optimisticConfiguration(cache.getConfiguration());
+ nodeLockingSchemeSpecificSetup(cache.getConfiguration());
cache.start();
return cache;
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/NodeValidityTestBase.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/NodeValidityTestBase.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/NodeValidityTestBase.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,9 +7,10 @@
import org.jboss.cache.NodeNotValidException;
import org.jboss.cache.NodeSPI;
import org.jboss.cache.config.Configuration;
-import org.jboss.cache.util.TestingUtil;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.optimistic.DefaultDataVersion;
import org.jboss.cache.transaction.DummyTransactionManagerLookup;
+import org.jboss.cache.util.TestingUtil;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@@ -25,7 +26,7 @@
@Test(groups = {"functional"})
public abstract class NodeValidityTestBase
{
- protected boolean optimistic;
+ protected NodeLockingScheme nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
// needed to attach a blockUntilViewsReceived in setup
protected boolean clustered = true;
@@ -43,17 +44,22 @@
protected abstract Cache<String, String> createModifier();
- protected void optimisticConfiguration(Configuration c)
+ protected void nodeLockingSchemeSpecificSetup(Configuration c)
{
- if (optimistic)
+ c.setNodeLockingScheme(nodeLockingScheme);
+ if (isOptimistic())
{
- c.setNodeLockingScheme(Configuration.NodeLockingScheme.OPTIMISTIC);
c.setTransactionManagerLookupClass(DummyTransactionManagerLookup.class.getName());
c.setSyncCommitPhase(true);
c.setSyncRollbackPhase(true);
}
}
+ protected boolean isOptimistic()
+ {
+ return nodeLockingScheme == NodeLockingScheme.OPTIMISTIC;
+ }
+
@BeforeMethod
public void setUp()
{
@@ -122,7 +128,7 @@
// the old node is only marked as invalid if we use opt locking
// with pess locking we directly move the node reference so the old ref is still valid, EVEN if the move happens
// remotely.
- if (optimistic) assert !obsNode.isValid() : "Should no longer be valid";
+ if (isOptimistic()) assert !obsNode.isValid() : "Should no longer be valid";
assert observer.getRoot().getChild(newParent).isValid() : "Should be valid";
}
@@ -148,7 +154,7 @@
// the old node is only marked as invalid if we use opt locking
// with pess locking we directly move the node reference so the old ref is still valid.
- if (optimistic)
+ if (isOptimistic())
{
assert !obsParentNode.isValid() : "Should no longer be valid";
assert !obsChildNode.isValid() : "Should no longer be valid";
@@ -296,7 +302,7 @@
modifier.put(parent, K, V);
modifier.removeNode(parent);
- if (optimistic && invalidation)
+ if (isOptimistic() && invalidation)
{
// if we are using optimistic invalidation then we should see tombstones. NOT otherwise.
NodeSPI modifierTombstone = modifierImpl.peek(parent, true, true);
@@ -328,7 +334,7 @@
modifier.put(child, K, V);
modifier.removeNode(parent);
- if (optimistic && invalidation)
+ if (isOptimistic() && invalidation)
{
// if we are using optimistic invalidation then we should see tombstones. NOT otherwise.
NodeSPI modifierParentTombstone = modifierImpl.peek(parent, true, true);
Added: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedMvccNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedMvccNodeValidityTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedMvccNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,13 @@
+package org.jboss.cache.api.nodevalidity;
+
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class ReplicatedMvccNodeValidityTest extends ReplicatedPessNodeValidityTest
+{
+ public ReplicatedMvccNodeValidityTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ }
+}
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedOptNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedOptNodeValidityTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedOptNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,5 +1,6 @@
package org.jboss.cache.api.nodevalidity;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
/**
@@ -11,6 +12,6 @@
{
public ReplicatedOptNodeValidityTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
}
}
\ No newline at end of file
Modified: core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedPessNodeValidityTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedPessNodeValidityTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/nodevalidity/ReplicatedPessNodeValidityTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -28,7 +28,7 @@
CacheFactory<String, String> f = new DefaultCacheFactory();
Cache<String, String> cache = f.createCache(false);
cache.getConfiguration().setCacheMode(Configuration.CacheMode.REPL_SYNC);
- optimisticConfiguration(cache.getConfiguration());
+ nodeLockingSchemeSpecificSetup(cache.getConfiguration());
cache.start();
return cache;
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeMoveOptimisticTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeMoveOptimisticTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeMoveOptimisticTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,6 +7,7 @@
package org.jboss.cache.api.optimistic;
import org.jboss.cache.api.NodeMoveAPITest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
@Test(groups = {"functional", "optimistic"})
@@ -14,7 +15,7 @@
{
public NodeMoveOptimisticTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
}
public void testLocks()
@@ -26,18 +27,4 @@
{
// no op
}
-
- @Override
- @Test(groups = {"functional"})
- public void testWithCacheloaders() throws Exception
- {
- super.testWithCacheloaders(); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- @Override
- @Test(groups = {"functional"})
- public void testWithPassivation() throws Exception
- {
- super.testWithPassivation(); //To change body of overridden methods use File | Settings | File Templates.
- }
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeReplicatedMoveOptimisticTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeReplicatedMoveOptimisticTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/optimistic/NodeReplicatedMoveOptimisticTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,6 +7,7 @@
package org.jboss.cache.api.optimistic;
import org.jboss.cache.api.NodeReplicatedMoveTest;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
@Test(groups = {"functional", "optimistic"})
@@ -14,6 +15,6 @@
{
public NodeReplicatedMoveOptimisticTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
}
}
Added: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationAsyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationAsyncTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationAsyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.pfer;
+
+import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class PFERMvccInvalidationAsyncTest extends PutForExternalReadTestBase
+{
+ public PFERMvccInvalidationAsyncTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ cacheMode = Configuration.CacheMode.INVALIDATION_ASYNC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationSyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationSyncTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccInvalidationSyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.pfer;
+
+import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class PFERMvccInvalidationSyncTest extends PutForExternalReadTestBase
+{
+ public PFERMvccInvalidationSyncTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ cacheMode = Configuration.CacheMode.INVALIDATION_SYNC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplAsyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplAsyncTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplAsyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.pfer;
+
+import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class PFERMvccReplAsyncTest extends PutForExternalReadTestBase
+{
+ public PFERMvccReplAsyncTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ cacheMode = Configuration.CacheMode.REPL_ASYNC;
+ }
+}
Added: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplSyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplSyncTest.java (rev 0)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERMvccReplSyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -0,0 +1,15 @@
+package org.jboss.cache.api.pfer;
+
+import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
+import org.testng.annotations.Test;
+
+@Test(groups = {"functional", "mvcc"})
+public class PFERMvccReplSyncTest extends PutForExternalReadTestBase
+{
+ public PFERMvccReplSyncTest()
+ {
+ nodeLockingScheme = NodeLockingScheme.MVCC;
+ cacheMode = Configuration.CacheMode.REPL_SYNC;
+ }
+}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationAsyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationAsyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationAsyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,6 +7,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
/**
@@ -20,7 +21,7 @@
{
public PFEROptimisticInvalidationAsyncTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
cacheMode = Configuration.CacheMode.INVALIDATION_ASYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationSyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationSyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticInvalidationSyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,6 +7,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
/**
@@ -20,7 +21,7 @@
{
public PFEROptimisticInvalidationSyncTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
cacheMode = Configuration.CacheMode.INVALIDATION_SYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplAsyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplAsyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplAsyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,6 +1,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
@Test(groups = {"functional", "optimistic"})
@@ -8,7 +9,7 @@
{
public PFEROptimisticReplAsyncTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
cacheMode = Configuration.CacheMode.REPL_ASYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplSyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplSyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFEROptimisticReplSyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,6 +1,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
@Test(groups = {"functional", "optimistic"})
@@ -8,7 +9,7 @@
{
public PFEROptimisticReplSyncTest()
{
- optimistic = true;
+ nodeLockingScheme = NodeLockingScheme.OPTIMISTIC;
cacheMode = Configuration.CacheMode.REPL_SYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationAsyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationAsyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationAsyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,6 +7,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
/**
@@ -20,7 +21,7 @@
{
public PFERPessimisticInvalidationAsyncTest()
{
- optimistic = false;
+ nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
cacheMode = Configuration.CacheMode.INVALIDATION_ASYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationSyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationSyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticInvalidationSyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -7,6 +7,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
/**
@@ -20,7 +21,7 @@
{
public PFERPessimisticInvalidationSyncTest()
{
- optimistic = false;
+ nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
cacheMode = Configuration.CacheMode.INVALIDATION_SYNC;
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplAsyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplAsyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplAsyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,6 +1,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
@Test(groups = {"functional", "pessimistic"})
@@ -8,7 +9,7 @@
{
public PFERPessimisticReplAsyncTest()
{
- optimistic = false;
+ nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
cacheMode = Configuration.CacheMode.REPL_ASYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplSyncTest.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplSyncTest.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PFERPessimisticReplSyncTest.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -1,6 +1,7 @@
package org.jboss.cache.api.pfer;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.testng.annotations.Test;
@Test(groups = {"functional", "pessimistic"})
@@ -8,7 +9,7 @@
{
public PFERPessimisticReplSyncTest()
{
- optimistic = false;
+ nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
cacheMode = Configuration.CacheMode.REPL_SYNC;
}
}
Modified: core/trunk/src/test/java/org/jboss/cache/api/pfer/PutForExternalReadTestBase.java
===================================================================
--- core/trunk/src/test/java/org/jboss/cache/api/pfer/PutForExternalReadTestBase.java 2008-06-27 16:01:12 UTC (rev 6101)
+++ core/trunk/src/test/java/org/jboss/cache/api/pfer/PutForExternalReadTestBase.java 2008-06-27 16:55:10 UTC (rev 6102)
@@ -11,7 +11,7 @@
import org.jboss.cache.RPCManager;
import org.jboss.cache.commands.ReplicableCommand;
import org.jboss.cache.config.Configuration;
-import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.config.Configuration.NodeLockingScheme;
import org.jboss.cache.factories.ComponentRegistry;
import org.jboss.cache.factories.UnitTestCacheConfigurationFactory;
import org.jboss.cache.lock.NodeLock;
@@ -35,6 +35,8 @@
@Test(groups = {"functional", "jgroups", "transaction"})
public abstract class PutForExternalReadTestBase
{
+ // TODO: Refactor this test so it isn't bound to using Thread.sleep() calls.
+
protected CacheSPI<String, String> cache1, cache2;
ReplicationListener replListener1;
@@ -48,24 +50,25 @@
protected String key = "k", value = "v", value2 = "v2";
- protected boolean useTx, optimistic;
+ protected boolean useTx;
protected Configuration.CacheMode cacheMode;
+ protected NodeLockingScheme nodeLockingScheme;
@BeforeMethod(alwaysRun = true)
public void setUp()
{
- CacheFactory<String, String> cf = new DefaultCacheFactory();
+ CacheFactory<String, String> cf = new DefaultCacheFactory<String, String>();
cache1 = (CacheSPI<String, String>) cf.createCache(UnitTestCacheConfigurationFactory.createConfiguration(cacheMode), false);
cache1.getConfiguration().setTransactionManagerLookupClass("org.jboss.cache.transaction.DummyTransactionManagerLookup");
- cache1.getConfiguration().setNodeLockingScheme(optimistic ? Configuration.NodeLockingScheme.OPTIMISTIC : Configuration.NodeLockingScheme.PESSIMISTIC);
+ cache1.getConfiguration().setNodeLockingScheme(nodeLockingScheme);
cache1.start();
tm1 = cache1.getConfiguration().getRuntimeConfig().getTransactionManager();
cache2 = (CacheSPI<String, String>) cf.createCache(UnitTestCacheConfigurationFactory.createConfiguration(cacheMode), false);
cache2.getConfiguration().setTransactionManagerLookupClass("org.jboss.cache.transaction.DummyTransactionManagerLookup");
- cache2.getConfiguration().setNodeLockingScheme(optimistic ? Configuration.NodeLockingScheme.OPTIMISTIC : Configuration.NodeLockingScheme.PESSIMISTIC);
+ cache2.getConfiguration().setNodeLockingScheme(nodeLockingScheme);
cache2.start();
tm2 = cache2.getConfiguration().getRuntimeConfig().getTransactionManager();
@@ -93,7 +96,7 @@
NodeSPI parentNode = null;
TransactionWorkspace workspace = null;
- if (optimistic)
+ if (isOptimistic())
workspace = extractTransactionWorkspace(cache1);
else
parentNode = (NodeSPI<String, String>) cache1.getRoot().getChild(parentFqn);
@@ -122,9 +125,9 @@
else
assertEquals("Parent node write should have replicated", value2, cache2.get(parentFqn, key));
- if (!optimistic)
+ if (!isOptimistic())
{
- // doesn't apply with optimistic locking since both gtx2EntryMap will succeed here.
+ // doesn't apply with isOptimistic() locking since both gtx2EntryMap will succeed here.
assertNull("PFER should have been a no-op", cache1.get(fqn, key));
assertNull("PFER should have been a no-op", cache2.get(fqn, key));
}
@@ -178,7 +181,7 @@
cr.registerComponent(rpcManager, RPCManager.class);
cr.rewire();
- // invalidations will not trigger any rpc call sfor PFER
+ // invalidations will not trigger any rpc calls for PFER
if (!isUsingInvalidation())
{
// specify what we expect called on the mock Rpc Manager. For params we don't care about, just use ANYTHING.
@@ -207,7 +210,7 @@
cache1.get(parentFqn, key);
NodeSPI parentNode = null;
TransactionWorkspace workspace = null;
- if (optimistic)
+ if (isOptimistic())
workspace = extractTransactionWorkspace(cache1);
else
parentNode = (NodeSPI<String, String>) cache1.getRoot().getChild(parentFqn);
@@ -228,8 +231,6 @@
tm1.resume(t);
tm1.commit();
- asyncWait();
-
assertEquals("parent fqn tx should have completed", value, cache1.get(parentFqn, key));
if (isUsingInvalidation())
assertNull("parent fqn tx should have invalidated cache2", cache2.get(parentFqn, key));
@@ -256,13 +257,13 @@
try
{
cache1.put(fqn, key, value);
- if (!optimistic) fail("Should have barfed");
+ if (!isOptimistic()) fail("Should have barfed");
}
catch (RuntimeException re)
{
}
- if (optimistic && !isUsingInvalidation())
+ if (isOptimistic() && !isUsingInvalidation())
{
// proves that the put did, in fact, barf. Doesn't work for invalidations since the inability to invalidate will not cause a rollback.
assertNull(cache1.get(fqn, key));
@@ -305,10 +306,9 @@
Object expected = isUsingInvalidation() ? null : value;
assertEquals("PFER propagated to cache2 as expected", expected, cache2.get(fqn, key));
+ // replication to cache 1 should NOT happen.
cache2.putForExternalRead(fqn, key, value);
- asyncWait();
-
assertEquals("PFER updated cache2", value, cache2.get(fqn, key));
assertEquals("Cache1 should be unaffected", value, cache1.get(fqn, key));
}
@@ -346,7 +346,7 @@
cache1.putForExternalRead(fqn, key, value);
tm1.commit();
- asyncWait();
+ TestingUtil.sleepThread(500);
assert cache1.getTransactionTable().getNumGlobalTransactions() == 0 : "Cache 1 should have no stale global TXs";
assert cache1.getTransactionTable().getNumLocalTransactions() == 0 : "Cache 1 should have no stale local TXs";
@@ -464,14 +464,24 @@
return null;
}
- protected void asyncWait()
+ protected boolean isUsingInvalidation()
{
- TestingUtil.sleepThread(500);
+ return cacheMode.isInvalidation();
}
- protected boolean isUsingInvalidation()
+ protected boolean isAsync()
{
- return cacheMode == CacheMode.INVALIDATION_ASYNC
- || cacheMode == CacheMode.INVALIDATION_SYNC;
+ return !cacheMode.isSynchronous();
}
+
+ protected boolean isOptimistic()
+ {
+ return nodeLockingScheme == NodeLockingScheme.OPTIMISTIC;
+ }
+
+ protected void asyncWait()
+ {
+ // always needs to do this since PFER will force async comms.
+ TestingUtil.sleepThread(500);
+ }
}
16 years, 6 months
JBoss Cache SVN: r6101 - core/branches/2.2.X/src/main/java/org/jboss/cache/config.
by jbosscache-commits@lists.jboss.org
Author: manik.surtani(a)jboss.com
Date: 2008-06-27 12:01:12 -0400 (Fri, 27 Jun 2008)
New Revision: 6101
Modified:
core/branches/2.2.X/src/main/java/org/jboss/cache/config/Configuration.java
Log:
Typo
Modified: core/branches/2.2.X/src/main/java/org/jboss/cache/config/Configuration.java
===================================================================
--- core/branches/2.2.X/src/main/java/org/jboss/cache/config/Configuration.java 2008-06-27 16:00:32 UTC (rev 6100)
+++ core/branches/2.2.X/src/main/java/org/jboss/cache/config/Configuration.java 2008-06-27 16:01:12 UTC (rev 6101)
@@ -93,7 +93,7 @@
*/
public boolean isInvalidation()
{
- return this == INVALIDATION_SYNC || this == INVALIDATION_SYNC;
+ return this == INVALIDATION_SYNC || this == INVALIDATION_ASYNC;
}
public boolean isSynchronous()
16 years, 6 months