<?xml version="1.0" encoding="ISO-8859-1" ?>

<!--
  $Revision: 1.2 $
  $Date: 2012/04/02 22:35:10 $
  $Author: willuhn $
 
  Copyright (c) by willuhn software & services
  All rights reserved

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  
  This program 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 General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

-->

<xsd:schema xml:lang="DE" elementFormDefault="qualified"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.willuhn.de/schema/jameica-plugin"
  xmlns:tns="http://www.willuhn.de/schema/jameica-plugin">

  <xsd:annotation>
     <xsd:documentation>
       XML-Spezifikation des XML-Formats fuer die "plugin.xml" von Jameica-Plugins.
     </xsd:documentation>
  </xsd:annotation>

  <!-- Root-Element //-->
  <xsd:element name="plugin" type="tns:pluginType" />

  <!-- Element "plugin" //-->
  <xsd:complexType name="pluginType">
    <xsd:annotation>
      <xsd:documentation>Root-Element einer plugin.xml</xsd:documentation>
    </xsd:annotation>

    <xsd:all>
      <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1">
        <xsd:annotation>
          <xsd:documentation>Beschreibungstext für das Plugin</xsd:documentation>
        </xsd:annotation>
      </xsd:element>

      <xsd:element name="url" type="xsd:string" minOccurs="0" maxOccurs="1">
        <xsd:annotation>
          <xsd:documentation>URL für das Online-Update des Plugins. Derzeit noch ungenutzt</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="homepage" type="xsd:string" minOccurs="0" maxOccurs="1">
        <xsd:annotation>
          <xsd:documentation>URL zur Webseite des Plugins</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="license" type="xsd:string" minOccurs="0" maxOccurs="1">
        <xsd:annotation>
          <xsd:documentation>Bezeichnung der Lizenz. Z.Bsp. GPL</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="icon" type="xsd:string" minOccurs="0" maxOccurs="1">
        <xsd:annotation>
          <xsd:documentation>Optionaler Dateiname eines Icons in der Groesse 64x64 Pixel</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element name="requires"    type="tns:requiresType"    minOccurs="0" maxOccurs="1"/>
      <xsd:element name="classfinder" type="tns:classfinderType" minOccurs="0" maxOccurs="1"/>
      <xsd:element name="menu"        type="tns:menuType"        minOccurs="0" maxOccurs="1"/>
      <xsd:element name="navigation"  type="tns:navigationType"  minOccurs="0" maxOccurs="1"/>
      <xsd:element name="services"    type="tns:servicesType"    minOccurs="0" maxOccurs="1"/>
      <xsd:element name="extensions"  type="tns:extensionsType"  minOccurs="0" maxOccurs="1"/>
    </xsd:all>

    <xsd:attribute name="name" type="xsd:string" use="required">
      <xsd:annotation>
        <xsd:documentation>
          Bezeichnung des Plugins. Sollte keine Leer- oder Sonderzeichen enthalten
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="version" type="xsd:string" use="required">
      <xsd:annotation>
        <xsd:documentation>
          Versionsnummer des Plugins. Z.Bsp. 1.4 oder 1.2.1 oder 1.0.0-test
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="class" type="xsd:string" use="required">
      <xsd:annotation>
        <xsd:documentation>
          Name der Basis-Klasse des Plugins.
          Muss von de.willuhn.jameica.plugin.AbstractPlugin abgeleitet sein.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="shared" type="xsd:boolean" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Legt fest, ob das Plugin durch den globalen Classloader (shared=true)
          von Jameica geladen werden soll oder durch einen exklusiven Classloader
          (shared=false), der nur von diesem Plugin genutzt wird. Per Default
          wird der globale Classloader verwendet.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
  
  

  <!-- Element "requires" //-->
  <xsd:complexType name="requiresType">
    <xsd:annotation>
      <xsd:documentation>Definition von Abhängigkeiten zu anderen Plugins.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="import" minOccurs="0" maxOccurs="unbounded">
        <xsd:annotation>
          <xsd:documentation>Definition einer Abhängigkeit zu einem anderen Plugin</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:attribute name="plugin" type="xsd:string" use="required">
            <xsd:annotation>
              <xsd:documentation>
                Name des Plugins. Das ist der Wert des Attributs name aus
                der plugin.xml des anderen Plugins.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <!-- optionale Angabe der benoetigten Versionsnummer. Moegliche Formate: "1.6-", "1.7+", "1.8" -->
          <xsd:attribute name="version" type="xsd:string" use="optional">
            <xsd:annotation>
              <xsd:documentation>
                Angabe der benötigten Versionsnummer. Z.Bsp. 1.6-, wenn das
                Plugin in einer älteren Version als 1.6 vorliegen muss; 1.7+, wenn
                es in Version 1.7 oder aktueller vorliegen muss; 1.8, wenn es
                genau in Version 1.8 vorliegen muss.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>

          <!-- optionale Angabe, ob die Abhaengigkeit zwingend vorhanden sein muss (Default:true) -->
          <xsd:attribute name="required" type="xsd:boolean" use="optional">
            <xsd:annotation>
              <xsd:documentation>
                Abhängigkeit muss nicht zwingend erfüllt ein. Kann genutzt
                werden, wenn die Abhängigkeit nicht unbedingt vorhanden sein
                muss. Wenn das Plugin jedoch installiert ist, soll es vorher
                geladen werden. Default: true. Ohne Angabe des Attributes
                handelt es sich also um eine obligatorische Abhängigkeit.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <!-- optionale Angabe der benoetigten Versionsnummer. Moegliche Formate: "1.6-", "1.7+", "1.8" -->
    <xsd:attribute name="jameica" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Optionale Angabe der benötigten Jameica-Version. Hiermit kann
          festgelegt werden, ob das Plugin eine bestimmte Jameica-Version
          voraussetzt. Mögliche Werte wie im Attribute version des Elements
          import.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>

  <!-- Element "classfinder" //-->
  <xsd:complexType name="classfinderType">
    <xsd:annotation>
      <xsd:documentation>
        Liste von Pfadangaben (Patterns) zu Class-Dateien und Jar-Files,
        die vom Classfinder analysiert werden sollen. Alle Klassen, die
        vom Classfinder analysiert worden, können anschließend anhand der
        Interfaces gesucht werden, die sie implementieren.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="include" type="xsd:string" minOccurs="0" maxOccurs="unbounded">
        <xsd:annotation>
          <xsd:documentation>
            Angabe einer einzelnen Pfad-Angabe. Z.Bsp.: meinplugin\.jar.
            Da es sich um einen regulären Ausdruck handelt, müssen u.a. Punkte
            mit einem Backslash escaped werden.
          </xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Element "menu" //-->
  <xsd:complexType name="menuType">
    <xsd:annotation>
      <xsd:documentation>Definition des Menu-Baumes des Plugins.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="item" type="tns:menuItemType" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
  
  <!-- Element "navigation" //-->
  <xsd:complexType name="navigationType">
    <xsd:annotation>
      <xsd:documentation>Definition des Navigations-Baumes des Plugins.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="item" type="tns:naviItemType" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
  
  <!-- Element "services" //-->
  <xsd:complexType name="servicesType">
    <xsd:annotation>
      <xsd:documentation>
        Definition der Services des Plugins. Alles Services müssen das
        Interface de.willuhn.datasource.Service implementieren.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:annotation>
        <xsd:documentation>Liste der Services.</xsd:documentation>
      </xsd:annotation>
      <xsd:element name="service" minOccurs="0" maxOccurs="unbounded">
        <xsd:annotation>
          <xsd:documentation>Definition eines einzelnen Services</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:attribute name="name" type="xsd:string" use="required">
            <xsd:annotation>
              <xsd:documentation>Name des Services. Sollte keine Leerzeichen sondern höchstens Punkte enthalten</xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <xsd:attribute name="class" type="xsd:string" use="required">
            <xsd:annotation>
              <xsd:documentation>
                Name des Interfaces des Services. Wurden sowohl Interface
                als auch Implementierung vom Classfinder analysiert, findet
                Jameica automatisch die zugehörige Implementierung. Andernfalls
                muss die implementierende Klasse explizit angegeben werden.
                Die Klasse muss de.willuhn.datasource.Service implementieren.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <xsd:attribute name="autostart" type="xsd:boolean" use="optional">
            <xsd:annotation>
              <xsd:documentation>
                Gibt an, ob der Service automatisch gestartet werden soll.
                Default: true.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <xsd:attribute name="share" type="xsd:boolean" use="optional">
            <xsd:annotation>
              <xsd:documentation>
                Gibt an, ob der Service via RMI freigegeben werden darf.
                Default: true.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <xsd:attribute name="depends" type="xsd:string" use="optional">
            <xsd:annotation>
              <xsd:documentation>
               Komma-separarierte Liste von Service-Namen innerhalb des selben
               Plugins, von denen dieser Service abhängt. Diese Services
               werden dann automatisch vorher gestartet.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Element "extensions" //-->
  <xsd:complexType name="extensionsType">
    <xsd:annotation>
      <xsd:documentation>
        Liste von Extensions für andere Plugins. Mit Hilfe von
        Extensions kann ein Plugin ein anderes um Funktionen
        erweitern. Hierzu muss die Komponente, welche erweitert
        werden soll, das Interface de.willuhn.jameica.gui.extension.Extendable
        implementieren. Die Extension selbst muss 
        de.willuhn.jameica.gui.extension.Extension implementieren.
        Für weitere Details siehe 
        http://www.willuhn.de/projects/jameica/doc/javadoc/de/willuhn/jameica/gui/extension/package-summary.html
      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="extension" minOccurs="0" maxOccurs="unbounded">
        <xsd:annotation>
          <xsd:documentation>Eine einzelne Extension</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:attribute name="class" type="xsd:string" use="required">
            <xsd:annotation>
              <xsd:documentation>Name der Klasse, die Extension implementiert</xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <xsd:attribute name="extends" type="xsd:string" use="required">
            <xsd:annotation>
              <xsd:documentation>Komma-separierte Liste von IDs der Extendables</xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
          <xsd:attribute name="requires" type="xsd:string" use="optional">
            <xsd:annotation>
              <xsd:documentation>
                optional: Komma-separierte Liste von Plugins, die installiert sein muessen,
                damit die Extension registriert wird.
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>


  <!-- Element "item" in "menu"-->
  <xsd:complexType name="menuItemType">
    <xsd:annotation>
      <xsd:documentation>Ein einzelnes Menu-Element</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <xsd:annotation>
        <xsd:documentation>Liste weiterer Kind-Elemente</xsd:documentation>
      </xsd:annotation>
      <!-- Rekursive Kind-Elemente -->
      <xsd:element name="item" type="tns:menuItemType" />
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required">
      <xsd:annotation>
        <xsd:documentation>
          Bezeichnung des Menu-Eintrages.
          Für Menu-Separatoren kann ein Bindestrich (-) verwendet werden.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="id" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Eindeutige ID innerhalb von Jameica. Für diese ID wird
          automatisch ein Extendable erzeugt, damit der Menu-Eintrag
          bei Bedarf von anderen Plugins erweitert oder aktiviert/deaktiviert
          werden kann.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="action" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Name der Klasse, die beim Klick auf den Menu-Eintrag
          ausgeführt werden soll. Die Klasse muss
          de.willuhn.jameica.gui.Action implementieren.
          Die Aktion wird nur ausgeführt, wenn das Menu-Element
          keine weiteren Kind-Elemente besitzt.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="enabled"  type="xsd:boolean" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Legt fest, ob der Menu-Eintrag aktiviert sein soll.
          Default: true
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="shortcut" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Legt eine optionale Tastenkombination für den Menu-Eintrag
          fest. Z.Bsp. CTRL+B oder ALT+Z
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <!-- Zusaetzliche Attribute im Menu -->
    <xsd:attribute name="icon" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Pfad und Dateiname zu einer Icon-Datei.
          Die Datei muss sich in einem Verzeichnis mit dem Namen img innerhalb
          des Classpath befinden.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
  
  <!-- Element "item" in "navigation"-->
  <xsd:complexType name="naviItemType">
    <xsd:annotation>
      <xsd:documentation>Ein einzelnes Navigations-Element</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
      <!-- Rekursive Kind-Elemente -->
      <xsd:annotation>
        <xsd:documentation>Liste weiterer Kind-Elemente</xsd:documentation>
      </xsd:annotation>
      <xsd:element name="item" type="tns:naviItemType" />
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required">
      <xsd:annotation>
        <xsd:documentation>Bezeichnung des Eintrages im Navigationsbaum.</xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="id" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Eindeutige ID innerhalb von Jameica. Für diese ID wird
          automatisch ein Extendable erzeugt, damit das Navigations-Element
          bei Bedarf von anderen Plugins erweitert oder aktiviert/deaktiviert
          werden kann.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="action" type="xsd:string" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Name der Klasse, die beim Klick auf das Navigations-Element
          ausgeführt werden soll. Die Klasse muss
          de.willuhn.jameica.gui.Action implementieren.
          Die Aktion wird nur ausgeführt, wenn das Navigations-Element
          keine weiteren Kind-Elemente besitzt.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="enabled" type="xsd:boolean" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Legt fest, ob das Navigations-Element aktiviert sein soll.
          Default: true
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="shortcut" type="xsd:string"  use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Legt eine optionale Tastenkombination für den Menu-Eintrag
          fest. Z.Bsp. CTRL+B oder ALT+Z
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>

    <!-- Zusaetzliche Attribute in der Navigation -->
    <xsd:attribute name="icon-open"  type="xsd:string"  use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Pfad und Dateiname zu einer Icon-Datei, die angezeigt werden
          soll, wenn das Navigations-Element aufgeklappt wird. Die Datei
          muss sich in einem Verzeichnis mit dem Namen img innerhalb
          des Classpath befinden.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="icon-close" type="xsd:string"  use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Pfad und Dateiname zu einer Icon-Datei, die angezeigt werden
          soll, wenn das Navigations-Element zugeklappt wird. Die Datei
          muss sich in einem Verzeichnis mit dem Namen img innerhalb
          des Classpath befinden.
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
    <xsd:attribute name="expanded" type="xsd:boolean" use="optional">
      <xsd:annotation>
        <xsd:documentation>
          Legt fest, ob das Navigations-Element beim Systemstart
          aufgeklappt sein soll.
          Default: true
        </xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>

</xsd:schema>
