/*
* 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;
import org.exoplatform.application.gadget.impl.GadgetRegistryServiceImpl;
import org.exoplatform.commons.xml.DocumentSource;
import org.exoplatform.commons.xml.XMLValidator;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.RootContainer;
import org.gatein.common.logging.Logger;
import org.gatein.common.logging.LoggerFactory;
import org.gatein.common.xml.XMLTools;
import org.gatein.wci.ServletContainerFactory;
import org.gatein.wci.WebApp;
import org.gatein.wci.WebAppEvent;
import org.gatein.wci.WebAppLifeCycleEvent;
import org.gatein.wci.WebAppListener;
import org.picocontainer.Startable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class GadgetDeployer implements WebAppListener, Startable {
/** . */
private static final XMLValidator validator = new XMLValidator(GadgetDeployer.class,
"http://www.gatein.org/xml/ns/gadgets_1_0", "gadgets_1_0.xsd");
/** . */
private final Logger log = LoggerFactory.getLogger(GadgetDeployer.class);
/** . */
private GadgetRegistryServiceImpl gadgetRegistryService;
/** . */
private ExoContainerContext context;
public GadgetDeployer(ExoContainerContext context, GadgetRegistryService gadgetRegistryService) {
this.context = context;
this.gadgetRegistryService = (GadgetRegistryServiceImpl) gadgetRegistryService;
}
public void onEvent(WebAppEvent webAppEvent) {
if (webAppEvent instanceof WebAppLifeCycleEvent) {
WebAppLifeCycleEvent lfEvent = (WebAppLifeCycleEvent) webAppEvent;
if (lfEvent.getType() == WebAppLifeCycleEvent.ADDED) {
WebApp webApp = webAppEvent.getWebApp();
ServletContext scontext = webApp.getServletContext();
try {
final URL url = scontext.getResource("/WEB-INF/gadget.xml");
if (url != null) {
final RootContainer.PortalContainerPostInitTask task = new RootContainer.PortalContainerPostInitTask() {
public void execute(ServletContext context, PortalContainer portalContainer) {
handle(context, url);
}
};
PortalContainer.addInitTask(scontext, task, context.getPortalContainerName());
}
} catch (MalformedURLException e) {
log.error("Could not read the content of the gadget file", e);
}
}
}
}
public void start() {
ServletContainerFactory.getServletContainer().addWebAppListener(this);
}
public void stop() {
ServletContainerFactory.getServletContainer().removeWebAppListener(this);
}
private void handle(ServletContext scontext, URL gadgetsURL) {
try {
List<GadgetImporter> importers = new ArrayList<GadgetImporter>();
Document docXML = validator.validate(DocumentSource.create(gadgetsURL));
NodeList nodeList = docXML.getElementsByTagName("gadget");
for (int i = 0; i < nodeList.getLength(); i++) {
Element gadgetElement = (Element) nodeList.item(i);
String gadgetName = gadgetElement.getAttribute("name");
//
log.debug("About to parse gadget " + gadgetName);
Element pathElt = XMLTools.getUniqueChild(gadgetElement, "path", false);
GadgetImporter importer = null;
if (pathElt != null) {
String path = XMLTools.asString(pathElt, true);
importer = new ServletLocalImporter(gadgetName, path, scontext, gadgetRegistryService);
} else {
Element urlElt = XMLTools.getUniqueChild(gadgetElement, "url", false);
if (urlElt != null) {
String url = XMLTools.asString(urlElt, true);
importer = new RemoteImporter(gadgetName, url);
}
}
//
if (importer != null) {
importers.add(importer);
log.debug("Add gadget " + gadgetName + " to gadget imports");
}
}
// Import everything
gadgetRegistryService.deploy(importers);
} catch (Exception e) {
log.error("Could not process gadget file " + gadgetsURL, e);
}
}
}