You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2009/02/10 07:06:28 UTC

svn commit: r742861 - in /tapestry/tapestry5/trunk: src/site/apt/ tapestry-core/src/main/java/org/apache/tapestry5/ tapestry-core/src/main/java/org/apache/tapestry5/internal/ tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/ tapestry-...

Author: hlship
Date: Tue Feb 10 06:06:20 2009
New Revision: 742861

URL: http://svn.apache.org/viewvc?rev=742861&view=rev
Log:
Rework the recent changes to Asset to keep the Asset interface unchanged and introduce a sub-interface, Asset2.

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset2.java
Modified:
    tapestry/tapestry5/trunk/src/site/apt/upgrade.apt
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AssetBinding.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AbstractAsset.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetFactory.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetSource.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/TapestryInternalUtilsTest.java

Modified: tapestry/tapestry5/trunk/src/site/apt/upgrade.apt
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/src/site/apt/upgrade.apt?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/src/site/apt/upgrade.apt (original)
+++ tapestry/tapestry5/trunk/src/site/apt/upgrade.apt Tue Feb 10 06:06:20 2009
@@ -45,10 +45,5 @@
   Extra public methods on module classes (methods that do not define services, contribute to services,
   or decorate or advise services) are now errors.
 
-* Asset interface
-
-  The {{{apidocs/org/apache/tapestry5/Asset.html}Asset}} interface has been changed incompatibly:
-  A new method, isInvariant(), has been added. This will only affect applications that have provided
-  their own implementations of Asset.
 
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset.java Tue Feb 10 06:06:20 2009
@@ -22,6 +22,9 @@
  * packaged inside JARs).
  * <p/>
  * An Asset's toString() will return the URL for the resource (the same value as {@link #toClientURL()}).
+ * <p/>
+ * Release 5.1.0.0 introduced {@link org.apache.tapestry5.Asset2}, which extends this interface with an additional
+ * method.
  */
 public interface Asset
 {
@@ -33,9 +36,6 @@
      * and alternate implementation are encouraged to do so as well. In addition, Tapestry ensures that context and
      * classpath assets have a far-future expires header (to ensure aggresive caching by the client).
      * <p/>
-     * This value is considered <em>variant</em>; because of {@link org.apache.tapestry5.services.AssetPathConverter},
-     * it is conceivable for the return value to be different at different times, depending on how the converter changes
-     * the default path.
      */
     String toClientURL();
 
@@ -44,15 +44,4 @@
      */
     Resource getResource();
 
-    /**
-     * Returns true if the Asset is invariant (meaning that it returns the same value from {@link #toClientURL()} at all
-     * times}. Assets that are used as binding values will be cached more aggresively by Tapestry is they are
-     * invariant.
-     *
-     * @return true if invariant
-     * @see org.apache.tapestry5.services.AssetPathConverter#isInvariant()
-     * @see Binding#isInvariant()
-     * @since 5.1.0.0
-     */
-    boolean isInvariant();
 }

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset2.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset2.java?rev=742861&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset2.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Asset2.java Tue Feb 10 06:06:20 2009
@@ -0,0 +1,39 @@
+// Copyright 2009 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.tapestry5;
+
+/**
+ * Extension to {@link org.apache.tapestry5.Asset} that adds a method to determine if the asset is invariant or not.
+ * {@link org.apache.tapestry5.services.AssetFactory} instances should ideally return Asset2 objects, not Asset. This is
+ * only of primary interest to the {@link org.apache.tapestry5.internal.bindings.AssetBindingFactory}, as it determines
+ * the invariance of the binding from the asset (and assumes variant unless the asset object implements this
+ * interface).
+ *
+ * @see org.apache.tapestry5.services.AssetPathConverter#isInvariant()
+ * @since 5.1.0.0
+ */
+public interface Asset2 extends Asset
+{
+    /**
+     * Returns true if the Asset is invariant (meaning that it returns the same value from {@link Asset#toClientURL()}
+     * at all times}. Assets that are used as binding values will be cached more aggresively by Tapestry is they are
+     * invariant.
+     *
+     * @return true if invariant
+     * @see org.apache.tapestry5.services.AssetPathConverter#isInvariant()
+     * @see Binding#isInvariant()
+     */
+    boolean isInvariant();
+}

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/TapestryInternalUtils.java Tue Feb 10 06:06:20 2009
@@ -15,10 +15,9 @@
 package org.apache.tapestry5.internal;
 
 import org.apache.commons.codec.binary.Base64;
-import org.apache.tapestry5.OptionModel;
-import org.apache.tapestry5.SelectModel;
-import org.apache.tapestry5.EventContext;
+import org.apache.tapestry5.*;
 import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.Defense;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
@@ -455,4 +454,41 @@
 
         return true;
     }
