r687 - in branches/eugene-2.0/eugene/src: main/java/org/nuiton/eugene main/java/org/nuiton/eugene/java main/java/org/nuiton/eugene/models/object/xml test/java/org/nuiton/eugene/java test/java/org/nuiton/eugene/models/object/xml
Author: fdesbois Date: 2009-11-03 12:38:10 +0100 (Tue, 03 Nov 2009) New Revision: 687 Added: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtension.java branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtensionTest.java Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/java/JavaBuilder.java branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/java/JavaBuilderTest.java branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ObjectModelImplTest.java Log: - Ano #118 : Add ExternalCacheExtension to manage external interfaces or superclasses (not existing in model) - Change debug log to trace log for lastModifiedSource - Improve test - Change throw exception when an extension not exist : newInstance Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/ObjectModelGenerator.java 2009-11-03 11:38:10 UTC (rev 687) @@ -201,13 +201,13 @@ File outputFile = getDestinationFile(destDir, filename); if (!getOverwrite() && isNewerThanSource(outputFile)) { - if (log.isDebugEnabled()) { - log.debug("file " + outputFile + " is up-to-date"); + if (log.isTraceEnabled()) { + log.trace("file " + outputFile + " is up-to-date"); } return; } else { - if (!outputFile.exists() && log.isDebugEnabled()) { - log.debug("not up-to-date " + outputFile.lastModified() + if (!outputFile.exists() && log.isTraceEnabled()) { + log.trace("not up-to-date " + outputFile.lastModified() + " <" + outputFile + ">"); } try { Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/java/JavaBuilder.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/java/JavaBuilder.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/java/JavaBuilder.java 2009-11-03 11:38:10 UTC (rev 687) @@ -33,13 +33,13 @@ this.model.setName(modelName); // initialize ObjectModel extension for ImportsManager - try { + //try { this.managers = this.model.getExtension( ImportsManagerExtension.OBJECTMODEL_EXTENSION, ImportsManagerExtension.class); - } catch (IllegalArgumentException eee) { // "imports" not exist + /*} catch (IllegalArgumentException eee) { // "imports" not exist this.managers = new ImportsManagerExtension(); this.model.addExtension(ImportsManagerExtension.OBJECTMODEL_EXTENSION, this.managers); - } + }*/ } public ObjectModel getModel() { Added: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtension.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtension.java (rev 0) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtension.java 2009-11-03 11:38:10 UTC (rev 687) @@ -0,0 +1,73 @@ + +package org.nuiton.eugene.models.object.xml; + +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.GeneratorUtil; + +/** + * ExternalCacheExtension + * + * Created: 2 nov. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class ExternalCacheExtension { + + private static final Log log = LogFactory.getLog(ExternalCacheExtension.class); + + public static final String OBJECTMODEL_EXTENSION = "externalClassifiers"; + + protected Map<String, ObjectModelClassifierImpl> cache; + + public ExternalCacheExtension() { + this.cache = new HashMap<String, ObjectModelClassifierImpl>(); + } + + @SuppressWarnings("unchecked") + public <C extends ObjectModelClassifierImpl> C getCache(ObjectModelImplRef reference, Class<C> classifierClass) + throws ClassCastException, RuntimeException { + ObjectModelClassifierImpl classifier = cache.get(reference.getName()); + C result; + if (classifier != null && !classifierClass.isAssignableFrom(classifier.getClass())) { + throw new ClassCastException("Invalid cast for " + classifierClass.getName()); + } + if (classifier == null) { + try { + result = classifierClass.newInstance(); + addClassifierToCache(reference, result); + if (log.isDebugEnabled()) { + log.debug("Add '" + reference.getName() + "' to external cache"); + } + } catch (Exception eee) { // IllegalAccessException and InstantiationException + throw new RuntimeException("Unable to add new '" + classifierClass.getName() + + "' to cache for '" + reference.getName() + "'", eee); + } + } else { + if (log.isDebugEnabled()) { + log.debug("Get '" + reference.getName() + "' from external cache"); + } + result = (C) classifier; + } + return result; + } + + protected void addClassifierToCache(ObjectModelImplRef reference, ObjectModelClassifierImpl classifier) { + String fqn = reference.getName(); + String packageName = GeneratorUtil.getParentPackageName(fqn); + String name = GeneratorUtil.getClassNameFromQualifiedName(fqn); + classifier.setName(name); + classifier.setPackage(packageName); + classifier.postInit(); // to create qualifiedName + classifier.setExtern(true); + cache.put(reference.getName(), classifier); + } + + +} Property changes on: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtension.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelBuilderHelper.java 2009-11-03 11:38:10 UTC (rev 687) @@ -132,7 +132,7 @@ public static void addSuperclass(ObjectModelClass clazz, String superclassQualifiedName) { ObjectModelClassImpl impl = (ObjectModelClassImpl) clazz; - ObjectModelImplRef superclass = new ObjectModelImplRef(); + ObjectModelImplSuperClassRef superclass = new ObjectModelImplSuperClassRef(); superclass.setName(superclassQualifiedName); impl.addSuperclass(superclass); Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassImpl.java 2009-11-03 11:38:10 UTC (rev 687) @@ -26,10 +26,10 @@ import java.util.List; import java.util.Map; +import org.nuiton.eugene.ObjectModelType; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelClassifier; -import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelOperation; /** @@ -96,9 +96,16 @@ .next(); ObjectModelClass superclass = objectModelImpl.getClass(ref .getName()); + + if (superclass == null) { + ExternalCacheExtension cache = objectModelImpl.getExtension( + ExternalCacheExtension.OBJECTMODEL_EXTENSION, ExternalCacheExtension.class); + + superclass = cache.getCache(ref, ObjectModelClassImpl.class); + } + superclasses.add(superclass); - superclassesDiscriminators.put(superclass, ref - .getDiscriminator()); + superclassesDiscriminators.put(superclass, ref.getDiscriminator()); } } return superclasses; Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelClassifierImpl.java 2009-11-03 11:38:10 UTC (rev 687) @@ -27,6 +27,7 @@ import java.util.Map; import org.nuiton.eugene.GeneratorUtil; +import org.nuiton.eugene.ObjectModelType; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClassifier; import org.nuiton.eugene.models.object.ObjectModelDependency; @@ -134,18 +135,17 @@ if (interfaces == null) { interfaces = new ArrayList<ObjectModelInterface>(); for(ObjectModelImplRef ref : interfacesRefs) { - // QUICK FIX for interface not include in the model (ex : Serializable) + ObjectModelInterfaceImpl interfacez = (ObjectModelInterfaceImpl)objectModelImpl.getInterface(ref.getName()); - if (interfacez == null) { - // TODO avoid multiple creation -> put new object in cache (or extension) - interfacez = new ObjectModelInterfaceImpl(); - String fqn = ref.getName(); - String packageName = GeneratorUtil.getParentPackageName(fqn); - String name = GeneratorUtil.getClassNameFromQualifiedName(fqn); - interfacez.setName(name); - interfacez.setPackage(packageName); - interfacez.postInit(); // to create qualifiedName + + if (interfacez == null) { // Interface not exist in model + + ExternalCacheExtension cache = objectModelImpl.getExtension( + ExternalCacheExtension.OBJECTMODEL_EXTENSION, ExternalCacheExtension.class); + + // get external interface from cache (or create it) + interfacez = cache.getCache(ref, ObjectModelInterfaceImpl.class); } interfaces.add(interfacez); } Modified: branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java =================================================================== --- branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/main/java/org/nuiton/eugene/models/object/xml/ObjectModelImpl.java 2009-11-03 11:38:10 UTC (rev 687) @@ -25,7 +25,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.ImportsManager; import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; @@ -182,28 +181,18 @@ * @return the ObjectModelClass of the found class, or null if the model * contains no class for this qualified name. */ + @Override public ObjectModelClass getClass(String qualifiedClassName) { if (qualifiedClassName == null) { return null; } if (!hasClass(qualifiedClassName)) { - //FIXME Decide if this is a good idea if (log.isWarnEnabled()) { log.warn("Class " + qualifiedClassName + " not found in model"); - log.warn("You may forgot to declare for good an external class ?"); - - log.warn("Generating fake class"); } - ObjectModelClassImpl result = new ObjectModelClassImpl(); - int index = qualifiedClassName.lastIndexOf("."); - if (index != -1) { - result.setPackage(qualifiedClassName.substring(0, index)); - } - result.setName(qualifiedClassName.substring(index + 1)); - result.postInit(); - return result; + return null; } - return (ObjectModelClass) classes.get(qualifiedClassName); + return classes.get(qualifiedClassName); } /* @@ -478,36 +467,34 @@ } /** - * Add a new extension to the model. - * This method overwrite the value object if the reference already exist. - * @param <O> object type - * @param reference unique key to reference the extension in the model - * @param extension object value corresponding to the extension - */ - public <O> void addExtension(String reference, O extension) { - extensions.put(reference, extension); - } - - /** - * Get the extension associated to the reference (unique) + * Get the extension associated to the reference (unique). Create it if not exist. * @param <O> object type returned * @param reference unique corresponding to the extension to get * @param extensionClass class of the extension * @return the object value for the extension * @throws ClassCastException when extensionClass is not valid - * @throws IllegalArgumentException for non existing extension with reference + * @throws RuntimeException when instantiation problem to create new extension */ @Override @SuppressWarnings("unchecked") public <O> O getExtension(String reference, Class<O> extensionClass) - throws ClassCastException, IllegalArgumentException { - Object result = extensions.get(reference); - if (result == null) { - throw new IllegalArgumentException("Extension '" + reference + "' is not defined in model '" + getName() + "'"); - } - if (!extensionClass.isAssignableFrom(result.getClass())) { + throws ClassCastException, RuntimeException { + Object object = extensions.get(reference); + O result; + if (object != null && !extensionClass.isAssignableFrom(object.getClass())) { throw new ClassCastException("Invalid cast for " + extensionClass.getName()); } - return (O) result; + if (object == null) { + try { + result = extensionClass.newInstance(); + } catch (Exception eee) { // IllegalAccessException and InstantiationException + throw new RuntimeException("Unable to create new extension '" +extensionClass.getName() + + "' for '" + reference + "'", eee); + } + extensions.put(reference, result); + } else { + result = (O)object; + } + return result; } } Modified: branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/java/JavaBuilderTest.java =================================================================== --- branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/java/JavaBuilderTest.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/java/JavaBuilderTest.java 2009-11-03 11:38:10 UTC (rev 687) @@ -124,24 +124,24 @@ assertTrue(clazz.isAbstract()); } -// /** -// * Test of setSuperClass method, of class JavaBuilder. -// */ -// @Test -// public void testSetSuperClass() { -// System.out.println("setSuperClass"); -// JavaBuilder builder = new JavaBuilder("TestModel"); -// -// ObjectModelClass clazz = builder.createClass("Person", "org.chorem.bonzoms"); -// -// String superclassQualifiedName = "org.chorem.bonzoms.Party"; -// -// //builder.setSuperClass(clazz, superclassQualifiedName); -// //assertNotNull(clazz.getSuperclasses()); -// //assertEquals(clazz.getSuperclasses().size(), 1); -// } -// /** + * Test of setSuperClass method, of class JavaBuilder. + */ + @Test + public void testSetSuperClass() { + System.out.println("setSuperClass"); + JavaBuilder builder = new JavaBuilder("TestModel"); + + ObjectModelClass clazz = builder.createClass("Person", "org.chorem.bonzoms"); + + String superclassQualifiedName = "org.chorem.bonzoms.Party"; + + builder.setSuperClass(clazz, superclassQualifiedName); + assertNotNull(clazz.getSuperclasses()); + assertEquals(clazz.getSuperclasses().size(), 1); + } + + /** * Test of addInterface method, of class JavaBuilder. * Prerequisite : existing classifier in model. * - Add an interface not included in the model to a classifier. Added: branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtensionTest.java =================================================================== --- branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtensionTest.java (rev 0) +++ branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtensionTest.java 2009-11-03 11:38:10 UTC (rev 687) @@ -0,0 +1,105 @@ + +package org.nuiton.eugene.models.object.xml; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.nuiton.eugene.models.object.ObjectModelInterface; +import static org.junit.Assert.*; + +/** + * ExternalCacheExtensionTest + * + * Created: 2 nov. 2009 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class ExternalCacheExtensionTest { + + public ExternalCacheExtensionTest() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Test of getCache method, of class ExternalCacheExtension. + * Prerequisite : Existing model + * - Add an external interface to cache + * - No double add, get the existing one + */ + @Test + public void testGetCache() { + System.out.println("getCache"); + + ObjectModelImpl model = new ObjectModelImpl(); + model.setName("TestModel"); + + ObjectModelImplRef refInterface = new ObjectModelImplRef(); + refInterface.setName("java.io.Serializable"); + + // Creation if not exist + ExternalCacheExtension cache = + model.getExtension(ExternalCacheExtension.OBJECTMODEL_EXTENSION, ExternalCacheExtension.class); + + ObjectModelInterface interfacez = + cache.getCache(refInterface, ObjectModelInterfaceImpl.class); + + assertNotNull(interfacez); + + ObjectModelInterface interfacez2 = + cache.getCache(refInterface, ObjectModelInterfaceImpl.class); + + assertEquals(interfacez, interfacez2); + } + + /** + * Test of addClassifierToCache method, of class ExternalCacheExtension. + * Prerequisite : Existing model + * - Add a classifier which is an interface + * - The interface getting is the same as the first added classifier + */ + @Test + public void testAddClassifierToCache() { + System.out.println("addClassifierToCache"); + + ObjectModelImpl model = new ObjectModelImpl(); + model.setName("TestModel"); + + ObjectModelImplRef refInterface = new ObjectModelImplRef(); + refInterface.setName("java.io.Serializable"); + + ObjectModelClassifierImpl classifier = new ObjectModelInterfaceImpl(); + + ExternalCacheExtension cache = + model.getExtension(ExternalCacheExtension.OBJECTMODEL_EXTENSION, ExternalCacheExtension.class); + + cache.addClassifierToCache(refInterface, classifier); + + assertEquals(classifier.getQualifiedName(), "java.io.Serializable"); + + ObjectModelInterfaceImpl interfacez = cache.getCache(refInterface, ObjectModelInterfaceImpl.class); + + assertEquals(interfacez, classifier); + } + +} \ No newline at end of file Property changes on: branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ExternalCacheExtensionTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Modified: branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ObjectModelImplTest.java =================================================================== --- branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ObjectModelImplTest.java 2009-11-02 18:17:52 UTC (rev 686) +++ branches/eugene-2.0/eugene/src/test/java/org/nuiton/eugene/models/object/xml/ObjectModelImplTest.java 2009-11-03 11:38:10 UTC (rev 687) @@ -1,8 +1,6 @@ package org.nuiton.eugene.models.object.xml; -import java.util.HashMap; -import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; @@ -10,7 +8,6 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.nuiton.eugene.ImportsManager; import org.nuiton.eugene.java.ImportsManagerExtension; import static org.junit.Assert.*; @@ -337,59 +334,27 @@ // } /** - * Test of addExtension method, of class ObjectModelImpl. - * - Ajout ImportsManager extension : Map<String, ImportsManager> - */ - @Test - public void testAddExtension() { - System.out.println("addExtension"); - - ObjectModelImpl model = new ObjectModelImpl(); - - ImportsManagerExtension extension = new ImportsManagerExtension(); - - model.addExtension(ImportsManagerExtension.OBJECTMODEL_EXTENSION, extension); - - ImportsManagerExtension result = - model.getExtension(ImportsManagerExtension.OBJECTMODEL_EXTENSION, ImportsManagerExtension.class); - - assertNotNull(result); - } - - /** * Test of getExtension method, of class ObjectModelImpl. - * - Get an existing importsManager from the ObjectModel extension "imports" - * - IllegalArgumentException for non existing extension + * - Create and get ImportsManagerExtension + * - No double creation */ @Test public void testGetExtension() { System.out.println("getExtension"); - + ObjectModelImpl model = new ObjectModelImpl(); model.setName("TestModel"); - ObjectModelClassImpl classifier = new ObjectModelClassImpl(); - classifier.setName("Person"); - classifier.setPackage("org.chorem.bonzoms"); - model.addClass(classifier); - - ImportsManagerExtension extension = new ImportsManagerExtension(); - - extension.getManager(classifier); // creation if not exist - - model.addExtension(ImportsManagerExtension.OBJECTMODEL_EXTENSION, extension); - + // Creation if not exist ImportsManagerExtension result = model.getExtension(ImportsManagerExtension.OBJECTMODEL_EXTENSION, ImportsManagerExtension.class); - assertNotNull(result.getImports(classifier)); + assertNotNull(result); - try { - String unknownExtension = - model.getExtension("unknown", String.class); - } catch (IllegalArgumentException eee) { - log.debug("unknown extension", eee); - } + ImportsManagerExtension result2 = + model.getExtension(ImportsManagerExtension.OBJECTMODEL_EXTENSION, ImportsManagerExtension.class); + + assertEquals(result, result2); } } \ No newline at end of file
participants (1)
-
fdesbois@users.nuiton.org