/** * Copyright 2005-2014 Restlet * * The contents of this file are subject to the terms of one of the following * open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can * select the license that you prefer but you may not use this file except in * compliance with one of these Licenses. * * You can obtain a copy of the Apache 2.0 license at * http://www.opensource.org/licenses/apache-2.0 * * You can obtain a copy of the EPL 1.0 license at * http://www.opensource.org/licenses/eclipse-1.0 * * See the Licenses for the specific language governing permissions and * limitations under the Licenses. * * Alternatively, you can obtain a royalty free commercial license with less * limitations, transferable or non-transferable, directly at * http://restlet.com/products/restlet-framework * * Restlet is a registered trademark of Restlet S.A.S. */ package org.restlet.engine.util; import java.util.Date; import org.restlet.Request; import org.restlet.Response; import org.restlet.data.ChallengeResponse; import org.restlet.data.Reference; import org.restlet.util.Resolver; /** * Resolves variable values based on a request and a response. * * @author Jerome Louvel */ public class CallResolver extends Resolver<Object> { /** The request to use as a model. */ private final Request request; /** The response to use as a model. */ private final Response response; /** * Constructor. * * @param request * The request to use as a model. * @param response * The response to use as a model. */ public CallResolver(Request request, Response response) { this.request = request; this.response = response; } /** * Returns the content corresponding to a reference property. * * @param partName * The variable sub-part name. * @param reference * The reference to use as a model. * @return The content corresponding to a reference property. */ private String getReferenceContent(String partName, Reference reference) { String result = null; if (reference != null && partName != null) { if (partName.equals("a")) { result = reference.getAuthority(); } else if (partName.startsWith("b")) { result = getReferenceContent(partName.substring(1), reference.getBaseRef()); } else if (partName.startsWith("t")) { result = getReferenceContent(partName.substring(1), reference.getTargetRef()); } else if (partName.equals("e")) { result = reference.getRelativePart(); } else if (partName.equals("f")) { result = reference.getFragment(); } else if (partName.equals("h")) { result = reference.getHostIdentifier(); } else if (partName.equals("i")) { result = reference.getIdentifier(); } else if (partName.equals("p")) { result = reference.getPath(); } else if (partName.equals("q")) { result = reference.getQuery(); } else if (partName.equals("r")) { result = reference.getRemainingPart(); } else if (partName.isEmpty()) { result = reference.toString(false, false); } } return result; } @Override public Object resolve(String variableName) { Object result = null; // Check for a matching response attribute if (this.response != null && this.response.getAttributes().containsKey(variableName)) { result = this.response.getAttributes().get(variableName); } // Check for a matching request attribute if ((result == null) && (this.request != null) && this.request.getAttributes().containsKey(variableName)) { result = this.request.getAttributes().get(variableName); } // Check for a matching request or response property if (result == null) { if (this.request != null && variableName != null) { if (variableName.equals("c")) { result = Boolean.toString(this.request.isConfidential()); } else if (variableName.equals("cia")) { result = this.request.getClientInfo().getAddress(); } else if (variableName.equals("ciua")) { result = this.request.getClientInfo().getUpstreamAddress(); } else if (variableName.equals("cig")) { result = this.request.getClientInfo().getAgent(); } else if (variableName.equals("cri")) { ChallengeResponse cr = this.request.getChallengeResponse(); if (cr != null) { result = cr.getIdentifier(); } } else if (variableName.equals("crs")) { ChallengeResponse cr = this.request.getChallengeResponse(); if (cr != null && cr.getScheme() != null) { result = cr.getScheme().getTechnicalName(); } } else if (variableName.equals("d")) { result = DateUtils.format(new Date(), DateUtils.FORMAT_RFC_1123.get(0)); } else if (variableName.equals("ecs")) { if ((this.request.getEntity() != null) && (this.request.getEntity().getCharacterSet() != null)) { result = this.request.getEntity().getCharacterSet() .getName(); } } else if (variableName.equals("ee")) { if ((this.request.getEntity() != null) && (!this.request.getEntity().getEncodings() .isEmpty())) { final StringBuilder value = new StringBuilder(); for (int i = 0; i < this.request.getEntity() .getEncodings().size(); i++) { if (i > 0) { value.append(", "); } value.append(this.request.getEntity() .getEncodings().get(i).getName()); } result = value.toString(); } } else if (variableName.equals("eed")) { if ((this.request.getEntity() != null) && (this.request.getEntity().getExpirationDate() != null)) { result = DateUtils.format(this.request.getEntity() .getExpirationDate(), DateUtils.FORMAT_RFC_1123 .get(0)); } } else if (variableName.equals("el")) { if ((this.request.getEntity() != null) && (!this.request.getEntity().getLanguages() .isEmpty())) { final StringBuilder value = new StringBuilder(); for (int i = 0; i < this.request.getEntity() .getLanguages().size(); i++) { if (i > 0) { value.append(", "); } value.append(this.request.getEntity() .getLanguages().get(i).getName()); } result = value.toString(); } } else if (variableName.equals("emd")) { if ((this.request.getEntity() != null) && (this.request.getEntity().getModificationDate() != null)) { result = DateUtils.format(this.request.getEntity() .getModificationDate(), DateUtils.FORMAT_RFC_1123.get(0)); } } else if (variableName.equals("emt")) { if ((this.request.getEntity() != null) && (this.request.getEntity().getMediaType() != null)) { result = this.request.getEntity().getMediaType() .getName(); } } else if (variableName.equals("es")) { if ((this.request.getEntity() != null) && (this.request.getEntity().getSize() != -1)) { result = Long.toString(this.request.getEntity() .getSize()); } } else if (variableName.equals("et")) { if ((this.request.getEntity() != null) && (this.request.getEntity().getTag() != null)) { result = this.request.getEntity().getTag().getName(); } } else if (variableName.startsWith("f")) { result = getReferenceContent(variableName.substring(1), this.request.getReferrerRef()); } else if (variableName.startsWith("h")) { result = getReferenceContent(variableName.substring(1), this.request.getHostRef()); } else if (variableName.equals("m")) { if (this.request.getMethod() != null) { result = this.request.getMethod().getName(); } } else if (variableName.startsWith("o")) { result = getReferenceContent(variableName.substring(1), this.request.getRootRef()); } else if (variableName.equals("p")) { if (this.request.getProtocol() != null) { result = this.request.getProtocol().getName(); } } else if (variableName.startsWith("r")) { result = getReferenceContent(variableName.substring(1), this.request.getResourceRef()); } } if ((result == null) && (this.response != null)) { if (variableName.equals("ECS")) { if ((this.response.getEntity() != null) && (this.response.getEntity().getCharacterSet() != null)) { result = this.response.getEntity().getCharacterSet() .getName(); } } else if (variableName.equals("EE")) { if ((this.response.getEntity() != null) && (!this.response.getEntity().getEncodings() .isEmpty())) { final StringBuilder value = new StringBuilder(); for (int i = 0; i < this.response.getEntity() .getEncodings().size(); i++) { if (i > 0) { value.append(", "); } value.append(this.response.getEntity() .getEncodings().get(i).getName()); } result = value.toString(); } } else if (variableName.equals("EED")) { if ((this.response.getEntity() != null) && (this.response.getEntity().getExpirationDate() != null)) { result = DateUtils.format(this.response.getEntity() .getExpirationDate(), DateUtils.FORMAT_RFC_1123 .get(0)); } } else if (variableName.equals("EL")) { if ((this.response.getEntity() != null) && (!this.response.getEntity().getLanguages() .isEmpty())) { final StringBuilder value = new StringBuilder(); for (int i = 0; i < this.response.getEntity() .getLanguages().size(); i++) { if (i > 0) { value.append(", "); } value.append(this.response.getEntity() .getLanguages().get(i).getName()); } result = value.toString(); } } else if (variableName.equals("EMD")) { if ((this.response.getEntity() != null) && (this.response.getEntity().getModificationDate() != null)) { result = DateUtils.format(this.response.getEntity() .getModificationDate(), DateUtils.FORMAT_RFC_1123.get(0)); } } else if (variableName.equals("EMT")) { if ((this.response.getEntity() != null) && (this.response.getEntity().getMediaType() != null)) { result = this.response.getEntity().getMediaType() .getName(); } } else if (variableName.equals("ES")) { if ((this.response.getEntity() != null) && (this.response.getEntity().getSize() != -1)) { result = Long.toString(this.response.getEntity() .getSize()); } } else if (variableName.equals("ET")) { if ((this.response.getEntity() != null) && (this.response.getEntity().getTag() != null)) { result = this.response.getEntity().getTag().getName(); } } else if (variableName.startsWith("R")) { result = getReferenceContent(variableName.substring(1), this.response.getLocationRef()); } else if (variableName.equals("S")) { if (this.response.getStatus() != null) { result = Integer.toString(this.response.getStatus() .getCode()); } } else if (variableName.equals("SIA")) { result = this.response.getServerInfo().getAddress(); } else if (variableName.equals("SIG")) { result = this.response.getServerInfo().getAgent(); } else if (variableName.equals("SIP")) { if (this.response.getServerInfo().getPort() != -1) { result = Integer.toString(this.response.getServerInfo() .getPort()); } } } } return result; } }