Author: olamy
Date: Sun Apr 27 23:48:32 2014
New Revision: 1590531

URL: http://svn.apache.org/r1590531
Log:
first version passing 465 test - not cdi ones. stats to review (they are not 
yet correct) and code to check

Added:
    
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java
   (with props)
    commons/proper/jcs/trunk/src/tck-resources/
    commons/proper/jcs/trunk/src/tck-resources/ExcludeList
    commons/proper/jcs/trunk/src/tck-resources/log4j.properties   (with props)
Modified:
    
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCache.java
    
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCachingManager.java
    
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/TempStateCacheView.java
    
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java
    commons/proper/jcs/trunk/tck.xml

Modified: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCache.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCache.java?rev=1590531&r1=1590530&r2=1590531&view=diff
==============================================================================
--- 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCache.java 
(original)
+++ 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCache.java 
Sun Apr 27 23:48:32 2014
@@ -8,6 +8,7 @@ import org.apache.commons.jcs.engine.con
 import org.apache.commons.jcs.jcache.jmx.JCSCacheMXBean;
 import org.apache.commons.jcs.jcache.jmx.JCSCacheStatisticsMXBean;
 import org.apache.commons.jcs.jcache.jmx.JMXs;
+import org.apache.commons.jcs.jcache.proxy.ExceptionWrapperHandler;
 import org.apache.commons.jcs.utils.serialization.StandardSerializer;
 
 import javax.cache.Cache;
@@ -24,6 +25,7 @@ import javax.cache.expiry.ExpiryPolicy;
 import javax.cache.integration.CacheLoader;
 import javax.cache.integration.CacheLoaderException;
 import javax.cache.integration.CacheWriter;
+import javax.cache.integration.CacheWriterException;
 import javax.cache.integration.CompletionListener;
 import javax.cache.processor.EntryProcessor;
 import javax.cache.processor.EntryProcessorException;
@@ -54,7 +56,8 @@ public class JCSCache<K extends Serializ
     private final Statistics statistics = new Statistics();
     private final IElementSerializer serializer = new StandardSerializer();
 
-    public JCSCache(final CacheManager mgr, final JCSConfiguration<K, V> 
configuration, final CompositeCache<K, JCSElement<V>> cache) {
+    public JCSCache(final ClassLoader classLoader, final CacheManager mgr, 
final JCSConfiguration<K, V> configuration,
+                    final CompositeCache<K, JCSElement<V>> cache) {
         manager = mgr;
         delegate = new CacheAccess<K, JCSElement<V>>(cache);
         config = configuration;
@@ -63,14 +66,14 @@ public class JCSCache<K extends Serializ
         if (cacheLoaderFactory == null) {
             loader = NoLoader.INSTANCE;
         } else {
-            loader = cacheLoaderFactory.create();
+            loader = ExceptionWrapperHandler.newProxy(classLoader, 
cacheLoaderFactory.create(), CacheLoaderException.class, CacheLoader.class);
         }
 
         final Factory<CacheWriter<? super K, ? super V>> cacheWriterFactory = 
configuration.getCacheWriterFactory();
         if (cacheWriterFactory == null) {
             writer = NoWriter.INSTANCE;
         } else {
-            writer = cacheWriterFactory.create();
+            writer = ExceptionWrapperHandler.newProxy(classLoader, 
cacheWriterFactory.create(), CacheWriterException.class, CacheWriter.class);
         }
 
         final Factory<ExpiryPolicy> expiryPolicyFactory = 
configuration.getExpiryPolicyFactory();
@@ -122,25 +125,24 @@ public class JCSCache<K extends Serializ
         return doGetControllingExpiry(key, true, false, false, true);
     }
 
-    private V doLoad(final K key, final boolean forceDoLoad, final boolean 
propagateLoadException) {
+    private V doLoad(final K key, final boolean update, final boolean 
propagateLoadException) {
         V v = null;
         try {
             v = loader.load(key);
-        } catch (final RuntimeException e) {
+        } catch (final CacheLoaderException e) {
             if (propagateLoadException) {
-                throw new CacheLoaderException(e);
+                throw e;
             }
         }
         if (v != null) {
             try {
-                final Duration duration = forceDoLoad ? 
expiryPolicy.getExpiryForUpdate() : expiryPolicy.getExpiryForCreation();
+                final Duration duration = update ? 
expiryPolicy.getExpiryForUpdate() : expiryPolicy.getExpiryForCreation();
                 if (duration == null || !duration.isZero()) {
                     delegate.put(key, new JCSElement<V>(v, duration));
                 }
             } catch (final CacheException e) {
                 throw new IllegalStateException(e);
             }
-            writer.write(new JCSEntry<K, V>(key, v));
         }
         return v;
     }
@@ -179,11 +181,13 @@ public class JCSCache<K extends Serializ
             }
             result.put(key, val);
         }
