blob: e6071821f7699b7aefd781347e7f0864347f68f1 [file] [log] [blame]
/*
* 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.mosgi.managedelements.obrprobe.tab;
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.Vector;
import java.util.StringTokenizer;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.table.AbstractTableModel;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.PrintStream;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.InvalidSyntaxException;
//import org.apache.felix.bundlerepository.BundleRepository;
//import org.apache.felix.bundlerepository.BundleRecord;
import org.osgi.service.obr.RepositoryAdmin;
import org.osgi.service.obr.Repository;
import org.osgi.service.obr.Resource;
import javax.management.openmbean.ArrayType;
import javax.management.openmbean.SimpleType;
import org.apache.felix.mosgi.console.ifc.Plugin;
public class ObrProbeTabUI extends JPanel implements Plugin, BundleActivator {
private static final String OSGI_ON="TabUI:name=ObrProbe";
private MBeanServerConnection mbsc=null;
private BundleContext m_context = null;
private ServiceReference m_brsRef = null;
private RepositoryAdmin m_brs = null;
private JTextField m_urlField = null;
private JButton m_refreshButton = null;
private JTable m_bundleTable = null;
private JButton m_startAllButton = null;
private JButton m_infoButton = null;
private ObjectName osgiON=null;
private PrintStream m_out=System.out;
private ServiceRegistration sreg=null;
///////////////////////////////////////////
// BundleActivator //
///////////////////////////////////////////
public void start(BundleContext context) throws BundleException {
m_context = context;
try {
this.init();
}catch(Exception e){
e.printStackTrace();
throw new BundleException("ObrTabUIException "+e.getMessage());
}
this.registerServicePlugin();
}
public void stop(BundleContext context) {
}
///////////////////////////////////////////
// Plugin //
//////////////////////////////////////////
public void registerServicePlugin(){
sreg = m_context.registerService(Plugin.class.getName(), this, null);
}
public void unregisterServicePlugin(){
sreg.unregister();
}
public String pluginLocation(){
return m_context.getBundle().getLocation();
}
public String getName(){return "Remote OBR";}
public Component getGUI(){return this;}
public void propertyChange(PropertyChangeEvent e){
//System.out.println("TEST"+e.getPropertyName());
if (e.getPropertyName().equals(Plugin.NEW_NODE_READY)){
this.mbsc=(MBeanServerConnection)e.getNewValue();
//System.out.println("TESTE"+this.mbsc);
}else if(e.getPropertyName().equals(Plugin.EMPTY_NODE)){
this.mbsc=null;
}
}
/////////////////////
// Plugin elements //
/////////////////////
private void init() throws Exception {
this.osgiON=new ObjectName(OSGI_ON);
ServiceListener sl = new ServiceListener() {
public void serviceChanged(ServiceEvent event) {
synchronized (ObrProbeTabUI.this) {
// Ignore additional services if we already have one.
if ((event.getType() == ServiceEvent.REGISTERED)
&& (m_brsRef != null)) {
return;
}
// Initialize the service if we don't have one.
else if ((event.getType() == ServiceEvent.REGISTERED)
&& (m_brsRef == null)) {
initializeService();
}
// Unget the service if it is unregistering.
else if ((event.getType() == ServiceEvent.UNREGISTERING)
&& event.getServiceReference().equals(m_brsRef)) {
m_context.ungetService(m_brsRef);
m_brsRef = null;
m_brs = null;
// Try to get another service.
initializeService();
}
}
}
};
try {
m_context.addServiceListener(sl, "(objectClass=" + RepositoryAdmin.class.getName() + ")");
} catch (InvalidSyntaxException ex) {
System.err.println("OBRPlugin: " + ex);
}
// Create the gui.
createUserInterface();
// Now try to manually initialize the shell service
// since one might already be available.
initializeService();
}
private synchronized void initializeService() {
if (m_brs != null) {
return;
}
m_brsRef = m_context.getServiceReference(RepositoryAdmin.class.getName());
if (m_brsRef == null) {
m_urlField.setText("");
} else {
m_brs = (RepositoryAdmin) m_context.getService(m_brsRef);
m_urlField.setText(convertArrayToString(m_brs.listRepositories()));
}
// Update the table.
((SimpleTableModel) m_bundleTable.getModel()).update();
}
private void createUserInterface() {
setLayout(new BorderLayout());
add(createBRUrlPanel(), BorderLayout.NORTH);
add(createTable(), BorderLayout.CENTER);
add(createButtonPanel(), BorderLayout.SOUTH);
createEventListeners();
}
private JPanel createBRUrlPanel(){
JPanel panel=new JPanel(new FlowLayout());
panel.add(new JLabel("URL(s)"));
panel.add(m_urlField = new JTextField(20));
panel.add(m_refreshButton = new JButton("Refresh"));
m_refreshButton.setMnemonic('I');
return panel;
}
private JScrollPane createTable() {
JScrollPane scroll = new JScrollPane(m_bundleTable = new JTable());
scroll.setPreferredSize(new Dimension(100, 100));
m_bundleTable.setMinimumSize(new Dimension(0, 0));
m_bundleTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
m_bundleTable.setModel(new SimpleTableModel());
m_bundleTable.getColumnModel().getColumn(0).setPreferredWidth(75);
m_bundleTable.getColumnModel().getColumn(1).setPreferredWidth(75);
m_bundleTable.getColumnModel().getColumn(2).setPreferredWidth(200);
return scroll;
}
private JPanel createButtonPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.add(m_startAllButton = new JButton("Start all"));
panel.add(m_infoButton = new JButton("Info"));
m_startAllButton.setMnemonic('S');
m_infoButton.setMnemonic('I');
return panel;
}
private void createEventListeners() {
// Create action listeners.
m_refreshButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
/*
synchronized (ObrProbeTabUI.this) {
if (m_brs == null) {
return;
} else if (m_urlField.getText().length() > 0) {
m_brs.setRepositoryURLs(convertStringToArray(m_urlField.getText()));
} else {
m_urlField.setText(convertArrayToString(m_brs.getRepositoryURLs()));
}
// Update the table.
((SimpleTableModel) m_bundleTable.getModel()).update();
}
*/
}
});
m_startAllButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
synchronized (ObrProbeTabUI.this) {
if (mbsc == null) {
System.out.println("coucou");
return;
}
int[] rows = m_bundleTable.getSelectedRows();
for (int i = 0; i < rows.length; i++) {
//Object [] tabo=new Object[]{(String) m_brs.getBundleRecord(rows[i]).getAttribute(BundleRecord.BUNDLE_UPDATELOCATION)};
try{
/*
BundleRecord[] m_records=m_brs.getBundleRecords();
Object [] tabo=new Object[]{(String) m_records[rows[i]].getAttribute(BundleRecord.BUNDLE_SYMBOLICNAME), parseVersionString((String) m_records[rows[i]].getAttribute(BundleRecord.BUNDLE_VERSION))};
String [] tabc=new String[]{String.class.getName(),new ArrayType(1, SimpleType.INTEGER).getTypeName()};
*/
Object [] tabo=new Object[]{(String)m_bundleTable.getValueAt(rows[i], 0), (String)m_bundleTable.getValueAt(rows[i], 1)};
String [] tabc=new String[]{String.class.getName(),String.class.getName()};
System.out.println("====>"+m_bundleTable.getValueAt(rows[i], 0));
System.out.println("====>"+m_bundleTable.getValueAt(rows[i], 1));
mbsc.invoke(osgiON, "deploy", tabo, tabc);
}catch(Exception e){
e.printStackTrace();
}
}
m_out.println("");
}
}
});
m_infoButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
/*
synchronized (ObrProbeTabUI.this) {
if (m_brs == null) {
return;
}
int[] rows = m_bundleTable.getSelectedRows();
for (int i = 0; i < rows.length; i++) {
if (i != 0) {
m_out.println("");
}
BundleRecord br = m_brs.getBundleRecords()[i];
br.printAttributes(m_out);
}
m_out.println("");
}
*/
}
});
}
private String[] convertStringToArray(String str) {
String[] strs = null;
StringTokenizer st = new StringTokenizer(str);
if (st.countTokens() > 0) {
strs = new String[st.countTokens()];
for (int i = 0; (strs != null) && (i < strs.length); i++) {
strs[i] = st.nextToken();
}
}
return strs;
}
private String convertArrayToString(Repository[] strs) {
StringBuffer str = new StringBuffer();
for (int i = 0; (strs != null) && (i < strs.length); i++) {
// Add space between URLs.
if (i != 0) {
str = str.append(" ");
}
str.append(strs[i].getURL());
}
return str.toString();
}
public static Integer[] parseVersionString(String s) {
Integer[] version = new Integer[] { new Integer(0), new Integer(0), new Integer(0) };
if (s != null) {
StringTokenizer st = new StringTokenizer(s, ".");
if (st.hasMoreTokens()) {
try {
version[0] = new Integer(st.nextToken());
if (st.hasMoreTokens()) {
version[1] = new Integer(st.nextToken());
if (st.hasMoreTokens()) {
version[2] = new Integer(st.nextToken());
}
}
return version;
} catch (NumberFormatException ex) {
throw new IllegalArgumentException( "Improper version number.");
}
}
}
return version;
}
private class SimpleTableModel extends AbstractTableModel {
public int getRowCount() {
if (m_brs==null){
return 0;
}else{
try {
Resource[] resources = m_brs.discoverResources("(|(presentationname=*)(symbolicname=*))");
return resources.length;
}catch(Exception e){
System.out.println("OBR not working, network problem ?");
//e.printStackTrace();
return 0;
}
}
}
public int getColumnCount() {
return 3;
}
public String getColumnName(int column) {
if (column == 0) {
return "Name";
} else if (column == 1) {
return "Version";
} else if (column == 2) {
return "Description";
}
return "";
}
public Class getColumnClass(int column) {
return String.class;
}
public boolean isCellEditable(int row, int column) {
return false;
}
public Object getValueAt(int row, int column) {
Resource br = null;
synchronized (ObrProbeTabUI.this) {
if (m_brs != null) {
br=m_brs.discoverResources("(|(presentationname=*)(symbolicname=*))")[row];
}
}
if (br != null) {
if (column == 0) {
return br.getPresentationName();
} else if (column == 1) {
return br.getVersion().toString();
} else if (column == 2) {
return br.getSymbolicName();
}
}
return null;
}
public void update() {
fireTableDataChanged();
}
}
}