/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.synapse.rest.version;
import org.apache.synapse.MessageContext;
import org.apache.synapse.config.xml.rest.VersionStrategyFactory;
import org.apache.synapse.rest.API;
import org.apache.synapse.rest.RESTUtils;
public class URLBasedVersionStrategy extends AbstractVersionStrategy {
String versionParam;
public URLBasedVersionStrategy(API api, String version, String versionParam) {
super(api, version, VersionStrategyFactory.TYPE_URL);
this.versionParam = versionParam;
}
public boolean isMatchingVersion(Object versionInfoObj) {
MessageContext msgContext = (MessageContext) versionInfoObj;
String path = RESTUtils.getFullRequestPath(msgContext);
String context = getAPI().getContext();
String pathStringAfterContext = path.substring(context.length());
//check if context can be invalid for path url and avoid matching a false version string
if (pathStringAfterContext != null && !pathStringAfterContext.startsWith("/")) {
return false;
}
//path after context will be starting from a "/" and compute index for next immediate "/"
int indexOfNextSlash = pathStringAfterContext.substring(1).indexOf("/");
//compute index of beginning of Query Parameter
int indexOfQueryStart = pathStringAfterContext.substring(1).indexOf("?");
String incomingVersionStr = null;
//Check if there exist a next slash and it is before query parameters
//To allow query parameters with URLs. ex: /test?a=http://asddd
if (indexOfNextSlash != -1 && (indexOfQueryStart == -1 || indexOfNextSlash < indexOfQueryStart)) {
incomingVersionStr = pathStringAfterContext.substring(1, indexOfNextSlash + 1);
} else {
String versionStr = pathStringAfterContext.substring(1);
//assume no slash at the end ie:-GET /context/1.0.0
incomingVersionStr = versionStr;
//check special case
if (versionStr.contains("?")) {
incomingVersionStr = versionStr.substring(0,versionStr.indexOf("?"));
}
}
return version.equals(incomingVersionStr);
}
public String getVersionParam() {
return versionParam;
}
public static void main(String[] args) {
String version = "1.0.0";
// String version = "1.0.1";
// String path = "/test/1.0.1/foo/abc/";
// String path = "/test/1.0/foo/abc/";
// String path = "/test/1.0/foo/abc/abc='asasa'";
String path = "/test11.0.0/1.0/foo/abc/abc='asasa'";
// String context = "/test";
// String context = "/test123";
String context = "/test";
String pathStringAfterContext = path.substring(context.length());
System.out.println("pathStringAfterContext : " + pathStringAfterContext);
int indexOfNextSlash = pathStringAfterContext.substring(1).indexOf("/");
System.out.println(indexOfNextSlash);
String incomingVersionStr = pathStringAfterContext.substring(1, indexOfNextSlash + 1);
System.out.println("incomingVersionStr : " + incomingVersionStr);
System.out.println(version.equals(incomingVersionStr));
}
}