+
+    /**
+     * Converts an Asset to an Asset2 if necessary. When actually wrapping an Asset as an Asset2, the asset is assumed
+     * to be variant (i.e., not cacheable).
+     *
+     * @since 5.1.0.0
+     */
+    public static Asset2 toAsset2(final Asset asset)
+    {
+        if (asset instanceof Asset2)
+            return (Asset2) asset;
+
+        return new Asset2()
+        {
+            /** Returns false. */
+            public boolean isInvariant()
+            {
+                return false;
+            }
+
+            public Resource getResource()
+            {
+                return asset.getResource();
+            }
+
+            public String toClientURL()
+            {
+                return asset.toClientURL();
+            }
+
+            @Override
+            public String toString()
+            {
+                return asset.toString();
+            }
+        };
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AssetBinding.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AssetBinding.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AssetBinding.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/bindings/AssetBinding.java Tue Feb 10 06:06:20 2009
@@ -15,26 +15,28 @@
 package org.apache.tapestry5.internal.bindings;
 
 import org.apache.tapestry5.Asset;
+import org.apache.tapestry5.Asset2;
+import org.apache.tapestry5.internal.TapestryInternalUtils;
 import org.apache.tapestry5.ioc.Location;
 
 public class AssetBinding extends AbstractBinding
 {
     private final String description;
 
-    private final Asset asset;
+    private final Asset2 asset;
 
     AssetBinding(Location location, String description, Asset asset)
     {
         super(location);
 
         this.description = description;
-        this.asset = asset;
+        this.asset = TapestryInternalUtils.toAsset2(asset);
     }
 
     @Override
     public Class getBindingType()
     {
-        return Asset.class;
+        return Asset2.class;
     }
 
     public Object get()

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AbstractAsset.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AbstractAsset.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AbstractAsset.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AbstractAsset.java Tue Feb 10 06:06:20 2009
@@ -14,14 +14,14 @@
 
 package org.apache.tapestry5.internal.services;
 
-import org.apache.tapestry5.Asset;
+import org.apache.tapestry5.Asset2;
 
 /**
  * Base class for assets.
  *
  * @since 5.1.0.0
  */
-public abstract class AbstractAsset implements Asset
+public abstract class AbstractAsset implements Asset2
 {
     private final boolean invariant;
 
@@ -35,6 +35,9 @@
         return invariant;
     }
 
+    /**
+     * Returns {@link org.apache.tapestry5.Asset#toClientURL()}.
+     */
     @Override
     public String toString()
     {

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetFactory.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetFactory.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetFactory.java Tue Feb 10 06:06:20 2009
@@ -29,5 +29,13 @@
      */
     Resource getRootResource();
 
+    /**
+     * Creates an instance of an asset. Starting with 5.1.0.0, it is preferred (but not required) that the factory
+     * return an instance of {@link org.apache.tapestry5.Asset2}.
+     *
+     * @param resource a resource within this factories domain (derived from the {@linkplain #getRootResource() root
+     *                 resource})
+     * @return an Asset for the resource
+     */
     Asset createAsset(Resource resource);
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetSource.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetSource.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/AssetSource.java Tue Feb 10 06:06:20 2009
@@ -27,6 +27,9 @@
  * Assets are defined with a domain, and the domain is indicated by a prefix.  The two builtin domains are "context:"
  * (for files inside the web application context) and "classpath:" for files stored on the classpath (typically, inside
  * a JAR, such as a component library).
+ * <p/>
+ * Since 5.1.0.0, is is preferred that {@link org.apache.tapestry5.services.AssetFactory#createAsset(org.apache.tapestry5.ioc.Resource)}
+ * return an instance of {@link org.apache.tapestry5.Asset2}.
  */
 @UsesMappedConfiguration(AssetFactory.class)
 public interface AssetSource

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/test/TapestryTestCase.java Tue Feb 10 06:06:20 2009
@@ -1210,4 +1210,9 @@
     {
         return newMock(ComponentRequestHandler.class);
     }
+
+    protected final Asset2 mockAsset2()
+    {
+        return newMock(Asset2.class);
+    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/TapestryInternalUtilsTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/TapestryInternalUtilsTest.java?rev=742861&r1=742860&r2=742861&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/TapestryInternalUtilsTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/TapestryInternalUtilsTest.java Tue Feb 10 06:06:20 2009
@@ -14,11 +14,10 @@
 
 package org.apache.tapestry5.internal;
 
-import org.apache.tapestry5.ComponentResources;
-import org.apache.tapestry5.OptionModel;
-import org.apache.tapestry5.SelectModel;
+import org.apache.tapestry5.*;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.Resource;
 import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ClassFactory;
 import org.apache.tapestry5.ioc.services.PropertyAccess;
@@ -395,4 +394,40 @@
     {
         assertEquals(TapestryInternalUtils.toBase64(input), expected);
     }
+
+    @Test
+    public void to_asset2_no_wrapper_needed()
+    {
+        Asset2 asset2 = mockAsset2();
+
+        replay();
+
+        assertSame(TapestryInternalUtils.toAsset2(asset2), asset2);
+
+        verify();
+    }
+
+    @Test
+    public void asset_to_asset2_wrapper()
+    {
+        Asset asset = mockAsset();
+        Resource resource = mockResource();
+        String clientURL = "clientURL";
+
+        train_toClientURL(asset, clientURL);
+
+        expect(asset.getResource()).andReturn(resource);
+
+        replay();
+
+        Asset2 asset2 = TapestryInternalUtils.toAsset2(asset);
+
+        assertFalse(asset2.isInvariant());
+
+        assertSame(asset2.toClientURL(), clientURL);
+        assertSame(asset2.toString(), asset.toString());
+        assertSame(asset2.getResource(), resource);
+
+        verify();
+    }
 }