package old_plugin;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.net.*;
import java.util.*;
import java.util.jar.*;
import javax.swing.*;
public class SamplePluginApp extends JFrame {
private static final long serialVersionUID = 1L;
private JTextField result;
private JComboBox pluginsCombo;
private JPanel panel;
private ArrayList <SamplePluginAppPlugin>plugins;
private SamplePluginAppPlugin selectedPlugin;
private JPanel selectedPluginPanel;
public static void main(String[] args) {
new SamplePluginApp().setVisible(true);
}
// コンストラクタ。基本GUIの作成
public SamplePluginApp(){
result = new JTextField();
this.add(result,BorderLayout.NORTH);
panel = new JPanel();
panel.setLayout(new BorderLayout());
pluginsCombo = this.getPluginComboBox();
pluginsCombo.setBounds(new Rectangle(25,25,100,20));
pluginsCombo.addActionListener(new pluginComboAction());
panel.add(pluginsCombo,BorderLayout.NORTH);
panel.add(selectedPlugin.getPanel(),BorderLayout.CENTER);
this.add(panel,BorderLayout.CENTER);
JButton button = new JButton("calc");
button.addActionListener(new buttonAction());
this.add(button,BorderLayout.SOUTH);
this.setSize(new Dimension(200,200));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// JComboBoxの作成
public JComboBox getPluginComboBox(){
JComboBox combo = new JComboBox();
plugins = getPlugins();
// デフォルトプラグインの準備
selectedPlugin = new DefaultPlugin();
selectedPluginPanel = selectedPlugin.getPanel();
combo.addItem(selectedPlugin);
for(int i = 0;i < plugins.size();i++){
SamplePluginAppPlugin plugin = plugins.get(i);
combo.addItem(plugin);
}
return combo;
}
// JComboBoxのActionListener
class pluginComboAction implements ActionListener {
public void actionPerformed(ActionEvent ev){
panel.removeAll();
panel.add(pluginsCombo,BorderLayout.NORTH);
selectedPlugin = (SamplePluginAppPlugin)
pluginsCombo.getSelectedItem();
selectedPluginPanel = selectedPlugin.getPanel();
panel.add(selectedPluginPanel);
panel.updateUI();
}
}
// JButtonのActionListener
class buttonAction implements ActionListener {
public void actionPerformed(ActionEvent ev){
result.setText(selectedPlugin.getResult());
}
}
// プラグインクラスのインスタンスをArrayListにまとめて返す
public ArrayList<SamplePluginAppPlugin> getPlugins() {
ArrayList <SamplePluginAppPlugin>plugins =
new ArrayList<SamplePluginAppPlugin>();
String cpath = System.getProperty("user.dir") + File.separator + "plugins";
// String cpath = System.getProperty("user.dir") + "\\test\\plugin" + File.separator + "plugins";
System.out.println(cpath);
// String cpath = "C:\\home\\miyahara\\90_warehouse\\01_git\\JAVA_TRAINING2\\JAVA_TRAINING\\JAVATRAINING_ROOT\\test\\plugin\\plugins";
try {
File f = new File(cpath);
String[] files = f.list();
for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(".jar")) {
File file = new File(cpath + File.separator + files[i]);
// File file = new File("C:\\home\\miyahara\\90_warehouse\\01_git\\JAVA_TRAINING2\\JAVA_TRAINING\\JAVATRAINING_ROOT\\test\\plugin\\plugins\\average.jar");
JarFile jar = new JarFile(file);
Manifest mf = jar.getManifest();
Attributes att = mf.getMainAttributes();
String cname = att.getValue("Plugin-Class");
URL url = file.getCanonicalFile().toURI().toURL();
URLClassLoader loader = new URLClassLoader(
new URL[] { url });
System.out.println(mf.getMainAttributes());
System.out.println(cname);
Class cobj = loader.loadClass(cname);
Class[] ifnames = cobj.getInterfaces();
for (int j = 0; j < ifnames.length; j++) {
if (ifnames[j] == SamplePluginAppPlugin.class) {
System.out.println("load..... " + cname);
SamplePluginAppPlugin plugin =
(SamplePluginAppPlugin)cobj.newInstance();
plugins.add(plugin);
break;
}
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return plugins;
}
}
// サンプルプラグインのクラス
class DefaultPlugin implements SamplePluginAppPlugin {
private JTextField input;
private JPanel currentPanel;
public String toString(){
return "Default(tax)";
}
public String getResult() {
String inputData = input.getText();
if (inputData == null) inputData = "0";
int n;
try {
n = Integer.parseInt(inputData);
} catch (NumberFormatException e) {
e.printStackTrace();
n = 0;
}
double res = ((int)(n * 1.05 * 100)) / 100;
return Double.toString(res);
}
public void setInputData(String str) {
input.setText(str);
}
public String getInputData(){
return input.getText();
}
public JPanel getPanel() {
currentPanel = new JPanel();
currentPanel.setLayout(null);
input = new JTextField();
input.setBounds(new Rectangle(25,25,50,20));
currentPanel.add(input);
return currentPanel;
}
}