Author: hlship
Date: Fri Nov 11 20:08:57 2005
New Revision: 332729

URL: http://svn.apache.org/viewcvs?rev=332729&view=rev
Log:
TAPESTRY-328: When an engine implementation is missing Tapestry does not throw 
an appropriate error

Added:
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFactoryTest.java
      - copied, changed from r332478, 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/TestEngineFactory.java
Removed:
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/TestEngineFactory.java
Modified:
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/EngineFactoryImpl.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplMessages.java
    
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplStrings.properties
    
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFixture.java
    jakarta/tapestry/trunk/status.xml

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/EngineFactoryImpl.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/EngineFactoryImpl.java?rev=332729&r1=332728&r2=332729&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/EngineFactoryImpl.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/EngineFactoryImpl.java
 Fri Nov 11 20:08:57 2005
@@ -18,34 +18,40 @@
 
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.ClassResolver;
+import org.apache.hivemind.ErrorLog;
 import org.apache.tapestry.IEngine;
+import org.apache.tapestry.engine.BaseEngine;
 import org.apache.tapestry.services.EngineFactory;
 import org.apache.tapestry.spec.IApplicationSpecification;
 
 /**
- * Standard implementation of [EMAIL PROTECTED] 
org.apache.tapestry.services.EngineFactory} service.
- * This should do for most purposes, since a major focus of Tapestry 4.0 is to 
no longer
- * require subclassing of [EMAIL PROTECTED] 
org.apache.tapestry.engine.BaseEngine}.
- *
+ * Standard implementation of [EMAIL PROTECTED] 
org.apache.tapestry.services.EngineFactory} service. This
+ * should do for most purposes, since a major focus of Tapestry 4.0 is to no 
longer require
+ * subclassing of [EMAIL PROTECTED] org.apache.tapestry.engine.BaseEngine}.
+ * 
  * @author Howard Lewis Ship
  * @since 4.0
  */
 public class EngineFactoryImpl implements EngineFactory
 {
     private IApplicationSpecification _applicationSpecification;
+
     private String _defaultEngineClassName;
+
     private EngineConstructor _constructor;
+
     private ClassResolver _classResolver;
 
+    private ErrorLog _errorLog;
+
     interface EngineConstructor
     {
         IEngine construct();
     }
 
-
-       // TODO: Create a BaseEngineConstructor that is hardcoded to
-       // instantiate a BaseEngine instance, without using reflection
-       // (for efficiency). 
+    // TODO: Create a BaseEngineConstructor that is hardcoded to
+    // instantiate a BaseEngine instance, without using reflection
+    // (for efficiency).
 
     static class ReflectiveEngineConstructor implements EngineConstructor
     {
@@ -64,9 +70,9 @@
             }
             catch (Exception ex)
             {
-                throw new ApplicationRuntimeException(
-                    ImplMessages.errorInstantiatingEngine(_engineClass, ex),
-                    ex);
+                throw new 
ApplicationRuntimeException(ImplMessages.errorInstantiatingEngine(
+                        _engineClass,
+                        ex), ex);
             }
         }
     }
@@ -75,12 +81,18 @@
     {
         String engineClassName = 
_applicationSpecification.getEngineClassName();
 
-               // TODO: Check in web.xml first.
+        // TODO: Check in web.xml first.
 
         if (engineClassName == null)
             engineClassName = _defaultEngineClassName;
 
-        Class engineClass = _classResolver.findClass(engineClassName);
+        Class engineClass = _classResolver.checkForClass(engineClassName);
+
+        if (engineClass == null)
+        {
+            _errorLog.error(ImplMessages.engineClassNotFound(engineClassName), 
null, null);
+            engineClass = BaseEngine.class;
+        }
 
         _constructor = new ReflectiveEngineConstructor(engineClass);
     }
@@ -107,6 +119,11 @@
     public void setDefaultEngineClassName(String string)
     {
         _defaultEngineClassName = string;
+    }
+
+    public void setErrorLog(ErrorLog errorLog)
+    {
+        _errorLog = errorLog;
     }
 
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplMessages.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplMessages.java?rev=332729&r1=332728&r2=332729&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplMessages.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplMessages.java
 Fri Nov 11 20:08:57 2005
@@ -269,4 +269,9 @@
         return _formatter.format("used-template-parameter-alias", new Object[]
         { HiveMind.getLocationString(token), token.getType(), attributeName, 
parameterName });
     }
+
+    static String engineClassNotFound(String engineClassName)
+    {
+        return _formatter.format("engine-class-not-found", engineClassName);
+    }
 }

Modified: 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplStrings.properties
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplStrings.properties?rev=332729&r1=332728&r2=332729&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplStrings.properties
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/services/impl/ImplStrings.properties
 Fri Nov 11 20:08:57 2005
@@ -60,3 +60,4 @@
 duplicate-infrastructure-contribution=Infrastructure contribution for property 
''{0}'' (mode ''{1}'') conflicts with a prior contribution (at {2}) and has 
been ignored.
 missing-infrastructure-property=Infrastructure property ''{0}'' is not defined.
 used-template-parameter-alias=Parameter {2} (for component {1}, at {0}) was 
bound; this parameter has been deprecated, bind parameter {3} instead.
+engine-class-not-found=Engine class ''{0}'' not found.
\ No newline at end of file

Copied: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFactoryTest.java
 (from r332478, 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/TestEngineFactory.java)
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFactoryTest.java?p2=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFactoryTest.java&p1=jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/TestEngineFactory.java&r1=332478&r2=332729&rev=332729&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/TestEngineFactory.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFactoryTest.java
 Fri Nov 11 20:08:57 2005
