This took a bit of digging. See the stack trace below. You are right, jena is not directly calling SchemeRegistryFactory.createSystemDefault(). The problem is that HttpOp.exec is calling httpClient.execute, which ends up calling SchemeRegistryFactory.createSystemDefault(). Evidently my class loaded already picked up the older version of SchemeRegistryFactory from the GWT jar and therefore I get the NoSuchMethodError. So my only hope is to avoid calls to HttpOp.exec.
So that leads to the other thing that has been bothering me. The default FileManager uses a LocatorURL and therefore tries to go out to the internet to resolve URLs that are in ontologies. This problem was somewhat bad when we upgraded to 2.7.3 and is even worse in 2.11.0 I have been unsuccessful in overwriting the default FileManager with my own locationEntries before OntModel machinery loads URLs. Have there been deliberate changes in this behavior and is there a recommended way to set up an application that needs to run behind a firewall without access to the internet? The application needs to be able to create Ont models that use rdfs and owl. The application also reads some RDF files that have prefixes that are not real URLs, like this @prefix sct: <http://www.mckesson.com/life/snomed-ct.ontology.owl#> . Thread [main] (Suspended (exception NoSuchMethodError)) owns: SystemDefaultHttpClient (id=89) owns: ConcurrentHashMap<K,V> (id=49) owns: Object (id=50) owns: ContextCache (id=51) SystemDefaultHttpClient.createClientConnectionManager() line: 118 SystemDefaultHttpClient(AbstractHttpClient).getConnectionManager() line: 445 SystemDefaultHttpClient(AbstractHttpClient).createHttpContext() line: 274 SystemDefaultHttpClient(AbstractHttpClient).execute(HttpHost, HttpRequest, HttpContext) line: 797 SystemDefaultHttpClient(AbstractHttpClient).execute(HttpUriRequest, HttpContext) line: 754 HttpOp.exec(String, HttpUriRequest, String, HttpResponseHandler, HttpClient, HttpContext, HttpAuthenticator) line: 1011 HttpOp.execHttpGet(String, String, HttpResponseHandler, HttpClient, HttpContext, HttpAuthenticator) line: 291 HttpOp.execHttpGet(String, String) line: 326 LocatorURL.open(String) line: 46 StreamManager.openNoMapOrNull(String) line: 138 StreamManager.open(String) line: 99 RDFDataMgr.open(String, StreamManager) line: 783 RDFDataMgr.open(String, Context) line: 772 RDFDataMgr.parse(StreamRDF, String, String, Lang, Context) line: 676 RDFDataMgr.read(Graph, String, String, Lang, Context) line: 211 RDFDataMgr.read(Graph, String, Lang, Context) line: 184 RDFDataMgr.read(Graph, String, Lang) line: 122 RDFDataMgr.read(Model, String, Lang) line: 113 JenaReadersWriters$RDFReaderRIOT_RDFXML(RDFReaderRIOT).read(Model, String) line: 77 ModelCom.read(String) line: 229 AdapterFileManager.readModelWorker(Model, String, String, String) line: 277 AdapterFileManager(FileManager).loadModelWorker(String, String, String) line: 326 AdapterFileManager(FileManager).loadModel(String) line: 278 -----Original Message----- From: Rob Vesse [mailto:[email protected]] Sent: Thursday, October 24, 2013 7:58 AM To: [email protected] Subject: Re: Use of recent features from httpclient Michael The method you identify is only used in test code, it is not called anywhere in the main ARQ code base (or the main code base of any other Jena library for that matter) As I suggested before if you could provide a stack trace that shows the exact error you receive in your environment so we can see where the call to that method comes from and look at how to avoid it (if at all possible) that would be much appreciated. Note also that you can provide a HttpClient instance to use via the HttpOp.setDefaultHttpClient() which may allow you to work around this without any need for changes on our part. Thanks, Rob On 23/10/2013 18:40, "Altmann, Michael" <[email protected]> wrote: >In org.apache.jena.riot.web.HttpOp there is a call to >SchemeRegistryFactory.createSystemDefault(). This method is new in >HTTPClient 4.2. > > public static HttpClient createCachingHttpClient() { > > return new SystemDefaultHttpClient() { > > /** See SystemDefaultHttpClient (4.2). This version always >sets the connection cache */ > > @Override > > protected ClientConnectionManager >createClientConnectionManager() { > > PoolingClientConnectionManager connmgr = new >PoolingClientConnectionManager( > > SchemeRegistryFactory.createSystemDefault()); > > String s = System.getProperty("http.maxConnections", > "5"); > > int max = Integer.parseInt(s); > > connmgr.setDefaultMaxPerRoute(max); > > connmgr.setMaxTotal(2 * max); > > return connmgr; > > } > > } ; > > } ; > > > > > > >If you would be willing to replicate the code that is in httpclient >4.2+, rather than calling SchemeRegistryFactory.createSystemDefault(), >I would be much obliged. The code in SchemeRegistryFactory is > > public static SchemeRegistry More ...createSystemDefault() { > SchemeRegistry registry = new SchemeRegistry(); > registry.register( > new Scheme("http", 80, >PlainSocketFactory.getSocketFactory())); > registry.register( > new Scheme("https", 443, >SSLSocketFactory.getSystemSocketFactory())); > return registry; > } > > > > > >-----Original Message----- >From: Rob Vesse [mailto:[email protected]] >Sent: Wednesday, October 23, 2013 10:30 AM >To: [email protected] >Subject: Re: Use of recent features from httpclient > > > >We are always open to making the code as widely compatible as possible. > >Could you point out where we call the troublesome method or provide a >relevant stack trace from your environment? > > > >It's possible that this is something that gets called by the internals >of HTTP Client in which case we would likely not be able to change this. > > > >Rob > > > >On 23/10/2013 15:42, "Altmann, Michael" ><[email protected]<mailto:[email protected]>> > >wrote: > > > >>Sometime between version 2.7.3 and 2.11.0, jena upgraded the version >>of > >>the apache httpclient library. It now uses 4.2.3. In particular, it > >>calls a method that was added in the 4.2 version of httpclient, namely > >>org.apache.http.impl.conn.SchemeRegistryFactory.createSystemDefault(). > >> > >>While that is a completely reasonable thing to do from the Jena > >>development point of view, it is causing us trouble. Our application > >>uses Jena and also uses GWT (Google Web Toolkit). Even the most >>recent > >>version of GWT ( 2.5.1) comes packaged with an old, 4.0, version of >>the > >>org.apache.http.impl.conn.SchemeRegistryFactory class, which lacks the > >>createSystemDefault() method. This means that we cannot use Jena > >>beyond version 2.7.3 until GWT Fixes its packaging (see > >>https://code.google.com/p/google-web-toolkit/issues/detail?id=4484). > >>There are several bug fixes in recent versions of Jena that I would > >>love to pick up, but cannot. Is there any chance that Jena would be > >>willing to develop against httpclient is a way that is backwards > >>compatible with httpclient 4.0? > >> > >>Thanks, Michael Altmann > > > > > > > >
