Return-Path: X-Original-To: apmail-felix-commits-archive@www.apache.org Delivered-To: apmail-felix-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 198379599 for ; Mon, 26 Mar 2012 15:24:06 +0000 (UTC) Received: (qmail 89825 invoked by uid 500); 26 Mar 2012 15:24:06 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 89764 invoked by uid 500); 26 Mar 2012 15:24:05 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 89749 invoked by uid 99); 26 Mar 2012 15:24:05 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 26 Mar 2012 15:24:05 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 26 Mar 2012 15:24:02 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id B28FC238897A for ; Mon, 26 Mar 2012 15:23:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1305394 - in /felix/trunk/examples/extenderbased.host: ./ src/main/java/org/apache/felix/example/extenderbased/host/ src/main/java/org/apache/felix/example/extenderbased/host/launch/ Date: Mon, 26 Mar 2012 15:23:42 -0000 To: commits@felix.apache.org From: rickhall@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120326152342.B28FC238897A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rickhall Date: Mon Mar 26 15:23:41 2012 New Revision: 1305394 URL: http://svn.apache.org/viewvc?rev=1305394&view=rev Log: Apply patch FELIX-3401 to use OSGi BundleTracker in example instead of custom one. Added: felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java Removed: felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/BundleTracker.java felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeTracker.java Modified: felix/trunk/examples/extenderbased.host/pom.xml felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java Modified: felix/trunk/examples/extenderbased.host/pom.xml URL: http://svn.apache.org/viewvc/felix/trunk/examples/extenderbased.host/pom.xml?rev=1305394&r1=1305393&r2=1305394&view=diff ============================================================================== --- felix/trunk/examples/extenderbased.host/pom.xml (original) +++ felix/trunk/examples/extenderbased.host/pom.xml Mon Mar 26 15:23:41 2012 @@ -36,7 +36,9 @@ org.apache.felix org.apache.felix.main - 1.8.0 + 4.0.2 + zip + source-release Modified: felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java URL: http://svn.apache.org/viewvc/felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java?rev=1305394&r1=1305393&r2=1305394&view=diff ============================================================================== --- felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java (original) +++ felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/Activator.java Mon Mar 26 15:23:41 2012 @@ -20,10 +20,8 @@ package org.apache.felix.example.extende import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; - import javax.swing.JFrame; import javax.swing.SwingUtilities; - import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; @@ -39,7 +37,7 @@ import org.osgi.framework.BundleExceptio public class Activator implements BundleActivator { private DrawingFrame m_frame = null; - private ShapeTracker m_shapetracker = null; + private ShapeBundleTracker m_shapetracker = null; /** * Displays the applications window and starts extension tracking; @@ -75,7 +73,7 @@ public class Activator implements Bundle m_frame.setVisible(true); - m_shapetracker = new ShapeTracker(context, m_frame); + m_shapetracker = new ShapeBundleTracker(context, m_frame); m_shapetracker.open(); } }); Added: felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java URL: http://svn.apache.org/viewvc/felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java?rev=1305394&view=auto ============================================================================== --- felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java (added) +++ felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/ShapeBundleTracker.java Mon Mar 26 15:23:41 2012 @@ -0,0 +1,144 @@ +package org.apache.felix.example.extenderbased.host; + +import java.util.Dictionary; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.SwingUtilities; +import org.apache.felix.example.extenderbased.host.extension.SimpleShape; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleEvent; +import org.osgi.util.tracker.BundleTracker; + +/** + * This is a simple bundle tracker utility class that tracks active + * bundles. The tracker must be given a bundle context upon creation, + * which it uses to listen for bundle events. The bundle tracker must be + * opened to track objects and closed when it is no longer needed. + * + * @see BundleTracker +**/ +public class ShapeBundleTracker extends BundleTracker +{ + // The application object to notify. + private final DrawingFrame m_frame; + + /** + * Constructs a tracker that uses the specified bundle context to + * track extensions and notifies the specified application object about + * changes. + * @param context The bundle context to be used by the tracker. + * @param frame The application object to notify about extension changes. + **/ + public ShapeBundleTracker(BundleContext context, DrawingFrame frame) + { + // we only want to track active bundles + super(context, Bundle.ACTIVE, null); + this.m_frame = frame; + } + + // Gets called when a bundle in enters the state ACTIVE + @Override + public SimpleShape addingBundle(Bundle bundle, BundleEvent event) + { + // Try to get the name of the extension. + Dictionary dict = bundle.getHeaders(); + String name = dict.get(SimpleShape.NAME_PROPERTY); + + // if the name is not null, bundle is a ShapeBundle + if (name != null) + { + // Get the icon resource of the extension. + String iconPath = dict.get(SimpleShape.ICON_PROPERTY); + Icon icon = new ImageIcon(bundle.getResource(iconPath)); + // Get the class of the extension. + String className = dict.get(SimpleShape.CLASS_PROPERTY); + SimpleShape shape = new DefaultShape(bundle.getBundleContext(), + bundle.getBundleId(), className); + processAdd(name, icon, shape); + return shape; + } + + // bundle is no ShapeBundle, ingore it + return null; + } + + /** + * Util method to process the addition of a new shape. + * + * @param name The name of the new shape + * @param icon The icon of the new shape + * @param shape the shape itself + */ + private void processAdd(final String name, final Icon icon, final SimpleShape shape) + { + try + { + if (SwingUtilities.isEventDispatchThread()) + { + m_frame.addShape(name, icon, shape); + } + else + { + SwingUtilities.invokeAndWait(new Runnable() + { + @Override + public void run() + { + m_frame.addShape(name, icon, shape); + } + }); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + + // Gets called when a bundle leaves the ACTIVE state + @Override + public void removedBundle(Bundle bundle, BundleEvent event, SimpleShape object) + { + // Try to get the name of the extension. + Dictionary dict = bundle.getHeaders(); + String name = dict.get(SimpleShape.NAME_PROPERTY); + + // if the name is not null, bundle is a ShapeBundle + if (name != null) + { + prcoessRemove(name); + } + } + + /** + * Util method to process the removal of a shape. + * + * @param name the name of the shape that is about to be removed. + */ + private void prcoessRemove(final String name) + { + try + { + if (SwingUtilities.isEventDispatchThread()) + { + m_frame.removeShape(name); + } + else + { + SwingUtilities.invokeAndWait(new Runnable() + { + @Override + public void run() + { + m_frame.removeShape(name); + } + }); + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } +} \ No newline at end of file Modified: felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java URL: http://svn.apache.org/viewvc/felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java?rev=1305394&r1=1305393&r2=1305394&view=diff ============================================================================== --- felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java (original) +++ felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/Application.java Mon Mar 26 15:23:41 2012 @@ -20,7 +20,6 @@ package org.apache.felix.example.extende import java.util.Map; import java.util.ServiceLoader; - import org.apache.felix.example.extenderbased.host.Activator; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -35,13 +34,13 @@ import org.osgi.framework.launch.Framewo * internal extensions to providing drawing functionality. To successfully * launch the stand-alone application, it must be run from this bundle's * installation directory using "{@code java -jar}". - * The locations of any additional extensions that have to be started, have to - * be passed as command line arguments to this method. + * The locations of any additional extensions that have to be started, have to + * be passed as command line arguments to this method. */ public class Application { private static Framework m_framework = null; - + /** * Enables the bundle to run as a stand-alone application. When this * static {@code main()} method is invoked, the application creates @@ -49,33 +48,33 @@ public class Application * internal extensions to provide drawing functionality. To successfully * launch as a stand-alone application, this method should be invoked from * the bundle's installation directory using "{@code java -jar}". - * The location of any extension that shall be installed can be passed + * The location of any extension that shall be installed can be passed * as parameters. *

