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 act.app.ActionContext;
import act.handler.RequestHandler;
import act.handler.RequestHandlerBase;
import org.osgl.$;
import org.osgl.http.H;
import org.osgl.util.E;
import org.osgl.util.S;
/**
* Used to expose Router table for debugging purpose
*/
public class RouteInfo extends $.T3<String, String, String> implements Comparable<RouteInfo> {
public RouteInfo(H.Method method, String path, RequestHandler handler) {
super(method.name(), path, handler.toString());
}
public String method() {
return _1;
}
public String path() {
return _2;
}
public String handler() {
return _3;
}
public String compactHandler() {
return compactHandler(_3);
}
public static String compactHandler(String handler) {
String[] sa = handler.split("\\.");
int len = sa.length;
if (len == 1) {
return handler;
}
S.Buffer sb = S.newBuffer();
for (int i = 0; i < len - 2; ++i) {
sb.append(sa[i].charAt(0)).append('.');
}
sb.append(sa[len - 2]).append('.').append(sa[len - 1]);
return sb.toString();
}
@Override
public String toString() {
return S.fmt("[%s %s] -> [%s]", method(), path(), compactHandler());
}
@Override
public int compareTo(RouteInfo routeInfo) {
int n = path().compareTo(routeInfo.path());
if (n != 0) {
return n;
}
n = method().compareTo(routeInfo.method());
if (n != 0) {
return n;
}
return handler().compareTo(routeInfo.handler());
}
public static RouteInfo of(ActionContext context) {
H.Method m = context.req().method();
String path = context.req().url();
RequestHandler handler = context.handler();
if (null == handler) {
handler = UNKNOWN_HANDLER;
}
return new RouteInfo(m, path, handler);
}
public static final RequestHandler UNKNOWN_HANDLER = new RequestHandlerBase() {
@Override
public void handle(ActionContext context) {
throw E.unsupport();
}
@Override
public boolean express(ActionContext context) {
return true;
}
@Override
public String toString() {
return "unknown";
}
@Override
public boolean sessionFree() {
return true;
}
@Override
public void prepareAuthentication(ActionContext context) {
throw E.unsupport();
}
};
}