/*
* Copyright 2013 Sylvain LAURENT
*
* 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 ch.sla.jdbcperflogger.console.ui;
import java.awt.Dimension;
import java.awt.Frame;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import org.eclipse.jdt.annotation.Nullable;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.sla.jdbcperflogger.console.db.LogRepositoryRead;
import ch.sla.jdbcperflogger.console.db.LogRepositoryReadJdbc;
import ch.sla.jdbcperflogger.console.db.LogRepositoryUpdate;
import ch.sla.jdbcperflogger.console.db.LogRepositoryUpdateJdbc;
import ch.sla.jdbcperflogger.console.net.AbstractLogReceiver;
import ch.sla.jdbcperflogger.console.net.ClientLogReceiver;
import ch.sla.jdbcperflogger.console.net.ServerLogReceiver;
public class PerfLoggerGuiMain implements IClientConnectionDelegate {
private static final String LOOK_AND_FEEL_CLASS_NAME_PREF_KEY = "lookAndFeelClassName";
private final static Logger LOGGER = LoggerFactory.getLogger(PerfLoggerGuiMain.class);
private final PerfLoggerGuiMainFrame frmJdbcPerformanceLogger;
private final Map<String, PerfLoggerController> connectionsToLogController = new HashMap<>();
private static final Preferences prefs = Preferences.userNodeForPackage(PerfLoggerGuiMain.class);
/**
* Launch the application.
*/
public static void main(final String[] args) {
LOGGER.debug("PerfLoggerGuiMain starting...");
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
installLookAndFeel();
try {
final PerfLoggerGuiMain window = new PerfLoggerGuiMain();
window.frmJdbcPerformanceLogger.setVisible(true);
} catch (final Exception e) {
e.printStackTrace();
}
}
});
}
private static void installLookAndFeel() {
final String lfClassName = getPreferredLookAndFeel();
try {
if (lfClassName != null) {
UIManager.setLookAndFeel(lfClassName);
} else {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException e) {
LOGGER.warn("Error setting LookAndFeel", e);
}
}
@Nullable
static String getPreferredLookAndFeel() {
return prefs.get(LOOK_AND_FEEL_CLASS_NAME_PREF_KEY, null);
}
static void savePreferredLookAndFeel(final @Nullable String lfClassName) {
if (lfClassName == null) {
prefs.remove(LOOK_AND_FEEL_CLASS_NAME_PREF_KEY);
} else {
prefs.put(LOOK_AND_FEEL_CLASS_NAME_PREF_KEY, lfClassName);
}
try {
prefs.sync();
} catch (final BackingStoreException e) {
throw new IllegalArgumentException(e);
}
}
/**
* Create the application.
*/
public PerfLoggerGuiMain() {
ToolTipManager.sharedInstance().setInitialDelay(500);
frmJdbcPerformanceLogger = new PerfLoggerGuiMainFrame();
final JPanel welcomePanel = new WelcomePanel(this);
frmJdbcPerformanceLogger.addTab("Welcome", welcomePanel);
// TODO make server port configurable
final PerfLoggerController serverPerfLoggerController = createServer(4561);
frmJdbcPerformanceLogger.addTab("*:4561", serverPerfLoggerController.getPanel());
frmJdbcPerformanceLogger.pack();
frmJdbcPerformanceLogger.setExtendedState(Frame.MAXIMIZED_BOTH);
frmJdbcPerformanceLogger.setMinimumSize(new Dimension(600, 500));
}
@Override
public void createClientConnection(final String host, final int port) {
final PerfLoggerController clientPerfLoggerController = connectToClient(host, port);
frmJdbcPerformanceLogger.addTab(host + ":" + port, clientPerfLoggerController.getPanel());
}
@Override
public void close(final PerfLoggerController perfLoggerController) {
frmJdbcPerformanceLogger.removeTab(perfLoggerController.getPanel());
final Iterator<Entry<String, PerfLoggerController>> iterator = connectionsToLogController.entrySet().iterator();
while (iterator.hasNext()) {
final Entry<String, PerfLoggerController> entry = iterator.next();
if (entry.getValue() == perfLoggerController) {
iterator.remove();
}
}
}
private PerfLoggerController connectToClient(final String targetHost, final int targetPort) {
final String hostAndPort = targetHost + "_" + targetPort;
PerfLoggerController perfLoggerController = connectionsToLogController.get(hostAndPort);
if (perfLoggerController == null) {
final LogRepositoryUpdate logRepositoryUpdate = new LogRepositoryUpdateJdbc(hostAndPort);
final LogRepositoryRead logRepositoryRead = new LogRepositoryReadJdbc(hostAndPort);
final AbstractLogReceiver logReceiver = new ClientLogReceiver(targetHost, targetPort, logRepositoryUpdate);
logReceiver.start();
perfLoggerController = new PerfLoggerController(this, logReceiver, logRepositoryUpdate, logRepositoryRead);
connectionsToLogController.put(hostAndPort, perfLoggerController);
}
return perfLoggerController;
}
private PerfLoggerController createServer(final int listeningPort) {
final LogRepositoryUpdate logRepositoryUpdate = new LogRepositoryUpdateJdbc("server_" + listeningPort);
final LogRepositoryRead logRepositoryRead = new LogRepositoryReadJdbc("server_" + listeningPort);
final AbstractLogReceiver logReceiver = new ServerLogReceiver(listeningPort, logRepositoryUpdate);
logReceiver.start();
return new PerfLoggerController(this, logReceiver, logRepositoryUpdate, logRepositoryRead);
}
}