@@ -17,13 +17,13 @@
 import java.util.Locale;
 
 import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.ErrorLog;
 import org.apache.hivemind.impl.DefaultClassResolver;
 import org.apache.hivemind.test.HiveMindTestCase;
 import org.apache.tapestry.IEngine;
 import org.apache.tapestry.engine.AbstractEngine;
 import org.apache.tapestry.engine.BaseEngine;
 import org.apache.tapestry.spec.IApplicationSpecification;
-import org.easymock.MockControl;
 
 /**
  * Tests for [EMAIL PROTECTED] 
org.apache.tapestry.services.impl.EngineFactoryImpl}.
@@ -31,17 +31,15 @@
  * @author Howard Lewis Ship
  * @since 4.0
  */
-public class TestEngineFactory extends HiveMindTestCase
+public class EngineFactoryTest extends HiveMindTestCase
 {
     public void testUseDefault()
     {
-        MockControl specControl = newControl(IApplicationSpecification.class);
-        IApplicationSpecification spec = (IApplicationSpecification) 
specControl.getMock();
+        IApplicationSpecification spec = newSpec();
 
         // Training
 
-        spec.getEngineClassName();
-        specControl.setReturnValue(null);
+        trainGetEngineClassName(spec, null);
 
         EngineFactoryImpl f = new EngineFactoryImpl();
 
@@ -61,15 +59,22 @@
         verifyControls();
     }
 
-    public void testDefinedInSpec()
+    private void trainGetEngineClassName(IApplicationSpecification spec, 
String engineClassName)
     {
-        MockControl specControl = newControl(IApplicationSpecification.class);
-        IApplicationSpecification spec = (IApplicationSpecification) 
specControl.getMock();
+        spec.getEngineClassName();
+        setReturnValue(spec, engineClassName);
+    }
 
-        // Training
+    private IApplicationSpecification newSpec()
+    {
+        return (IApplicationSpecification) 
newMock(IApplicationSpecification.class);
+    }
 
-        spec.getEngineClassName();
-        specControl.setReturnValue(EngineFixture.class.getName());
+    public void testDefinedInSpec()
+    {
+        IApplicationSpecification spec = newSpec();
+
+        trainGetEngineClassName(spec, EngineFixture.class.getName());
 
         EngineFactoryImpl f = new EngineFactoryImpl();
 
@@ -90,13 +95,11 @@
 
     public void testUnableToInstantiate()
     {
-        MockControl specControl = newControl(IApplicationSpecification.class);
-        IApplicationSpecification spec = (IApplicationSpecification) 
specControl.getMock();
+        IApplicationSpecification spec = newSpec();
 
         // Training
 
-        spec.getEngineClassName();
-        specControl.setReturnValue(AbstractEngine.class.getName());
+        trainGetEngineClassName(spec, AbstractEngine.class.getName());
 
         EngineFactoryImpl f = new EngineFactoryImpl();
 
@@ -124,30 +127,28 @@
 
     public void testInvalidClass()
     {
-        MockControl specControl = newControl(IApplicationSpecification.class);
-        IApplicationSpecification spec = (IApplicationSpecification) 
specControl.getMock();
+        IApplicationSpecification spec = newSpec();
 
-        // Training
+        trainGetEngineClassName(spec, "foo.XyzzYx");
 
-        spec.getEngineClassName();
-        specControl.setReturnValue("foo.XyzzYx");
+        ErrorLog log = (ErrorLog) newMock(ErrorLog.class);
+
+        log.error("Engine class 'foo.XyzzYx' not found.", null, null);
 
         EngineFactoryImpl f = new EngineFactoryImpl();
 
         f.setApplicationSpecification(spec);
         f.setClassResolver(new DefaultClassResolver());
+        f.setErrorLog(log);
+        f.setDefaultEngineClassName(BaseEngine.class.getName());
 
         replayControls();
 
-        try
-        {
-            f.initializeService();
-            unreachable();
-        }
-        catch (ApplicationRuntimeException ex)
-        {
-            assertExceptionSubstring(ex, "Could not load class foo.XyzzYx");
-        }
+        f.initializeService();
+
+        IEngine result = f.constructNewEngineInstance(Locale.CANADA_FRENCH);
+
+        assertTrue(result instanceof BaseEngine);
 
         verifyControls();
     }

Modified: 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFixture.java
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFixture.java?rev=332729&r1=332728&r2=332729&view=diff
==============================================================================
--- 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFixture.java
 (original)
+++ 
jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/services/impl/EngineFixture.java
 Fri Nov 11 20:08:57 2005
@@ -21,7 +21,7 @@
 import org.apache.tapestry.engine.IPageRecorder;
 
 /**
- * Used by [EMAIL PROTECTED] 
org.apache.tapestry.services.impl.TestEngineFactory}.
+ * Used by [EMAIL PROTECTED] 
org.apache.tapestry.services.impl.EngineFactoryTest}.
  * 
  * @author Howard Lewis Ship
  * @since 4.0

Modified: jakarta/tapestry/trunk/status.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=332729&r1=332728&r2=332729&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Fri Nov 11 20:08:57 2005
@@ -64,6 +64,7 @@
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-359">Localization 
directive cuts trailing space</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-741">PopupLinkRenderer 
overrides wrong method of DefaultLinkRenderer</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-652">Checkbox does not 
support FieldLabel</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-328">When an engine 
implementation is missing Tapestry does not throw an appropriate error</action>
     </release>
     <release version="4.0-beta-12" date="Oct 30 2005">
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-718">Asset injection 
makes assets appear as null inside finishLoad()</action>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to