Package org.apache.wicket.request.resource.caching

Source Code of org.apache.wicket.request.resource.caching.QueryStringWithVersionResourceCachingStrategy

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.wicket.request.resource.caching;

import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.mapper.parameter.INamedParameters;
import org.apache.wicket.request.resource.AbstractResource;
import org.apache.wicket.request.resource.caching.version.CachingResourceVersion;
import org.apache.wicket.request.resource.caching.version.IResourceVersion;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.StringValue;

/**
* resource caching strategy that adds a version string to the query parameters of the resource
* (this is similar to how wicket 1.4 does it when enabling timestamps on resources). You should
* preferably use {@link FilenameWithVersionResourceCachingStrategy} since it is more reliable.
*
* @author Peter Ertl
*
* @see FilenameWithVersionResourceCachingStrategy
*
* @since 1.5
*/
public class QueryStringWithVersionResourceCachingStrategy implements IResourceCachingStrategy
{
  /**
   * default query parameter for version information
   */
  private static final String DEFAULT_VERSION_PARAMETER = "ver";

  /**
   * query string parameter name that contains the version string for the resource
   */
  private final String versionParameter;

  /**
   * resource version provider
   */
  private final IResourceVersion resourceVersion;

  /**
   * create query string resource caching strategy
   * <p/>
   * it will use a query parameter named <code>{@value #DEFAULT_VERSION_PARAMETER}</code>
   * for storing the version information.
   *
   * @param resourceVersion
   *                resource version provider
   */
  public QueryStringWithVersionResourceCachingStrategy(IResourceVersion resourceVersion)
  {
    this(DEFAULT_VERSION_PARAMETER, resourceVersion);
  }

  /**
   * create query string resource caching strategy
   * <p/>
   * it will use a query parameter with name specified by
   * parameter <code>resourceVersion</code> for storing the version information.
   *
   * @param versionParameter
   *            name of version parameter which will be added to query string
   *            containing the resource version
   * @param resourceVersion
   *                resource version provider
   */
  public QueryStringWithVersionResourceCachingStrategy(String versionParameter,
                                                       IResourceVersion resourceVersion)
  {
    this.versionParameter = Args.notEmpty(versionParameter, "versionParameter");
    this.resourceVersion = Args.notNull(resourceVersion, "resourceVersion");
  }

  /**
   * @return name of version parameter which will be added to query string
   */
  public final String getVersionParameter()
  {
    return versionParameter;
  }

  @Override
  public void decorateUrl(ResourceUrl url, final IStaticCacheableResource resource)
  {
    String version = resourceVersion.getVersion(resource);

    if (version != null)
    {
      url.getParameters().set(versionParameter, version, INamedParameters.Type.MANUAL);
    }
  }

  @Override
  public void undecorateUrl(ResourceUrl url)
  {
    final INamedParameters parameters = url.getParameters();
   
    if (parameters != null)
    {
      // store the version in the request cycle
      StringValue versionValue = parameters.get(versionParameter);
      RequestCycle requestCycle = RequestCycle.get();
      if (versionValue.isEmpty() == false && requestCycle != null)
      {
        requestCycle.setMetaData(URL_VERSION, versionValue.toString());
      }

      // undecorate
      parameters.remove(versionParameter);
    }
  }

  @Override
  public void decorateResponse(AbstractResource.ResourceResponse response, IStaticCacheableResource resource)
  {
    String requestedVersion = RequestCycle.get().getMetaData(URL_VERSION);
    String calculatedVersion = this.resourceVersion.getVersion(resource);
    if (calculatedVersion != null && calculatedVersion.equals(requestedVersion))
    {
      response.setCacheDurationToMaximum();
      response.setCacheScope(WebResponse.CacheScope.PUBLIC);
    }
  }

  @Override
  public void clearCache()
  {
    if (resourceVersion instanceof CachingResourceVersion)
    {
      ((CachingResourceVersion) resourceVersion).invalidateAll();
    }
  }
}
TOP

Related Classes of org.apache.wicket.request.resource.caching.QueryStringWithVersionResourceCachingStrategy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.