/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2012-2017 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package org.glassfish.jersey.examples.aggregator; import java.awt.Color; import java.awt.EventQueue; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.ActionMap; import javax.swing.DefaultListModel; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.KeyStroke; import javax.swing.WindowConstants; /** * Main data aggregator client application UI window. * * @author Marek Potociar (marek.potociar at oracle.com) */ public class MainWindow extends javax.swing.JFrame { private final DefaultListModel keywordListModel; private final AtomicBoolean receiveMessages; private final List<DataAggregator> dataAggregators; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addButton; private javax.swing.JLabel connectionStatusLabel; private javax.swing.JPanel jPanel4; private javax.swing.JList keywordList; private javax.swing.JTextArea messagesArea; private javax.swing.JTextField newKeywordField; private javax.swing.JButton startStopButton; private javax.swing.JCheckBox testCheckbox; private javax.swing.JLabel testColorLabel; private javax.swing.JCheckBox twitterCheckbox; private javax.swing.JLabel twitterColorLabel; // End of variables declaration//GEN-END:variables /** * Creates new form MessageAggregator */ public MainWindow() { keywordListModel = new DefaultListModel(); receiveMessages = new AtomicBoolean(false); initComponents(); // Bind "remove selected list items" action to DELETE key pressed in keyword list. ActionMap actionMap = keywordList.getActionMap(); InputMap inputMap = keywordList.getInputMap(JComponent.WHEN_FOCUSED); final String actionKey = "RemoveSelectedListItems"; actionMap.put(actionKey, new RemoveSelectedListItemsAction(keywordList, keywordListModel)); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), actionKey); dataAggregators = new ArrayList<DataAggregator>(2); } private void initAggregators() { if (twitterCheckbox.isSelected()) { dataAggregators.add(new TwitterAggregator(colorToString(twitterColorLabel.getBackground()))); } if (testCheckbox.isSelected()) { dataAggregators.add(new TestAggregatorJersey(colorToString(testColorLabel.getBackground()))); dataAggregators.add(new TestAggregatorJaxRs(colorToString(testColorLabel.getBackground()))); } } private String colorToString(Color color) { StringBuilder colorBuilder = new StringBuilder(); colorBuilder .append(String.format("%02X", color.getRed())) .append(String.format("%02X", color.getGreen())) .append(String.format("%02X", color.getBlue())); return colorBuilder.toString(); } private void onKeywordEntered(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onKeywordEntered final String keyword = newKeywordField.getText(); if (keyword == null || keyword.isEmpty() || keywordListModel.contains(keyword)) { return; } addButton.doClick(); }//GEN-LAST:event_onKeywordEntered private void onAdd(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onAdd final String keyword = newKeywordField.getText(); if (keyword == null || keyword.isEmpty() || keywordListModel.contains(keyword)) { return; } keywordListModel.addElement(keyword); newKeywordField.setText(""); }//GEN-LAST:event_onAdd private void onStartOrStop(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onStartOrStop if (receiveMessages.get()) { // stop receiveMessages.set(false); startStopButton.setText("Start"); newKeywordField.setEnabled(true); addButton.setEnabled(true); stop(); } else { // start receiveMessages.set(true); startStopButton.setText("Stop"); connectionStatusLabel.setText("Connecting..."); newKeywordField.setEnabled(false); addButton.setEnabled(false); messagesArea.setText(""); StringBuilder keywordsBuilder = new StringBuilder(); final Enumeration<?> elements = keywordListModel.elements(); while (elements.hasMoreElements()) { keywordsBuilder.append(elements.nextElement()); if (elements.hasMoreElements()) { keywordsBuilder.append(","); } } start(keywordsBuilder.toString(), new DataListener() { @Override public void onStart() { EventQueue.invokeLater(() -> connectionStatusLabel.setText("Connected.")); } @Override public void onMessage(final Message message) { EventQueue.invokeLater(() -> messagesArea.append(message.getText() + "\n\n")); } @Override public void onError() { EventQueue.invokeLater(() -> { connectionStatusLabel.setText("Connection Error!"); receiveMessages.set(false); startStopButton.setText("Start"); newKeywordField.setEnabled(true); addButton.setEnabled(true); }); } @Override public void onComplete() { EventQueue.invokeLater(() -> connectionStatusLabel.setText("Disconnected.")); } }); } }//GEN-LAST:event_onStartOrStop private void stop() { for (DataAggregator dataAggregator : dataAggregators) { dataAggregator.stop(); } dataAggregators.clear(); } private void start(String keywords, DataListener listener) { initAggregators(); for (DataAggregator dataAggregator : dataAggregators) { dataAggregator.start(keywords, listener); } } /** * @param args the command line arguments */ public static void main(String args[]) { /* Create and display the form */ EventQueue.invokeLater(() -> { final MainWindow messageAggregator = new MainWindow(); messageAggregator.setLocationRelativeTo(null); messageAggregator.setVisible(true); }); } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { javax.swing.JPanel jPanel3 = new javax.swing.JPanel(); newKeywordField = new javax.swing.JTextField(); addButton = new javax.swing.JButton(); javax.swing.JPanel jPanel1 = new javax.swing.JPanel(); connectionStatusLabel = new javax.swing.JLabel(); startStopButton = new javax.swing.JButton(); javax.swing.JScrollPane jScrollPane2 = new javax.swing.JScrollPane(); messagesArea = new javax.swing.JTextArea(); javax.swing.JPanel jPanel2 = new javax.swing.JPanel(); javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); keywordList = new javax.swing.JList(); jPanel4 = new javax.swing.JPanel(); twitterCheckbox = new javax.swing.JCheckBox(); twitterColorLabel = new javax.swing.JLabel(); testColorLabel = new javax.swing.JLabel(); testCheckbox = new javax.swing.JCheckBox(); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setTitle("Message aggregator"); setMinimumSize(new java.awt.Dimension(304, 300)); jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder()); newKeywordField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { onKeywordEntered(evt); } }); addButton.setText("Add"); addButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { onAdd(evt); } }); org.jdesktop.layout.GroupLayout jPanel3Layout = new org.jdesktop.layout.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel3Layout.createSequentialGroup() .addContainerGap() .add(newKeywordField) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(addButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 72, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel3Layout.createSequentialGroup() .addContainerGap() .add(jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(newKeywordField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(addButton)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); startStopButton.setText("Start"); startStopButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { onStartOrStop(evt); } }); messagesArea.setColumns(20); messagesArea.setLineWrap(true); messagesArea.setRows(5); messagesArea.setWrapStyleWord(true); messagesArea.setFocusable(false); jScrollPane2.setViewportView(messagesArea); org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .addContainerGap() .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 247, Short.MAX_VALUE) .addContainerGap()) .add(jPanel1Layout.createSequentialGroup() .add(connectionStatusLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(startStopButton)))) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .addContainerGap() .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(startStopButton) .add(connectionStatusLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jScrollPane2) .addContainerGap()) ); jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); keywordList.setModel(keywordListModel); jScrollPane1.setViewportView(keywordList); org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel2Layout.createSequentialGroup() .addContainerGap() .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE) .addContainerGap()) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel2Layout.createSequentialGroup() .addContainerGap() .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE) .addContainerGap()) ); jPanel4.setBorder(javax.swing.BorderFactory.createEtchedBorder()); twitterCheckbox.setSelected(true); twitterCheckbox.setText("Twitter aggregator"); twitterColorLabel.setBackground(new java.awt.Color(85, 170, 0)); twitterColorLabel.setText(" "); twitterColorLabel.setOpaque(true); testColorLabel.setBackground(new java.awt.Color(0, 85, 170)); testColorLabel.setText(" "); testColorLabel.setOpaque(true); testCheckbox.setText("Test Aggregator"); org.jdesktop.layout.GroupLayout jPanel4Layout = new org.jdesktop.layout.GroupLayout(jPanel4); jPanel4.setLayout(jPanel4Layout); jPanel4Layout.setHorizontalGroup( jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel4Layout.createSequentialGroup() .addContainerGap() .add(jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel4Layout.createSequentialGroup() .add(twitterColorLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(twitterCheckbox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel4Layout.createSequentialGroup() .add(testColorLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(testCheckbox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); jPanel4Layout.setVerticalGroup( jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel4Layout.createSequentialGroup() .addContainerGap() .add(jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(twitterCheckbox) .add(twitterColorLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel4Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(testCheckbox) .add(testColorLabel)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jPanel4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jPanel3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(layout.createSequentialGroup() .add(jPanel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents }