From 1f8ea9393cbb1540c416696780b80875e3f97dd8 Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Sat, 26 Jan 2008 22:59:11 +0000 Subject: Added DelegateStorableGenerator. --- .../carbonado/repo/toy/ToyStorableGenerator.java | 143 --------------------- .../com/amazon/carbonado/repo/toy/ToyStorage.java | 18 ++- 2 files changed, 13 insertions(+), 148 deletions(-) delete mode 100644 src/test/java/com/amazon/carbonado/repo/toy/ToyStorableGenerator.java (limited to 'src/test') 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 { - private static final Map cCache; - - static { - cCache = new SoftValuedHashMap(); - } - - /** - * Generated class has a constructor that accepts a ToyStorage instance. - */ - public static Class getGeneratedClass(Class type) - throws SupportException - { - synchronized (cCache) { - Class generatedClass = (Class) cCache.get(type); - if (generatedClass != null) { - return generatedClass; - } - generatedClass = new ToyStorableGenerator(type).generateAndInjectClass(); - cCache.put(type, generatedClass); - return generatedClass; - } - } - - private final Class mStorableType; - - private final ClassInjector mClassInjector; - private final ClassFile mClassFile; - - private ToyStorableGenerator(Class type) throws SupportException { - mStorableType = type; - - EnumSet features = EnumSet - .of(MasterFeature.VERSIONING, MasterFeature.INSERT_SEQUENCES); - - final Class 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 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 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 - implements Storage, MasterSupport, QueryFactory, QueryExecutorFactory + implements Storage, DelegateSupport, QueryFactory, QueryExecutorFactory { final ToyRepository mRepo; final Class mType; @@ -78,9 +81,14 @@ public class ToyStorage mRepo = repo; mType = type; - Class generatedStorableClass = ToyStorableGenerator.getGeneratedClass(type); + EnumSet features = EnumSet + .of(MasterFeature.VERSIONING, MasterFeature.INSERT_SEQUENCES); + + Class delegateStorableClass = + DelegateStorableGenerator.getDelegateClass(type, features); + mInstanceFactory = QuickConstructorGenerator - .getInstance(generatedStorableClass, InstanceFactory.class); + .getInstance(delegateStorableClass, InstanceFactory.class); mData = new LinkedList(); mDataLock = new ReentrantLock(); @@ -255,7 +263,7 @@ public class ToyStorage } public static interface InstanceFactory { - Storable instantiate(ToyStorage storage); + Storable instantiate(DelegateSupport support); } private class ToyQuery extends StandardQuery { -- cgit v1.2.3