/* * TeleStax, Open Source Cloud Communications Copyright 2012. * TeleStax and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.smsc.tools.cassandratool; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import org.apache.log4j.BasicConfigurator; import org.mobicents.smsc.cassandra.DBOperations; import org.mobicents.smsc.cassandra.PersistenceException; import org.mobicents.smsc.cassandra.Schema; import org.mobicents.smsc.library.SmsSet; import com.datastax.driver.core.BoundStatement; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.JButton; import java.awt.GridLayout; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.LineBorder; import javax.swing.event.TableModelEvent; import javax.swing.table.DefaultTableModel; import java.awt.Color; import javax.swing.ListSelectionModel; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.SortedMap; import java.util.TreeMap; import java.util.Vector; import javax.swing.JRadioButton; import javax.swing.ButtonGroup; /** * * @author sergey vetyutnev * */ public class CassandraToolForm { private JTextField tbHost; private JTextField tbPort; private JTextField tbUser; private JTextField tbPass; private JTextField tbKeyspace; private JTable tResult; protected JFrame frmSmppSimulator; private JButton btConnect; private JButton btDisconnect; private JButton btGetData; private JRadioButton rbLive; private JRadioButton rbArchive; private JRadioButton rbMsgId; private JRadioButton rbDlvMsgId; private DefaultTableModel model = new DefaultTableModel(); private DBOperationsProxy dbOperations; private final ButtonGroup buttonGroup = new ButtonGroup(); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { CassandraToolForm window = new CassandraToolForm(); window.frmSmppSimulator.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } private static void setupLog4j() { BasicConfigurator.configure(); } public CassandraToolForm() { initialize(); setupLog4j(); } public JFrame getJFrame() { return this.frmSmppSimulator; } private void initialize() { frmSmppSimulator = new JFrame(); frmSmppSimulator.setResizable(true); frmSmppSimulator.setTitle("Cassandra Tool"); frmSmppSimulator.setBounds(100, 100, 895, 728); frmSmppSimulator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); frmSmppSimulator.getContentPane().add(panel, BorderLayout.CENTER); panel.setLayout(new GridLayout(0, 1, 0, 0)); JPanel panel_1 = new JPanel(); panel.add(panel_1); panel_1.setLayout(new GridLayout(1, 0, 0, 0)); JScrollPane scrollPane = new JScrollPane(); panel_1.add(scrollPane); tResult = new JTable(); tResult.setModel(new DefaultTableModel(new Object[][] {}, new String[] { "TargetId", "Id", "DueSLot", "MessageId", "InSystem", "DeliveryCount", "SmStatus", "ValidityPeriod", "SchedulerDeliveryTime", "Text", }) { Class[] columnTypes = new Class[] { String.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class }; public Class getColumnClass(int columnIndex) { return columnTypes[columnIndex]; } boolean[] columnEditables = new boolean[] { false, false, false, false, false, false, false, false, false, false }; public boolean isCellEditable(int row, int column) { return columnEditables[column]; } }); tResult.getColumnModel().getColumn(0).setPreferredWidth(80); tResult.getColumnModel().getColumn(1).setPreferredWidth(20); tResult.getColumnModel().getColumn(2).setPreferredWidth(140); tResult.getColumnModel().getColumn(3).setPreferredWidth(20); tResult.getColumnModel().getColumn(4).setPreferredWidth(20); tResult.getColumnModel().getColumn(5).setPreferredWidth(20); tResult.getColumnModel().getColumn(6).setPreferredWidth(80); tResult.getColumnModel().getColumn(7).setPreferredWidth(80); tResult.getColumnModel().getColumn(8).setPreferredWidth(80); tResult.getColumnModel().getColumn(9).setPreferredWidth(120); tResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tResult.setFillsViewportHeight(true); tResult.setBorder(new LineBorder(new Color(0, 0, 0))); scrollPane.setViewportView(tResult); model = (DefaultTableModel) tResult.getModel(); JPanel panel_2 = new JPanel(); panel.add(panel_2); panel_2.setLayout(null); JLabel lblCassandraHost = new JLabel("Cassandra host"); lblCassandraHost.setBounds(10, 15, 125, 14); panel_2.add(lblCassandraHost); JLabel lblCassandraPort = new JLabel("Cassandra port"); lblCassandraPort.setBounds(10, 43, 125, 14); panel_2.add(lblCassandraPort); JLabel lblCassandraKeyspace = new JLabel("Cassandra keyspace"); lblCassandraKeyspace.setBounds(10, 70, 125, 14); panel_2.add(lblCassandraKeyspace); tbKeyspace = new JTextField(); tbKeyspace.setBounds(145, 67, 125, 20); panel_2.add(tbKeyspace); tbKeyspace.setText("RestCommSMSC"); tbKeyspace.setColumns(10); tbPort = new JTextField(); tbPort.setBounds(145, 40, 125, 20); panel_2.add(tbPort); tbPort.setText("9042"); tbPort.setColumns(10); tbHost = new JTextField(); tbHost.setBounds(145, 12, 125, 20); panel_2.add(tbHost); tbHost.setText("127.0.0.1"); tbHost.setColumns(10); tbUser = new JTextField(); tbPort.setBounds(145, 40, 125, 20); panel_2.add(tbUser); tbUser.setText("cassandra"); tbUser.setColumns(10); tbPass = new JTextField(); tbPort.setBounds(145, 40, 125, 20); panel_2.add(tbPass); tbPass.setText("cassandra"); tbPass.setColumns(10); btConnect = new JButton("Connect"); btConnect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { connect(); } }); btConnect.setBounds(10, 135, 105, 23); panel_2.add(btConnect); btDisconnect = new JButton("Disconnect"); btDisconnect.setEnabled(false); btDisconnect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { disConnect(); } }); btDisconnect.setBounds(125, 135, 105, 23); panel_2.add(btDisconnect); btGetData = new JButton("Get data"); btGetData.setEnabled(false); btGetData.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getData(); } }); btGetData.setBounds(240, 135, 105, 23); panel_2.add(btGetData); rbLive = new JRadioButton("Live table"); rbLive.setSelected(true); buttonGroup.add(rbLive); rbLive.setBounds(6, 91, 109, 23); panel_2.add(rbLive); rbArchive = new JRadioButton("Archive table"); buttonGroup.add(rbArchive); rbArchive.setBounds(117, 91, 109, 23); panel_2.add(rbArchive); rbMsgId = new JRadioButton("MsgId table"); buttonGroup.add(rbMsgId); rbMsgId.setBounds(228, 91, 109, 23); panel_2.add(rbMsgId); rbDlvMsgId = new JRadioButton("DlvMsgId table"); buttonGroup.add(rbDlvMsgId); rbDlvMsgId.setBounds(339, 91, 109, 23); panel_2.add(rbDlvMsgId); } private void connect() { this.dbOperations = new DBOperationsProxy(); String hosts = this.tbHost.getText(); String strPort = this.tbPort.getText(); String user = this.tbUser.getText(); String pass = this.tbPass.getText(); int port = 0; try { port = Integer.parseInt(strPort); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(getJFrame(), "Can not parse port value:\n" + e.getMessage()); return; } String keyspace = this.tbKeyspace.getText(); try { this.dbOperations.start(hosts, port, keyspace, user, pass, 60, 60, 60 * 10, 1, 10000000000L); } catch (Exception e) { JOptionPane.showMessageDialog(getJFrame(), "Can not connect to cassandra database:\n" + e.getMessage()); return; } this.btConnect.setEnabled(false); this.btDisconnect.setEnabled(true); this.btGetData.setEnabled(true); JOptionPane.showMessageDialog(getJFrame(), "Connected:\nDriverVersion = " + this.dbOperations.getCluster().getDriverVersion() + "\nProtocolVersion = " + this.dbOperations.getProtocolVersion(this.dbOperations.getCluster())); } private void disConnect() { try { this.dbOperations.stop(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } this.dbOperations = null; this.btConnect.setEnabled(true); this.btDisconnect.setEnabled(false); this.btGetData.setEnabled(false); JOptionPane.showMessageDialog(getJFrame(), "Disconnected"); } private void getData() { try { String tName = this.dbOperations.getTableName(new Date()); String tbFam; int option = 0; if (this.rbLive.isSelected()) { tbFam = Schema.FAMILY_SLOT_MESSAGES_TABLE; } else if (this.rbArchive.isSelected()) { tbFam = Schema.FAMILY_MESSAGES; } else if (this.rbMsgId.isSelected()) { tbFam = Schema.FAMILY_MES_ID; option = 1; } else { tbFam = Schema.FAMILY_DLV_MES_ID; option = 2; } String s1 = "SELECT * FROM \"" + tbFam + tName + "\";"; Session session = this.dbOperations.getSession(); PreparedStatement ps = session.prepare(s1); BoundStatement boundStatement = new BoundStatement(ps); ResultSet res = session.execute(boundStatement); model.getDataVector().clear(); model.rowsRemoved(new TableModelEvent(model)); DateFormat df = new SimpleDateFormat("MM.dd HH:mm:ss"); if (option == 0) { SortedMap<Long, ArrayList<SmsSet>> result = new TreeMap<Long, ArrayList<SmsSet>>(); for (Row row : res) { SmsSet smsSet = this.dbOperations.createSms(row, null); if (smsSet != null) { ArrayList<SmsSet> al = result.get(smsSet.getSms(0).getMessageId()); if (al == null) { al = new ArrayList<SmsSet>(); result.put(smsSet.getSms(0).getMessageId(), al); } al.add(smsSet); } } for (ArrayList<SmsSet> al : result.values()) { for (SmsSet smsSet : al) { ListSelectionModel l = tResult.getSelectionModel(); Vector newRow = new Vector(); newRow.add(smsSet.getTargetId()); newRow.add(smsSet.getSms(0).getDbId()); String reportDate = df.format(this.dbOperations.c2_getTimeForDueSlot(smsSet.getSms(0).getDueSlot())); newRow.add(smsSet.getSms(0).getDueSlot() + " - " + reportDate); newRow.add(smsSet.getSms(0).getMessageId()); newRow.add(smsSet.getInSystem()); newRow.add(smsSet.getSms(0).getDeliveryCount()); newRow.add(smsSet.getStatus()); Date dt = smsSet.getSms(0).getValidityPeriod(); if (dt != null) reportDate = df.format(dt); else reportDate = ""; newRow.add(reportDate); dt = smsSet.getSms(0).getScheduleDeliveryTime(); if (dt != null) reportDate = df.format(dt); else reportDate = ""; newRow.add(reportDate); newRow.add(smsSet.getSms(0).getShortMessageText()); model.getDataVector().add(0, newRow); model.newRowsAdded(new TableModelEvent(model)); } } } else if (option == 1) { for (Row row : res) { ListSelectionModel l = tResult.getSelectionModel(); Vector newRow = new Vector(); newRow.add(row.getString(Schema.COLUMN_ADDR_DST_DIGITS)); newRow.add(row.getUUID(Schema.COLUMN_ID)); newRow.add(""); newRow.add(row.getLong(Schema.COLUMN_MESSAGE_ID)); newRow.add(""); newRow.add(""); newRow.add(""); newRow.add(""); newRow.add(""); newRow.add(""); model.getDataVector().add(0, newRow); model.newRowsAdded(new TableModelEvent(model)); } } else { for (Row row : res) { ListSelectionModel l = tResult.getSelectionModel(); Vector newRow = new Vector(); newRow.add(row.getString(Schema.COLUMN_REMOTE_MESSAGE_ID)); newRow.add(""); newRow.add(row.getString(Schema.COLUMN_DEST_ID)); newRow.add(row.getLong(Schema.COLUMN_MESSAGE_ID)); newRow.add(""); newRow.add(""); newRow.add(""); newRow.add(""); newRow.add(""); newRow.add(""); model.getDataVector().add(0, newRow); model.newRowsAdded(new TableModelEvent(model)); } } } catch (Exception e) { JOptionPane.showMessageDialog(getJFrame(), "Can not get data from cassandra database:\n" + e.getMessage()); } } public class DBOperationsProxy extends DBOperations { protected Cluster getCluster() { return super.getCluster(); } protected Session getSession() { return super.getSession(); } protected String getTableName(Date dt) { return super.getTableName(dt); } protected SmsSet createSms(final Row row, SmsSet smsSet) throws PersistenceException { return super.createSms(row, smsSet, true, true, true, true, true, true); } } }