org.apache.wicket.request.resource.UrlResourceReference.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.wicket.request.resource.UrlResourceReference.java

Source

/*
 * 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;

import org.apache.wicket.request.IUrlRenderer;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.UrlUtils;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.util.lang.Args;

/**
 * A ResourceReference that can be used to point to a resource by using an Url. For example to a
 * resource residing in a CDN (Content Delivering Network) or context relative one.
 * 
 * @since 6.0
 */
public class UrlResourceReference extends ResourceReference {
    /**
     * An Url that knows how to render itself, so it doesn't need re-calculating in UrlRenderer. It
     * should be rendered as is.
     */
    private static class CalculatedUrl extends Url implements IUrlRenderer {
        private CalculatedUrl(Url original) {
            super(original);
        }

        @Override
        public String renderFullUrl(Url url, Url baseUrl) {
            StringMode mode = getStringMode(url);
            return url.toString(mode);
        }

        @Override
        public String renderRelativeUrl(Url url, Url baseUrl) {
            return url.toString();
        }
    }

    /**
     * The url to the resource.
     */
    private final Url url;

    private boolean contextRelative = false;

    /**
     * Constructor.
     * 
     * @param url
     *            the url of the external resource
     */
    public UrlResourceReference(final Url url) {
        super(asName(url));

        this.url = url;
    }

    private static String asName(Url externalUrl) {
        Args.notNull(externalUrl, "url");
        return externalUrl.toString();
    }

    /**
     * @return the url of the external resource
     */
    public final Url getUrl() {
        CalculatedUrl _url;

        if (contextRelative) {
            String contextRelative = UrlUtils.rewriteToContextRelative(url.toString(), RequestCycle.get());
            _url = new CalculatedUrl(Url.parse(contextRelative, url.getCharset()));
        } else {
            _url = new CalculatedUrl(url);
        }

        return _url;
    }

    /**
     * @return {@code null} because this ResourceReference won't use an IResource to deliver the
     *         content of the external resource. The browser will make a direct request to the
     *         external url.
     */
    @Override
    public final IResource getResource() {
        return null;
    }

    public UrlResourceReference setContextRelative(final boolean contextRelative) {
        if (contextRelative && (url.isFull() || url.isContextAbsolute())) {
            throw new IllegalStateException(
                    String.format("An absolute url '%s' cannot be rendered as context relative", url));
        }
        this.contextRelative = contextRelative;
        return this;
    }

    public boolean isContextRelative() {
        return contextRelative;
    }

    @Override
    public String toString() {
        return "UrlResourceReference{" + "url=" + url.toString(getStringMode(url)) + ", contextRelative="
                + contextRelative + '}';
    }

    private static Url.StringMode getStringMode(Url url) {
        final Url.StringMode mode;
        if (url.isFull()) {
            mode = Url.StringMode.FULL;
        } else {
            mode = Url.StringMode.LOCAL;
        }
        return mode;
    }
}