You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2007/05/13 20:30:05 UTC
svn commit: r537633 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry/annotations/
main/java/org/apache/tapestry/internal/services/
main/java/org/apache/tapestry/services/
test/java/org/apache/tapestry/internal/services/
Author: hlship
Date: Sun May 13 11:30:04 2007
New Revision: 537633
URL: http://svn.apache.org/viewvc?view=rev&rev=537633
Log:
TAPESTRY-1443: org.apache.tapestry.annotations.Service annotation is ignored
Added:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProvider.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProviderTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/annotations/Service.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/annotations/Service.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/annotations/Service.java?view=diff&rev=537633&r1=537632&r2=537633
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/annotations/Service.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/annotations/Service.java Sun May 13 11:30:04 2007
@@ -23,10 +23,9 @@
import java.lang.annotation.Target;
/**
- * Used in conjunction with the {@link Inject} annotation (or the IoC container's
- * {@link org.apache.tapestry.ioc.annotations.Inject} annotation) to identify a service
- * <em>by name</em> and not by type (which is more typical). This is most useful when there are
- * multiple services with the same service interface and a particular one needs to be selected.
+ * Used in conjunction with the {@link Inject} annotation to identify a service <em>by name</em>
+ * and not by type. This is most useful when there are multiple services with the same service
+ * interface and a particular one needs to be selected.
*/
@Target(
{ FIELD, PARAMETER })
Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProvider.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProvider.java?view=auto&rev=537633
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProvider.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProvider.java Sun May 13 11:30:04 2007
@@ -0,0 +1,39 @@
+// Copyright 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.
+// 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 org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.annotations.Service;
+import org.apache.tapestry.ioc.AnnotationProvider;
+import org.apache.tapestry.ioc.ObjectLocator;
+import org.apache.tapestry.ioc.ObjectProvider;
+
+/**
+ * Adds support for the {@link Service} annotation (which can be applied to fields or parameters),
+ * which is used to disambiguate injection when multiple services implement the same service
+ * interface.
+ */
+public class ServiceAnnotationObjectProvider implements ObjectProvider
+{
+ public <T> T provide(Class<T> objectType, AnnotationProvider annotationProvider,
+ ObjectLocator locator)
+ {
+ Service annotation = annotationProvider.getAnnotation(Service.class);
+
+ if (annotation == null) return null;
+
+ return locator.getService(annotation.value(), objectType);
+ }
+
+}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java?view=diff&rev=537633&r1=537632&r2=537633
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/services/TapestryModule.java Sun May 13 11:30:04 2007
@@ -48,6 +48,7 @@
import org.apache.tapestry.annotations.PageDetached;
import org.apache.tapestry.annotations.PageLoaded;
import org.apache.tapestry.annotations.Path;
+import org.apache.tapestry.annotations.Service;
import org.apache.tapestry.annotations.SetupRender;
import org.apache.tapestry.beaneditor.Validate;
import org.apache.tapestry.corelib.data.GridPagerPosition;
@@ -138,6 +139,7 @@
import org.apache.tapestry.internal.services.ResponseImpl;
import org.apache.tapestry.internal.services.RetainWorker;
import org.apache.tapestry.internal.services.RootPathDispatcher;
+import org.apache.tapestry.internal.services.ServiceAnnotationObjectProvider;
import org.apache.tapestry.internal.services.SessionApplicationStatePersistenceStrategy;
import org.apache.tapestry.internal.services.SessionHolder;
import org.apache.tapestry.internal.services.SessionPersistentFieldStrategy;
@@ -571,6 +573,7 @@
* <li>Alias: Searches by type among {@linkplain AliasContribution contributions} to the
* {@link Alias} service</li>
* <li>Asset: Checks for the {@link Path} annotation, and injects an {@link Asset}</li>
+ * <li>Service: Injects based on the {@link Service} annotation, if present</li>
* </ul>
*/
public static void contributeMasterObjectProvider(
@@ -598,6 +601,8 @@
configuration.add("Alias", wrapper, "after:Value");
configuration.add("Asset", assetObjectProvider, "before:Alias");
+
+ configuration.add("Service", new ServiceAnnotationObjectProvider(), "before:Alias");
}
/**
Added: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProviderTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProviderTest.java?view=auto&rev=537633
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProviderTest.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/ServiceAnnotationObjectProviderTest.java Sun May 13 11:30:04 2007
@@ -0,0 +1,70 @@
+// Copyright 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.
+// 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 org.apache.tapestry.internal.services;
+
+import org.apache.tapestry.annotations.Service;
+import org.apache.tapestry.ioc.AnnotationProvider;
+import org.apache.tapestry.ioc.ObjectLocator;
+import org.apache.tapestry.ioc.ObjectProvider;
+import org.apache.tapestry.test.TapestryTestCase;
+import org.testng.annotations.Test;
+
+public class ServiceAnnotationObjectProviderTest extends TapestryTestCase
+{
+ @SuppressWarnings("unchecked")
+ @Test
+ public void no_annotation()
+ {
+ Class objectType = Runnable.class;
+ AnnotationProvider provider = mockAnnotationProvider();
+ ObjectLocator locator = mockObjectLocator();
+
+ train_getAnnotation(provider, Service.class, null);
+
+ replay();
+
+ ObjectProvider objectProvider = new ServiceAnnotationObjectProvider();
+
+ assertNull(objectProvider.provide(objectType, provider, locator));
+
+ verify();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void annotation_present()
+ {
+ Class objectType = Runnable.class;
+ AnnotationProvider provider = mockAnnotationProvider();
+ ObjectLocator locator = mockObjectLocator();
+ Service service = newMock(Service.class);
+ String serviceId = "JiffyPop";
+ Runnable instance = mockRunnable();
+
+ train_getAnnotation(provider, Service.class, service);
+
+ expect(service.value()).andReturn(serviceId);
+
+ train_getService(locator, serviceId, objectType, instance);
+
+ replay();
+
+ ObjectProvider objectProvider = new ServiceAnnotationObjectProvider();
+
+ assertSame(objectProvider.provide(objectType, provider, locator), instance);
+
+ verify();
+ }
+}