/* * Copyright 2017 ThoughtWorks, Inc. * * 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 com.thoughtworks.go.agent.bootstrapper.osx; import com.apple.eawt.Application; import com.thoughtworks.go.agent.common.AgentBootstrapperArgs; import com.thoughtworks.go.logging.LogConfigurator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.swing.*; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Properties; import static com.thoughtworks.go.agent.bootstrapper.AgentBootstrapper.DEFAULT_LOG4J_CONFIGURATION_FILE; public class AgentMacWindow extends JFrame { private static final File PREFS_FILE = new File(System.getProperty("user.home"), "/Library/Preferences/com.thoughtworks.go.agent.properties"); private static final Log LOG = LogFactory.getLog(AgentMacWindow.class); private AgentBootstrapperArgs bootstrapperArgs; private final boolean firstRun; private final MacBootstrapperApplicationAdapter macBootstrapperAppAdapter; private MacBootstrapperThread bootstrapLauncher; public static void main(String[] args) throws IOException { LogConfigurator logConfigurator = new LogConfigurator(DEFAULT_LOG4J_CONFIGURATION_FILE); logConfigurator.initialize(); new AgentMacWindow().go(); } private void go() { if (firstRun) { macBootstrapperAppAdapter.requestInitialPreferences(); } launchBootStrapper(); } private AgentMacWindow() { firstRun = !PREFS_FILE.exists(); if (firstRun) { saveDefaultPrefs(); } bootstrapperArgs = loadPrefs(); macBootstrapperAppAdapter = initializeApplicationAdapter(); } private void saveDefaultPrefs() { LOG.info("Initializing preferences in " + PREFS_FILE); savePrefs(defaultArgs()); } private void savePrefs(AgentBootstrapperArgs args) { try { try (FileOutputStream fos = new FileOutputStream(PREFS_FILE)) { args.toProperties().store(fos, null); } } catch (IOException e) { LOG.error("IO error on " + PREFS_FILE, e); } } private MacBootstrapperApplicationAdapter initializeApplicationAdapter() { Application application = Application.getApplication(); application.setEnabledPreferencesMenu(true); application.setEnabledAboutMenu(true); setVisible(false); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setResizable(false); setSize(getPreferredSize()); MacBootstrapperApplicationAdapter applicationAdapter = new MacBootstrapperApplicationAdapter(this); application.addApplicationListener(applicationAdapter); return applicationAdapter; } private AgentBootstrapperArgs defaultArgs() { try { return new AgentBootstrapperArgs(new URL("https://127.0.0.1:8154/go"), null, AgentBootstrapperArgs.SslMode.NONE); } catch (MalformedURLException e) { throw new RuntimeException(e); } } private AgentBootstrapperArgs loadPrefs() { try (FileInputStream stream = new FileInputStream(PREFS_FILE)) { Properties myProps = new Properties(); myProps.load(stream); LOG.info("Loaded preferences from " + PREFS_FILE); return AgentBootstrapperArgs.fromProperties(myProps); } catch (Exception e) { LOG.error("Error for " + PREFS_FILE, e); } return defaultArgs(); } void launchBootStrapper() { if (bootstrapLauncher == null) { bootstrapLauncher = new MacBootstrapperThread(bootstrapperArgs); bootstrapLauncher.start(); } } void stopBootStrapper() { if (bootstrapLauncher != null) { bootstrapLauncher.stopLooping(); bootstrapLauncher.interrupt(); try { Thread.sleep(500); } catch (Exception ignore) { } bootstrapLauncher.stop(); bootstrapLauncher = null; } } public AgentBootstrapperArgs getBootstrapperArgs() { return bootstrapperArgs; } public void setBootstrapperArgs(AgentBootstrapperArgs bootstrapperArgs) { this.bootstrapperArgs = bootstrapperArgs; savePrefs(this.bootstrapperArgs); restartBootstrapper(); } private void restartBootstrapper() { stopBootStrapper(); launchBootStrapper(); } }