Author: hlship
Date: Mon Jan 29 09:32:47 2007
New Revision: 501121
URL: http://svn.apache.org/viewvc?view=rev&rev=501121
Log:
Use case-insensitivity with blocks (within component templates).
Add case-insensitive matching for component events (caseless matching against
the event type and the component id).
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StructureMessages.java
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentEvent.java
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/structure/StructureStrings.properties
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
Mon Jan 29 09:32:47 2007
@@ -17,6 +17,8 @@
import java.util.Locale;
import org.apache.commons.logging.Log;
+import org.apache.tapestry.annotations.OnEvent;
+import org.apache.tapestry.internal.services.OnEventWorker;
import org.apache.tapestry.internal.structure.ComponentPageElement;
import org.apache.tapestry.model.ComponentModel;
import org.apache.tapestry.services.ComponentSource;
@@ -76,6 +78,8 @@
* component, then its container, and so on. When a matching event handler
method is located, it
* is invoked. If the method returns a value, the value is passed to the
handler (if handler is
* null, then it is an error for a method to return a non-null vavlue).
+ * <p>
+ * Resolution of event type to event handler methods is case insensitive.
*
* @param eventType
* event type (as determined from the request, or otherwise by
design)
@@ -88,6 +92,8 @@
* that does not support return values from event handler
methods
* @return true if any event handler was invoked (even if no event handler
method returns a
* non-null value)
+ * @see OnEventWorker
+ * @see OnEvent
*/
boolean triggerEvent(String eventType, Object[] context,
ComponentEventHandler handler);
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentEventImpl.java
Mon Jan 29 09:32:47 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -67,7 +67,7 @@
{
for (String id : componentId)
{
- if (id.equals(_originatingComponentId))
+ if (id.equalsIgnoreCase(_originatingComponentId))
return true;
}
@@ -78,7 +78,7 @@
{
for (String type : eventTypes)
{
- if (type.equals(_eventType))
+ if (type.equalsIgnoreCase(_eventType))
return true;
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/OnEventWorker.java
Mon Jan 29 09:32:47 2007
@@ -17,7 +17,6 @@
import java.util.List;
import org.apache.tapestry.annotations.OnEvent;
-import org.apache.tapestry.internal.TapestryUtils;
import org.apache.tapestry.ioc.util.BodyBuilder;
import org.apache.tapestry.model.MutableComponentModel;
import org.apache.tapestry.runtime.Component;
@@ -157,7 +156,7 @@
String componentId = name.substring(fromx + 4);
return new String[]
- { TapestryUtils.decapitalize(componentId) };
+ { componentId };
}
private String[] extractEventTypes(MethodSignature method, OnEvent
annotation)
@@ -179,7 +178,7 @@
return _empty;
return new String[]
- { TapestryUtils.decapitalize(eventName) };
+ { eventName };
}
private void buildMethodParameters(BodyBuilder builder, MethodSignature
method)
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
Mon Jan 29 09:32:47 2007
@@ -16,6 +16,7 @@
import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newList;
import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
+import static org.apache.tapestry.ioc.internal.util.Defense.notBlank;
import java.util.Iterator;
import java.util.List;
@@ -1048,7 +1049,9 @@
public Block getBlock(String id)
{
- Block result = InternalUtils.get(_blocks, id);
+ notBlank(id, "id");
+
+ Block result = InternalUtils.get(_blocks, id.toLowerCase());
if (result == null)
throw new
BlockNotFoundException(StructureMessages.blockNotFound(_completeId, id),
@@ -1062,9 +1065,13 @@
if (_blocks == null)
_blocks = newMap();
- // TODO: Check for duplicates.
+ String caselessId = blockId.toLowerCase();
+
+ if (_blocks.containsKey(caselessId))
+ throw new TapestryException(StructureMessages.duplicateBlock(this,
blockId), block,
+ null);
- _blocks.put(blockId, block);
+ _blocks.put(caselessId, block);
}
public String getDefaultBindingPrefix(String parameterName)
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StructureMessages.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StructureMessages.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StructureMessages.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/StructureMessages.java
Mon Jan 29 09:32:47 2007
@@ -90,4 +90,9 @@
{
return MESSAGES.format("duplicate-child-component",
container.getCompleteId(), childId);
}
+
+ static String duplicateBlock(ComponentPageElement component, String
blockId)
+ {
+ return MESSAGES.format("duplicate-block", component.getCompleteId(),
blockId);
+ }
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentEvent.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentEvent.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentEvent.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/runtime/ComponentEvent.java
Mon Jan 29 09:32:47 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -29,17 +29,18 @@
public interface ComponentEvent extends Event
{
/**
- * Returns true if the component event's type matches
+ * Returns true if the component event's type matches any of the provided
values. Comparison is
+ * caseless.
*
* @param eventTypes
- * @return
+ * @return true if there is any match
*/
boolean matchesByEventType(String[] eventTypes);
/**
* Returns true if the originating component matches any of the components
identified by their
* ids. This filter is only relevent in the immediate container of the
originating component (it
- * will never match at higher levels).
+ * will never match at higher levels). Comparison is caseless.
*/
boolean matchesByComponentId(ComponentResources resources, String[]
componentId);
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/structure/StructureStrings.properties
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/structure/StructureStrings.properties?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/structure/StructureStrings.properties
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/structure/StructureStrings.properties
Mon Jan 29 09:32:47 2007
@@ -30,4 +30,6 @@
page-is-dirty=Page %s was stored into the page pool in a dirty state. This
should never happen, \
and may indicate that a reference to the page (or component within the page)
was retained past the end of a request.
duplicate-child-component=Component %s already contains a child component with
id '%s'. \
- Embedded component ids must be unique (excluding case, which is ignored).
\ No newline at end of file
+ Embedded component ids must be unique (excluding case, which is ignored).
+duplicate-block=Component %s already contains a block with id '%s'. \
+ Block ids must be unique (excluding case, which is ignored).
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/ComponentEventImplTest.java
Mon Jan 29 09:32:47 2007
@@ -58,6 +58,22 @@
}
@Test
+ public void event_type_match_is_case_insensitive()
+ {
+ ComponentEventHandler handler = newComponentEventHandler();
+
+ replay();
+
+ ComponentEvent event = new ComponentEventImpl("eventType", "someId",
null, handler,
+ _coercer);
+
+ assertTrue(event.matchesByEventType(new String[]
+ { "EVENTTYPE" }));
+
+ verify();
+ }
+
+ @Test
public void matches_on_component_id()
{
ComponentEventHandler handler = newComponentEventHandler();
@@ -70,6 +86,21 @@
{ "foo", "someId", "bar" }));
assertFalse(event.matchesByComponentId(null, new String[]
{ "foo", "bar" }));
+
+ verify();
+ }
+
+ @Test
+ public void component_id_matches_are_case_insensitive()
+ {
+ ComponentEventHandler handler = newComponentEventHandler();
+
+ replay();
+ ComponentEvent event = new ComponentEventImpl("eventType", "someId",
null, handler,
+ _coercer);
+
+ assertTrue(event.matchesByComponentId(null, new String[]
+ { "SOMEID" }));
verify();
}
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/OnEventWorkerTest.java
Mon Jan 29 09:32:47 2007
@@ -154,7 +154,7 @@
train_getMethodAnnotation(ct, signature, OnEvent.class, null);
- train_addInjectedField(ct, "eventTypes", "_v", "submit");
+ train_addInjectedField(ct, "eventTypes", "_v", "Submit");
train_getClassName(ct, "foo.Bar");
@@ -235,7 +235,7 @@
train_getMethodAnnotation(ct, signature, OnEvent.class, null);
- train_addInjectedField(ct, "componentIds", "_ids", "zork");
+ train_addInjectedField(ct, "componentIds", "_ids", "Zork");
train_getResourcesFieldName(ct, "_res");
Modified:
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java?view=diff&rev=501121&r1=501120&r2=501121
==============================================================================
---
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
(original)
+++
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/structure/ComponentPageElementImplTest.java
Mon Jan 29 09:32:47 2007
@@ -93,6 +93,8 @@
cpe.addBlock("known", block);
assertSame(resources.getBlock("known"), block);
+ // Caseless check
+ assertSame(resources.getBlock("KNOWN"), block);
verify();
}
@@ -123,6 +125,39 @@
assertFalse(resources.isBound("fred"));
assertTrue(resources.isBound("barney"));
+
+ verify();
+ }
+
+ @Test
+ public void duplicate_block_id()
+ {
+ Page page = newPage(PAGE_NAME);
+ Component component = newComponent();
+ ComponentModel model = newComponentModel();
+ TypeCoercer coercer = newTypeCoercer();
+ Block block1 = newBlock();
+ Block block2 = newBlock();
+
+ Instantiator ins = newInstantiator(component, model);
+
+ replay();
+
+ ComponentPageElement cpe = new ComponentPageElementImpl(page, ins,
coercer, null);
+
+ cpe.addBlock("myblock", block1);
+
+ try
+ {
+ cpe.addBlock("MyBlock", block2);
+ unreachable();
+ }
+ catch (TapestryException ex)
+ {
+ assertEquals(
+ ex.getMessage(),
+ "Component org.test.pages.Foo already contains a block
with id \'MyBlock\'. Block ids must be unique (excluding case, which is
ignored).");
+ }
verify();
}