/* * 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.application.gadget.impl; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.Callable; import org.apache.shindig.common.uri.Uri; import org.apache.shindig.gadgets.spec.GadgetSpec; import org.apache.shindig.gadgets.spec.ModulePrefs; import org.chromattic.api.Chromattic; import org.chromattic.api.ChromatticSession; import org.chromattic.ext.ntdef.Resource; import org.exoplatform.application.gadget.Gadget; import org.exoplatform.application.gadget.GadgetImporter; import org.exoplatform.application.gadget.GadgetRegistryService; import org.exoplatform.application.registry.impl.ApplicationRegistryChromatticLifeCycle; import org.exoplatform.commons.chromattic.ChromatticLifeCycle; import org.exoplatform.commons.chromattic.ChromatticManager; import org.exoplatform.commons.utils.PropertyManager; import org.exoplatform.container.PortalContainer; import org.exoplatform.container.xml.InitParams; import org.exoplatform.container.xml.PropertiesParam; import org.exoplatform.container.xml.ValueParam; import org.gatein.common.logging.Logger; import org.gatein.common.logging.LoggerFactory; /** * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> * @version $Revision$ */ public class GadgetRegistryServiceImpl implements GadgetRegistryService { /** . */ private final Logger log = LoggerFactory.getLogger(GadgetRegistryServiceImpl.class); /** . */ private static final String DEFAULT_DEVELOPER_GROUP = "/platform/administrators"; /** . */ private ChromatticLifeCycle chromatticLifeCycle; /** . */ private String country; /** . */ private String language; /** . */ private String moduleId; /** . */ private String hostName; public GadgetRegistryServiceImpl(ChromatticManager chromatticManager, InitParams params) { ApplicationRegistryChromatticLifeCycle lifeCycle = (ApplicationRegistryChromatticLifeCycle) chromatticManager .getLifeCycle("app"); // String gadgetDeveloperGroup = null; String country = null; String language = null; String moduleId = null; String hostName = null; if (params != null) { PropertiesParam properties = params.getPropertiesParam("developerInfo"); gadgetDeveloperGroup = properties != null ? properties.getProperty("developer.group") : null; ValueParam gadgetCountry = params.getValueParam("gadgets.country"); country = gadgetCountry != null ? gadgetCountry.getValue() : null; ValueParam gadgetLanguage = params.getValueParam("gadgets.language"); language = gadgetLanguage != null ? gadgetLanguage.getValue() : null; ValueParam gadgetModuleId = params.getValueParam("gadgets.moduleId"); moduleId = gadgetModuleId != null ? gadgetModuleId.getValue() : null; ValueParam gadgetHostName = params.getValueParam("gadgets.hostName"); hostName = gadgetHostName != null ? gadgetHostName.getValue() : null; } // if (gadgetDeveloperGroup == null) { gadgetDeveloperGroup = DEFAULT_DEVELOPER_GROUP; } // this.country = country; this.language = language; this.moduleId = moduleId; this.hostName = hostName; this.chromatticLifeCycle = lifeCycle; } public GadgetRegistry getRegistry() { Chromattic chromattic = chromatticLifeCycle.getChromattic(); ChromatticSession session = chromattic.openSession(); GadgetRegistry registry = session.findByPath(GadgetRegistry.class, "app:gadgets"); if (registry == null) { registry = session.insert(GadgetRegistry.class, "app:gadgets"); } return registry; } // *************** public void deploy(Iterable<GadgetImporter> gadgets) { for (GadgetImporter importer : gadgets) { try { new DeployTask(importer).call(); } catch (Exception e) { log.error("Could not process gadget file " + importer, e); } } } public Gadget getGadget(String name) { GadgetRegistry registry = getRegistry(); // GadgetDefinition def = registry.getGadget(name); // return def == null ? null : loadGadget(def); } public List<Gadget> getAllGadgets() throws Exception { return getAllGadgets(null); } public List<Gadget> getAllGadgets(Comparator<Gadget> sortComparator) { GadgetRegistry registry = getRegistry(); List<Gadget> gadgets = new ArrayList<Gadget>(); for (GadgetDefinition def : registry.getGadgets()) { Gadget gadget = loadGadget(def); gadgets.add(gadget); } if (sortComparator != null) { Collections.sort(gadgets, sortComparator); } return gadgets; } public void saveGadget(Gadget gadget) throws Exception { if (gadget == null) { throw new NullPointerException(); } // GadgetRegistry registry = getRegistry(); GadgetDefinition def = registry.getGadget(gadget.getName()); // if (def == null) { def = registry.addGadget(gadget.getName()); if (gadget.isLocal()) { def.setLocal(true); LocalGadgetData data = (LocalGadgetData) def.getData(); String fileName = gadget.getName() + ".xml"; data.setFileName(fileName); data.getResources().createFile( fileName, new Resource("application.xml", "UTF-8", ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<Module><ModulePrefs title=\"\" />" + "<Content type=\"html\"> <![CDATA[]]>" + "</Content>" + "</Module>").getBytes("UTF-8"))); } else { def.setLocal(false); RemoteGadgetData data = (RemoteGadgetData) def.getData(); data.setURL(gadget.getUrl()); } } if (!gadget.isLocal()) { def.setDescription(gadget.getDescription()); def.setReferenceURL(gadget.getReferenceUrl()); def.setTitle(gadget.getTitle()); def.setThumbnail(gadget.getThumbnail()); } } public void removeGadget(String name) { if (name == null) { throw new NullPointerException(); } // GadgetRegistry registry = getRegistry(); GadgetDefinition def = registry.getGadget(name); // if (def == null) { throw new IllegalArgumentException("No such gadget " + name); } // registry.removeGadget(name); } public String getGadgetURL(String gadgetName) { String url; GadgetData data = this.getRegistry().getGadget(gadgetName).getData(); if (data instanceof LocalGadgetData) { LocalGadgetData localData = (LocalGadgetData) data; url = "/" + PortalContainer.getCurrentRestContextName() + "/" + getJCRGadgetURL(localData); } else if (data instanceof RemoteGadgetData) { RemoteGadgetData remoteData = (RemoteGadgetData) data; url = remoteData.getURL(); } else { throw new IllegalStateException("Gadget has to be instance of LocalGadgetData or RemoteGadgetData"); } return url; } private String getJCRGadgetURL(LocalGadgetData data) { return "jcr/" + chromatticLifeCycle.getRepositoryName() + "/" + chromatticLifeCycle.getWorkspaceName() + data.getPath() + "/app:resources/" + data.getFileName(); } private Gadget loadGadget(GadgetDefinition def) { GadgetData data = def.getData(); Gadget gadget = new Gadget(); // if (data instanceof LocalGadgetData) { try { String gadgetName = def.getName(); LocalGadgetData localData = (LocalGadgetData) data; Resource resource = localData.getResources().getFile(localData.getFileName()).getContentResource(); String content = new String(resource.getData(), resource.getEncoding()); GadgetSpec gadgetSpec = new GadgetSpec(Uri.parse(getGadgetURL(gadgetName)), content); ModulePrefs prefs = gadgetSpec.getModulePrefs(); String title = prefs.getDirectoryTitle(); if (title == null || title.trim().length() < 1) { title = prefs.getTitle(); } if (title == null || title.trim().length() < 1) { title = gadgetName; } gadget.setName(def.getName()); gadget.setDescription(prefs.getDescription()); gadget.setLocal(true); gadget.setTitle(title); gadget.setReferenceUrl(prefs.getTitleUrl().toString()); gadget.setThumbnail(prefs.getThumbnail().toString()); gadget.setUrl(getJCRGadgetURL(localData)); } catch (Exception ex) { log.error("Error while loading the content of local gadget " + def.getName(), ex); } } else { RemoteGadgetData remoteData = (RemoteGadgetData) data; gadget.setName(def.getName()); gadget.setDescription(def.getDescription()); gadget.setLocal(false); gadget.setTitle(def.getTitle()); gadget.setReferenceUrl(def.getReferenceURL()); gadget.setThumbnail(def.getThumbnail()); gadget.setUrl(remoteData.getURL()); } // return gadget; } public boolean isGadgetDeveloper(String username) { return PropertyManager.isDevelopping(); } public String getCountry() { return country; } public String getLanguage() { return language; } public String getModuleId() { return moduleId; } public String getHostName() { return hostName; } private class DeployTask implements Callable<Boolean> { /** . */ private final GadgetImporter importer; private DeployTask(GadgetImporter importer) { this.importer = importer; } public Boolean call() throws Exception { chromatticLifeCycle.openContext(); boolean done = true; try { if (getRegistry().getGadget(importer.getGadgetName()) == null) { GadgetDefinition def = getRegistry().addGadget(importer.getGadgetName()); importer.doImport(def); } else { log.debug("Will not import existing gagdet " + importer.getGadgetName()); } } catch (Exception e) { done = false; } finally { chromatticLifeCycle.closeContext(done); } return done; } } }