package org.springframework.roo.addon.web.mvc.embedded.provider; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.addon.web.mvc.embedded.AbstractEmbeddedProvider; import org.springframework.roo.addon.web.mvc.embedded.EmbeddedCompletor; import org.springframework.roo.support.util.XmlElementBuilder; import org.springframework.roo.support.util.XmlRoundTripUtils; import org.springframework.roo.support.util.XmlUtils; import org.w3c.dom.Element; /** * Provider to embed photo galleries via a URL or specific install method. * * @author Stefan Schmidt * @since 1.1 */ @Component @Service public class PhotoEmbeddedProvider extends AbstractEmbeddedProvider { public enum PhotoProvider implements EmbeddedCompletor { FLIKR, PICASA; @Override public String toString() { final ToStringBuilder builder = new ToStringBuilder(this); builder.append("provider", name()); return builder.toString(); } } public boolean embed(final String url, final String viewName) { // Expected http://picasaweb.google.com.au/stsmedia/SydneyByNight if (url.contains("picasaweb.google.")) { final String[] split = url.split("/"); if (split.length > 4) { final Map<String, String> options = new HashMap<String, String>(); options.put("provider", PhotoProvider.PICASA.name()); options.put("userId", split[3]); options.put("albumId", getPicasaId(url)); return install(viewName, options); } return false; } else if (url.contains("flickr.")) { final String[] split = url.split("/"); if (split.length > 4) { final Map<String, String> options = new HashMap<String, String>(); options.put("provider", PhotoProvider.FLIKR.name()); options.put("userId", split[4]); options.put("albumId", split.length > 5 ? split[5] : split[4]); return install(viewName, options); } return false; } return false; } private String getPicasaId(final String url) { final String json = sendHttpGetRequest("http://api.embed.ly/v1/api/oembed?url=" + url); if (json != null) { final String subDoc = json.substring(json.indexOf("albumid%2F") + 10); return subDoc.substring(0, subDoc.indexOf("%") == 1 ? subDoc.length() : subDoc.indexOf("%")); } return null; } public boolean install(final String viewName, final Map<String, String> options) { if (options == null || options.size() != 3 || !options.containsKey("provider") || !options.containsKey("userId") || !options.containsKey("albumId")) { return false; } final String provider = options.get("provider"); if (!isProviderSupported(provider, PhotoProvider.values())) { return false; } final String userId = options.get("userId"); final String albumId = options.get("albumId"); installTagx("photos"); final Element photos = new XmlElementBuilder("embed:photos", XmlUtils.getDocumentBuilder().newDocument()) .addAttribute("id", "photos_" + userId + "_" + albumId) .addAttribute("albumId", albumId).addAttribute("userId", userId) .addAttribute("provider", provider.toLowerCase()).build(); photos.setAttribute("z", XmlRoundTripUtils.calculateUniqueKeyFor(photos)); installJspx(getViewName(viewName, provider.toLowerCase()), null, photos); return true; } }