* For example if you build the bundles inside your workspace, maven will - * create a target directory in every project. To start the application - * from within your IDE you should pass: + * create a target directory in every project. To start the application + * from within your IDE you should pass: *

*

-     * {@code file:../extenderbased.circle/target/extenderbased.circle-1.0.0.jar 
-     * file:../extenderbased.square/target/extenderbased.square-1.0.0.jar 
+     * {@code file:../extenderbased.circle/target/extenderbased.circle-1.0.0.jar
+     * file:../extenderbased.square/target/extenderbased.square-1.0.0.jar
      * file:../extenderbased.triangle/target/extenderbased.triangle-1.0.0.jar}
      * 
- * + * * @param args The locations of additional bundles to start. **/ public static void main(String[] args) { // args should never be null if the application is run from the command line. Check it anyway. String[] locations = args != null ? args : new String[0]; - + // Print welcome banner. System.out.println("\nWelcome to My Launcher"); System.out.println("======================\n"); try { - Map config = ConfigUtil.createConfig(); + Map config = ConfigUtil.createConfig(); m_framework = createFramework(config); m_framework.init(); m_framework.start(); @@ -92,13 +91,13 @@ public class Application } /** - * Util method for creating an embedded Framework. Tries to create a {@link FrameworkFactory} + * Util method for creating an embedded Framework. Tries to create a {@link FrameworkFactory} * which is then be used to create the framework. * * @param config the configuration to create the framework with * @return a Framework with the given configuration */ - private static Framework createFramework(Map config) + private static Framework createFramework(Map config) { ServiceLoader factoryLoader = ServiceLoader.load(FrameworkFactory.class); for(FrameworkFactory factory : factoryLoader){ @@ -106,10 +105,10 @@ public class Application } throw new IllegalStateException("Unable to load FrameworkFactory service."); } - + /** - * Installs and starts all bundles used by the application. Therefore the host bundle will be started. The locations - * of extensions for the host bundle can be passed in as parameters. + * Installs and starts all bundles used by the application. Therefore the host bundle will be started. The locations + * of extensions for the host bundle can be passed in as parameters. * * @param bundleLocations the locations where extension for the host bundle are located. Must not be {@code null}! * @throws BundleException if something went wrong while installing or starting the bundles. @@ -125,4 +124,4 @@ public class Application addition.start(); } } -} +} \ No newline at end of file Modified: felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java URL: http://svn.apache.org/viewvc/felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java?rev=1305394&r1=1305393&r2=1305394&view=diff ============================================================================== --- felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java (original) +++ felix/trunk/examples/extenderbased.host/src/main/java/org/apache/felix/example/extenderbased/host/launch/ConfigUtil.java Mon Mar 26 15:23:41 2012 @@ -22,7 +22,6 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; - import org.osgi.framework.Constants; /** @@ -32,21 +31,22 @@ final class ConfigUtil { /** - * Creates a configuration for the framework. Therefore this method attempts to create - * a temporary cache dir. If creation of the cache dir is successful, it will be added + * Creates a configuration for the framework. Therefore this method attempts to create + * a temporary cache dir. If creation of the cache dir is successful, it will be added * to the configuration. - * + * * @return */ - public static Map createConfig() + public static Map createConfig() { final File cachedir = createCacheDir(); - Map configMap = new HashMap(); - // Tells the framework to export the extension package, making it accessible for the other shape bundels + Map configMap = new HashMap(); + // Tells the framework to export the extension package, making it accessible + // for the other shape bundels configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "org.apache.felix.example.extenderbased.host.extension; version=1.0.0"); - + // if we could create a cache dir, we use it. Otherwise the platform default will be used if (cachedir != null) { @@ -57,8 +57,8 @@ final class ConfigUtil } /** - * Tries to create a temporay cache dir. If creation of the cache dir is successful, - * it will be returned. If creation fails, null will be returned. + * Tries to create a temporay cache dir. If creation of the cache dir is successful, + * it will be returned. If creation fails, null will be returned. * * @return a {@code File} object representing the cache dir */ @@ -80,7 +80,7 @@ final class ConfigUtil } /** - * Adds a shutdown hook to the runtime, that will make sure, that the cache dir will + * Adds a shutdown hook to the runtime, that will make sure, that the cache dir will * be deleted after the application has been terminated. */ private static void createShutdownHook(final File cachedir) @@ -113,4 +113,4 @@ final class ConfigUtil } file.delete(); } -} +} \ No newline at end of file