All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.usergrid.launcher.LauncherFrame Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright 2012 Apigee Corporation
 * 
 * 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.usergrid.launcher;

import java.awt.Color;
import java.awt.Container;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class LauncherFrame extends JFrame {

	private static final long serialVersionUID = 1L;

	enum Status {
		GREEN, RED, YELLOW
	}

	Status status = Status.RED;

	App app;

	ImageIcon start_icon = createImageIcon("start.png", "Start");
	ImageIcon start_active_icon = createImageIcon("start_active.png", "Start");
	JButton start_button;

	ImageIcon stop_icon = createImageIcon("stop.png", "Stop");
	ImageIcon stop_active_icon = createImageIcon("stop_active.png", "Start");
	JButton stop_button;

	ImageIcon log_viewer_icon = createImageIcon("log_viewer.png", "Log");
	JButton log_viewer_button;

	ImageIcon usergrid_admin_icon = createImageIcon("web_browser.png", "Admin");
	JButton usergrid_admin_button;

	JCheckBox start_database_checkbox;
	JCheckBox init_database_checkbox;
	JComboBox urlList;

	ImageIcon status_green = createImageIcon("status_green.png", "Green");
	ImageIcon status_yellow = createImageIcon("status_yellow.png", "Green");
	ImageIcon status_red = createImageIcon("status_red.png", "Green");
	ImageIcon status_off = createImageIcon("status_off.png", "Green");
	JLabel status_label;
	Timer status_timer;

	JCheckBox auto_login_checkbox;
	JTextField auto_login_email;

	public LauncherFrame(App app) {
		super("Usergrid Launcher");

		this.app = app;

		// getRootPane().putClientProperty("apple.awt.brushMetalLook",
		// Boolean.TRUE);
		// getRootPane().putClientProperty("apple.awt.antialiasing",
		// Boolean.TRUE);
		addComponentsToPane();
		pack();
		setBackground(new Color(196, 196, 196));
		setLocationRelativeTo(null);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		setVisible(true);
		setResizable(false);
	}

	public void addComponentsToPane() {
		Container pane = getContentPane();
		pane.setLayout(new GridBagLayout());

		GridBagConstraints c;

		JToolBar toolBar = new JToolBar("Toolbar");
		toolBar.setBackground(new Color(128, 128, 128));
		toolBar.setFloatable(false);
		toolBar.setRollover(true);
		toolBar.setMargin(new Insets(8, 16, 8, 8));
		toolBar.setBorder(new EmptyBorder(new Insets(8, 16, 8, 8)));

		status_label = new JLabel(status_red);
		status_label.setPreferredSize(new Dimension(24, 64));
		toolBar.add(status_label);
		status_timer = new Timer(750, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (status == Status.YELLOW) {
					if (status_label.getIcon() == status_yellow) {
						status_label.setIcon(status_off);
					} else {
						status_label.setIcon(status_yellow);
					}
				}
			}
		});
		status_timer.start();

		toolBar.addSeparator(new Dimension(16, 0));

		start_button = new JButton(start_active_icon);
		initButton(start_button);
		toolBar.add(start_button);
		start_button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				start_button.setIcon(start_icon);
				stop_button.setIcon(stop_active_icon);
				app.startServer();
			}
		});

		toolBar.addSeparator(new Dimension(8, 0));

		stop_button = new JButton(stop_icon);
		initButton(stop_button);
		toolBar.add(stop_button);
		stop_button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				start_button.setIcon(start_active_icon);
				stop_button.setIcon(stop_icon);
				app.stopServer();
			}
		});

		toolBar.addSeparator(new Dimension(8, 0));

		log_viewer_button = new JButton(log_viewer_icon);
		initButton(log_viewer_button);
		toolBar.add(log_viewer_button);
		log_viewer_button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				app.showLogView();
			}
		});

		toolBar.addSeparator(new Dimension(8, 0));

		usergrid_admin_button = new JButton(usergrid_admin_icon);
		initButton(usergrid_admin_button);
		toolBar.add(usergrid_admin_button);
		usergrid_admin_button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				if (app.serverIsStarted() && (status == Status.GREEN)) {
					storeAdminUrls();
					storeAdminEmail();
          String adminUri = null;
					try {
            adminUri = getAdminURI().toString();
            Desktop.getDesktop().browse(getAdminURI());
          } catch (IOException e) {
            JOptionPane.showMessageDialog(null,
                    new JTextArea("Error opening URL in browser."
                            + " Please open the following URL in a browser manually:\n" + adminUri),
                    "Warning", JOptionPane.WARNING_MESSAGE);
          } catch (Exception ex) {
            JOptionPane.showMessageDialog(
                    null,
                    new JTextArea("Error opening URL in browser."
                            + "Please open the following URL in a browser manually:" + adminUri),
                    "Warning", JOptionPane.WARNING_MESSAGE);
          }
				} else {
					JOptionPane
							.showMessageDialog(
									null,
									"Server must be started before opening Admin Console.\n"
											+ "Please start server and wait for the status to turn green.",
									"Warning", JOptionPane.WARNING_MESSAGE);
				}

			}
		});

		c = new GridBagConstraints();
		c.anchor = GridBagConstraints.CENTER;
		c.weightx = 0.0;
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridwidth = 2;
		add(toolBar, c);

		start_database_checkbox = new JCheckBox("Start Database With Server*");
		c = new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
				new Insets(16, 16, 8, 16), 0, 0);
		start_database_checkbox.setSelected(app.isStartDatabaseWithServer());
		start_database_checkbox.setFont(new Font("Arial", Font.BOLD, 18));
		pane.add(start_database_checkbox, c);
		start_database_checkbox.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent change) {
				app.setStartDatabaseWithServer(start_database_checkbox
						.isSelected());
			}
		});

		init_database_checkbox = new JCheckBox("Initialize Database on Start*");
		c = new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
				new Insets(16, 16, 8, 16), 0, 0);
		init_database_checkbox.setSelected(app.isInitializeDatabaseOnStart());
		init_database_checkbox.setFont(new Font("Arial", Font.BOLD, 18));
		pane.add(init_database_checkbox, c);
		init_database_checkbox.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent change) {
				app.setInitializeDatabaseOnStart(init_database_checkbox
						.isSelected());
			}
		});

		JLabel label = new JLabel("Console URL:");
		c = new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
				new Insets(16, 24, 8, 0), 0, 0);
		label.setFont(new Font("Arial", Font.BOLD, 18));
		pane.add(label, c);

		String[] urls = app.getUrlsFromPreferences();
		urlList = new JComboBox(urls);
		urlList.setEditable(true);
		c = new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(
						16, 0, 8, 16), 0, 0);
		urlList.setFont(new Font("Arial", Font.BOLD, 18));

		urlList.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXX");

		ComboBoxEditor editor = urlList.getEditor();
		JTextField textField = (JTextField) editor.getEditorComponent();
		textField.setColumns(20);

		setPreferredWidth(textField, 350);
		setMaxWidth(textField, 350);

		setPreferredWidth(urlList, 350);
		setMaxWidth(urlList, 350);

		pane.add(urlList, c);

		auto_login_checkbox = new JCheckBox("Auto-login as:");
		c = new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
				new Insets(16, 16, 8, 0), 0, 0);
		auto_login_checkbox.setSelected(app.isAutoLogin());
		auto_login_checkbox.setFont(new Font("Arial", Font.BOLD, 18));
		pane.add(auto_login_checkbox, c);
		auto_login_checkbox.addChangeListener(new ChangeListener() {
			@Override
			public void stateChanged(ChangeEvent change) {
				app.setAutoLogin(auto_login_checkbox.isSelected());
			}
		});

		auto_login_email = new JTextField(app.getAdminUserEmail());
		c = new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
				new Insets(16, 0, 8, 16), 0, 0);
		auto_login_email.setFont(new Font("Arial", Font.BOLD, 18));
		pane.add(auto_login_email, c);

		label = new JLabel(
				"* Database can only be started or initialized once per app launch");
		c = new GridBagConstraints(0, 5, 2, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
				new Insets(16, 16, 16, 0), 0, 0);
		label.setForeground(Color.RED);
		label.setFont(new Font("Arial", Font.BOLD, 12));
		pane.add(label, c);

		List icons = new ArrayList(4);
		icons.add(new ImageIcon(getClass().getClassLoader().getResource(
				"org/usergrid/launcher/icon_16.png")).getImage());
		icons.add(new ImageIcon(getClass().getClassLoader().getResource(
				"org/usergrid/launcher/icon_32.png")).getImage());
		icons.add(new ImageIcon(getClass().getClassLoader().getResource(
				"org/usergrid/launcher/icon_64.png")).getImage());
		icons.add(new ImageIcon(getClass().getClassLoader().getResource(
				"org/usergrid/launcher/icon_256.png")).getImage());
		setIconImages(icons);
	}

	public void setPreferredWidth(JComponent jc, int width) {
		Dimension max = jc.getPreferredSize();
		max.width = width;
		jc.setPreferredSize(max);
	}

	public void setMaxWidth(JComponent jc, int width) {
		Dimension max = jc.getMaximumSize();
		max.width = width;
		jc.setMaximumSize(max);
	}

	public void initButton(JButton button) {
		button.setPreferredSize(new Dimension(64, 64));
		button.setMargin(new Insets(8, 8, 8, 8));
		button.setOpaque(false);
		button.setFocusPainted(false);
		button.setBorderPainted(false);
		button.setContentAreaFilled(false);
		button.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
	}

	public void setStatusRed() {
		status = Status.RED;
		status_label.setIcon(status_red);
	}

	public void setStatusGreen() {
		status = Status.GREEN;
		status_label.setIcon(status_green);
	}

	public void setStatusYellow() {
		status = Status.YELLOW;
		status_label.setIcon(status_yellow);
	}

	public URI getAdminURI() throws URISyntaxException,
			UnsupportedEncodingException {
		String url = urlList.getSelectedItem().toString();
		if (url.contains("?")) {
			url += "&";
		} else {
			url += "?";
		}
		url += "api_url=" + URLEncoder.encode("http://localhost:8080", "UTF-8");
		if (app.isAutoLogin()) {
			String access_token = app.getAccessToken();
			UUID adminId = app.getAdminUUID();
			
			if (access_token != null) {
				url += "&admin_email="
						+ URLEncoder.encode(app.getAdminUserEmail(), "UTF-8");
				url += "&access_token=" + access_token;
			}
			
			if(adminId != null){
			    url += "&uuid="+adminId;
			}
		}
		return new URI(url);
	}

	public void storeAdminUrls() {
		Set urls = app.getUrlSetFromPreferences();
		urls.add(urlList.getSelectedItem().toString());
		app.storeUrlsInPreferences(urls);
	}

	protected ImageIcon createImageIcon(String path, String description) {
		java.net.URL imgURL = getClass().getResource(path);
		if (imgURL != null) {
			return new ImageIcon(imgURL, description);
		} else {
			System.err.println("Couldn't find file: " + path);
			return null;
		}
	}

	public void storeAdminEmail() {
		app.setAdminUserEmail(auto_login_email.getText());
	}

	public static class LauncherToolBar extends JToolBar {

		public LauncherToolBar() {
			super();
		}

		public LauncherToolBar(int orientation) {
			super(orientation);
		}

		public LauncherToolBar(String name, int orientation) {
			super(name, orientation);
		}

		public LauncherToolBar(String name) {
			super(name);
		}

		private static final long serialVersionUID = 1L;

		@Override
		protected void paintComponent(Graphics g) {
			// Create the 2D copy
			Graphics2D g2 = (Graphics2D) g.create();

			// Apply vertical gradient
			g2.setPaint(new GradientPaint(0, 0, Color.WHITE, 0, getHeight(),
					Color.BLUE));
			g2.fillRect(0, 0, getWidth(), getHeight());

			// Dipose of copy
			g2.dispose();
		}

	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy