Skip to content

Instantly share code, notes, and snippets.

@quoth
Created September 29, 2011 09:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quoth/1250375 to your computer and use it in GitHub Desktop.
Save quoth/1250375 to your computer and use it in GitHub Desktop.
Customized Wicket ResourceStreamLocator
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.locator.ResourceStreamLocator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TraversalResourceStreamLocator extends ResourceStreamLocator {
private static final Logger logger = LoggerFactory.getLogger(TraversalResourceStreamLocator.class);
private final int maxDepth;
private TraversalResourceStreamLocator(int maxDepth) {
this.maxDepth = maxDepth;
}
public static TraversalResourceStreamLocator newInstance() {
return new TraversalResourceStreamLocator(0);
}
public static TraversalResourceStreamLocator newInstance(int maxDepth) {
return new TraversalResourceStreamLocator(maxDepth);
}
/*
* (non-Javadoc)
* @see org.apache.wicket.util.resource.locator.ResourceStreamLocator#locate(java.lang.Class, java.lang.String)
*/
@Override
public IResourceStream locate(Class<?> clazz, String path) {
String resolvedPath = resolvePath(clazz, path);
logger.debug("searching {}.", resolvedPath);
IResourceStream located = super.locate(clazz, resolvedPath);
if (located != null) {
return located;
}
return super.locate(clazz, path);
}
String resolvePath(final Class<?> clazz, final String path) {
List<String> clippedPackageNameList =
Arrays.asList(clazz.getPackage().getName().split("\\."));
int depth = clippedPackageNameList.size() >= maxDepth ? clippedPackageNameList.size() - maxDepth: 0;
StringBuilder sb = new StringBuilder();
for (ListIterator<String> itor = clippedPackageNameList.listIterator(depth); itor.hasNext();) {
sb.append(String.valueOf(itor.next()));
sb.append('/');
}
int start = path.indexOf(sb.toString());
if (start == -1) {
return path;
}
return path.substring(start);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment