/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.visualvm.modules.security;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.SwingUtilities;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
import org.openide.windows.WindowManager;
/**
*
* @author Jiri Sedlacek
*/
class PersistenceSupport {
private static final String SNAPSHOT_VERSION = "snapshot_version"; // NOI18N
private static final String SNAPSHOT_VERSION_DIVIDER = ".";
private static final String CURRENT_SNAPSHOT_VERSION_MAJOR = "1"; // NOI18N
private static final String CURRENT_SNAPSHOT_VERSION_MINOR = "0"; // NOI18N
private static final String CURRENT_SNAPSHOT_VERSION =
CURRENT_SNAPSHOT_VERSION_MAJOR +
SNAPSHOT_VERSION_DIVIDER +
CURRENT_SNAPSHOT_VERSION_MINOR;
private static final Logger LOGGER =
Logger.getLogger(PersistenceSupport.class.getName());
static File chooseLoadFile(String title, File startFile) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle(title);
chooser.setSelectedFile(startFile);
if (chooser.showOpenDialog(WindowManager.getDefault().getMainWindow()) ==
JFileChooser.APPROVE_OPTION)
return chooser.getSelectedFile();
return null;
}
static File chooseSaveFile(String title) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle(title);
if (chooser.showSaveDialog(WindowManager.getDefault().getMainWindow()) ==
JFileChooser.APPROVE_OPTION)
return chooser.getSelectedFile();
return null;
}
static void saveToFile(SecurityOptionsPanel panel) {
final File file = chooseSaveFile(NbBundle.getMessage(
PersistenceSupport.class, "MSG_SaveToFile")); // NOI18N
if (file == null) return;
final Properties props = new Properties();
props.put(SNAPSHOT_VERSION, CURRENT_SNAPSHOT_VERSION);
String keyStore = panel.getKeyStore();
if (keyStore != null) {
props.put(SecurityModel.KEYSTORE_LOCATION, keyStore);
char[] keyStorePassword = panel.getKeyStorePassword();
if (keyStorePassword != null)
props.put(SecurityModel.KEYSTORE_PASSWORD, new String(keyStorePassword));
String keyStoreType = panel.getKeyStoreType();
if (keyStoreType != null)
props.put(SecurityModel.KEYSTORE_TYPE, keyStoreType);
}
String trustStore = panel.getTrustStore();
if (trustStore != null) {
props.put(SecurityModel.TRUSTSTORE_LOCATION, trustStore);
char[] trustStorePassword = panel.getTrustStorePassword();
if (trustStorePassword != null)
props.put(SecurityModel.TRUSTSTORE_PASSWORD, new String(trustStorePassword));
String trustStoreType = panel.getTrustStoreType();
if (trustStoreType != null)
props.put(SecurityModel.TRUSTSTORE_TYPE, trustStoreType);
}
String enabledProtocols = panel.getEnabledProtocols();
if (enabledProtocols != null)
props.put(SecurityModel.ENABLED_PROTOCOLS, enabledProtocols);
String enabledCipherSuites = panel.getEnabledCipherSuites();
if (enabledCipherSuites != null)
props.put(SecurityModel.ENABLED_CIPHER_SUITES, enabledCipherSuites);
RequestProcessor.getDefault().post(new Runnable() {
public void run() {
boolean saved = saveProperties(props, file);
if (!saved) {
NotifyDescriptor nd = new NotifyDescriptor.Message(
NbBundle.getMessage(PersistenceSupport.class,
"MSG_FailedSaveToFile"), NotifyDescriptor.ERROR_MESSAGE); // NOI18N
DialogDisplayer.getDefault().notifyLater(nd);
return;
}
}
});
}
static void loadFromFile(final SecurityOptionsPanel panel) {
final File file = chooseLoadFile(NbBundle.getMessage(PersistenceSupport.class,
"MSG_LoadFromFile"), null); // NOI18N
if (file == null) return;
RequestProcessor.getDefault().post(new Runnable() {
public void run() {
final Properties props = loadProperties(file);
if (props == null) {
NotifyDescriptor nd = new NotifyDescriptor.Message(
NbBundle.getMessage(PersistenceSupport.class,
"MSG_FailedLoadFromFile"), NotifyDescriptor.ERROR_MESSAGE);
DialogDisplayer.getDefault().notifyLater(nd);
return;
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
panel.setKeyStore(props.getProperty(SecurityModel.KEYSTORE_LOCATION));
String keyStorePassword = props.getProperty(SecurityModel.KEYSTORE_PASSWORD);
panel.setKeyStorePassword(keyStorePassword == null ? null : keyStorePassword.toCharArray());
panel.setKeyStoreType(props.getProperty(SecurityModel.KEYSTORE_TYPE));
panel.setTrustStore(props.getProperty(SecurityModel.TRUSTSTORE_LOCATION));
String trustStorePassword = props.getProperty(SecurityModel.TRUSTSTORE_PASSWORD);
panel.setTrustStorePassword(trustStorePassword == null ? null : trustStorePassword.toCharArray());
panel.setTrustStoreType(props.getProperty(SecurityModel.TRUSTSTORE_TYPE));
panel.setEnabledProtocols(props.getProperty(SecurityModel.ENABLED_PROTOCOLS));
panel.setEnabledCipherSuites(props.getProperty(SecurityModel.ENABLED_CIPHER_SUITES));
}
});
}
});
}
private static boolean saveProperties(Properties properties, File file) {
OutputStream os = null;
BufferedOutputStream bos = null;
try {
os = new FileOutputStream(file);
bos = new BufferedOutputStream(os);
properties.storeToXML(os, null);
return true;
} catch (Exception e) {
LOGGER.log(Level.INFO, "Error storing properties to " + file, e); // NOI18N
return false;
} finally {
try {
if (bos != null) bos.close();
if (os != null) os.close();
} catch (Exception e) {
LOGGER.log(Level.INFO, "Problem closing output stream", e); // NOI18N
}
}
}
private static Properties loadProperties(File file) {
InputStream is = null;
BufferedInputStream bis = null;
try {
is = new FileInputStream(file);
bis = new BufferedInputStream(is);
Properties properties = new Properties();
properties.loadFromXML(bis);
return properties;
} catch (Exception e) {
LOGGER.log(Level.INFO, "Error loading properties from " + file, e); // NOI18N
return null;
} finally {
try {
if (bis != null) bis.close();
if (is != null) is.close();
} catch (Exception e) {
LOGGER.log(Level.INFO, "Problem closing input stream", e); // NOI18N
}
}
}
}