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]