ret = cache.request(purl);
if (ret != null) {
// System.out.println("Image came from cache" + purl);
if (colorSpace != null)
ret = new ProfileRable(ret, colorSpace);
return ret;
}
}
// System.out.println("Image didn't come from cache: " + purl);
boolean openFailed = false;
List mimeTypes = getRegisteredMimeTypes();
Iterator i;
i = entries.iterator();
while (i.hasNext()) {
RegistryEntry re = (RegistryEntry)i.next();
if (re instanceof URLRegistryEntry) {
if ((purl == null) || !allowOpenStream) continue;
URLRegistryEntry ure = (URLRegistryEntry)re;
if (ure.isCompatibleURL(purl)) {
ret = ure.handleURL(purl, needRawData);
// Check if we got an image.
if (ret != null) break;
}
continue;
}
if (re instanceof StreamRegistryEntry) {
StreamRegistryEntry sre = (StreamRegistryEntry)re;
// Quick out last time the open didn't work for this
// URL so don't try again...
if (openFailed) continue;
try {
if (is == null) {
// Haven't opened the stream yet let's try.
if ((purl == null) || !allowOpenStream)
break; // No purl nothing we can do...
try {
is = purl.openStream(mimeTypes.iterator());
} catch(IOException ioe) {
// Couldn't open the stream, go to next entry.
openFailed = true;
continue;
}
if (!is.markSupported())
// Doesn't support mark so wrap with
// BufferedInputStream that does.
is = new BufferedInputStream(is);
}
if (sre.isCompatibleStream(is)) {
ret = sre.handleStream(is, purl, needRawData);
if (ret != null) break;
}
} catch (StreamCorruptedException sce) {
// Stream is messed up so setup to reopen it..
is = null;
}
continue;
}
}
if (cache != null)
cache.put(purl, ret);
if (ret == null) {
if (!returnBrokenLink)
return null;
if (openFailed)
// Technially it's possible that it's an unknown
// 'protocol that caused the open to fail but probably
// it's a bad URL...
return getBrokenLinkImage(this, ERR_URL_UNREACHABLE,
new Object[] { purl });
// We were able to get to the data we just couldn't
// make sense of it...
return getBrokenLinkImage(this, ERR_URL_UNINTERPRETABLE,
new Object[] { purl } );
}
if (ret.getProperty(BrokenLinkProvider.BROKEN_LINK_PROPERTY) != null) {
// Don't Return Broken link image unless requested
return (returnBrokenLink)?ret:null;
}
if (colorSpace != null)
ret = new ProfileRable(ret, colorSpace);
return ret;
}