package act.route; /*- * #%L * ACT Framework * %% * Copyright (C) 2014 - 2017 ActFramework * %% * 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. * #L% */ import org.osgl.util.C; import org.osgl.util.S; import java.util.List; /** * Encapsulate the logic to compare an incoming URL path with a route entry path. * <p> * Note we can't do simple String match as route entry path might contains the dynamic part * </p> */ class UrlPath { static final String DYNA_PART = ""; private List<String> parts = C.newList(); UrlPath(CharSequence path) { String s = path.toString(); String[] sa = s.split("/"); for (String item: sa) { if (S.notBlank(item)) { if (item.startsWith("{") || item.contains(":")) { item = DYNA_PART; } parts.add(item); } } } boolean matches(CharSequence path) { return equals(new UrlPath(path)); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof UrlPath) { UrlPath that = (UrlPath) obj; if (parts.size() != that.parts.size()) { return false; } for (int i = parts.size() - 1; i >= 0; --i) { if (!matches(parts.get(i), that.parts.get(i))) { return false; } } return true; } return false; } private static boolean matches(CharSequence cs1, CharSequence cs2) { if (DYNA_PART.equals(cs1)) { return true; } int len = cs1.length(); if (len != cs2.length()) { return false; } for (int i = len - 1; i >= 0; --i) { if (cs1.charAt(i) != cs2.charAt(i)) { return false; } } return true; } }