Author: doogie
Date: Sun Mar 14 03:57:12 2010 New Revision: 922758 URL: http://svn.apache.org/viewvc?rev=922758&view=rev Log: Helper wrapper to protect against objects that have some kind of timestamp checking. Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/GeneratedResult.java ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLCachedObject.java ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/TTLCachedObjectTest.java Modified: ofbiz/trunk/framework/base/build.xml Modified: ofbiz/trunk/framework/base/build.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/build.xml?rev=922758&r1=922757&r2=922758&view=diff ============================================================================== --- ofbiz/trunk/framework/base/build.xml (original) +++ ofbiz/trunk/framework/base/build.xml Sun Mar 14 03:57:12 2010 @@ -56,6 +56,7 @@ under the License. <file name="org/ofbiz/base/util/collections/test/GenericMapTest.java"/> <file name="org/ofbiz/base/concurrent/test/SyncTTLObjectTest.java"/> <file name="org/ofbiz/base/concurrent/test/AsyncTTLObjectTest.java"/> + <file name="org/ofbiz/base/concurrent/test/TTLCachedObjectTest.java"/> </filelist> <target name="init"> Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/GeneratedResult.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/GeneratedResult.java?rev=922758&view=auto ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/GeneratedResult.java (added) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/GeneratedResult.java Sun Mar 14 03:57:12 2010 @@ -0,0 +1,31 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *******************************************************************************/ +package org.ofbiz.base.concurrent; + +import org.ofbiz.base.util.ObjectWrapper; + +public final class GeneratedResult<T> { + public final long lastModifiedTime; + public final T object; + + public GeneratedResult(long lastModifiedTime, T object) { + this.lastModifiedTime = lastModifiedTime; + this.object = object; + } +} Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLCachedObject.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLCachedObject.java?rev=922758&view=auto ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLCachedObject.java (added) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/TTLCachedObject.java Sun Mar 14 03:57:12 2010 @@ -0,0 +1,49 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *******************************************************************************/ +package org.ofbiz.base.concurrent; + +public abstract class TTLCachedObject<T> extends TTLObject<T> { + public static final long NOT_EXISTANT_TIMESTAMP = Long.MIN_VALUE; + public static final long FORCE_REGEN = Long.MIN_VALUE + 1; + + protected long lastModifiedTime = NOT_EXISTANT_TIMESTAMP; + + public long getTimestamp() throws ObjectException { + getObject(); + return lastModifiedTime; + } + + protected T load(T old, int serial) throws Exception { + long timestamp = getTimestamp(old); + if (lastModifiedTime != timestamp) { + if (timestamp != NOT_EXISTANT_TIMESTAMP) { + GeneratedResult<T> result = generate(old, serial); + lastModifiedTime = result.lastModifiedTime; + return result.object; + } else { + lastModifiedTime = NOT_EXISTANT_TIMESTAMP; + return getInitial(); + } + } + return old; + } + + protected abstract GeneratedResult<T> generate(T old, int serial) throws Exception; + protected abstract long getTimestamp(T old) throws Exception; +} Added: ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/TTLCachedObjectTest.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/TTLCachedObjectTest.java?rev=922758&view=auto ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/TTLCachedObjectTest.java (added) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/concurrent/test/TTLCachedObjectTest.java Sun Mar 14 03:57:12 2010 @@ -0,0 +1,72 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *******************************************************************************/ +package org.ofbiz.base.concurrent.test; + +import org.ofbiz.base.concurrent.GeneratedResult; +import org.ofbiz.base.concurrent.TTLCachedObject; +import org.ofbiz.base.concurrent.TTLObject; + +public class TTLCachedObjectTest extends TTLObjectTest { + static { + TTLObject.setDefaultTTLForClass(TTLCachedObjectTestTTLObject.class, 100); + } + + public TTLCachedObjectTest(String name) { + super(name, true); + } + + protected final class TTLCachedObjectTestTTLObject extends TTLCachedObject<String> { + protected long dataTimestamp = NOT_EXISTANT_TIMESTAMP; + protected String data = "first"; + + protected long getTimestamp(String old) throws Exception { + return dataTimestamp; + } + + protected GeneratedResult<String> generate(String old, int serial) throws Exception { + return new GeneratedResult<String>(dataTimestamp, data); + } + } + + public void testTTLCachedObject() throws Exception { + TTLCachedObjectTestTTLObject object = new TTLCachedObjectTestTTLObject(); + assertNull("initial non-existant value", object.getObject()); + assertEquals("initial non-existant timestamp", TTLCachedObject.NOT_EXISTANT_TIMESTAMP, object.getTimestamp()); + object.dataTimestamp = 1; + assertNull("initial no-refresh value", object.getObject()); + assertEquals("initial no-refresh timestamp", TTLCachedObject.NOT_EXISTANT_TIMESTAMP, object.getTimestamp()); + object.refresh(); + assertEquals("first value", "first", object.getObject()); + assertEquals("first timestamp", 1, object.getTimestamp()); + object.data = "second"; + object.refresh(); + assertEquals("not-modified value", "first", object.getObject()); + assertEquals("not-modified timestamp", 1, object.getTimestamp()); + object.dataTimestamp = 2; + assertEquals("cached modified value", "first", object.getObject()); + assertEquals("cached modified timestamp", 1, object.getTimestamp()); + object.refresh(); + assertEquals("refresh second value", "second", object.getObject()); + assertEquals("refresh second timestamp", 2, object.getTimestamp()); + object.dataTimestamp = TTLCachedObject.NOT_EXISTANT_TIMESTAMP; + object.refresh(); + assertNull("refresh non-existant value", object.getObject()); + assertEquals("refresh non-existant timestamp", TTLCachedObject.NOT_EXISTANT_TIMESTAMP, object.getTimestamp()); + } +} |
Free forum by Nabble | Edit this page |