| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.felix.shell.gui.impl; |
| |
| import java.awt.BorderLayout; |
| import java.awt.event.WindowAdapter; |
| import java.awt.event.WindowEvent; |
| import java.beans.PropertyChangeEvent; |
| import java.beans.PropertyChangeListener; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.swing.JFrame; |
| import javax.swing.event.EventListenerList; |
| |
| import org.apache.felix.shell.gui.Plugin; |
| import org.osgi.framework.*; |
| |
| public class Activator implements BundleActivator |
| { |
| private BundleContext m_context = null; |
| private List m_pluginList = null; |
| private EventListenerList m_listenerList = null; |
| private JFrame m_frame = null; |
| |
| public static final String PLUGIN_LIST_PROPERTY = "pluginList"; |
| |
| public Activator() |
| { |
| m_pluginList = new ArrayList(); |
| m_listenerList = new EventListenerList(); |
| } |
| |
| public synchronized int getPluginCount() |
| { |
| if (m_pluginList == null) |
| { |
| return 0; |
| } |
| return m_pluginList.size(); |
| } |
| |
| public synchronized Plugin getPlugin(int i) |
| { |
| if ((i < 0) || (i >= getPluginCount())) |
| { |
| return null; |
| } |
| return (Plugin) m_pluginList.get(i); |
| } |
| |
| public synchronized boolean pluginExists(Plugin plugin) |
| { |
| for (int i = 0; i < m_pluginList.size(); i++) |
| { |
| if (m_pluginList.get(i) == plugin) |
| { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| // |
| // Bundle activator methods. |
| // |
| |
| public void start(BundleContext context) |
| { |
| m_context = context; |
| |
| // Listen for factory service events. |
| ServiceListener sl = new ServiceListener() { |
| public void serviceChanged(ServiceEvent event) |
| { |
| ServiceReference ref = event.getServiceReference(); |
| Object svcObj = m_context.getService(ref); |
| if ((event.getType() == ServiceEvent.REGISTERED) && |
| (svcObj instanceof Plugin)) |
| { |
| synchronized (Activator.this) |
| { |
| // Check for duplicates. |
| if (!m_pluginList.contains(svcObj)) |
| { |
| m_pluginList.add(svcObj); |
| firePropertyChangedEvent( |
| PLUGIN_LIST_PROPERTY, null, null); |
| } |
| } |
| } |
| else if ((event.getType() == ServiceEvent.UNREGISTERING) && |
| (svcObj instanceof Plugin)) |
| { |
| synchronized (Activator.this) |
| { |
| m_pluginList.remove(svcObj); |
| firePropertyChangedEvent( |
| PLUGIN_LIST_PROPERTY, null, null); |
| } |
| } |
| else |
| { |
| m_context.ungetService(ref); |
| } |
| } |
| }; |
| try |
| { |
| m_context.addServiceListener(sl, |
| "(objectClass=" |
| + org.apache.felix.shell.gui.Plugin.class.getName() |
| + ")"); |
| } |
| catch (InvalidSyntaxException ex) |
| { |
| System.err.println("ShellGuiActivator: Cannot add service listener."); |
| System.err.println("ShellGuiActivator: " + ex); |
| } |
| |
| // Now try to manually initialize the plugin list |
| // since some might already be available. |
| initializePlugins(); |
| |
| // Create and display the frame. |
| if (m_frame == null) |
| { |
| ShellPanel panel = new ShellPanel(this); |
| m_frame = new JFrame("Felix GUI Shell"); |
| m_frame.getContentPane().setLayout(new BorderLayout()); |
| m_frame.getContentPane().add(panel); |
| m_frame.pack(); |
| m_frame.setSize(700, 400); |
| m_frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); |
| m_frame.addWindowListener(new WindowAdapter() { |
| public void windowClosing(WindowEvent event) |
| { |
| if (m_context.getBundle().getState() == Bundle.ACTIVE) |
| { |
| try |
| { |
| m_context.getBundle().stop(); |
| } |
| catch (Exception ex) |
| { |
| System.err.println("ShellGuiActivator: " + ex); |
| } |
| } |
| } |
| }); |
| } |
| |
| m_frame.setVisible(true); |
| } |
| |
| private synchronized void initializePlugins() |
| { |
| try |
| { |
| // Get all model services. |
| ServiceReference refs[] = m_context.getServiceReferences( |
| org.apache.felix.shell.gui.Plugin.class.getName(), null); |
| if (refs != null) |
| { |
| // Add model services to list, ignore duplicates. |
| for (int i = 0; i < refs.length; i++) |
| { |
| Object svcObj = m_context.getService(refs[i]); |
| if (!m_pluginList.contains(svcObj)) |
| { |
| m_pluginList.add(svcObj); |
| } |
| } |
| firePropertyChangedEvent( |
| PLUGIN_LIST_PROPERTY, null, null); |
| } |
| } |
| catch (Exception ex) |
| { |
| System.err.println("ShellGuiActivator: Error initializing model list."); |
| System.err.println("ShellGuiActivator: " + ex); |
| ex.printStackTrace(); |
| } |
| } |
| |
| public void stop(BundleContext context) |
| { |
| if (m_frame != null) |
| { |
| m_frame.setVisible(false); |
| m_frame.dispose(); |
| m_frame = null; |
| } |
| } |
| |
| // |
| // Event methods. |
| // |
| |
| public void addPropertyChangeListener(PropertyChangeListener l) |
| { |
| m_listenerList.add(PropertyChangeListener.class, l); |
| } |
| |
| public void removeFooListener(PropertyChangeListener l) |
| { |
| m_listenerList.remove(PropertyChangeListener.class, l); |
| } |
| |
| protected void firePropertyChangedEvent(String name, Object oldValue, Object newValue) |
| { |
| PropertyChangeEvent event = null; |
| |
| // Guaranteed to return a non-null array |
| Object[] listeners = m_listenerList.getListenerList(); |
| |
| // Process the listeners last to first, notifying |
| // those that are interested in this event |
| for (int i = listeners.length - 2; i >= 0; i -= 2) |
| { |
| if (listeners[i] == PropertyChangeListener.class) |
| { |
| // Lazily create the event: |
| if (event == null) |
| { |
| event = new PropertyChangeEvent(this, name, oldValue, newValue); |
| } |
| ((PropertyChangeListener) listeners[i + 1]).propertyChange(event); |
| } |
| } |
| } |
| } |