/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.webui.application; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.IOUtils; import org.exoplatform.application.gadget.Gadget; import org.exoplatform.application.gadget.GadgetRegistryService; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.container.PortalContainer; import org.exoplatform.portal.gadget.core.SecurityTokenGenerator; import org.exoplatform.portal.webui.util.Util; import org.gatein.common.logging.Logger; import org.gatein.common.logging.LoggerFactory; import org.json.JSONException; import org.json.JSONObject; /** * Created by The eXo Platform SAS Author : Pham Thanh Tung thanhtungty@gmail.com Oct 2, 2008 */ public class GadgetUtil { private static final Logger log = LoggerFactory.getLogger(GadgetUtil.class); public static Gadget toGadget(String name, String path, boolean isLocal) throws Exception { Gadget gadget = new Gadget(); gadget.setName(name); gadget.setUrl(path); gadget.setLocal(isLocal); Map<String, String> metaData = getMapMetadata(reproduceUrl(path, isLocal)); if (metaData.containsKey("errors")) throw new Exception("error on the server: " + metaData.get("errors")); String title = metaData.get("directoryTitle"); if (title == null || title.trim().length() < 1) title = metaData.get("title"); if (title == null || title.trim().length() < 1) title = gadget.getName(); gadget.setTitle(title); gadget.setDescription(metaData.get("description")); gadget.setReferenceUrl(metaData.get("titleUrl")); gadget.setThumbnail(metaData.get("thumbnail")); return gadget; } /** * Fetchs Metatada of gadget application, create the connection to shindig server to get the metadata TODO cache the * informations for better performance * * @return the string represents metadata of gadget application */ @Deprecated public static String fetchGagdetMetadata(String urlStr) { String result = null; ExoContainer container = ExoContainerContext.getCurrentContainer(); GadgetRegistryService gadgetService = (GadgetRegistryService) container .getComponentInstanceOfType(GadgetRegistryService.class); try { String data = "{\"context\":{\"country\":\"" + gadgetService.getCountry() + "\",\"language\":\"" + gadgetService.getLanguage() + "\"},\"gadgets\":[" + "{\"moduleId\":" + gadgetService.getModuleId() + ",\"url\":\"" + urlStr + "\",\"prefs\":[]}]}"; // Send data String gadgetServer = getGadgetServerUrl(); URL url = new URL(gadgetServer + (gadgetServer.endsWith("/") ? "" : "/") + "metadata"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data); wr.flush(); // Get the response result = IOUtils.toString(conn.getInputStream(), "UTF-8"); wr.close(); } catch (IOException e) { log.error(e.getMessage(), e); return "{}"; } return result; } /** * Fetchs Metatada of gadget application, create the connection to shindig server to get the metadata TODO cache the * informations for better performance * * @return the string represents metadata of gadget application */ public static String fetchGagdetRpcMetadata(String urlStr) { String result = null; ExoContainer container = ExoContainerContext.getCurrentContainer(); GadgetRegistryService gadgetService = (GadgetRegistryService) container .getComponentInstanceOfType(GadgetRegistryService.class); try { String data = "[{method:\"gadgets.metadata\", id:\"test\", params: {ids:[\"" + urlStr + "\"], container:\"default\", language:\"" + gadgetService.getLanguage() + "\", country:\"" + gadgetService.getCountry() + "\", view:\"home\"}}]"; // Send data String gadgetServer = getGadgetServerUrl(); URL url = new URL(gadgetServer + (gadgetServer.endsWith("/") ? "" : "/") + "api/rpc"); URLConnection conn = url.openConnection(); conn.setRequestProperty("Content-Type", "application/json"); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data); wr.flush(); // Get the response result = IOUtils.toString(conn.getInputStream(), "UTF-8"); wr.close(); } catch (IOException e) { log.error(e.getMessage(), e); return "{}"; } return result; } public static String createToken(String gadgetURL, Long moduleId) { SecurityTokenGenerator tokenGenerator = (SecurityTokenGenerator) ExoContainerContext.getCurrentContainer() .getComponentInstanceOfType(SecurityTokenGenerator.class); return tokenGenerator.createToken(gadgetURL, moduleId); } /** * Gets map metadata of gadget application * * @return map metadata of gadget application so can get value of metadata by it's key such as title, url * @throws JSONException if can't create jsonObject from metadata */ @SuppressWarnings("unchecked") public static Map<String, String> getMapMetadata(String url) throws JSONException { Map<String, String> mapMetaData = new HashMap<String, String>(); String metadata = fetchGagdetRpcMetadata(url); metadata = metadata.substring(metadata.indexOf("[") + 1, metadata.lastIndexOf("]")); JSONObject jsonObj = new JSONObject(metadata).getJSONObject(UIGadget.RPC_RESULT).getJSONObject(url) .getJSONObject(UIGadget.METADATA_MODULEPREFS); Iterator<String> iter = jsonObj.keys(); while (iter.hasNext()) { String element = iter.next(); mapMetaData.put(element, jsonObj.get(element).toString()); } return mapMetaData; } public static String reproduceUrl(String path, boolean isLocal) { if (isLocal) { return getViewPath(path); } return path; } public static String getViewPath(String uri) { return getLocalHostBase() + "/" + PortalContainer.getCurrentRestContextName() + "/" + uri; } public static String getEditPath(String uri) { return getLocalHostBase() + "/" + PortalContainer.getCurrentRestContextName() + "/private/" + uri; } /** * Make full URL of gadget server * * @return URL String */ public static String getGadgetServerUrl() { String uriString = getGadgetServerURI(); try { new URL(uriString); } catch (Exception e) { return getLocalHostBase() + (uriString.startsWith("/") ? uriString : ("/" + uriString)); } return uriString; } /** * See getGadgetServerUrl() * * @return URL String */ @Deprecated public static String getRelGadgetServerUrl() { return getGadgetServerUrl(); } private static String getGadgetServerURI() { ExoContainer container = ExoContainerContext.getCurrentContainer(); GadgetRegistryService gadgetService = (GadgetRegistryService) container .getComponentInstanceOfType(GadgetRegistryService.class); return gadgetService.getHostName(); } private static String getLocalHostBase() { HttpServletRequest request = Util.getPortalRequestContext().getRequest(); return request.getScheme() + "://" + request.getServerName() + ((request.getServerPort() != 80) ? ":" + request.getServerPort() : ""); } }