/********************************************************************** * $Source: /cvsroot/jameica/jameica.webadmin/src/de/willuhn/jameica/webadmin/rest/Service.java,v $ * $Revision: 1.15 $ * $Date: 2012/03/29 20:54:40 $ * $Author: willuhn $ * $Locker: $ * $State: Exp $ * * Copyright (c) by willuhn software & services * All rights reserved * **********************************************************************/ package de.willuhn.jameica.webadmin.rest; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.json.JSONArray; import org.json.JSONObject; import de.willuhn.jameica.plugin.Manifest; import de.willuhn.jameica.plugin.ServiceDescriptor; import de.willuhn.jameica.system.Application; import de.willuhn.jameica.webadmin.annotation.Doc; import de.willuhn.jameica.webadmin.annotation.Path; import de.willuhn.logging.Logger; /** * REST-Kommandos zum Starten und Stoppen von Services. */ @Doc("System: Bietet Zugriff auf die Services der Plugins.") public class Service implements AutoRestBean { /** * Startet den Service. * @param plugin Name des Plugins. * @param service Name des Services. * @return der Service-Status. * @throws IOException */ @Doc(value="Startet den angegebenen Service (meinservicename) des angegebenen Plugins (meinplugin)", example="plugins/meinplugin/services/meinservicename/start") @Path("/plugins/(.*?)/services/(.*?)/start$") public JSONObject start(String plugin, String service) throws IOException { try { de.willuhn.datasource.Service s = find(plugin,service); s.start(); return new JSONObject().put("started",Boolean.toString(s.isStarted())); } catch (IOException e) { throw e; } catch (Exception e2) { Logger.error("unable to start service",e2); throw new IOException("unable to start service"); } } /** * Stoppt den Service. * @param plugin Name des Plugins. * @param service Name des Services. * @return der Service-Status. * @throws IOException */ @Doc(value="Stoppt den angegebenen Service (meinservicename) des angegebenen Plugins (meinplugin)", example="plugins/meinplugin/services/meinservicename/stop") @Path("/plugins/(.*?)/services/(.*?)/stop$") public JSONObject stop(String plugin, String service) throws IOException { try { de.willuhn.datasource.Service s = find(plugin,service); s.stop(false); return new JSONObject().put("started",Boolean.toString(s.isStarted())); } catch (IOException e) { throw e; } catch (Exception e2) { Logger.error("unable to stop service",e2); throw new IOException("unable to stop service"); } } /** * Liefert den Service-Status. * @param plugin Name des Plugins. * @param service Name des Services. * @return der Service-Status. * @throws IOException */ @Doc(value="Liefert den Status den angegebenen Service (meinservicename) des angegebenen Plugins (meinplugin)", example="plugins/meinplugin/services/meinservicename/status") @Path("/plugins/(.*?)/services/(.*?)/status$") public JSONObject getStatus(String plugin, String service) throws IOException { try { de.willuhn.datasource.Service s = find(plugin,service); return new JSONObject().put("started",Boolean.toString(s.isStarted())); } catch (IOException e) { throw e; } catch (Exception e2) { Logger.error("unable to get service status",e2); throw new IOException("unable to get service status"); } } /** * Listet die Services eines Plugins auf. * @param plugin Name des Plugins. * @return Liste der Services. * @throws IOException */ @Doc(value="Liefert eine Liste der Services des angegebenen Plugins (meinplugin)", example="plugins/meinplugin/services/list") @Path("/plugins/(.*?)/services/list$") public JSONArray getList(String plugin) throws IOException { if (plugin == null || plugin.length() == 0) throw new IOException("no plugin given"); Manifest mf = Application.getPluginLoader().getManifestByName(plugin); if (mf == null) throw new IOException("plugin " + plugin + " not found"); List<Map> list = new ArrayList<Map>(); ServiceDescriptor[] services = mf.getServices(); for (ServiceDescriptor d:services) { try { de.willuhn.datasource.Service s = find(plugin,d.getName()); Map data = new HashMap(); data.put("name", StringUtils.trimToEmpty(d.getName())); data.put("description", StringUtils.trimToEmpty(s.getName())); data.put("class", StringUtils.trimToEmpty(d.getClassname())); data.put("depends", d.depends()); data.put("autostart", d.autostart()); data.put("shared", d.share()); data.put("started", s.isStarted()); list.add(data); } catch (Exception e) { Logger.error("unable to load service " + d.getName(),e); } } return new JSONArray(list); } /** * Sucht den angegebenen Service im Plugin. * @param plugin das Plugin. * @param service der Service-Name. * @return Instanz des Services. * @throws Exception */ de.willuhn.datasource.Service find(String plugin, String service) throws Exception { Manifest mf = Application.getPluginLoader().getManifestByName(plugin); if (mf == null) throw new IOException("plugin " + plugin + " not found"); de.willuhn.datasource.Service s = Application.getServiceFactory().lookup(Application.getPluginLoader().getPlugin(mf.getPluginClass()).getClass(),service); if (s == null) throw new IOException("service " + service + " not found in plugin " + plugin); return s; } } /********************************************************************* * $Log: Service.java,v $ * Revision 1.15 2012/03/29 20:54:40 willuhn * @C Kompatibilitaet zu Jameica 2.2 wieder hergestellt * * Revision 1.14 2012/03/28 22:28:21 willuhn * @N Einfuehrung eines neuen Interfaces "Plugin", welches von "AbstractPlugin" implementiert wird. Es dient dazu, kuenftig auch Jameica-Plugins zu unterstuetzen, die selbst gar keinen eigenen Java-Code mitbringen sondern nur ein Manifest ("plugin.xml") und z.Bsp. Jars oder JS-Dateien. Plugin-Autoren muessen lediglich darauf achten, dass die Jameica-Funktionen, die bisher ein Object vom Typ "AbstractPlugin" zuruecklieferten, jetzt eines vom Typ "Plugin" liefern. * @C "getClassloader()" verschoben von "plugin.getRessources().getClassloader()" zu "manifest.getClassloader()" - der Zugriffsweg ist kuerzer. Die alte Variante existiert weiterhin, ist jedoch als deprecated markiert. * * Revision 1.13 2010-11-02 00:56:31 willuhn * @N Umstellung des Webfrontends auf Velocity/Webtools * * Revision 1.12 2010/05/12 10:59:20 willuhn * @N Automatische Dokumentations-Seite fuer die REST-Beans basierend auf der Annotation "Doc" * * Revision 1.11 2010/05/11 14:59:48 willuhn * @N Automatisches Deployment von REST-Beans * * Revision 1.10 2010/03/18 09:29:35 willuhn * @N Wenn REST-Beans Rueckgabe-Werte liefern, werrden sie automatisch als toString() in den Response-Writer geschrieben **********************************************************************/