From 5f75a8c311285ea56063bab6fa4361cd7a46c29e Mon Sep 17 00:00:00 2001 From: Haruaki Tamada Date: Thu, 2 Jun 2011 19:12:12 +0900 Subject: [PATCH] =?utf8?q?refs=20#344=20=E3=82=A4=E3=83=B3=E3=82=B9?= =?utf8?q?=E3=83=88=E3=83=BC=E3=83=AB=E3=81=AE=E3=81=A8=E3=81=8D=EF=BC=8C?= =?utf8?q?=E4=BE=9D=E5=AD=98=E3=83=A9=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA?= =?utf8?q?=E3=82=82=E4=B8=80=E7=B7=92=E3=81=AB=E3=83=97=E3=83=A9=E3=82=B0?= =?utf8?q?=E3=82=A4=E3=83=B3=E3=83=87=E3=82=A3=E3=83=AC=E3=82=AF=E3=83=88?= =?utf8?q?=E3=83=AA=E3=81=B8=E3=82=B3=E3=83=94=E3=83=BC=E3=81=99=E3=82=8B?= =?utf8?q?=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97=E3=81=9F?= =?utf8?q?=EF=BC=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit なお,その変更に伴い,jarファイルのMANIFESTファイルから依存ライブラリを取得する汎用メソッドをUtilityクラスに追加した. また,コマンドの実行に成功したか否かを判断できるようStigmataCommandのperformメソッドの返り値をvoidからbooleanに変更した. 加えて,エラーメッセージをGUIに渡すために,StigmataCommandにgetMessages, putMessage, getMessageSizeの3つのメソッドを追加した.メッセージを追加できるようになる.デフォルト実装はAbstractStigmataCommandにあるので,実装クラスで変更は必要ない. --- pom.xml | 5 +- .../jp/sourceforge/stigmata/StigmataCommand.java | 14 ++-- .../stigmata/command/AbstractStigmataCommand.java | 36 +++++++--- .../stigmata/command/CompareCommand.java | 3 +- .../stigmata/command/ExportConfigCommand.java | 11 ++- .../stigmata/command/ExtractCommand.java | 3 +- .../sourceforge/stigmata/command/GuiCommand.java | 3 +- .../sourceforge/stigmata/command/HelpCommand.java | 4 +- .../stigmata/command/InstallCommand.java | 78 ++++++++++++++++++---- .../stigmata/command/LicenseCommand.java | 15 ++++- .../stigmata/command/ListBirthmarksCommand.java | 3 +- .../stigmata/command/UninstallCommand.java | 3 +- .../stigmata/command/VersionCommand.java | 3 +- .../stigmata/ui/swing/StigmataFrame.java | 13 ++-- .../jp/sourceforge/stigmata/utils/Utility.java | 22 +++++- 15 files changed, 168 insertions(+), 48 deletions(-) diff --git a/pom.xml b/pom.xml index 52e17ed..2955b68 100644 --- a/pom.xml +++ b/pom.xml @@ -164,6 +164,7 @@ org.apache.maven.plugins maven-dependency-plugin + 2.2 copy-dependencies @@ -256,9 +257,11 @@ + org.apache.maven.plugins maven-release-plugin + 2.1 - svn+ssh://tama3@svn.sourceforge.jp/svnroot/stigmata/tags + git:ssh://git@diamond.cse.kyoto-su.ac.jp:/stigmata/stigmata.git diff --git a/src/main/java/jp/sourceforge/stigmata/StigmataCommand.java b/src/main/java/jp/sourceforge/stigmata/StigmataCommand.java index fe808ec..16cbc78 100644 --- a/src/main/java/jp/sourceforge/stigmata/StigmataCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/StigmataCommand.java @@ -5,15 +5,21 @@ package jp.sourceforge.stigmata; * @author Haruaki Tamada */ public interface StigmataCommand{ + public String getCommandString(); + + public String[] getMessages(); + + public int getMessageSize(); + public boolean isAvailableArguments(String[] args); - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args); + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args); - public void perform(Stigmata stigmata, String[] args); + public boolean perform(Stigmata stigmata, String[] args); + + public void putMessage(String message); public void setUp(BirthmarkEnvironment env); public void tearDown(BirthmarkEnvironment env); - - public String getCommandString(); } diff --git a/src/main/java/jp/sourceforge/stigmata/command/AbstractStigmataCommand.java b/src/main/java/jp/sourceforge/stigmata/command/AbstractStigmataCommand.java index 8958ccb..e65e3fd 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/AbstractStigmataCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/AbstractStigmataCommand.java @@ -1,7 +1,10 @@ package jp.sourceforge.stigmata.command; -import jp.sourceforge.stigmata.Stigmata; +import java.util.ArrayList; +import java.util.List; + import jp.sourceforge.stigmata.BirthmarkEnvironment; +import jp.sourceforge.stigmata.Stigmata; import jp.sourceforge.stigmata.StigmataCommand; import jp.sourceforge.stigmata.hook.Phase; import jp.sourceforge.stigmata.hook.StigmataHookManager; @@ -11,17 +14,37 @@ import jp.sourceforge.stigmata.hook.StigmataHookManager; * @author Haruaki Tamada */ public abstract class AbstractStigmataCommand implements StigmataCommand{ + private List messages = new ArrayList(); + + @Override + public abstract String getCommandString(); + + @Override + public String[] getMessages(){ + return messages.toArray(new String[messages.size()]); + } + + @Override + public int getMessageSize(){ + return messages.size(); + } + + @Override + public boolean isAvailableArguments(String[] args){ + return true; + } + /** * {@link perform(Stigmata, BirthmarkContext, String[]) perform(stigmata, stigmata.createContext(), args)}. */ @Override - public void perform(Stigmata stigmata, String[] args){ - perform(stigmata, stigmata.createContext(), args); + public boolean perform(Stigmata stigmata, String[] args){ + return perform(stigmata, stigmata.createContext(), args); } @Override - public boolean isAvailableArguments(String[] args){ - return true; + public void putMessage(String message){ + messages.add(message); } @Override @@ -33,7 +56,4 @@ public abstract class AbstractStigmataCommand implements StigmataCommand{ public void tearDown(BirthmarkEnvironment env){ StigmataHookManager.getInstance().runHook(Phase.TEAR_DOWN, env); } - - @Override - public abstract String getCommandString(); } diff --git a/src/main/java/jp/sourceforge/stigmata/command/CompareCommand.java b/src/main/java/jp/sourceforge/stigmata/command/CompareCommand.java index 1d2ef92..0b5c440 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/CompareCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/CompareCommand.java @@ -31,7 +31,7 @@ public class CompareCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ try{ BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR); @@ -57,5 +57,6 @@ public class CompareCommand extends AbstractStigmataCommand{ }catch(Exception e){ e.printStackTrace(); } + return true; } } diff --git a/src/main/java/jp/sourceforge/stigmata/command/ExportConfigCommand.java b/src/main/java/jp/sourceforge/stigmata/command/ExportConfigCommand.java index 0f16268..f572ad7 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/ExportConfigCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/ExportConfigCommand.java @@ -20,9 +20,9 @@ public class ExportConfigCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + PrintWriter out = null; try{ - PrintWriter out; if(args == null || args.length == 0){ out = new PrintWriter(System.out); } @@ -34,8 +34,13 @@ public class ExportConfigCommand extends AbstractStigmataCommand{ } new ConfigFileExporter(context.getEnvironment()).export(out); - out.close(); + return true; }catch(IOException e){ + return false; + } finally{ + if(out != null){ + out.close(); + } } } } diff --git a/src/main/java/jp/sourceforge/stigmata/command/ExtractCommand.java b/src/main/java/jp/sourceforge/stigmata/command/ExtractCommand.java index ac72845..00dbcc2 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/ExtractCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/ExtractCommand.java @@ -30,7 +30,7 @@ public class ExtractCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ try{ context.setComparisonMethod(ComparisonMethod.ROUND_ROBIN_SAME_PAIR); BirthmarkEngine engine = new BirthmarkEngine(context.getEnvironment()); @@ -52,5 +52,6 @@ public class ExtractCommand extends AbstractStigmataCommand{ }catch(Exception ex){ ex.printStackTrace(); } + return true; } } diff --git a/src/main/java/jp/sourceforge/stigmata/command/GuiCommand.java b/src/main/java/jp/sourceforge/stigmata/command/GuiCommand.java index a492521..c1e8238 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/GuiCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/GuiCommand.java @@ -13,9 +13,10 @@ import jp.sourceforge.stigmata.ui.swing.StigmataFrame; */ public class GuiCommand extends AbstractStigmataCommand{ @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ StigmataFrame frame = new StigmataFrame(stigmata, context.getEnvironment()); frame.setVisible(true); + return true; } @Override diff --git a/src/main/java/jp/sourceforge/stigmata/command/HelpCommand.java b/src/main/java/jp/sourceforge/stigmata/command/HelpCommand.java index 2dcc2fd..7d643a9 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/HelpCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/HelpCommand.java @@ -30,7 +30,7 @@ public class HelpCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ BirthmarkEnvironment env = context.getEnvironment(); Package p = getClass().getPackage(); @@ -64,5 +64,7 @@ public class HelpCommand extends AbstractStigmataCommand{ System.out.println(); System.out.println(helpResource.getString("cli.interface.copyright")); System.out.println(helpResource.getString("cli.interface.mailto")); + + return true; } } diff --git a/src/main/java/jp/sourceforge/stigmata/command/InstallCommand.java b/src/main/java/jp/sourceforge/stigmata/command/InstallCommand.java index a21f5e9..548d16b 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/InstallCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/InstallCommand.java @@ -6,6 +6,11 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; import jp.sourceforge.stigmata.BirthmarkContext; import jp.sourceforge.stigmata.BirthmarkEnvironment; @@ -28,15 +33,19 @@ public class InstallCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ File pluginsDir = new File(BirthmarkEnvironment.getStigmataHome(), "plugins"); BirthmarkEnvironment env = context.getEnvironment(); + List messages = new ArrayList(); for(int i = 0; i < args.length; i++){ File pluginSource = new File(args[i]); File pluginDest = new File(pluginsDir, pluginSource.getName()); - if(!Utility.isStigmataPluginJarFile(pluginSource)){ + if(!Utility.isStigmataPluginJarFile(pluginSource, messages)){ + for(String msg: messages){ + putMessage(msg); + } throw new IllegalArgumentException(pluginSource + ": not stigmata plugin file."); } if(pluginDest.exists()){ @@ -51,21 +60,64 @@ public class InstallCommand extends AbstractStigmataCommand{ pluginDest.renameTo(backupFile); } } + copyFile(pluginSource, pluginDest); + File parent = pluginSource.getParentFile(); + File destParent = pluginDest.getParentFile(); + String[] myDependencies = null; + for(String dependency: Utility.getDependencies(pluginSource)){ + if(myDependencies == null){ + myDependencies = findStigmataDependencies(); + } + boolean include = false; + for(String systemDependency: myDependencies){ + if(dependency.equals(systemDependency)){ + include = true; + break; + } + } + if(!include){ + File dependencyFile = new File(parent, dependency); + if(dependencyFile.exists()){ + copyFile(dependencyFile, new File(destParent, dependency)); + } + else{ + putMessage(dependency + ": not found. Install this jar file into plugin directory"); + } + } + } + } + return getMessageSize() == 0; + } - byte[] data = new byte[256]; - int read; - + private String[] findStigmataDependencies(){ + URL url = getClass().getResource("/jp/sourceforge/stigmata/command/InstallCommand.class"); + String jarfilePath = url.toString(); + String[] deps = new String[0]; + if(jarfilePath.startsWith("jar:")){ + jarfilePath = jarfilePath.substring("jar:".length(), jarfilePath.lastIndexOf("!")); try{ - InputStream in = new FileInputStream(pluginSource); - OutputStream out = new FileOutputStream(pluginDest); + deps = Utility.getDependencies(new File(new URI(jarfilePath))); + } catch(URISyntaxException e){ + e.printStackTrace(); + } + } + return deps; + } - while((read = in.read(data)) != -1){ - out.write(data, 0, read); - } - in.close(); - out.close(); - } catch(IOException e){ + private void copyFile(File source, File dest){ + byte[] data = new byte[256]; + int read; + + try{ + InputStream in = new FileInputStream(source); + OutputStream out = new FileOutputStream(dest); + + while((read = in.read(data)) != -1){ + out.write(data, 0, read); } + in.close(); + out.close(); + } catch(IOException e){ } } } diff --git a/src/main/java/jp/sourceforge/stigmata/command/LicenseCommand.java b/src/main/java/jp/sourceforge/stigmata/command/LicenseCommand.java index 17ba7e6..d819669 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/LicenseCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/LicenseCommand.java @@ -19,18 +19,27 @@ public class LicenseCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + BufferedReader reader = null; try{ InputStream in = getClass().getResourceAsStream("/META-INF/license.txt"); - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + reader = new BufferedReader(new InputStreamReader(in)); String line; while((line = reader.readLine()) != null){ System.out.println(line); } reader.close(); + return true; }catch(IOException ex){ - ex.printStackTrace(); + return false; + } finally{ + if(reader != null){ + try{ + reader.close(); + } catch(IOException e){ + } + } } } } diff --git a/src/main/java/jp/sourceforge/stigmata/command/ListBirthmarksCommand.java b/src/main/java/jp/sourceforge/stigmata/command/ListBirthmarksCommand.java index 7a20fca..7c45c1a 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/ListBirthmarksCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/ListBirthmarksCommand.java @@ -21,7 +21,7 @@ public class ListBirthmarksCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ BirthmarkService[] spis = context.getEnvironment().findServices(); ResultPrinterService spi = stigmata.getPrinterManager().getService(context.getFormat()); BirthmarkServicePrinter formatter = spi.getBirthmarkServicePrinter(); @@ -39,6 +39,7 @@ public class ListBirthmarksCommand extends AbstractStigmataCommand{ }catch(IOException e){ e.printStackTrace(); } + return true; } private String validateTarget(String fileName, String format){ diff --git a/src/main/java/jp/sourceforge/stigmata/command/UninstallCommand.java b/src/main/java/jp/sourceforge/stigmata/command/UninstallCommand.java index c6e35e6..aa59451 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/UninstallCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/UninstallCommand.java @@ -33,7 +33,7 @@ public class UninstallCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ File pluginsDir = new File(BirthmarkEnvironment.getStigmataHome(), "plugins"); BirthmarkEnvironment env = context.getEnvironment(); boolean removeServiceInConfigFile = false; @@ -55,6 +55,7 @@ public class UninstallCommand extends AbstractStigmataCommand{ if(removeServiceInConfigFile){ updateConfigFile(env); } + return true; } private void updateConfigFile(BirthmarkEnvironment env){ diff --git a/src/main/java/jp/sourceforge/stigmata/command/VersionCommand.java b/src/main/java/jp/sourceforge/stigmata/command/VersionCommand.java index 60f341e..11f9795 100644 --- a/src/main/java/jp/sourceforge/stigmata/command/VersionCommand.java +++ b/src/main/java/jp/sourceforge/stigmata/command/VersionCommand.java @@ -16,9 +16,10 @@ public class VersionCommand extends AbstractStigmataCommand{ } @Override - public void perform(Stigmata stigmata, BirthmarkContext context, String[] args){ + public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){ ResourceBundle helpResource = ResourceBundle.getBundle("resources.options"); Package p = getClass().getPackage(); System.out.printf("%s %s%n", helpResource.getString("cli.version.header"), p.getImplementationVersion()); + return true; } } diff --git a/src/main/java/jp/sourceforge/stigmata/ui/swing/StigmataFrame.java b/src/main/java/jp/sourceforge/stigmata/ui/swing/StigmataFrame.java index f7b5e2e..33acbd8 100644 --- a/src/main/java/jp/sourceforge/stigmata/ui/swing/StigmataFrame.java +++ b/src/main/java/jp/sourceforge/stigmata/ui/swing/StigmataFrame.java @@ -450,16 +450,15 @@ public class StigmataFrame extends JFrame{ new String[] { "jar", }, messages.get("installplugin.fileopen.description") ); - List messages = new ArrayList(); if(pluginFile == null){ return; } - if(Utility.isStigmataPluginJarFile(pluginFile, messages)){ - StigmataCommand command = StigmataCommandFactory.getInstance().getCommand("install"); - String path = pluginFile.getPath(); - command.perform(getStigmata(), new String[] { path }); + StigmataCommand command = StigmataCommandFactory.getInstance().getCommand("install"); + String path = pluginFile.getPath(); + boolean installFlag = command.perform(getStigmata(), new String[] { path }); + if(installFlag){ int flag = JOptionPane.showConfirmDialog( this, getMessages().get("reload.after.installplugin"), getMessages().get("reload.after.installplugin.title"), @@ -481,8 +480,8 @@ public class StigmataFrame extends JFrame{ StringBuilder sb = new StringBuilder(""); sb.append("

").append(getMessages().format("install.error", pluginFile.getPath())).append("

"); sb.append("
    "); - for(String message: messages){ - sb.append("
  • ").append(getMessages().get(message)).append("
  • "); + for(String message: command.getMessages()){ + sb.append("
  • ").append(message).append("
  • "); } sb.append("
"); diff --git a/src/main/java/jp/sourceforge/stigmata/utils/Utility.java b/src/main/java/jp/sourceforge/stigmata/utils/Utility.java index 72c8697..df05013 100644 --- a/src/main/java/jp/sourceforge/stigmata/utils/Utility.java +++ b/src/main/java/jp/sourceforge/stigmata/utils/Utility.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.jar.Manifest; public class Utility{ /** @@ -37,8 +38,25 @@ public class Utility{ return new String(builder); } - public static boolean isStigmataPluginJarFile(File pluginFile){ - return isStigmataPluginJarFile(pluginFile, new ArrayList()); + public static String[] getDependencies(File source){ + JarFile jarfile = null; + try{ + jarfile = new JarFile(source); + Manifest manifest = jarfile.getManifest(); + String classPath = manifest.getMainAttributes().getValue("Class-Path"); + if(classPath != null && !classPath.equals("")){ + return classPath.split("[ \t]"); + } + } catch(IOException e){ + } finally{ + if(jarfile != null){ + try{ + jarfile.close(); + } catch(IOException e){ + } + } + } + return new String[0]; } public static boolean isStigmataPluginJarFile(File pluginFile, List messages){ -- 2.11.0