package org.simpleframework.xml.util;
import java.util.Iterator;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.ValidationTestCase;
import org.simpleframework.xml.core.Persister;
public class ResolverTest extends ValidationTestCase {
private static final String LIST =
"<?xml version=\"1.0\"?>\n"+
"<test name='example'>\n"+
" <list>\n"+
" <match pattern='*.html' value='text/html'/>\n"+
" <match pattern='*.jpg' value='image/jpeg'/>\n"+
" <match pattern='/images/*' value='image/jpeg'/>\n"+
" <match pattern='/log/**' value='text/plain'/>\n"+
" <match pattern='*.exe' value='application/octetstream'/>\n"+
" <match pattern='**.txt' value='text/plain'/>\n"+
" <match pattern='/html/*' value='text/html'/>\n"+
" </list>\n"+
"</test>";
@Root(name="match")
private static class ContentType implements Match {
@Attribute(name="value")
private String value;
@Attribute
private String pattern;
public ContentType() {
super();
}
public ContentType(String pattern, String value) {
this.pattern = pattern;
this.value = value;
}
public String getPattern() {
return pattern;
}
public String toString() {
return String.format("%s=%s", pattern, value);
}
}
@Root(name="test")
private static class ContentResolver implements Iterable<ContentType> {
@ElementList(name="list", type=ContentType.class)
private Resolver<ContentType> list;
@Attribute(name="name")
private String name;
private ContentResolver() {
this.list = new Resolver<ContentType>();
}
public Iterator<ContentType> iterator() {
return list.iterator();
}
public void add(ContentType type) {
list.add(type);
}
public ContentType resolve(String name) {
return list.resolve(name);
}
public int size() {
return list.size();
}
}
private Persister serializer;
public void setUp() {
serializer = new Persister();
}
public void testResolver() throws Exception {
ContentResolver resolver = (ContentResolver) serializer.read(ContentResolver.class, LIST);
assertEquals(7, resolver.size());
assertEquals("image/jpeg", resolver.resolve("image.jpg").value);
assertEquals("text/plain", resolver.resolve("README.txt").value);
assertEquals("text/html", resolver.resolve("/index.html").value);
assertEquals("text/html", resolver.resolve("/html/image.jpg").value);
assertEquals("text/plain", resolver.resolve("/images/README.txt").value);
assertEquals("text/plain", resolver.resolve("/log/access.log").value);
validate(resolver, serializer);
}
public void testCache() throws Exception {
ContentResolver resolver = (ContentResolver) serializer.read(ContentResolver.class, LIST);
assertEquals(7, resolver.size());
assertEquals("image/jpeg", resolver.resolve("image.jpg").value);
assertEquals("text/plain", resolver.resolve("README.txt").value);
Iterator<ContentType> it = resolver.iterator();
while(it.hasNext()) {
ContentType type = it.next();
if(type.value.equals("text/plain")) {
it.remove();
break;
}
}
resolver.add(new ContentType("*", "application/octetstream"));
assertEquals("application/octetstream", resolver.resolve("README.txt").value);
assertEquals("application/octetstream", resolver.resolve("README.txt").value);
resolver.add(new ContentType("README.*", "text/html"));
resolver.add(new ContentType("README.txt", "text/plain"));
assertEquals("text/plain", resolver.resolve("README.txt").value);
assertEquals("text/html", resolver.resolve("README.jsp").value);
validate(resolver, serializer);
}
public void testNoResolution() throws Exception {
ContentResolver resolver = (ContentResolver) serializer.read(ContentResolver.class, LIST);
assertEquals(7, resolver.size());
assertEquals("text/plain", resolver.resolve("README.txt").value);
assertEquals(null, resolver.resolve("README"));
}
public void testNonGreedyMatch() throws Exception {
ContentResolver resolver = (ContentResolver) serializer.read(ContentResolver.class, LIST);
assertEquals(7, resolver.size());
resolver.add(new ContentType("/*?/html/*", "text/html"));
assertEquals(8, resolver.size());
assertEquals(null, resolver.resolve("/a/b/html/index.jsp"));
assertEquals("text/html", resolver.resolve("/a/html/index.jsp").value);
}
public void testResolverCache() throws Exception {
ContentResolver resolver = new ContentResolver();
for(int i = 0; i <= 2000; i++) {
resolver.add(new ContentType(String.valueOf(i), String.valueOf(i)));
}
assertEquals(resolver.resolve("1").value, "1");
assertEquals(resolver.resolve("2000").value, "2000");
}
}