001: /*
002: * Copyright 2005-2007 Noelios Consulting.
003: *
004: * The contents of this file are subject to the terms of the Common Development
005: * and Distribution License (the "License"). You may not use this file except in
006: * compliance with the License.
007: *
008: * You can obtain a copy of the license at
009: * http://www.opensource.org/licenses/cddl1.txt See the License for the specific
010: * language governing permissions and limitations under the License.
011: *
012: * When distributing Covered Code, include this CDDL HEADER in each file and
013: * include the License file at http://www.opensource.org/licenses/cddl1.txt If
014: * applicable, add the following below this CDDL HEADER, with the fields
015: * enclosed by brackets "[]" replaced with your own identifying information:
016: * Portions Copyright [yyyy] [name of copyright owner]
017: */
018:
019: package com.noelios.restlet.component;
020:
021: import java.util.logging.Level;
022: import java.util.regex.Pattern;
023:
024: import org.restlet.Route;
025: import org.restlet.Router;
026: import org.restlet.VirtualHost;
027: import org.restlet.data.Request;
028: import org.restlet.data.Response;
029:
030: /**
031: * Route based on a target VirtualHost.
032: *
033: * @author Jerome Louvel (contact@noelios.com)
034: */
035: public class HostRoute extends Route {
036: /**
037: * Constructor.
038: *
039: * @param router
040: * The parent router.
041: * @param target
042: * The target virtual host.
043: */
044: public HostRoute(Router router, VirtualHost target) {
045: super (router, "", target);
046: }
047:
048: /**
049: * Returns the target virtual host.
050: *
051: * @return The target virtual host.
052: */
053: public VirtualHost getVirtualHost() {
054: return (VirtualHost) getNext();
055: }
056:
057: /**
058: * Sets the next virtual host.
059: *
060: * @param next
061: * The next virtual host.
062: */
063: public void setNext(VirtualHost next) {
064: super .setNext(next);
065: }
066:
067: /**
068: * Returns the score for a given call (between 0 and 1.0).
069: *
070: * @param request
071: * The request to score.
072: * @param response
073: * The response to score.
074: * @return The score for a given call (between 0 and 1.0).
075: */
076: public float score(Request request, Response response) {
077: float result = 0F;
078:
079: // Prepare the value to be matched
080: String hostDomain = "";
081: String hostPort = "";
082: String hostScheme = "";
083:
084: if (request.getHostRef() != null) {
085: hostDomain = request.getHostRef().getHostDomain();
086: if (hostDomain == null)
087: hostDomain = "";
088:
089: int basePortValue = request.getHostRef().getHostPort();
090: if (basePortValue == -1)
091: basePortValue = request.getHostRef()
092: .getSchemeProtocol().getDefaultPort();
093: hostPort = Integer.toString(basePortValue);
094:
095: hostScheme = request.getHostRef().getScheme();
096: if (hostScheme == null)
097: hostScheme = "";
098: }
099:
100: String resourceDomain = request.getResourceRef()
101: .getHostDomain();
102: if (resourceDomain == null)
103: resourceDomain = "";
104:
105: int resourcePortValue = request.getResourceRef().getHostPort();
106: if (resourcePortValue == -1)
107: resourcePortValue = request.getResourceRef()
108: .getSchemeProtocol().getDefaultPort();
109: String resourcePort = Integer.toString(resourcePortValue);
110:
111: String resourceScheme = request.getResourceRef().getScheme();
112: if (resourceScheme == null)
113: resourceScheme = "";
114:
115: String serverAddress = response.getServerInfo().getAddress();
116: if (serverAddress == null)
117: serverAddress = "";
118:
119: String serverPort = "";
120: if (response.getServerInfo().getPort() != -1)
121: serverPort = Integer.toString(response.getServerInfo()
122: .getPort());
123:
124: // Check if all the criterias match
125: if (matches(getVirtualHost().getHostDomain(), hostDomain)
126: && matches(getVirtualHost().getHostPort(), hostPort)
127: && matches(getVirtualHost().getHostScheme(), hostScheme)
128: && matches(getVirtualHost().getResourceDomain(),
129: resourceDomain)
130: && matches(getVirtualHost().getResourcePort(),
131: resourcePort)
132: && matches(getVirtualHost().getResourceScheme(),
133: resourceScheme)
134: && matches(getVirtualHost().getServerAddress(),
135: serverAddress)
136: && matches(getVirtualHost().getServerPort(), serverPort)) {
137: result = 1F;
138: }
139:
140: // Log the result of the matching
141: if (getLogger().isLoggable(Level.FINER)) {
142: getLogger().finer(
143: "Call score for the \""
144: + getVirtualHost().getName() + "\" host: "
145: + result);
146: }
147:
148: return result;
149: }
150:
151: /**
152: * Matches a formatted string against a regex pattern, in a case insensitive
153: * manner.
154: *
155: * @param regex
156: * The pattern to use.
157: * @param formattedString
158: * The formatted string to match.
159: * @return True if the formatted string matched the pattern.
160: */
161: private boolean matches(String regex, String formattedString) {
162: return Pattern.compile(regex, Pattern.CASE_INSENSITIVE)
163: .matcher(formattedString).matches();
164: }
165:
166: /**
167: * Allows filtering before processing by the next Restlet. Set the base
168: * reference.
169: *
170: * @param request
171: * The request to handle.
172: * @param response
173: * The response to update.
174: */
175: protected void beforeHandle(Request request, Response response) {
176: if (getLogger().isLoggable(Level.FINE)) {
177: getLogger().fine(
178: "New base URI: "
179: + request.getResourceRef().getBaseRef());
180: getLogger().fine(
181: "New remaining part: "
182: + request.getResourceRef()
183: .getRemainingPart());
184: }
185: }
186: }
|