-        for (final K k : keys) {
-            if (!result.containsKey(k)) {
-                final V v = doLoad(k, false, true);
-                if (v != null) {
-                    result.put(k, v);
+        if (config.isReadThrough() && result.size() != keys.size()) {
+            for (final K k : keys) {
+                if (!result.containsKey(k)) {
+                    final V v = doLoad(k, false, false);
+                    if (v != null) {
+                        result.put(k, v);
+                    }
                 }
             }
         }
@@ -219,8 +223,8 @@ public class JCSCache<K extends Serializ
                     delegate.remove(key);
                 }
             } else {
-                delegate.put(storeByValue ? copy(key) : key, element);
                 writer.write(new JCSEntry<K, V>(key, value));
+                delegate.put(storeByValue ? copy(key) : key, element);
                 for (final JCSListener<K, V> listener : listeners.values()) {
                     if (created) {
                         listener.onCreated(Arrays.<CacheEntryEvent<? extends 
K, ? extends V>>asList(
@@ -280,10 +284,12 @@ public class JCSCache<K extends Serializ
         assertNotClosed();
         assertNotNull(key, "key");
 
-        final long start = config.isStatisticsEnabled() ? Times.now() : 0;
+        final boolean statisticsEnabled = config.isStatisticsEnabled();
+        final long start = statisticsEnabled ? Times.now() : 0;
 
         final JCSElement<V> v = delegate.get(key);
         final V value = v != null && v.getElement() != null ? v.getElement() : 
null;
+        writer.delete(key);
         boolean remove = delegate.getCacheControl().remove(key);
         if (v != null && v.isExpired()) {
             remove = false;
@@ -292,7 +298,7 @@ public class JCSCache<K extends Serializ
             listener.onRemoved(Arrays.<CacheEntryEvent<? extends K, ? extends 
V>>asList(
                     new JCSCacheEntryEvent<K, V>(this, EventType.REMOVED, 
null, key, value)));
         }
-        if (remove && config.isStatisticsEnabled()) {
+        if (remove && statisticsEnabled) {
             statistics.increaseRemovals(1);
             statistics.addRemoveTime(Times.now() - start);
         }
@@ -326,21 +332,22 @@ public class JCSCache<K extends Serializ
     private V doGetControllingExpiry(final K key, final boolean updateAcess,
                                      final boolean forceDoLoad, final boolean 
skipLoad,
                                      final boolean propagateLoadException) {
+        final boolean statisticsEnabled = config.isStatisticsEnabled();
         final long getStart = Times.now();
         final JCSElement<V> elt = delegate.get(key);
         V v = elt != null? elt.getElement() : null;
-        if (v == null && config.isReadThrough()) {
+        if (v == null && (config.isReadThrough() || forceDoLoad)) {
             if (!skipLoad) {
-                v = doLoad(key, forceDoLoad, propagateLoadException);
+                v = doLoad(key, false, propagateLoadException);
             }
-        } else if (config.isStatisticsEnabled()) {
-            if (elt != null) {
+        } else if (statisticsEnabled) {
+            if (v != null) {
                 statistics.increaseHits(1);
             } else {
                 statistics.increaseMisses(1);
-                statistics.addGetTime(Times.now() - getStart);
             }
         }
+
         if (updateAcess && elt != null) {
             elt.update(expiryPolicy.getExpiryForAccess());
             if (elt.isExpired()) {
@@ -440,17 +447,7 @@ public class JCSCache<K extends Serializ
 
     @Override
     public void removeAll() {
-        if (config.isStatisticsEnabled()) {
-            int i = 0;
-            final CompositeCache<K, JCSElement<V>> underlying = 
delegate.getCacheControl();
-            for (final K elt : underlying.getKeySet()) {
-                if (!underlying.get(elt).getVal().isExpired()) {
-                    i++;
-                }
-            }
-            statistics.increaseRemovals(i);
-        }
-        clear();
+        removeAll(delegate.getCacheControl().getKeySet());
     }
 
     @Override
@@ -480,15 +477,13 @@ public class JCSCache<K extends Serializ
         // TODO: async
         try {
             for (final K k : keys) {
-                final boolean removed;
                 if (replaceExistingValues) {
-                    removed = delegate.getCacheControl().remove(k);
+                    final V v = doLoad(k, containsKey(k), completionListener 
!= null);
+                    continue;
                 } else if (containsKey(k)) {
                     continue;
-                } else {
-                    removed = false;
                 }
-                doGetControllingExpiry(k, true, removed, false, 
completionListener != null); // will trigger cacheloader and init
+                doGetControllingExpiry(k, true, true, false, 
completionListener != null); // will trigger cacheloader and init
             }
         } catch (final RuntimeException e) {
             if (completionListener != null) {

Modified: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCachingManager.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCachingManager.java?rev=1590531&r1=1590530&r2=1590531&view=diff
==============================================================================
--- 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCachingManager.java
 (original)
+++ 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSCachingManager.java
 Sun Apr 27 23:48:32 2014
@@ -79,6 +79,7 @@ public class JCSCachingManager implement
             final Cache<K, V> cache = ClassLoaderAwareHandler.newProxy(
                     loader,
                     new JCSCache/*<K, V, C>*/(
+                            loader,
                             this,
                             new JCSConfiguration(configuration, 
configuration.getKeyType(), configuration.getValueType()),
                             instance.getCache(cacheName)),

Modified: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/TempStateCacheView.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/TempStateCacheView.java?rev=1590531&r1=1590530&r2=1590531&view=diff
==============================================================================
--- 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/TempStateCacheView.java
 (original)
+++ 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/TempStateCacheView.java
 Sun Apr 27 23:48:32 2014
@@ -20,6 +20,7 @@ import java.util.Set;
 
 import static org.apache.commons.jcs.jcache.Asserts.assertNotNull;
 
+// kind of transactional view for a Cache<K, V>, to use with EntryProcessor
 public class TempStateCacheView<K extends Serializable, V extends 
Serializable> implements Cache<K, V> {
     private final JCSCache<K, V, ?> cache;
     private final Map<K, V> put = new HashMap<K, V>();
@@ -41,7 +42,7 @@ public class TempStateCacheView<K extend
             return v;
         }
 
-        // for an EntryProcessor we already incremented stats
+        // for an EntryProcessor we already incremented stats - to enhance 
surely
         if 
(cache.getConfiguration(CompleteConfiguration.class).isStatisticsEnabled()) {
             final Statistics statistics = cache.getStatistics();
             if (cache.containsKey(key)) {
@@ -112,9 +113,12 @@ public class TempStateCacheView<K extend
     }
 
     public boolean remove(final K key) {
+        final boolean noop = put.containsKey(key);
         put.remove(key);
-        if (!ignoreKey(key) && cache.containsKey(key)) {
-            remove.add(key);
+        if (!ignoreKey(key)) {
+            if (!noop) {
+                remove.add(key);
+            }
             return true;
         }
         return false;

Modified: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java?rev=1590531&r1=1590530&r2=1590531&view=diff
==============================================================================
--- 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java
 (original)
+++ 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java
 Sun Apr 27 23:48:32 2014
@@ -46,7 +46,7 @@ public class ClassLoaderAwareHandler imp
         return method.invoke(delegate, args);
     }
 
-    private boolean isEquals(Method method, Object[] args) {
+    private boolean isEquals(final Method method, final Object[] args) {
         return "equals".equals(method.getName()) && args != null && 
args.length == 1;
     }
 

Added: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java?rev=1590531&view=auto
==============================================================================
--- 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java
 (added)
+++ 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java
 Sun Apr 27 23:48:32 2014
@@ -0,0 +1,44 @@
+package org.apache.commons.jcs.jcache.proxy;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+public class ExceptionWrapperHandler<T> implements InvocationHandler {
+    private final T delegate;
+    private final Constructor<? extends RuntimeException> wrapper;
+
+    public ExceptionWrapperHandler(final T delegate, final Class<? extends 
RuntimeException> exceptionType) {
+        this.delegate = delegate;
+        try {
+            this.wrapper = exceptionType.getConstructor(Throwable.class);
+        } catch (final NoSuchMethodException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    @Override
+    public Object invoke(final Object proxy, final Method method, final 
Object[] args) throws Throwable {
+        try {
+            return method.invoke(delegate, args);
+        } catch (final InvocationTargetException ite) {
+            final Throwable e = ite.getCause();
+            if (RuntimeException.class.isInstance(e)) {
+                final RuntimeException re;
+                try {
+                    re = wrapper.newInstance(e);
+                } catch (final Exception e1) {
+                    throw new IllegalArgumentException(e1);
+                }
+                throw re;
+            }
+            throw e;
+        }
+    }
+
+    public static <T> T newProxy(final ClassLoader loader, final T delegate, 
final Class<? extends RuntimeException> exceptionType, final Class<T> apis) {
+        return (T) Proxy.newProxyInstance(loader, new Class<?>[] { apis }, new 
ExceptionWrapperHandler<T>(delegate, exceptionType));
+    }
+}

Propchange: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ExceptionWrapperHandler.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: commons/proper/jcs/trunk/src/tck-resources/ExcludeList
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/tck-resources/ExcludeList?rev=1590531&view=auto
==============================================================================
--- commons/proper/jcs/trunk/src/tck-resources/ExcludeList (added)
+++ commons/proper/jcs/trunk/src/tck-resources/ExcludeList Sun Apr 27 23:48:32 
2014
@@ -0,0 +1,2 @@
+# for tck this test needs to be excluded
+org.jsr107.tck.CachingTest#dummyTest

Added: commons/proper/jcs/trunk/src/tck-resources/log4j.properties
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/tck-resources/log4j.properties?rev=1590531&view=auto
==============================================================================
--- commons/proper/jcs/trunk/src/tck-resources/log4j.properties (added)
+++ commons/proper/jcs/trunk/src/tck-resources/log4j.properties Sun Apr 27 
23:48:32 2014
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+log4j.rootCategory=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

Propchange: commons/proper/jcs/trunk/src/tck-resources/log4j.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/jcs/trunk/src/tck-resources/log4j.properties
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: commons/proper/jcs/trunk/tck.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/jcs/trunk/tck.xml?rev=1590531&r1=1590530&r2=1590531&view=diff
==============================================================================
--- commons/proper/jcs/trunk/tck.xml (original)
+++ commons/proper/jcs/trunk/tck.xml Sun Apr 27 23:48:32 2014
@@ -3,6 +3,8 @@
          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>
   <!--
+  NOTE: ENSURE TO hAVE BUILD commons-jcs BEFORE.
+
   TO RUN TCKs CALL:
 
   $ mvn -f tck.xml test
@@ -100,7 +102,7 @@
   <build>
     <testResources>
       <testResource>
-        <directory>src/test/resources</directory>
+        <directory>src/tck-resources</directory>
         <filtering>true</filtering>
       </testResource>
     </testResources>
@@ -154,7 +156,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.9</version>
+        <version>2.17</version>
         <configuration>
           <systemPropertyVariables>
             <domainJar>${domain-lib-dir}/${domain-jar}</domainJar>


Reply via email to