Author: olamy Date: Sun Apr 27 23:48:21 2014 New Revision: 1590530 URL: http://svn.apache.org/r1590530 Log: another bunch of tcks passing
Added: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java (with props) commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java (with props) commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java (with props) Modified: commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheThread.java commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheUnicaster.java commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/server/LateralCacheServletReciever.java commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/socket/udp/LateralUDPReceiver.java commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/xmlrpc/LateralXMLRPCReceiverConnection.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java 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/JCSConfiguration.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSElement.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/TempStateCacheView.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java commons/proper/jcs/trunk/tck.sh commons/proper/jcs/trunk/tck.xml Modified: commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheThread.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheThread.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheThread.java (original) +++ commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheThread.java Sun Apr 27 23:48:21 2014 @@ -198,7 +198,7 @@ public class LateralCacheThread extends String result = ""; try { - ObjectInputStream is = new ObjectInputStream( connection.getInputStream() ); + ObjectInputStream is = new ObjectInputStreamClassLoaderAware( connection.getInputStream(), null ); result = ( String ) is.readObject(); is.close(); Modified: commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheUnicaster.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheUnicaster.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheUnicaster.java (original) +++ commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/broadcast/LateralCacheUnicaster.java Sun Apr 27 23:48:21 2014 @@ -188,7 +188,7 @@ public class LateralCacheUnicaster String result = ""; try { - ObjectInputStream is = new ObjectInputStream( conn.getInputStream() ); + ObjectInputStream is = new ObjectInputStreamClassLoaderAware( conn.getInputStream(), null ); try { result = ( String ) is.readObject(); Modified: commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/server/LateralCacheServletReciever.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/server/LateralCacheServletReciever.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/server/LateralCacheServletReciever.java (original) +++ commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/http/server/LateralCacheServletReciever.java Sun Apr 27 23:48:21 2014 @@ -77,7 +77,7 @@ public class LateralCacheServletReciever // Create the ObjectInputStream with // the Request InputStream. - ObjectInputStream ois = new ObjectInputStream( request.getInputStream() ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( request.getInputStream(), null ); if ( log.isDebugEnabled() ) { Modified: commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/socket/udp/LateralUDPReceiver.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/socket/udp/LateralUDPReceiver.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/socket/udp/LateralUDPReceiver.java (original) +++ commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/socket/udp/LateralUDPReceiver.java Sun Apr 27 23:48:21 2014 @@ -108,7 +108,7 @@ public class LateralUDPReceiver implemen final ByteArrayInputStream byteStream = new ByteArrayInputStream( m_buffer, 0, packet.getLength() ); - final ObjectInputStream objectStream = new ObjectInputStream( byteStream ); + final ObjectInputStream objectStream = new ObjectInputStreamClassLoaderAware( byteStream, null ); obj = objectStream.readObject(); Modified: commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/xmlrpc/LateralXMLRPCReceiverConnection.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/xmlrpc/LateralXMLRPCReceiverConnection.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/xmlrpc/LateralXMLRPCReceiverConnection.java (original) +++ commons/proper/jcs/trunk/src/experimental/org/apache/commons/jcs/auxiliary/lateral/xmlrpc/LateralXMLRPCReceiverConnection.java Sun Apr 27 23:48:21 2014 @@ -85,7 +85,7 @@ public class LateralXMLRPCReceiverConnec byte[] data = ( byte[] ) params.firstElement(); ByteArrayInputStream bais = new ByteArrayInputStream( data ); BufferedInputStream bis = new BufferedInputStream( bais ); - ObjectInputStream ois = new ObjectInputStream( bis ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis, null ); try { led = ( LateralElementDescriptor ) ois.readObject(); Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskKeyStore.java Sun Apr 27 23:48:21 2014 @@ -34,6 +34,7 @@ import java.util.Map; import java.util.Set; import org.apache.commons.jcs.auxiliary.disk.LRUMapJCS; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; import org.apache.commons.jcs.utils.timing.ElapsedTimer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -230,7 +231,7 @@ public class BlockDiskKeyStore<K extends { FileInputStream fis = new FileInputStream( keyFile ); BufferedInputStream bis = new BufferedInputStream( fis ); - ObjectInputStream ois = new ObjectInputStream( bis ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis , null); try { while ( true ) Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java Sun Apr 27 23:48:21 2014 @@ -44,6 +44,7 @@ import org.apache.commons.jcs.engine.beh import org.apache.commons.jcs.engine.behavior.IShutdownObserver; import org.apache.commons.jcs.engine.control.CompositeCache; import org.apache.commons.jcs.engine.control.CompositeCacheManager; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -601,7 +602,7 @@ public class LateralTCPListener<K extend try { - ois = new ObjectInputStream( socket.getInputStream() ); + ois = new ObjectInputStreamClassLoaderAware( socket.getInputStream(), null ); } catch ( Exception e ) { Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/lateral/socket/tcp/LateralTCPSender.java Sun Apr 27 23:48:21 2014 @@ -29,6 +29,7 @@ import java.net.Socket; import org.apache.commons.jcs.auxiliary.lateral.LateralElementDescriptor; import org.apache.commons.jcs.auxiliary.lateral.socket.tcp.behavior.ITCPLateralCacheAttributes; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -283,7 +284,7 @@ public class LateralTCPSender { // TODO make configurable // socket.setSoTimeout( 2000 ); - ObjectInputStream ois = new ObjectInputStream( socket.getInputStream() ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( socket.getInputStream(), null ); response = ois.readObject(); } catch ( IOException ioe ) Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java Sun Apr 27 23:48:21 2014 @@ -35,6 +35,7 @@ import org.apache.commons.jcs.access.exc import org.apache.commons.jcs.auxiliary.remote.value.RemoteCacheRequest; import org.apache.commons.jcs.auxiliary.remote.value.RemoteCacheResponse; import org.apache.commons.jcs.engine.control.CompositeCacheManager; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; import org.apache.commons.jcs.utils.serialization.StandardSerializer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -155,7 +156,7 @@ public class RemoteHttpCacheServlet protected RemoteCacheRequest<Serializable, Serializable> readRequestFromStream( InputStream inputStream ) throws IOException, ClassNotFoundException { - ObjectInputStream ois = new ObjectInputStream( inputStream ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( inputStream, null ); @SuppressWarnings("unchecked") // Need to cast from Object RemoteCacheRequest<Serializable, Serializable> remoteRequest Added: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java?rev=1590530&view=auto ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java (added) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java Sun Apr 27 23:48:21 2014 @@ -0,0 +1,36 @@ +package org.apache.commons.jcs.io; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.lang.reflect.Proxy; + +public class ObjectInputStreamClassLoaderAware extends ObjectInputStream { + private final ClassLoader classLoader; + + public ObjectInputStreamClassLoaderAware(final InputStream in, final ClassLoader classLoader) throws IOException { + super(in); + this.classLoader = classLoader != null? classLoader : Thread.currentThread().getContextClassLoader(); + } + + @Override + protected Class<?> resolveClass(final ObjectStreamClass desc) throws ClassNotFoundException { + return Class.forName(desc.getName(), false, classLoader); + } + + @Override + protected Class resolveProxyClass(final String[] interfaces) throws IOException, ClassNotFoundException { + final Class[] cinterfaces = new Class[interfaces.length]; + for (int i = 0; i < interfaces.length; i++) { + cinterfaces[i] = Class.forName(interfaces[i], false, classLoader); + } + + try { + return Proxy.getProxyClass(classLoader, cinterfaces); + } catch (IllegalArgumentException e) { + throw new ClassNotFoundException(null, e); + } + } + +} Propchange: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/io/ObjectInputStreamClassLoaderAware.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision 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=1590530&r1=1590529&r2=1590530&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:21 2014 @@ -3,10 +3,12 @@ package org.apache.commons.jcs.jcache; import org.apache.commons.jcs.access.CacheAccess; import org.apache.commons.jcs.access.exception.CacheException; import org.apache.commons.jcs.engine.behavior.ICacheElement; +import org.apache.commons.jcs.engine.behavior.IElementSerializer; import org.apache.commons.jcs.engine.control.CompositeCache; 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.utils.serialization.StandardSerializer; import javax.cache.Cache; import javax.cache.CacheManager; @@ -16,9 +18,11 @@ import javax.cache.configuration.Configu import javax.cache.configuration.Factory; import javax.cache.event.CacheEntryEvent; import javax.cache.event.EventType; +import javax.cache.expiry.Duration; import javax.cache.expiry.EternalExpiryPolicy; import javax.cache.expiry.ExpiryPolicy; import javax.cache.integration.CacheLoader; +import javax.cache.integration.CacheLoaderException; import javax.cache.integration.CacheWriter; import javax.cache.integration.CompletionListener; import javax.cache.processor.EntryProcessor; @@ -35,9 +39,7 @@ import java.util.concurrent.ConcurrentHa import static org.apache.commons.jcs.jcache.Asserts.assertNotNull; -// TODO: get statistics distributed? -// TODO:: get configuration and CompleteConfiguration to get CacheLoader needed for get() -// TODO:: optimize touch() +// TODO: get statistics locally correct then correct even if distributed public class JCSCache<K extends Serializable, V extends Serializable, C extends CompleteConfiguration<K, V>> implements Cache<K, V> { private final CacheAccess<K, JCSElement<V>> delegate; private final CacheManager manager; @@ -50,6 +52,7 @@ public class JCSCache<K extends Serializ private volatile boolean closed = false; private final Map<CacheEntryListenerConfiguration<K, V>, JCSListener<K, V>> listeners = new ConcurrentHashMap<CacheEntryListenerConfiguration<K, V>, JCSListener<K, V>>(); 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) { manager = mgr; @@ -98,16 +101,11 @@ public class JCSCache<K extends Serializ } catch (final Exception e) { throw new IllegalArgumentException(e); } - JMXs.register(cacheConfigObjectName, new JCSCacheMXBean<K, V>(this)); - JMXs.register(cacheStatsObjectName, new JCSCacheStatisticsMXBean(statistics)); - } - - private void registerJMXBeans() { - try { - JMXs.register(cacheStatsObjectName, new JCSCacheStatisticsMXBean(statistics)); + if (config.isManagementEnabled()) { JMXs.register(cacheConfigObjectName, new JCSCacheMXBean<K, V>(this)); - } catch (final Exception e) { - throw new IllegalArgumentException(e.getMessage(), e); + } + if (config.isStatisticsEnabled()) { + JMXs.register(cacheStatsObjectName, new JCSCacheStatisticsMXBean(statistics)); } } @@ -121,25 +119,23 @@ public class JCSCache<K extends Serializ public V get(final K key) { assertNotClosed(); assertNotNull(key, "key"); - - final JCSElement<V> elt = delegate.get(key); - V v = elt != null? elt.getElement() : null; - if (v == null && config.isReadThrough()) { - v = doLoad(key); - } else if (elt != null) { - elt.update(expiryPolicy.getExpiryForAccess()); - touch(key, elt); - } - - return v; + return doGetControllingExpiry(key, true, false, false, true); } - private V doLoad(final K key) { - final V v = loader.load(key); + private V doLoad(final K key, final boolean forceDoLoad, final boolean propagateLoadException) { + V v = null; + try { + v = loader.load(key); + } catch (final RuntimeException e) { + if (propagateLoadException) { + throw new CacheLoaderException(e); + } + } if (v != null) { try { - if (!expiryPolicy.getExpiryForCreation().isZero()) { - delegate.put(key, new JCSElement<V>(v, expiryPolicy.getExpiryForCreation())); + final Duration duration = forceDoLoad ? 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); @@ -160,6 +156,9 @@ public class JCSCache<K extends Serializ @Override public Map<K, V> getAll(final Set<? extends K> keys) { assertNotClosed(); + for (final K k : keys) { + assertNotNull(k , "key"); + } final Set<K> names = (Set<K>) keys; final Map<K, V> result = new HashMap<K, V>(); @@ -170,7 +169,7 @@ public class JCSCache<K extends Serializ final JCSElement<V> elt = k.getValue() != null ? k.getValue().getVal() : null; V val = elt != null ? elt.getElement() : null; if (val == null && config.isReadThrough()) { - val = doLoad(key); + val = doLoad(key, false, false); if (val != null) { result.put(key, val); } @@ -180,6 +179,14 @@ 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); + } + } + } return result; } @@ -191,21 +198,28 @@ public class JCSCache<K extends Serializ } @Override - public void put(final K key, final V value) { + public void put(final K key, final V rawValue) { assertNotClosed(); assertNotNull(key, "key"); - assertNotNull(value, "value"); + assertNotNull(rawValue, "value"); + + final long start = config.isStatisticsEnabled() ? Times.now() : 0; try { final JCSElement<V> oldElt = delegate.get(key); final V old = oldElt != null? oldElt.getElement() : null; + final boolean storeByValue = config.isStoreByValue(); + final V value = storeByValue ? copy(rawValue) : rawValue; + final boolean created = old == null; final JCSElement<V> element = new JCSElement<V>(value, created ? expiryPolicy.getExpiryForCreation() : expiryPolicy.getExpiryForUpdate()); if (element.isExpired()) { - delegate.remove(key); + if (!created) { + delegate.remove(key); + } } else { - delegate.put(key, element); + delegate.put(storeByValue ? copy(key) : key, element); writer.write(new JCSEntry<K, V>(key, value)); for (final JCSListener<K, V> listener : listeners.values()) { if (created) { @@ -216,19 +230,28 @@ public class JCSCache<K extends Serializ new JCSCacheEntryEvent<K, V>(this, EventType.UPDATED, old, key, value))); } } - } - if (config.isStatisticsEnabled()) { - statistics.increasePuts(1); + if (config.isStatisticsEnabled()) { + statistics.increasePuts(1); + statistics.addPutTime(System.currentTimeMillis() - start); + } } } catch (final CacheException e) { throw new IllegalStateException(e); } } + private <T extends Serializable> T copy(final T value) { + try { + return serializer.deSerialize(serializer.serialize(value)); + } catch (final Exception ioe) { + throw new IllegalStateException(ioe.getMessage(), ioe); + } + } + @Override public V getAndPut(final K key, final V value) { - final V v = get(key); + final V v = doGetControllingExpiry(key, false, false, true, false); put(key, value); return v; } @@ -257,13 +280,22 @@ public class JCSCache<K extends Serializ assertNotClosed(); assertNotNull(key, "key"); + final long start = config.isStatisticsEnabled() ? Times.now() : 0; + final JCSElement<V> v = delegate.get(key); final V value = v != null && v.getElement() != null ? v.getElement() : null; - final boolean remove = delegate.getCacheControl().remove(key); + boolean remove = delegate.getCacheControl().remove(key); + if (v != null && v.isExpired()) { + remove = false; + } for (final JCSListener<K, V> listener : listeners.values()) { listener.onRemoved(Arrays.<CacheEntryEvent<? extends K, ? extends V>>asList( new JCSCacheEntryEvent<K, V>(this, EventType.REMOVED, null, key, value))); } + if (remove && config.isStatisticsEnabled()) { + statistics.increaseRemovals(1); + statistics.addRemoveTime(Times.now() - start); + } return remove; } @@ -272,36 +304,85 @@ public class JCSCache<K extends Serializ assertNotClosed(); assertNotNull(key, "key"); assertNotNull(oldValue, "oldValue"); - if (containsKey(key) && get(key).equals(oldValue)) { - remove(key); - return true; + final V v = doGetControllingExpiry(key, false, false, false, false); + final boolean found = v != null; + if (found) { + if (v.equals(oldValue)) { + remove(key); + return true; + } + delegate.get(key).update(expiryPolicy.getExpiryForAccess()); } return false; } @Override public V getAndRemove(final K key) { - final V v = get(key); + final V v = doGetControllingExpiry(key, false, false, true, false); remove(key); return v; } + private V doGetControllingExpiry(final K key, final boolean updateAcess, + final boolean forceDoLoad, final boolean skipLoad, + final boolean propagateLoadException) { + 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 (!skipLoad) { + v = doLoad(key, forceDoLoad, propagateLoadException); + } + } else if (config.isStatisticsEnabled()) { + if (elt != null) { + statistics.increaseHits(1); + } else { + statistics.increaseMisses(1); + statistics.addGetTime(Times.now() - getStart); + } + } + if (updateAcess && elt != null) { + elt.update(expiryPolicy.getExpiryForAccess()); + if (elt.isExpired()) { + delegate.getCacheControl().remove(key); + } else { + touch(key, elt); + } + } + if (v != null) { + statistics.addGetTime(Times.now() - getStart); + } + return v; + } + @Override public boolean replace(final K key, final V oldValue, final V newValue) { assertNotClosed(); assertNotNull(key, "key"); assertNotNull(oldValue, "oldValue"); assertNotNull(newValue, "newValue"); + final boolean statisticsEnabled = config.isStatisticsEnabled(); final JCSElement<V> elt = delegate.get(key); if (elt != null) { V value = elt.getElement(); + if (elt.isExpired()) { + value = null; + } + if (value != null && statisticsEnabled) { + statistics.increaseHits(1); + } if (value == null && config.isReadThrough()) { - value = doLoad(key); + value = doLoad(key, false, false); } if (value != null && value.equals(oldValue)) { put(key, newValue); return true; + } else if (value != null) { + elt.update(expiryPolicy.getExpiryForAccess()); + touch(key, elt); } + } else if (statisticsEnabled) { + statistics.increaseMisses(1); } return false; } @@ -311,9 +392,15 @@ public class JCSCache<K extends Serializ assertNotClosed(); assertNotNull(key, "key"); assertNotNull(value, "value"); + boolean statisticsEnabled = config.isStatisticsEnabled(); if (containsKey(key)) { + if (statisticsEnabled) { + statistics.increaseHits(1); + } put(key, value); return true; + } else if (statisticsEnabled) { + statistics.increaseMisses(1); } return false; } @@ -324,14 +411,20 @@ public class JCSCache<K extends Serializ assertNotNull(key, "key"); assertNotNull(value, "value"); + final boolean statisticsEnabled = config.isStatisticsEnabled(); + final JCSElement<V> elt = delegate.get(key); if (elt != null) { V oldValue = elt.getElement(); if (oldValue == null && config.isReadThrough()) { - oldValue = doLoad(key); + oldValue = doLoad(key, false, false); + } else if (statisticsEnabled) { + statistics.increaseHits(1); } put(key, value); return oldValue; + } else if (statisticsEnabled) { + statistics.increaseMisses(1); } return null; } @@ -348,7 +441,14 @@ public class JCSCache<K extends Serializ @Override public void removeAll() { if (config.isStatisticsEnabled()) { - statistics.increaseRemovals(delegate.getCacheControl().getSize()); + 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(); } @@ -373,18 +473,29 @@ public class JCSCache<K extends Serializ public void loadAll(final Set<? extends K> keys, final boolean replaceExistingValues, final CompletionListener completionListener) { assertNotClosed(); + assertNotNull(keys, "keys"); + for (final K k : keys) { + assertNotNull(k, "a key"); + } // TODO: async try { for (final K k : keys) { - if (!containsKey(k) || replaceExistingValues) { - get(k); // will trigger cacheloader and init + final boolean removed; + if (replaceExistingValues) { + removed = delegate.getCacheControl().remove(k); + } else if (containsKey(k)) { + continue; + } else { + removed = false; } + doGetControllingExpiry(k, true, removed, false, completionListener != null); // will trigger cacheloader and init } - } catch (final Exception e) { + } catch (final RuntimeException e) { if (completionListener != null) { completionListener.onException(e); + return; } - return; + throw e; } if (completionListener != null) { completionListener.onCompletion(); @@ -404,6 +515,13 @@ public class JCSCache<K extends Serializ assertNotNull(entryProcessor, "entryProcessor"); assertNotNull(key, "key"); try { + if (config.isStatisticsEnabled()) { + if (containsKey(key)) { + statistics.increaseHits(1); + } else { + statistics.increaseMisses(1); + } + } return entryProcessor.process(new JCSMutableEntry<K, V>(view, key), arguments); } catch (final Exception ex) { return throwEntryProcessorException(ex); @@ -422,15 +540,19 @@ public class JCSCache<K extends Serializ final EntryProcessor<K, V, T> entryProcessor, final Object... arguments) { assertNotClosed(); + assertNotNull(entryProcessor, "entryProcessor"); final Map<K, EntryProcessorResult<T>> results = new HashMap<K, EntryProcessorResult<T>>(); for (final K k : keys) { try { - results.put(k, new EntryProcessorResult<T>() { - @Override - public T get() throws EntryProcessorException { - return invoke(k, entryProcessor, arguments); - } - }); + final T invoke = invoke(k, entryProcessor, arguments); + if (invoke != null) { + results.put(k, new EntryProcessorResult<T>() { + @Override + public T get() throws EntryProcessorException { + return invoke; + } + }); + } } catch (final Exception e) { results.put(k, new EntryProcessorResult<T>() { @Override @@ -531,4 +653,26 @@ public class JCSCache<K extends Serializ public Statistics getStatistics() { return statistics; } + + public void enableManagement() { + config.managementEnabled(); + JMXs.register(cacheConfigObjectName, new JCSCacheMXBean<K, V>(this)); + } + + public void disableManagement() { + config.managementDisabled(); + JMXs.unregister(cacheConfigObjectName); + } + + public void enableStatistics() { + config.statisticsEnabled(); + statistics.setActive(true); + JMXs.register(cacheStatsObjectName, new JCSCacheStatisticsMXBean(statistics)); + } + + public void disableStatistics() { + config.statisticsDisabled(); + statistics.setActive(false); + JMXs.unregister(cacheStatsObjectName); + } } 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=1590530&r1=1590529&r2=1590530&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:21 2014 @@ -2,6 +2,7 @@ package org.apache.commons.jcs.jcache; import org.apache.commons.jcs.access.exception.CacheException; import org.apache.commons.jcs.engine.control.CompositeCacheManager; +import org.apache.commons.jcs.jcache.proxy.ClassLoaderAwareHandler; import javax.cache.Cache; import javax.cache.CacheManager; @@ -9,6 +10,7 @@ import javax.cache.configuration.Configu import javax.cache.spi.CachingProvider; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Proxy; import java.net.URI; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; @@ -74,11 +76,15 @@ public class JCSCachingManager implement assertNotClosed(); assertNotNull(cacheName, "cacheName"); if (!caches.containsKey(cacheName)) { - caches.putIfAbsent(cacheName, + final Cache<K, V> cache = ClassLoaderAwareHandler.newProxy( + loader, new JCSCache/*<K, V, C>*/( this, new JCSConfiguration(configuration, configuration.getKeyType(), configuration.getValueType()), - instance.getCache(cacheName))); + instance.getCache(cacheName)), + Cache.class + ); + caches.putIfAbsent(cacheName, cache); } else { throw new javax.cache.CacheException("cache " + cacheName + " already exists"); } @@ -102,14 +108,33 @@ public class JCSCachingManager implement public void enableManagement(final String cacheName, final boolean enabled) { assertNotClosed(); assertNotNull(cacheName, "cacheName"); - throw new UnsupportedOperationException(); + final JCSCache<?, ?, ?> cache = getJCSCache(cacheName); + if (cache != null) { + if (enabled) { + cache.enableManagement(); + } else { + cache.disableManagement(); + } + } + } + + private JCSCache<?, ?, ?> getJCSCache(final String cacheName) { + final Cache<?, ?> cache = caches.get(cacheName); + return JCSCache.class.cast(ClassLoaderAwareHandler.class.cast(Proxy.getInvocationHandler(cache)).getDelegate()); } @Override public void enableStatistics(final String cacheName, final boolean enabled) { assertNotClosed(); assertNotNull(cacheName, "cacheName"); - throw new UnsupportedOperationException(); + final JCSCache<?, ?, ?> cache = getJCSCache(cacheName); + if (cache != null) { + if (enabled) { + cache.enableStatistics(); + } else { + cache.disableStatistics(); + } + } } @Override Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSConfiguration.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSConfiguration.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSConfiguration.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSConfiguration.java Sun Apr 27 23:48:21 2014 @@ -40,8 +40,8 @@ public class JCSConfiguration<K, V> impl private final Factory<ExpiryPolicy> expiryPolicyFactory; private final Set<CacheEntryListenerConfiguration<K, V>> cacheEntryListenerConfigurations; - private boolean statisticsEnabled = true; - private boolean managementEnabled = true; + private volatile boolean statisticsEnabled; + private volatile boolean managementEnabled; public JCSConfiguration(final Configuration<K, V> configuration, final Class<K> keyType, final Class<V> valueType) { this.keyType = keyType; @@ -69,6 +69,8 @@ public class JCSConfiguration<K, V> impl storeByValue = true; readThrough = false; writeThrough = false; + statisticsEnabled = false; + managementEnabled = false; cacheLoaderFactory = null; cacheWristerFactory = null; cacheEntryListenerConfigurations = new HashSet<CacheEntryListenerConfiguration<K, V>>(); @@ -137,4 +139,20 @@ public class JCSConfiguration<K, V> impl public synchronized void removeListener(final CacheEntryListenerConfiguration<K, V> cacheEntryListenerConfiguration) { cacheEntryListenerConfigurations.remove(cacheEntryListenerConfiguration); } + + public void statisticsEnabled() { + statisticsEnabled = true; + } + + public void managementEnabled() { + managementEnabled = true; + } + + public void statisticsDisabled() { + statisticsEnabled = false; + } + + public void managementDisabled() { + managementEnabled = false; + } } Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSElement.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSElement.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSElement.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/JCSElement.java Sun Apr 27 23:48:21 2014 @@ -12,12 +12,8 @@ public class JCSElement<V> implements Se update(duration); } - private static long now() { - return System.currentTimeMillis(); - } - public boolean isExpired() { - return end != -1 && (end == 0 || now() > end); + return end != -1 && (end == 0 || Times.now() > end); } public V getElement() { @@ -30,7 +26,7 @@ public class JCSElement<V> implements Se } else if (duration.isZero()) { end = 0; } else { - end = duration.getAdjustedTime(now()); + end = duration.getAdjustedTime(Times.now()); } } } 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=1590530&r1=1590529&r2=1590530&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:21 2014 @@ -3,11 +3,13 @@ package org.apache.commons.jcs.jcache; import javax.cache.Cache; import javax.cache.CacheManager; import javax.cache.configuration.CacheEntryListenerConfiguration; +import javax.cache.configuration.CompleteConfiguration; import javax.cache.configuration.Configuration; import javax.cache.integration.CompletionListener; import javax.cache.processor.EntryProcessor; import javax.cache.processor.EntryProcessorException; import javax.cache.processor.EntryProcessorResult; +import java.io.Serializable; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -18,14 +20,14 @@ import java.util.Set; import static org.apache.commons.jcs.jcache.Asserts.assertNotNull; -public class TempStateCacheView<K, V> implements Cache<K, V> { - private final Cache<K, V> cache; +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>(); private final Collection<K> remove = new LinkedList<K>(); private boolean removeAll = false; private boolean clear = false; - public TempStateCacheView(final Cache<K, V> entries) { + public TempStateCacheView(final JCSCache<K, V, ?> entries) { this.cache = entries; } @@ -38,6 +40,16 @@ public class TempStateCacheView<K, V> im if (v != null) { return v; } + + // for an EntryProcessor we already incremented stats + if (cache.getConfiguration(CompleteConfiguration.class).isStatisticsEnabled()) { + final Statistics statistics = cache.getStatistics(); + if (cache.containsKey(key)) { + statistics.increaseHits(-1); + } else { + statistics.increaseMisses(-1); + } + } return cache.get(key); } @@ -63,7 +75,7 @@ public class TempStateCacheView<K, V> im } public boolean containsKey(final K key) { - return !ignoreKey(key) && put.containsKey(key) || cache.containsKey(key); + return !ignoreKey(key) && (put.containsKey(key) || cache.containsKey(key)); } public void loadAll(final Set<? extends K> keys, final boolean replaceExistingValues, final CompletionListener completionListener) { Added: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java?rev=1590530&view=auto ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java (added) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java Sun Apr 27 23:48:21 2014 @@ -0,0 +1,11 @@ +package org.apache.commons.jcs.jcache; + +public class Times { + public static long now() { + return System.currentTimeMillis(); + } + + private Times() { + // no-op + } +} Propchange: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/Times.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: 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=1590530&view=auto ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java (added) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java Sun Apr 27 23:48:21 2014 @@ -0,0 +1,60 @@ +package org.apache.commons.jcs.jcache.proxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +public class ClassLoaderAwareHandler implements InvocationHandler { + private final ClassLoader loader; + private final Object delegate; + + public ClassLoaderAwareHandler(final ClassLoader loader, final Object delegate) { + this.loader = loader; + this.delegate = delegate; + } + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + final Thread th = Thread.currentThread(); + final ClassLoader old = th.getContextClassLoader(); + th.setContextClassLoader(loader); + try { + if (Object.class == method.getDeclaringClass()) { + if (isEquals(method, args)) { + return doEquals(method, args); + } + } + return method.invoke(delegate, args); + } catch (final InvocationTargetException ite) { + throw ite.getCause(); + } finally { + th.setContextClassLoader(old); + } + } + + private Object doEquals(final Method method, final Object[] args) throws IllegalAccessException, InvocationTargetException { + if (args[0] == null) { + return false; + } + if (Proxy.isProxyClass(args[0].getClass())) { + final InvocationHandler handler = Proxy.getInvocationHandler(args[0]); + if (ClassLoaderAwareHandler.class.isInstance(handler)) { + return delegate.equals(ClassLoaderAwareHandler.class.cast(handler).delegate); + } + } + return method.invoke(delegate, args); + } + + private boolean isEquals(Method method, Object[] args) { + return "equals".equals(method.getName()) && args != null && args.length == 1; + } + + public static <T> T newProxy(final ClassLoader loader, final Object delegate, final Class<?>...apis) { + return (T) Proxy.newProxyInstance(loader, apis, new ClassLoaderAwareHandler(loader, delegate)); + } + + public Object getDelegate() { + return delegate; + } +} Propchange: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/jcache/proxy/ClassLoaderAwareHandler.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java Sun Apr 27 23:48:21 2014 @@ -31,6 +31,7 @@ import java.util.concurrent.ThreadPoolEx import org.apache.commons.jcs.engine.CacheInfo; import org.apache.commons.jcs.engine.behavior.IShutdownObserver; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; import org.apache.commons.jcs.utils.discovery.UDPDiscoveryMessage.BroadcastType; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -165,7 +166,7 @@ public class UDPDiscoveryReceiver } final ByteArrayInputStream byteStream = new ByteArrayInputStream( mBuffer, 0, packet.getLength() ); - final ObjectInputStream objectStream = new ObjectInputStream( byteStream ); + final ObjectInputStream objectStream = new ObjectInputStreamClassLoaderAware( byteStream, null ); obj = objectStream.readObject(); if ( obj != null && obj instanceof UDPDiscoveryMessage ) Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/CompressingSerializer.java Sun Apr 27 23:48:21 2014 @@ -28,6 +28,7 @@ import java.io.ObjectOutputStream; import java.io.Serializable; import org.apache.commons.jcs.engine.behavior.IElementSerializer; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; import org.apache.commons.jcs.utils.zip.CompressionUtil; /** @@ -110,7 +111,7 @@ public class CompressingSerializer { ByteArrayInputStream bais = new ByteArrayInputStream( decompressedByteArray ); BufferedInputStream bis = new BufferedInputStream( bais ); - ObjectInputStream ois = new ObjectInputStream( bis ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis, null ); try { Modified: commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java (original) +++ commons/proper/jcs/trunk/src/java/org/apache/commons/jcs/utils/serialization/StandardSerializer.java Sun Apr 27 23:48:21 2014 @@ -19,6 +19,9 @@ package org.apache.commons.jcs.utils.ser * under the License. */ +import org.apache.commons.jcs.engine.behavior.IElementSerializer; +import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware; + import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -27,8 +30,6 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; -import org.apache.commons.jcs.engine.behavior.IElementSerializer; - /** * Performs default serialization and de-serialization. * <p> @@ -76,7 +77,7 @@ public class StandardSerializer { ByteArrayInputStream bais = new ByteArrayInputStream( data ); BufferedInputStream bis = new BufferedInputStream( bais ); - ObjectInputStream ois = new ObjectInputStream( bis ); + ObjectInputStream ois = new ObjectInputStreamClassLoaderAware( bis, null ); try { @SuppressWarnings("unchecked") // Need to cast from Object Modified: commons/proper/jcs/trunk/tck.sh URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/tck.sh?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/tck.sh (original) +++ commons/proper/jcs/trunk/tck.sh Sun Apr 27 23:48:21 2014 @@ -1,3 +1,8 @@ #! /bin/bash -mvn clean -f tck.xml test $@ + +# build [jcs] first +mvn clean install -Dmaven.test.skip=true + +# then run tck against freshly built binaries +mvn clean -f tck.xml test surefire-report:report-only -Dmaven.test.failure.ignore=true $@ Modified: commons/proper/jcs/trunk/tck.xml URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/tck.xml?rev=1590530&r1=1590529&r2=1590530&view=diff ============================================================================== --- commons/proper/jcs/trunk/tck.xml (original) +++ commons/proper/jcs/trunk/tck.xml Sun Apr 27 23:48:21 2014 @@ -11,6 +11,8 @@ -P test-optional-cache -P test-basic-cache + to run from an IDE a JMX test add: + -Dorg.jsr107.tck.management.agentId=MBeanServerJCS -Djavax.management.builder.initial=org.apache.commons.jcs.jcache.jmx.ConfigurableMBeanServerIdBuilder --> <groupId>org.apache.commons</groupId> @@ -110,6 +112,7 @@ <executions> <execution> <id>copy-cache-tests</id> + <phase>generate-test-resources</phase> <goals> <goal>unpack-dependencies</goal> </goals> @@ -123,6 +126,7 @@ </execution> <execution> <id>copy-domain</id> + <phase>generate-test-resources</phase> <goals> <goal>copy</goal> </goals>