/**
* Copyright 2010 Molindo GmbH
*
* 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.wicketstuff.mergedresources.urlcoding;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.wicket.IRequestTarget;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.request.RequestParameters;
import org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy;
import org.apache.wicket.request.target.coding.IMountableRequestTargetUrlCodingStrategy;
import org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy;
import org.apache.wicket.request.target.coding.SharedResourceRequestTargetUrlCodingStrategy;
import org.apache.wicket.request.target.resource.SharedResourceRequestTarget;
import at.molindo.utils.data.StringUtils;
import at.molindo.wicketutils.utils.WicketUtils;
public class RemoteHostUrlCodingStrategy implements IRequestTargetUrlCodingStrategy,
IMountableRequestTargetUrlCodingStrategy {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(RemoteHostUrlCodingStrategy.class);
private final AbstractRequestTargetUrlCodingStrategy _strategy;
private final String _key;
private final String _protocol;
private final Integer _port;
private final String _host;
private final String _path;
private boolean _useRequestProtocol = true;
private boolean _useRequestPort = true;
public RemoteHostUrlCodingStrategy(URL root, final String mountPath, final ResourceReference ref) {
if (ref == null) {
throw new NullPointerException("sharedResourceKey");
}
_key = ref.getSharedResourceKey();
_strategy = newStrategy(mountPath, _key);
if (root != null) {
_protocol = root.getProtocol();
_port = root.getPort();
_host = root.getHost();
_path = StringUtils.trailing(root.getFile(), "/");
} else {
_port = null;
_host = _protocol = _path = null;
}
}
protected AbstractRequestTargetUrlCodingStrategy newStrategy(final String mountPath, final String sharedResourceKey) {
return new SharedResourceRequestTargetUrlCodingStrategy(mountPath, sharedResourceKey);
}
@Override
public IRequestTarget decode(final RequestParameters requestParameters) {
return new IRequestTarget() {
private SharedResourceRequestTarget _orig;
private SharedResourceRequestTarget getOriginalRequestTarget() {
if (_orig == null) {
_orig = (SharedResourceRequestTarget) _strategy.decode(requestParameters);
}
return _orig;
}
@Override
public void detach(final RequestCycle requestCycle) {
if (_orig != null) {
_orig.detach(requestCycle);
}
}
@Override
public void respond(final RequestCycle requestCycle) {
getOriginalRequestTarget().respond(requestCycle);
}
};
}
@Override
public CharSequence encode(final IRequestTarget requestTarget) {
final CharSequence encoded = _strategy.encode(requestTarget);
if (_host == null) {
return encoded;
}
String protocol = !isUseRequestProtocol() ? _protocol : WicketUtils.getHttpServletRequest().getScheme();
Integer port = !isUseRequestPort() ? _port : WicketUtils.getHttpServletRequest().getServerPort();
if (port != null) {
if (port == 80 && "http".equals(protocol)) {
port = null;
} else if (port == 443 && "https".equals(protocol)) {
port = null;
}
}
try {
return new URL(protocol, _host, port == null ? -1 : port, _path
+ StringUtils.stripLeading(encoded.toString(), "/")).toString();
} catch (MalformedURLException e) {
log.error("failed to build URL, balling back to default", e);
return encoded;
}
}
@Override
public String getMountPath() {
return _strategy.getMountPath();
}
@Override
public boolean matches(final IRequestTarget requestTarget) {
return _strategy.matches(requestTarget);
}
@Override
public boolean matches(final String path, final boolean b) {
return _strategy.matches(path, b);
}
public boolean isUseRequestProtocol() {
return _useRequestProtocol;
}
public RemoteHostUrlCodingStrategy setUseRequestProtocol(boolean useRequestProtocol) {
_useRequestProtocol = useRequestProtocol;
return this;
}
public boolean isUseRequestPort() {
return _useRequestPort;
}
public RemoteHostUrlCodingStrategy setUseRequestPort(boolean useRequestPort) {
_useRequestPort = useRequestPort;
return this;
}
}