Start - Publikationen - Wissen - TOGAF - Impressum -

Swing und die Eclipse Runtime


Problem: Die Eclipse Runtime soll eine Swing GUI starten.

Lösung: Zum Starten einer Anwendung ist der EP org.eclipse.core.runtime.applications zu erweitern und innerhalb der run-Methode die Swing GUI zu starten. Damit die GUI nicht wieder sofort geschlossen wird, ist der Eclipse Runtime Thread anzuhalten, bis die GUI geschlossen wird.

/**
 * Starterklasse in einer Eclipse-Runtime Umgebung.
 */
public class GUIStarterRunnable implements IPlatformRunnable {
    //
    public Object run(Object args) throws Exception {
      //
      JFrame frame = new JFrame("Applikation"); //$NON-NLS-1$
      frame.setVisible(true);
      //
      frame.addWindowListener(new WindowAdapter() {
	public void windowClosing(WindowEvent e) {
	    super.windowClosing(e);
	    synchronized (GUIStarterRunnable.this) {
	        GUIStarterRunnable.this.notify();
	    }
         }
      });
      //
      // der Mainthread fällt hier in den Schlaf und wird erst bei dispose geweckt
      synchronized(this) {
          this.wait();
      }
      //
      return EXIT_OK;
   }
}

Bereitstellung von Startkonfigurationen


Problem: Startkonfigurationen bereitstellen. Startkonfigurationen sind alle Konfigurationen, die der Starter der Applikstion vorgeben will.

Lösung: Übergabe als Startparameter: -Dproperty=wert, oder Übergabe des Namens einer Konfigurationsdatei: -Dconfig.file=/config.properties (ohne Slash sucht der ClassLoader relativ zur Klasse, also im Paket der Klasse des Codes!)

  ...
  String configFile = System.getProperty("config.file");
  if (configFile != null) {
    try {
      InputStream inputStream = this.getClass().getResourceAsStream(configFile);
      if (inputStream != null) {
	System.getProperties().load(inputStream);
	// Test:
	System.out.println("test.name " + System.getProperty("test.name"));
      }
    } catch (IOException e1) {
	e1.printStackTrace();
    }
  }
  ...

I18N der plugin.xml


Problem: I18N der Einträge in der plugin.xml. Lösung: Alle Werte, die in der plugin.xml mit einem % beginnen, werden aus der plugin.properties (oder Länderspezifischen Versionen davon wie plugin_de.properties) geholt.

Laden von ResourceBundles


Problem: In einem Plugin sollen Resourcen aus ResourceBundles geladen werden. Lösung: Normale Benutzung des ResourceBundles.

  ..
  ResourceBundle bundle = ResourceBundle.getBundle("messages");
  ..
  System.out.println(bundle.getString("rb.test.one"));
  String value = bundle.getString("rb.test.two");
  System.out.println(MessageFormat.format(value, new String[]{"ARG"}));
  ..
Inhalt von messages.properties (oder einer länderspazifischen Version):
rb.test.one=Eine Nachricht aus dem ResourceBundle
rb.test.two=Eine Nachricht für {0} aus dem ResourceBundle

Bereitstellen von InputStreams aus anderen Plugins.


Problem: Aus einem erweiternden Plugin soll eine InputStream Resource bereitgestellt werden.

Lösung: Die Lösung ist eigentlich nicht schwer:

