Extension Points in Eclipse *fleh*

Wurzelseppi

Mitglied
Hallo zusammen,

jetzt hab ich das Thema lang genug vor mir her geschoben. Jetzt muss ichs aber doch irgendwann angehen.

Also, kann mir bitte jemand erklären, wie das mit den Extension Points funktioniert.

Am besten anhand eines Beispiels:

2 Eclipse PlugIn Projekte, in dem einem einfach eine Klasse mit einer Methode die mir einen MessageDialog.openInformation(new Shell(), "test", parameter.getText()); ausspuckt und einen Extension point, der auf diese Funktionalität zeigt.
In dem anderen wird der Extension Point in die PlugIn XML mitaufgenommen und sagen wir über eine Menuaction getriggert.

Kann mir das einer Step by Step erklären, wie ich das hinbekomme.
Ich habe schon die Basics dieser Extension Points nicht gerafft.

Wer mir das helfen kann wird in der Liste der Leute die ich anbete für kurze Zeit weit oben stehen (lasst das meine Frau nicht hören) :-)


Gruß,

Wurzelseppi
 
Hallo,

hier mal ein kleines Beispiel für den Extension Point Mechanismus anhand 2er Mini Plugins. Als Platform verwende ich die Equinox OSGi Laufzeit von
Eclipse. Das plugin de.tutorials.root definiert das Interface de.tutorials.root.operations.IOperation:
Java:
/**
 * 
 */
package de.tutorials.root.operations;

/**
 * @author Tom
 *
 */
public interface IOperation {
    double apply(double...args);
}

Diese Interface definert die Methode applay die eine Liste von doubles auf einen Wert reduziert.

Über einen (per schema definierten) Extension Point de.tutorials.root.operations kann man nun neue Operationen in das system einbringen:
operations.exsd:
XML:
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="de.tutorials.root">
<annotation>
      <appInfo>
         <meta.schema plugin="de.tutorials.root" id="de.tutorials.root.operations" name="Operations"/>
      </appInfo>
      <documentation>
         [Enter description of this extension point.]
      </documentation>
   </annotation>

   <element name="operation">
      <complexType>
         <attribute name="id" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
            </annotation>
         </attribute>
         <attribute name="class" type="string" use="required">
            <annotation>
               <documentation>
                  
               </documentation>
               <appInfo>
                  <meta.attribute kind="java" basedOn="de.tutorials.root.operations.IOperation"/>
               </appInfo>
            </annotation>
         </attribute>
      </complexType>
   </element>
</schema>

Im root Plugin steuere ich über die Plugin-xml:
Plguin.xml:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
   <extension-point id="de.tutorials.root.operations" name="Operations" schema="schema/operations.exsd"/>
   <extension
         point="de.tutorials.root.operations">
        <operation id="AddOperation" class="de.tutorials.root.operations.internal.AddOperation"/> 
   </extension>
</plugin>
Nun die AddOperation hinzu die die double-Liste addiert und die Summe zurück gibt:
Java:
/**
 * 
 */
package de.tutorials.root.operations.internal;

import de.tutorials.root.operations.IOperation;

/**
 * @author Tom
 *
 */
public class AddOperation implements IOperation {

    public double apply(double... args) {
        double sum = 0.0d;
        for(double d : args){
            sum += d;
        }
        return sum;
    }
}

Damit man nun was sieht gehe ich beim starten des Bundles über alle beigesteuerten Konfigurationselemente von de.tutorials.root.operations
drüber, gebe dessen Typ aus und wende sie auf eine Liste von doubles an:

Java:
package de.tutorials.root;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import de.tutorials.root.operations.IOperation;

public class Activator implements BundleActivator {

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
     */
    public void start(BundleContext context) throws Exception {
        System.out.println("start");
        double a = 1.D;
        double b = 3.5D;
        double c = 7.1D;
        
        System.out.println(a);
        
        for(IConfigurationElement configurationElement : Platform.getExtensionRegistry().getConfigurationElementsFor("de.tutorials.root.operations")){
            IOperation operation = (IOperation)configurationElement.createExecutableExtension("class");
            System.out.println(operation + " -> " + operation.apply(a,b,c));
        }
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
     */
    public void stop(BundleContext context) throws Exception {
    }

}

In einem zusätzlichen Plugin - de.tutorials.extension (welches von de.tutorials.root anhängig ist) steuere ich über die plugin.xml eine weitere MultiplyOperation bei:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
   <extension
         point="de.tutorials.root.operations">
         <operation id="MultiplyOperation" class="de.tutorials.extension.operations.MultiplyOperation"/>
   </extension>
   
</plugin>

Java:
/**
 * 
 */
package de.tutorials.extension.operations;

import de.tutorials.root.operations.IOperation;

/**
 * @author Tom
 *
 */
public class MultiplyOperation implements IOperation{

    public double apply(double... factors) {
        double product = 1.0D;
        for(double factor : factors){
            product*=factor;
        }
        return product;
    }
}

Läst man das ganze nun in der Konsole laufen sieht man folgendes:
Code:
osgi> start
1.0
de.tutorials.extension.operations.MultiplyOperation@54a328 -> 24.849999999999998
de.tutorials.root.operations.internal.AddOperation@1e8a1f6 -> 11.6

Gruß Tom
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
Hi Tom,

erinnere mich daran, daß wenn wir uns irgendwann man treffen sollten; der Abend geht auf mich :-)

Vielen Dank nochmal!


Gruß,


Wurzelseppi
 
Zurück