package org.jboss.seam.web;
import java.util.ArrayList;
import java.util.List;
public class OutgoingPattern {
String view;
String pattern;
ServletMapping viewMapping;
List<String> parts = new ArrayList<String>();
public OutgoingPattern(ServletMapping viewMapping, String view, String pattern) {
this.view = view;
this.pattern = pattern;
this.viewMapping = viewMapping;
parsePattern(pattern);
}
public Rewrite rewrite(String path) {
return new OutgoingRewrite(path);
}
private void parsePattern(String value) {
while (value.length()>0) {
int pos = value.indexOf('{');
if (pos == -1) {
parts.add(value);
value = "";
} else {
int pos2 = value.indexOf('}');
if (pos2 == -1) {
throw new IllegalArgumentException("invalid pattern");
}
parts.add(value.substring(0,pos));
parts.add(value.substring(pos,pos2+1));
value = value.substring(pos2+1);
}
}
}
public class OutgoingRewrite
implements Rewrite
{
Boolean isMatch;
private String base;
private List<String> queryArgs = new ArrayList<String>();
private List<String> matchedArgs = new ArrayList<String>();
public OutgoingRewrite(String outgoing) {
int queryPos = outgoing.indexOf('?');
if (queryPos == -1) {
this.base = outgoing;
} else {
this.base = outgoing.substring(0, queryPos);
parseArgs(outgoing.substring(queryPos+1));
}
}
private void parseArgs(String text) {
for (String part: text.split("\\&")) {
queryArgs.add(part);
}
}
public boolean isMatch() {
if (isMatch == null) {
isMatch = match();
}
return isMatch;
}
private boolean match() {
if (!viewMapping.isMapped(base,view)) {
return false;
}
for (String part: parts) {
if (part.startsWith("{") && part.endsWith("}")) {
String name = part.substring(1,part.length()-1);
String value = matchArg(name);
if (value == null) {
return false;
}
matchedArgs.add(value);
}
}
return true;
}
private String matchArg(String argName) {
for (int i=0; i<queryArgs.size(); i++) {
String query = queryArgs.get(i);
int pos = query.indexOf("=");
if (query.subSequence(0, pos).equals(argName)) {
queryArgs.remove(i);
return query.substring(pos+1);
}
}
return null;
}
public String rewrite() {
StringBuffer res = new StringBuffer();
int matchedPosition = 0;
for (String part: parts) {
if (part.startsWith("{")) {
res.append(matchedArgs.get(matchedPosition++));
} else {
res.append(part);
}
}
char sep = '?';
for (String arg: queryArgs) {
res.append(sep).append(arg);
sep = '&';
}
return res.toString();
}
}
}