// Der Name des Bundles ist dem Plugin nicht bekannt, aber
// kann aus der Extension besorgt werden
..
Bundle bundle = Platform.getBundle("Pluginname");
URL url = bundle.getResource(configurationElement.getAttribute("ResourceName"));
InputStream is = url.openStream();
..
Die einzige Herausforderung ist es zur Laufzeit den Name des Plugins festzustellen. Dazu wird ein EP definiert ('ResourceLocation'), an dem sich Plugins die Resourcen bereitstellen wollen, anmelden. Ihr Name kann dann zur Laufzeit mittels extension.getNamespace() ermittelt werden. Der Name der Resource ist dann entweder fest vorgegeben, oder er wird, wie hier, als Attribut ('ResourceName') mitgegeben.
..
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint("GUIStarter.ResourceLocation"); //$NON-NLS-1$
IExtension[] extensions = extensionPoint.getExtensions();
for (int i = 0, l = extensions.length; i < l; i++) {
  IExtension extension = extensions[i];
  IConfigurationElement[] configurationElements = extension.getConfigurationElements();
  for (int j = 0, m = configurationElements.length; j < m; j++) {
    IConfigurationElement configurationElement = configurationElements[j];
    if (configurationElement.getName().equals("ResourceDescription")) { //$NON-NLS-1$
      // Der Name des Bundles ist dem Plugin nicht bekannt, aber
      // kann aus der Extension besorgt werden
      Bundle bundle = Platform.getBundle(extension.getNamespace());
      URL url = bundle.getResource(configurationElement.getAttribute("ResourceName"));
      InputStream is = url.openStream();
      for (int c = is.read(); c!=-1; c = is.read()) {
        System.out.print((char)c);
      }
    }
  }
}

Die Eclipse PDE Console


  ..
  MessageConsole console = new MessageConsole("System Output", null);
  ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { console });
  ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
  MessageConsoleStream stream = console.newMessageStream();
  //
  System.setOut(new PrintStream(stream));
  System.setErr(new PrintStream(stream));
  ..

Classpath aus der Workbench auslesen


  ..
  IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
  // TODO How to get the selected project
  IProject proj = workspaceRoot.getProject("KpmEAR");
  IJavaProject jp = JavaCore.create(proj);
  try {
    IClasspathEntry[] cps = jp.getRawClasspath();
    printCPERecursively(workspaceRoot, jp, cps);
  } catch (JavaModelException e) {
    e.printStackTrace();
  }
  ..
  //
  private void printCPERecursively(IWorkspaceRoot workspaceRoot, IJavaProject jp, IClasspathEntry[] cps)
  throws JavaModelException {
    //
    for (int i = 0; i < cps.length; i++) {
      int entryKind = cps[i].getEntryKind();
      if (entryKind == IClasspathEntry.CPE_CONTAINER) {
        IClasspathContainer icc = JavaCore.getClasspathContainer(cps[i].getPath(), jp);
        IClasspathEntry[] ice = icc.getClasspathEntries();
        printCPERecursively(workspaceRoot, jp, ice); // recursion!
      } else if(entryKind == IClasspathEntry.CPE_PROJECT) {
        IProject ip = workspaceRoot.getProject(cps[i].getPath().toString());
        IJavaProject dep = JavaCore.create(ip);
        printItWithSpaceAround("../.." + dep.getOutputLocation());
      } else if (entryKind == IClasspathEntry.CPE_LIBRARY) {
        printItWithSpaceAround(cps[i].getPath().toString());
      } else if (entryKind == IClasspathEntry.CPE_SOURCE) {
        printItWithSpaceAround(cps[i].getPath().toString());
      } else if (entryKind == IClasspathEntry.CPE_VARIABLE) {
        printItWithSpaceAround(cps[i].getPath().toString());
      }
    }
  }
 ..
 //
 private void printItWithSpaceAround(String path) {
    System.out.print(" ");
      //
    Matcher matcher = pattern.matcher(path);
    path = matcher.replaceAll("../../../../../../");
      //
    System.out.print(path);
    System.out.println(" ");
  }
..
  private static final Pattern pattern = Pattern.compile("D:/");

Eclipse Ressourcen


Gehört hier eigentlich nicht rein, aber brauche ich andauernd. Für bessere Performanz bei der Arbeit mit Eclipse:

-vmargs
-Xms512m             --> start VM memory
-Xmx1024m            --> max VM memory
-Xss2m               --> thread stack size
-XX:MaxPermSize=256m --> repariert OutOfMemory Bug in der VM ab JDK1.4. Ist aber nur 
                         ein Workaround, vielleicht ab 1.6 nicht mehr nötig?
copyright © 2003-2021 | Dr. Christian Dürr | prozesse-und-systeme.de | all rights reserved