diff options
Diffstat (limited to 'src/test/java/com')
| -rw-r--r-- | src/test/java/com/amazon/carbonado/repo/toy/ToyStorableGenerator.java | 143 | ||||
| -rw-r--r-- | src/test/java/com/amazon/carbonado/repo/toy/ToyStorage.java | 18 |
2 files changed, 13 insertions, 148 deletions
diff --git a/src/test/java/com/amazon/carbonado/repo/toy/ToyStorableGenerator.java b/src/test/java/com/amazon/carbonado/repo/toy/ToyStorableGenerator.java deleted file mode 100644 index 8ab95f6..0000000 --- a/src/test/java/com/amazon/carbonado/repo/toy/ToyStorableGenerator.java +++ /dev/null @@ -1,143 +0,0 @@ -/*
- * Copyright 2006 Amazon Technologies, Inc. or its affiliates.
- * Amazon, Amazon.com and Carbonado are trademarks or registered trademarks
- * of Amazon Technologies, Inc. or its affiliates. All rights reserved.
- *
- * Licensed 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 com.amazon.carbonado.repo.toy;
-
-import java.util.EnumSet;
-import java.util.Map;
-
-import org.cojen.classfile.ClassFile;
-import org.cojen.classfile.CodeBuilder;
-import org.cojen.classfile.MethodInfo;
-import org.cojen.classfile.Modifiers;
-import org.cojen.classfile.TypeDesc;
-
-import org.cojen.util.ClassInjector;
-import org.cojen.util.SoftValuedHashMap;
-
-import com.amazon.carbonado.Storable;
-import com.amazon.carbonado.SupportException;
-import com.amazon.carbonado.Trigger;
-
-import com.amazon.carbonado.gen.MasterFeature;
-import com.amazon.carbonado.gen.MasterStorableGenerator;
-import com.amazon.carbonado.gen.MasterSupport;
-import com.amazon.carbonado.gen.StorableGenerator;
-import com.amazon.carbonado.gen.TriggerSupport;
-
-/**
- *
- *
- * @author Brian S O'Neill
- */
-public class ToyStorableGenerator<S extends Storable> {
- private static final Map<Class, Class> cCache;
-
- static {
- cCache = new SoftValuedHashMap();
- }
-
- /**
- * Generated class has a constructor that accepts a ToyStorage instance.
- */
- public static <S extends Storable> Class<? extends S> getGeneratedClass(Class<S> type)
- throws SupportException
- {
- synchronized (cCache) {
- Class<? extends S> generatedClass = (Class<? extends S>) cCache.get(type);
- if (generatedClass != null) {
- return generatedClass;
- }
- generatedClass = new ToyStorableGenerator<S>(type).generateAndInjectClass();
- cCache.put(type, generatedClass);
- return generatedClass;
- }
- }
-
- private final Class<S> mStorableType;
-
- private final ClassInjector mClassInjector;
- private final ClassFile mClassFile;
-
- private ToyStorableGenerator(Class<S> type) throws SupportException {
- mStorableType = type;
-
- EnumSet<MasterFeature> features = EnumSet
- .of(MasterFeature.VERSIONING, MasterFeature.INSERT_SEQUENCES);
-
- final Class<? extends S> abstractClass =
- MasterStorableGenerator.getAbstractClass(mStorableType, features);
-
- mClassInjector = ClassInjector.create(mStorableType.getName(),
- abstractClass.getClassLoader());
-
- mClassFile = new ClassFile(mClassInjector.getClassName(), abstractClass);
- mClassFile.markSynthetic();
- mClassFile.setSourceFile(ToyStorableGenerator.class.getName());
- mClassFile.setTarget("1.5");
- }
-
- private Class<? extends S> generateAndInjectClass() {
- TypeDesc masterSupportType = TypeDesc.forClass(MasterSupport.class);
- TypeDesc toyStorageType = TypeDesc.forClass(ToyStorage.class);
-
- // Add constructor that accepts a ToyStorage.
- {
- TypeDesc[] params = {toyStorageType};
- MethodInfo mi = mClassFile.addConstructor(Modifiers.PUBLIC, params);
- CodeBuilder b = new CodeBuilder(mi);
- b.loadThis();
- b.loadLocal(b.getParameter(0));
- b.invokeSuperConstructor(new TypeDesc[] {masterSupportType});
- b.returnVoid();
- }
-
- // Implement abstract methods which all delegate to ToyStorage instance.
-
- generateDelegatedMethod
- (MasterStorableGenerator.DO_TRY_LOAD_MASTER_METHOD_NAME, "doTryLoad");
- generateDelegatedMethod
- (MasterStorableGenerator.DO_TRY_INSERT_MASTER_METHOD_NAME, "doTryInsert");
- generateDelegatedMethod
- (MasterStorableGenerator.DO_TRY_UPDATE_MASTER_METHOD_NAME, "doTryUpdate");
- generateDelegatedMethod
- (MasterStorableGenerator.DO_TRY_DELETE_MASTER_METHOD_NAME, "doTryDelete");
-
- Class<? extends S> generatedClass = mClassInjector.defineClass(mClassFile);
-
- return generatedClass;
- }
-
- private void generateDelegatedMethod(String masterMethodName, String supportMethodName) {
- TypeDesc triggerSupportType = TypeDesc.forClass(TriggerSupport.class);
- TypeDesc toyStorageType = TypeDesc.forClass(ToyStorage.class);
-
- TypeDesc[] storableParam = {TypeDesc.forClass(Storable.class)};
-
- MethodInfo mi = mClassFile.addMethod
- (Modifiers.PROTECTED, masterMethodName, TypeDesc.BOOLEAN, null);
- CodeBuilder b = new CodeBuilder(mi);
-
- b.loadThis();
- b.loadField(StorableGenerator.SUPPORT_FIELD_NAME, triggerSupportType);
- b.checkCast(toyStorageType);
- b.loadThis();
- b.invokeVirtual(toyStorageType, supportMethodName, TypeDesc.BOOLEAN, storableParam);
- b.returnValue(TypeDesc.BOOLEAN);
- }
-}
diff --git a/src/test/java/com/amazon/carbonado/repo/toy/ToyStorage.java b/src/test/java/com/amazon/carbonado/repo/toy/ToyStorage.java index ec03fad..b37e685 100644 --- a/src/test/java/com/amazon/carbonado/repo/toy/ToyStorage.java +++ b/src/test/java/com/amazon/carbonado/repo/toy/ToyStorage.java @@ -19,6 +19,7 @@ package com.amazon.carbonado.repo.toy;
import java.util.Collection;
+import java.util.EnumSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -39,7 +40,9 @@ import com.amazon.carbonado.Trigger; import com.amazon.carbonado.sequence.SequenceValueProducer;
-import com.amazon.carbonado.gen.MasterSupport;
+import com.amazon.carbonado.gen.DelegateStorableGenerator;
+import com.amazon.carbonado.gen.DelegateSupport;
+import com.amazon.carbonado.gen.MasterFeature;
import com.amazon.carbonado.util.QuickConstructorGenerator;
@@ -63,7 +66,7 @@ import com.amazon.carbonado.qe.StandardQuery; * @author Brian S O'Neill
*/
public class ToyStorage<S extends Storable>
- implements Storage<S>, MasterSupport<S>, QueryFactory<S>, QueryExecutorFactory<S>
+ implements Storage<S>, DelegateSupport<S>, QueryFactory<S>, QueryExecutorFactory<S>
{
final ToyRepository mRepo;
final Class<S> mType;
@@ -78,9 +81,14 @@ public class ToyStorage<S extends Storable> mRepo = repo;
mType = type;
- Class<? extends S> generatedStorableClass = ToyStorableGenerator.getGeneratedClass(type);
+ EnumSet<MasterFeature> features = EnumSet
+ .of(MasterFeature.VERSIONING, MasterFeature.INSERT_SEQUENCES);
+
+ Class<? extends S> delegateStorableClass =
+ DelegateStorableGenerator.getDelegateClass(type, features);
+
mInstanceFactory = QuickConstructorGenerator
- .getInstance(generatedStorableClass, InstanceFactory.class);
+ .getInstance(delegateStorableClass, InstanceFactory.class);
mData = new LinkedList<S>();
mDataLock = new ReentrantLock();
@@ -255,7 +263,7 @@ public class ToyStorage<S extends Storable> }
public static interface InstanceFactory {
- Storable instantiate(ToyStorage storage);
+ Storable instantiate(DelegateSupport support);
}
private class ToyQuery extends StandardQuery<S> {
|
