[ https://issues.apache.org/jira/browse/WICKET-3163?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12931678#action_12931678 ]
Peter Ertl commented on WICKET-3163: ------------------------------------ Seems like this improvement was really necessary as we get timeouts on hudson quite often, e.g.: https://hudson.apache.org/hudson/job/Apache%20Wicket%201.5.x/507/org.apache.wicket$wicket Should be solved now :-) > support building wicket offline by resolving DTD references locally > ------------------------------------------------------------------- > > Key: WICKET-3163 > URL: https://issues.apache.org/jira/browse/WICKET-3163 > Project: Wicket > Issue Type: Improvement > Components: wicket > Affects Versions: 1.5-M3 > Reporter: Peter Ertl > Assignee: Peter Ertl > Fix For: 1.5-M4 > > Attachments: local-lookup.patch, LocalEntityResolver.java > > > Wicket developers, please give me some comment on this: > Some wicket test cases parse XML which refers to an external DTD. > An example is org.apache.wicket.protocol.http.WicketFilterTest > It refers to org.apache.wicket.util.file.WebXmlFile will will parse a custom > web.xml. > The web.xml will make the parser to look up > http://java.sun.com/dtd/web-app_2_3.dtd > When building wicket offline this will cause a network error and the test > will fail. > I would like to add > org.apache.wicket.util.xml.LocalEntityResolver > which may contain a set of local entitites to avoid hitting the network. > As wicket 1.5 is getting close to final I would like to get some feedback > first before putting that into trunk... > By adding this like to WebXmlFile network lookup would be avoided. > > DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); > DocumentBuilder builder = factory.newDocumentBuilder(); > builder.setEntityResolver(LocalEntityResolver.getDefault()); // no more > network lookups > Document document = builder.parse(is); > ---------------------------------------------------- > package org.apache.wicket.util.xml; > import org.apache.wicket.util.lang.Args; > import org.xml.sax.EntityResolver; > import org.xml.sax.InputSource; > import org.xml.sax.SAXException; > import javax.servlet.Filter; > import java.io.IOException; > import java.io.InputStream; > import java.util.HashMap; > import java.util.Map; > /** > * entity resolver that tries to locate a document type definition (DTD) > using a set of custom entity resolvers > * > * @author pete > */ > public class LocalEntityResolver implements EntityResolver > { > private final Map<EntityKey, EntityLocator> entities = new > HashMap<EntityKey, EntityLocator>(3); > public static LocalEntityResolver getDefault() > { > LocalEntityResolver resolver = new LocalEntityResolver(); > > // > // look up servlet 2.3 web.xml DTD right from inside servlet-api.jar > // > resolver.put(new EntityKey("-//Sun Microsystems, Inc.//DTD Web > Application 2.3//EN", > > "http://java.sun.com/dtd/web-app_2_3.dtd"), > new ServletApiEntityLocator("web-app_2_3.dtd")); > return resolver; > } > public void put(EntityKey key, EntityLocator locator) > { > Args.notNull(key, "key"); > Args.notNull(locator, "locator"); > entities.put(key, locator); > } > public InputSource resolveEntity(String id, String url) throws > SAXException, IOException > { > for (Map.Entry<EntityKey, EntityLocator> entry : > entities.entrySet()) > if (entry.getKey().id.equals(id) || > entry.getKey().url.equals(url)) > return entry.getValue().locateInputSource(); > return null; > } > public static class EntityKey > { > private final String id; > private final String url; > private EntityKey(String id, String url) > { > Args.notEmpty(id, "id"); > Args.notEmpty(url, "url"); > this.id = id; > this.url = url; > } > @Override > public boolean equals(Object o) > { > if (this == o) > return true; > if (!(o instanceof EntityKey)) > return false; > EntityKey key = (EntityKey) o; > if (!id.equals(key.id)) > return false; > return url.equals(key.url); > } > @Override > public int hashCode() > { > int result = id.hashCode(); > result = 31 * result + url.hashCode(); > return result; > } > } > public static interface EntityLocator > { > InputSource locateInputSource() throws SAXException, > IOException; > } > public static class ServletApiEntityLocator implements EntityLocator > { > private final String name; > private ServletApiEntityLocator(String name) > { > this.name = name; > } > public InputSource locateInputSource() > { > InputStream stream = > Filter.class.getResourceAsStream("resources/" + name); > if (stream == null) > return null; > return new InputSource(stream); > } > } > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.