/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * 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 net.java.sip.communicator.plugin.jabberaccregwizz; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import javax.imageio.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.table.*; import javax.xml.parsers.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.util.*; import org.jitsi.service.fileaccess.*; import org.jitsi.util.xml.*; import org.osgi.framework.*; import org.w3c.dom.*; import org.xml.sax.*; /** * A dialog that shows the list of available Jabber servers. * * @author Nicolas Grandclaude */ public class JabberServerChooserDialog extends SIPCommDialog implements ListSelectionListener { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private static final Logger logger = Logger .getLogger(JabberServerChooserDialog.class); // Servers Table private JTable serversTable; private JTextArea chooseArea = new JTextArea(Resources .getString("plugin.jabberaccregwizz.CHOOSE_SERVER_TEXT")); // Panel private JPanel mainPanel = new TransparentPanel(new BorderLayout()); private JPanel buttonPanel = new TransparentPanel(new FlowLayout( FlowLayout.RIGHT)); private Box buttonBox = new Box(BoxLayout.X_AXIS); private JPanel chooseAreaPanel = new TransparentPanel(new BorderLayout()); private JPanel westPanel = new TransparentPanel(new BorderLayout(10, 10)); private JPanel eastPanel = new TransparentPanel(new BorderLayout(10, 10)); private JLabel westIconLabel = new JLabel(); private JButton okButton = new JButton(Resources.getString("service.gui.OK")); private JButton cancelButton = new JButton(Resources .getString("service.gui.CANCEL")); private Vector<String> servers = new Vector<String>(); private FileAccessService faService = null; private String[] columnNames = { Resources.getString("plugin.jabberaccregwizz.SERVER_COLUMN"), Resources.getString("plugin.jabberaccregwizz.COMMENT_COLUMN")}; /** * If the OK button is pressed. */ public boolean isOK = false; /** * The selected server. */ public String serverSelected; /** * Creates an instance of <tt>JabberServerChooserDialog</tt>. */ public JabberServerChooserDialog() { this.setSize(new Dimension(550, 450)); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setTitle(Resources.getString( "plugin.jabberaccregwizz.CHOOSE_SERVER_TITLE")); this.setModal(true); // Place the window in the center Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation(screenSize.width / 2 - this.getWidth() / 2, screenSize.height / 2 - this.getHeight() / 2); this.init(); } /** * Initializes all panels, buttons, etc. */ private void init() { chooseArea.setEditable(false); chooseArea.setOpaque(false); chooseArea.setLineWrap(true); chooseArea.setWrapStyleWord(true); chooseAreaPanel .setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 10)); chooseAreaPanel.add(chooseArea, BorderLayout.NORTH); eastPanel.add(chooseAreaPanel, BorderLayout.NORTH); // West Jabber icon westIconLabel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createEmptyBorder(20, 20, 20, 20), BorderFactory .createTitledBorder(""))); try { westIconLabel.setIcon(new ImageIcon(ImageIO .read(new ByteArrayInputStream(Resources .getImage(Resources.PAGE_IMAGE))))); } catch (IOException e) { logger.error("Could not read image.", e); } this.westPanel.add(westIconLabel, BorderLayout.NORTH); this.mainPanel.add(westPanel, BorderLayout.WEST); // Table with servers and comments serversTable = new JTable(new ServerChooserTableModel()); serversTable.setRowHeight(22); serversTable.getSelectionModel().addListSelectionListener(this); serversTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); serversTable.setPreferredScrollableViewportSize(new Dimension(500, 70)); // Fill the servers array with servers from servers.xml fillTable(); JScrollPane scrollPane = new JScrollPane(serversTable); eastPanel.add(scrollPane, BorderLayout.CENTER); // Ok button okButton.setMnemonic(Resources.getMnemonic("service.gui.OK")); okButton.setEnabled(false); // Cancel button cancelButton.setMnemonic(Resources.getMnemonic("service.gui.CANCEL")); // Box with Ok and Cancel buttonBox.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10))); buttonBox.add(okButton); buttonBox.add(Box.createHorizontalStrut(10)); buttonBox.add(cancelButton); buttonPanel.add(buttonBox); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { isOK = true; dispose(); } }); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { dispose(); } }); this.mainPanel.add(eastPanel, BorderLayout.CENTER); this.mainPanel.add(buttonPanel, BorderLayout.SOUTH); mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); this.getContentPane().add(mainPanel, BorderLayout.CENTER); this.setVisible(true); } /** * Fill the servers array variable with data from the remote servers.xml */ public void fillTable() { BundleContext bc = JabberAccRegWizzActivator.bundleContext; ServiceReference faServiceReference = bc .getServiceReference(FileAccessService.class.getName()); faService = (FileAccessService) bc.getService(faServiceReference); File localServersListFile = null; try { localServersListFile = faService.getTemporaryFile(); URL file = new URL("https://xmpp.net/services.php"); InputStream stream = file.openStream(); try { // Copy the remote file to the disk byte[] buf = new byte[2048]; int len; if (stream.available() > 0) { FileOutputStream fos = new FileOutputStream(localServersListFile); while ((len = stream.read(buf)) > 0) { fos.write(buf, 0, len); } fos.close(); } } finally { stream.close(); } FileInputStream fis = new FileInputStream(localServersListFile); DocumentBuilder constructor = XMLUtils.newDocumentBuilderFactory().newDocumentBuilder(); Document document = constructor.parse(fis); Element root = document.getDocumentElement(); NodeList list = root.getElementsByTagName("item"); // Read the xml and fill servers variable for the JTable for (int i = 0; i < list.getLength(); i++) { Element e = (Element) list.item(i); servers.add(new String(e.getAttribute("jid"))); } fis.close(); } catch (Exception e) { logger.error( "Failed to get a reference to the Jabber servers list file.", e); } finally { if (localServersListFile != null) { localServersListFile.delete(); } } } /** * When a table row is selected enable the "Ok" button, otherwise disable it. */ public void valueChanged(ListSelectionEvent e) { int row = serversTable.getSelectedRow(); if (row != -1) { okButton.setEnabled(true); serverSelected = (String) serversTable.getValueAt(row, 0); } else { okButton.setEnabled(false); } } @Override protected void close(boolean isEscaped) { cancelButton.doClick(); } /** * The table model used for the table containing all servers. */ private class ServerChooserTableModel extends AbstractTableModel { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private Document serverComments; private NodeList commentsList; public ServerChooserTableModel() { try { // Create the builder and parse the file serverComments = XMLUtils.newDocumentBuilderFactory().newDocumentBuilder() .parse(Resources.getPropertyInputStream( "plugin.jabberaccregwizz.SERVER_COMMENTS")); } catch (SAXException e) { logger.error("Failed to parse server comments.", e); } catch (ParserConfigurationException e) { logger.error("Failed to parse server comments.", e); } catch (IOException e) { logger.error("Failed to parse server comments.", e); } Element root = serverComments.getDocumentElement(); commentsList = root.getElementsByTagName("item"); } public int getColumnCount() { return 2; } public int getRowCount() { return servers.size(); } @Override public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { String commentString = new String(""); if (col == 0) // Column 1 (Server name) { return servers.get(row); } else { // Column 2 (Comment) int i = 0; Element e = (Element) commentsList.item(i); while ((i < commentsList.getLength()) && (e.getAttribute("jid").equals(servers.get(row)) == false)) { e = (Element) commentsList.item(i); i++; } if (e.getAttribute("jid").equals(servers.get(row))) { commentString = e.getAttribute("comment"); } return commentString; } } } }