* @see
* org.opentides.service.WidgetService#requestWidget(java.lang
* .String)
*/
public Widget requestWidget(String widgetUrl, String name, HttpServletRequest req) {
Widget widget = findByName(name);
if (widget != null) {
long now = System.currentTimeMillis();
Date lastCacheDate = widget.getLastCacheUpdate();
boolean useCache = false;
// check if we should use cache or not
if (lastCacheDate != null) {
long expire = widget.getLastCacheUpdate().getTime()
+ widget.getCacheDuration() * 1000;
if (widget.getCacheType().startsWith(
Widget.TYPE_IMAGE)
|| now < expire)
useCache = true;
}
if (useCache) {
_log.debug("Reusing widget [" + widget.getName()
+ "] from cache...");
// retrieve from cache
return widget;
} else {
// retrieve from url
String url = widget.getUrl();
if (!UrlUtil.hasProtocol(url)) {
String slash = "/";
if (!url.startsWith("/")) {
url = slash + url;
}
url = req.getContextPath().toString() + url;
if (req.getServerPort() != 80) {
url = ":" + Integer.toString(req.getServerPort()) + url;
}
url = UrlUtil.ensureProtocol(req.getServerName() + url);
}
// set the IP Address as param
Map<String, Object> param = new HashMap<String, Object>();
if (StringUtil.isEmpty(IPAddress))
param.put("IPAddress", IPAddress);
UrlResponseObject response = UrlUtil.getPage(url, req, param);
if (response==null)
return null;
if (response.getResponseType()
.startsWith(Widget.TYPE_IMAGE)) {
_log.debug("Retrieving image [" + widget.getName()
+ "] from url [" + widget.getUrl() + "]...");
widget.setCacheType(response.getResponseType());
widget.setCache(response.getResponseBody());
widget.setLastCacheUpdate(new Date());
save(widget);
_log.debug("Saved image [" + widget.getName()
+ "] to cache...");
return widget;
} else {
_log.debug("Retrieving widget [" + widget.getName()
+ "] from url [" + widget.getUrl() + "]...");
widget.setCacheType(response.getResponseType());
// check for image inside the html
String html = new String(response.getResponseBody());
String hostname = UrlUtil.getHostname(url);
Matcher matcher = pattern.matcher(html);
while (matcher.find()) {
// add image link to cache
String imageUrl = matcher.group(1);
String cacheUrl = imageUrl;
if (!UrlUtil.hasProtocol(cacheUrl)) {
if (!imageUrl.startsWith("/")) {
cacheUrl = "http://" + hostname + "/" + imageUrl;
} else {
cacheUrl = "http://" + hostname + imageUrl;
}
}
String imageName = this.addCache(cacheUrl, req, widget);
// replace html that reference to image with cached image
String newUrl = widgetUrl+"?name="+imageName;
html = html.replace(imageUrl, newUrl);
}
widget.setCache(html.getBytes());
widget.setLastCacheUpdate(new Date());
save(widget);
_log.debug("Saved widget [" + widget.getName()
+ "] to cache...");
return widget;
}
}
}