/*
* Copyright 2013 eXo Platform SAS
*
* 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.
*/
package juzu.impl.router;
import juzu.impl.router.regex.RE;
import juzu.impl.router.regex.REFactory;
import juzu.impl.common.Tools;
import java.util.BitSet;
/**
* The router takes care of mapping a request to a a map.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class Router extends Route {
/** . */
private static final BitSet escapeSet;
static {
// A subset of the path literals
BitSet bs = new BitSet();
bs.set('_');
bs.set('.');
bs.set('-');
bs.set('~');
bs.set('!');
bs.set('$');
bs.set('&');
bs.set('+');
bs.set(':');
bs.set('@');
//
escapeSet = bs;
}
/** . */
private final REFactory factory;
/** . */
private RERef[] regexes;
/** The slash escape char. */
final char separatorEscape;
/** . */
final char separatorEscapeNible1;
/** . */
final char separatorEscapeNible2;
public Router() throws RouterConfigException {
this('_', REFactory.JAVA);
}
public Router(char separatorEscape) throws RouterConfigException {
this(separatorEscape, REFactory.JAVA);
}
public Router(char separatorEscape, REFactory regexFactory) throws RouterConfigException {
super(null, Route.TERMINATION_NONE);
//
int i = separatorEscape & ~0x7F;
if (i > 0 || !escapeSet.get(separatorEscape)) {
throw new RouterConfigException("Char " + (int)separatorEscape + " cannot be used a separator escape");
}
//
String s = Integer.toString(separatorEscape, 16).toUpperCase();
separatorEscapeNible1 = s.charAt(0);
separatorEscapeNible2 = s.charAt(1);
//
this.separatorEscape = separatorEscape;
this.regexes = new RERef[0];
this.factory = regexFactory;
}
RERef compile(String pattern) {
for (RERef regex : regexes) {
if (regex.re.getPattern().equals(pattern)) {
return regex;
}
}
//
RE regex = factory.compile(pattern);
RERef holder = new RERef(regexes.length, regex);
regexes = Tools.appendTo(regexes, holder);
return holder;
}
@Override
public String toString() {
return "Router[" + super.toString() + "]";
}
}