/* * Copyright 2005 The Apache Software Foundation * * Licensed 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.console.component; import org.apache.felix.mosgi.console.ifc.CommonPlugin; import org.apache.felix.mosgi.console.ifc.Plugin; //import org.apache.felix.mosgi.console.component.JtableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.JTable; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.JFileChooser; import javax.swing.table.JTableHeader; import javax.swing.JOptionPane; import java.awt.Component; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import javax.management.Notification; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.MBeanServerConnection; import java.util.Hashtable; import java.util.StringTokenizer; import java.util.Vector; import java.util.Date; import java.io.PrintStream; import java.io.File; import java.io.FileNotFoundException; import java.text.DateFormat; //import java.text.SimpleDateFormat; public class RemoteLogger_jtable extends DefaultTableModel implements CommonPlugin, NotificationListener, ActionListener{ private JTable logList; private JButton jb_save; private String[] columnToolTips=new String[]{"","","","","", "<html><pre> 1 UNINSTALLED black<br> 2 INSTALLED red<br> 4 RESOLVED orange<br> 8 STARTING gray<br>16 STOPPING gray<br>32 ACTIVE green", "",""}; private JPanel jbPanel; private JPanel jp; private Hashtable nodes=new Hashtable(); public RemoteLogger_jtable (){ super(new String[]{"Date","Time", "Src", "Id", "Name", "State", "Lvl", "Msg"},1); jp=new JPanel(); jp.setLayout(new BorderLayout()); jbPanel=new JPanel(); jbPanel.setSize(300,25); jb_save=new JButton("Save log on file"); jb_save.setName("jb_save"); jb_save.addActionListener(this); logList=new JTable(this){ protected JTableHeader createDefaultTableHeader() { return new JTableHeader(columnModel) { public String getToolTipText(MouseEvent e) { String tip = null; java.awt.Point p = e.getPoint(); int index = columnModel.getColumnIndexAtX(p.x); int realIndex = columnModel.getColumn(index).getModelIndex(); return columnToolTips[realIndex]; } }; } }; JtableCellRenderer cellRenderer=new JtableCellRenderer(); logList.setDefaultRenderer(Object.class,cellRenderer); logList.setPreferredScrollableViewportSize(new java.awt.Dimension(600, 70)); logList.getColumnModel().getColumn(0).setPreferredWidth(50); logList.getColumnModel().getColumn(1).setPreferredWidth(40); logList.getColumnModel().getColumn(2).setPreferredWidth(120); logList.getColumnModel().getColumn(3).setPreferredWidth(15); logList.getColumnModel().getColumn(4).setPreferredWidth(70); logList.getColumnModel().getColumn(5).setPreferredWidth(15); logList.getColumnModel().getColumn(6).setPreferredWidth(40); logList.getColumnModel().getColumn(7).setPreferredWidth(180); logList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); logList.getTableHeader().setReorderingAllowed(true);//false); jbPanel.add(jb_save); jp.add(jbPanel, BorderLayout.NORTH); jp.add(new JScrollPane(logList), BorderLayout.CENTER); } ///////////////////////////////////// // Plugin Interface //////////////// ///////////////////////////////////// public String getName(){ return "JTable Remote Logger";} public Component getGUI(){return this.jp;} /* a supprimer si on enleve l'heritage CommonPlugin -> Plugin */ public String pluginLocation(){ return null; } public void registerServicePlugin(){} public void unregisterServicePlugin(){} /* fin a supprimer */ public void propertyChange(PropertyChangeEvent e){ if (e.getPropertyName().equals(Plugin.NEW_NODE_CONNECTION)){ try{ MBeanServerConnection mbs=(MBeanServerConnection)e.getNewValue(); if (nodes.get(mbs)==null){ //System.out.println("Ajout d'un listener " +mbs); ((MBeanServerConnection)e.getNewValue()).addNotificationListener(Activator.REMOTE_LOGGER_ON, this, null, e.getOldValue()); nodes.put(mbs, "ok"); } }catch(Exception ex){ ex.printStackTrace(); } } } private static final DateFormat dateF = DateFormat.getDateInstance(DateFormat.SHORT); private static final DateFormat timeF = DateFormat.getTimeInstance(DateFormat.MEDIUM); public void handleNotification(Notification notification, Object handback) { StringTokenizer st = new StringTokenizer(notification.getMessage(),"*"); long ts=notification.getTimeStamp(); String date=JtreeCellRenderer.UNKNOWN_DATE; //"??/??/??"; String time=JtreeCellRenderer.UNKNOWN_TIME; //"??/??/??"; if (ts!=0){ // means it's not an old log Date d=new Date(ts); //DateFormat dateFormat = new SimpleDateFormat("hh'h'mm dd-MM-yy"); date = dateF.format(d); time = timeF.format(d); } String id=st.nextToken(); String name=st.nextToken(); String shortName=name.substring(name.lastIndexOf(".")+1,name.length()); String state=st.nextToken(); String lvl=st.nextToken(); String msg=st.nextToken(); Object [] event = new Object []{date,time,handback,id,shortName,state,lvl,msg}; this.insertRow(0,event); this.fireTableRowsInserted(0, 0); } public void actionPerformed(ActionEvent e) { Object o=e.getSource(); if ( o==jb_save){ PrintStream ps=System.out; JFileChooser jfc=new JFileChooser(); if (jfc.showSaveDialog(null)==JFileChooser.APPROVE_OPTION & jfc.getSelectedFile()!=null){ try{ ps=new PrintStream(new java.io.FileOutputStream(jfc.getSelectedFile())); System.out.println("Save remote log into \""+jfc.getSelectedFile().getName()+"\""); } catch (FileNotFoundException fnfe){ System.out.println("err : "+fnfe); } } int col=this.logList.getColumnCount(); int line=this.logList.getRowCount() - 1; // last line always empty //ps.print(col+" "+line); Vector tableData=new Vector(); tableData=this.getDataVector(); for (int i=0 ; i<line ; i++){ ps.print(i+" : "); for (int j=0 ; j<col ; j++){ ps.print((String) ( ((Vector) (tableData.elementAt(i))).elementAt(j) )+" | "); } ps.print("\n"); } } } }