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 documents via a URL or specific install method. * * @author Stefan Schmidt * @since 1.1 */ @Component @Service public class DocumentEmbeddedProvider extends AbstractEmbeddedProvider { public enum DocumentProvider implements EmbeddedCompletor { GOOGLE_PRESENTATION, SCRIBD, SLIDESHARE; @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) { if (url.contains("slideshare.net")) { // Expected format // http://www.slideshare.net/schmidtstefan/spring-one2-gx-slides-stefan-schmidt final Map<String, String> options = new HashMap<String, String>(); options.put("provider", DocumentProvider.SLIDESHARE.name()); options.put("id", url); return install(viewName, options); } else if (url.contains("scribd.com")) { // Expected format // http://www.scribd.com/doc/27766735/Introduction-to-SpringRoo final String[] split = url.split("/"); if (split.length > 4) { final Map<String, String> options = new HashMap<String, String>(); options.put("provider", DocumentProvider.SCRIBD.name()); options.put("id", split[4]); return install(viewName, options); } return false; } else if (url.contains("docs.google.") && url.contains("present")) { // Expected format // http://docs.google.com/present/view?id=dd8rf8t9_31c9f2fcgd&revision=_latest&start=0&theme=blank&authkey=CLj5iZwJ&cwj=true final String qStart = url.substring(url.indexOf("id=") + 3); final Map<String, String> options = new HashMap<String, String>(); options.put("provider", DocumentProvider.GOOGLE_PRESENTATION.name()); options.put("id", qStart.substring(0, qStart.indexOf("&") == -1 ? qStart.length() : qStart.indexOf("&"))); return install(getViewName(viewName, "googlepresentation"), options); } return false; } private String getSlideShareId(final String url) { final String json = sendHttpGetRequest("http://oohembed.com/oohembed/?url=" + url.replace(":", "%3A")); if (json != null) { final String subDoc = json.substring(json.indexOf("doc=") + 4); 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() != 2 || !options.containsKey("provider") || !options.containsKey("id")) { return false; } final String provider = options.get("provider"); if (!isProviderSupported(provider, DocumentProvider.values())) { return false; } String id = options.get("id"); installTagx("document"); if (DocumentProvider.SLIDESHARE.name().equals(provider) && id.startsWith("http")) { id = getSlideShareId(id); } final Element document = new XmlElementBuilder("embed:document", XmlUtils.getDocumentBuilder().newDocument()) .addAttribute("id", "doc_" + id).addAttribute("documentId", id) .addAttribute("provider", provider.toLowerCase()).build(); document.setAttribute("z", XmlRoundTripUtils.calculateUniqueKeyFor(document)); installJspx(getViewName(viewName, provider.toLowerCase()), null, document); return true; } }