|
20 | 20 |
|
21 | 21 | import com.hp.hpl.jena.ontology.OntModel; |
22 | 22 | import com.hp.hpl.jena.ontology.OntModelSpec; |
23 | | -import com.hp.hpl.jena.rdf.model.Model; |
24 | | -import com.hp.hpl.jena.rdf.model.ModelFactory; |
25 | | -import com.hp.hpl.jena.rdf.model.ModelMaker; |
| 23 | +import com.hp.hpl.jena.rdf.model.*; |
26 | 24 | import org.apache.commons.io.FileUtils; |
27 | 25 | import org.apache.commons.lang3.StringUtils; |
28 | 26 | import org.apache.commons.lang3.time.StopWatch; |
@@ -83,49 +81,7 @@ public static OntModel loadMemoryModel( String url, @Nullable String cacheName ) |
83 | 81 | timer.start(); |
84 | 82 | OntModel model = getMemoryModel( url ); |
85 | 83 |
|
86 | | - URLConnection urlc = null; |
87 | | - int tries = 0; |
88 | | - while ( tries < MAX_CONNECTION_TRIES ) { |
89 | | - try { |
90 | | - urlc = new URL( url ).openConnection(); |
91 | | - // help ensure mis-configured web servers aren't causing trouble. |
92 | | - urlc.setRequestProperty( "Accept", "application/rdf+xml" ); |
93 | | - |
94 | | - try { |
95 | | - HttpURLConnection c = ( HttpURLConnection ) urlc; |
96 | | - c.setInstanceFollowRedirects( true ); |
97 | | - } catch ( ClassCastException e ) { |
98 | | - // not via http, using a FileURLConnection. |
99 | | - } |
100 | | - |
101 | | - if ( tries > 0 ) { |
102 | | - log.info( "Retrying connecting to " + url + " [" + tries + "/" + MAX_CONNECTION_TRIES |
103 | | - + " of max tries" ); |
104 | | - } else { |
105 | | - log.info( "Connecting to " + url ); |
106 | | - } |
107 | | - |
108 | | - urlc.connect(); // Will error here on bad URL |
109 | | - |
110 | | - if ( urlc instanceof HttpURLConnection ) { |
111 | | - String newUrl = urlc.getHeaderField( "Location" ); |
112 | | - |
113 | | - if ( StringUtils.isNotBlank( newUrl ) ) { |
114 | | - log.info( "Redirect to " + newUrl ); |
115 | | - urlc = new URL( newUrl ).openConnection(); |
116 | | - // help ensure mis-configured web servers aren't causing trouble. |
117 | | - urlc.setRequestProperty( "Accept", "application/rdf+xml" ); |
118 | | - urlc.connect(); |
119 | | - } |
120 | | - } |
121 | | - |
122 | | - break; |
123 | | - } catch ( IOException e ) { |
124 | | - // try to recover. |
125 | | - log.error( e + " retrying?" ); |
126 | | - tries++; |
127 | | - } |
128 | | - } |
| 84 | + URLConnection urlc = openConnection( url ); |
129 | 85 |
|
130 | 86 | if ( urlc != null ) { |
131 | 87 | try ( InputStream in = urlc.getInputStream() ) { |
@@ -235,13 +191,80 @@ private static OntModel getMemoryModel( String url ) { |
235 | 191 | ModelMaker maker = ModelFactory.createMemModelMaker(); |
236 | 192 | Model base = maker.createModel( url, false ); |
237 | 193 | spec.setImportModelMaker( maker ); |
238 | | - spec.getDocumentManager().setProcessImports( false ); |
| 194 | + spec.getDocumentManager().setProcessImports( true ); |
| 195 | + spec.setImportModelGetter( new ModelGetter() { |
| 196 | + @Override |
| 197 | + public Model getModel( String URL ) { |
| 198 | + return null; |
| 199 | + } |
239 | 200 |
|
| 201 | + @Override |
| 202 | + public Model getModel( String URL, ModelReader loadIfAbsent ) { |
| 203 | + Model model = maker.createModel( URL ); |
| 204 | + URLConnection urlc = openConnection( URL ); |
| 205 | + if ( urlc != null ) { |
| 206 | + try ( InputStream in = urlc.getInputStream() ) { |
| 207 | + return model.read( in, URL ); |
| 208 | + } catch ( IOException e ) { |
| 209 | + log.error( String.format( "Failed to load from %s.", URL ), e ); |
| 210 | + } |
| 211 | + } |
| 212 | + return loadIfAbsent.readModel( model, URL ); |
| 213 | + } |
| 214 | + } ); |
240 | 215 | OntModel model = ModelFactory.createOntologyModel( spec, base ); |
241 | 216 | model.setStrictMode( false ); // fix for owl2 files |
242 | 217 | return model; |
243 | 218 | } |
244 | 219 |
|
| 220 | + public static URLConnection openConnection( String url ) { |
| 221 | + URLConnection urlc = null; |
| 222 | + int tries = 0; |
| 223 | + while ( tries < MAX_CONNECTION_TRIES ) { |
| 224 | + try { |
| 225 | + urlc = new URL( url ).openConnection(); |
| 226 | + // help ensure mis-configured web servers aren't causing trouble. |
| 227 | + urlc.setRequestProperty( "Accept", "application/rdf+xml" ); |
| 228 | + |
| 229 | + try { |
| 230 | + HttpURLConnection c = ( HttpURLConnection ) urlc; |
| 231 | + c.setInstanceFollowRedirects( true ); |
| 232 | + } catch ( ClassCastException e ) { |
| 233 | + // not via http, using a FileURLConnection. |
| 234 | + } |
| 235 | + |
| 236 | + if ( tries > 0 ) { |
| 237 | + log.info( "Retrying connecting to " + url + " [" + tries + "/" + MAX_CONNECTION_TRIES |
| 238 | + + " of max tries" ); |
| 239 | + } else { |
| 240 | + log.info( "Connecting to " + url ); |
| 241 | + } |
| 242 | + |
| 243 | + urlc.connect(); // Will error here on bad URL |
| 244 | + |
| 245 | + if ( urlc instanceof HttpURLConnection ) { |
| 246 | + String newUrl = urlc.getHeaderField( "Location" ); |
| 247 | + |
| 248 | + if ( StringUtils.isNotBlank( newUrl ) ) { |
| 249 | + log.info( "Redirect to " + newUrl ); |
| 250 | + urlc = new URL( newUrl ).openConnection(); |
| 251 | + // help ensure mis-configured web servers aren't causing trouble. |
| 252 | + urlc.setRequestProperty( "Accept", "application/rdf+xml" ); |
| 253 | + urlc.connect(); |
| 254 | + } |
| 255 | + } |
| 256 | + |
| 257 | + break; |
| 258 | + } catch ( IOException e ) { |
| 259 | + // try to recover. |
| 260 | + log.error( e + " retrying?" ); |
| 261 | + tries++; |
| 262 | + } |
| 263 | + } |
| 264 | + |
| 265 | + return urlc; |
| 266 | + } |
| 267 | + |
245 | 268 | /** |
246 | 269 | * Obtain the path for the ontology cache. |
247 | 270 | */ |
|
0 commit comments