/*
* Copyright (C) 2004 The Concord Consortium, Inc.,
* 10 Concord Crossing, Concord, MA 01742
*
* Web Site: http://www.concord.org
* Email: info@concord.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* END LICENSE */
package org.concord.swing;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.Vector;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
public class ClassPathEditor
extends JPanel
implements ListSelectionListener, ActionListener
{
public static final File JAVA_HOME = new File(System.getProperty("java.home"));
public static final String BOOT_CLASS_PATH = System.getProperty("sun.boot.class.path");
public static final String CLASS_PATH = System.getProperty("java.class.path");
public static final String PATH_SEPARATOR = System.getProperty("path.separator");
public static final String FOLDER_PREFIX = "!.folder";
public static final String CLASS_SUFFIX = ".class";
public final File userDir = new File(System.getProperty("user.dir"));
public final File userHome = new File(System.getProperty("user.home"));
protected LocalClassLoader localClassLoader = new LocalClassLoader();
protected JFileChooser classFileChooser = new JFileChooser();
protected JList jarList = new JList();
protected JScrollPane jarListScroll = new JScrollPane(jarList);
protected JDialog dialog;
protected Map bootClassPathURLS = new TreeMap();
protected Map classPathURLS = new TreeMap();
protected String systemPrefix;
protected Class selectedClass;
public ClassPathEditor()
{
setLayout(new BorderLayout());
classFileChooser.setFileSystemView(new AbstractSystemView());
classFileChooser.setFileFilter(new ClassFileFilter());
classFileChooser.addActionListener(this);
systemPrefix = System.class.getResource("System.class").getPath();
systemPrefix = systemPrefix.substring(0, systemPrefix.indexOf("!"));
systemPrefix = systemPrefix.substring(0, systemPrefix.lastIndexOf("/") + 1);
initializeClassPath(BOOT_CLASS_PATH, bootClassPathURLS);
initializeClassPath(CLASS_PATH, classPathURLS);
classPathURLS.putAll(bootClassPathURLS);
Vector jars = new Vector((Collection) classPathURLS.keySet());
jarList.setListData(jars);
jarList.addListSelectionListener(this);
jarList.setSelectedIndex(0);
add(jarListScroll, "Center");
add(classFileChooser, "South");
}
protected void initializeClassPath(String classPath, Map classPathMap)
{
StringTokenizer pathTokens = new StringTokenizer(classPath, PATH_SEPARATOR);
while (pathTokens.hasMoreTokens())
{
String fileName = pathTokens.nextToken();
File file = new File(fileName);
if (fileName.endsWith(".jar") || file.isDirectory())
{
if (file.exists())
{
try
{
URL pathURL = file.toURL();
classPathMap.put(pathURL.toString(), file);
}
catch (IOException e)
{
System.out.println("File to URL failure: " + file.toString());
}
}
}
}
}
protected boolean isBootPathURL(URL url)
{
return bootClassPathURLS.get(url) instanceof URL;
}
public String chooseClassName()
{
File file = classFileChooser.getSelectedFile();
File classRoot = (File) classPathURLS.get(jarList.getSelectedValue());
String rootPath = classRoot.toString();
if (file != null)
{
String filePath = file.toString();
if (filePath.startsWith(rootPath))
{
if (filePath.endsWith(CLASS_SUFFIX))
{
filePath = filePath.substring(rootPath.length()).replace('\\', '/');
filePath = filePath.replace('/', '.');
filePath = filePath.substring(0, filePath.length() - CLASS_SUFFIX.length());
if (filePath.startsWith(FOLDER_PREFIX))
{
filePath = filePath.substring(FOLDER_PREFIX.length());
}
filePath = filePath.substring(1);
return filePath;
}
}
}
return null;
}
public Class chooseClass()
{
String className = chooseClassName();
if (className != null)
{
try
{
return localClassLoader.loadClass(className);
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public static void main(String [] args)
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (ClassNotFoundException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (InstantiationException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (IllegalAccessException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (UnsupportedLookAndFeelException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
ClassPathEditor classPathEditor = new ClassPathEditor();
JDialog dialog = new JDialog((JFrame) null, "Class Path Editor Test");
classPathEditor.showClassPathEditor(dialog);
System.out.println("Selected class = " + classPathEditor.getSelectedClass());
}
public void showClassPathEditor(JDialog dialog)
{
this.dialog = dialog;
dialog.setModal(true);
dialog.getContentPane().add(this);
dialog.setBounds(50, 50, 800, 600);
dialog.setVisible(true);
}
public void valueChanged(ListSelectionEvent e)
{
Object selection = jarList.getSelectedValue();
File file = (File) classPathURLS.get(selection);
classFileChooser.setSelectedFile(file);
}
public class ClassFileFilter
extends FileFilter
{
public boolean accept(File file)
{
if (file.isDirectory())
return true;
if (file.getName().toLowerCase().endsWith(".jar!"))
return true;
if (file.getName().toLowerCase().endsWith(".zip!"))
return true;
return file.getName().toLowerCase().endsWith(CLASS_SUFFIX);
}
public String getDescription()
{
return "Java class file (*.class)";
}
}
public class LocalClassLoader
extends URLClassLoader
{
public LocalClassLoader()
{
super(new URL[0], ClassPathEditor.class.getClassLoader());
}
public void addURLPathElement(URL url)
{
addURL(url);
}
}
public void actionPerformed(ActionEvent e)
{
selectedClass = chooseClass();
dialog.setVisible(false);
}
public Class getSelectedClass()
{
return selectedClass;
}
}