1 package jp.sourceforge.stigmata.command;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.io.OutputStream;
10 import java.net.URISyntaxException;
12 import java.util.ArrayList;
13 import java.util.List;
15 import jp.sourceforge.stigmata.BirthmarkContext;
16 import jp.sourceforge.stigmata.BirthmarkEnvironment;
17 import jp.sourceforge.stigmata.Stigmata;
18 import jp.sourceforge.stigmata.utils.Utility;
22 * @author Haruaki Tamada
24 public class InstallCommand extends AbstractStigmataCommand{
26 public boolean isAvailableArguments(String[] args){
27 return args.length > 0;
31 public String getCommandString(){
36 public boolean perform(Stigmata stigmata, BirthmarkContext context, String[] args){
37 File pluginsDir = new File(BirthmarkEnvironment.getStigmataHome(), "plugins");
38 BirthmarkEnvironment env = context.getEnvironment();
39 List<String> messages = new ArrayList<String>();
41 for(int i = 0; i < args.length; i++){
42 File pluginSource = new File(args[i]);
43 File pluginDest = new File(pluginsDir, pluginSource.getName());
45 if(!Utility.isStigmataPluginJarFile(pluginSource, messages)){
46 for(String msg: messages){
49 throw new IllegalArgumentException(pluginSource + ": not stigmata plugin file.");
51 if(pluginDest.exists()){
52 String override = env.getProperty("override.exists.plugin");
53 if(override != null &&
54 (override.equalsIgnoreCase("true") || override.equalsIgnoreCase("yes"))){
58 File backupFile = new File(pluginDest.getParent(), pluginDest.getName() + ".back");
59 if(backupFile.exists()) backupFile.delete();
60 pluginDest.renameTo(backupFile);
63 copyFile(pluginSource, pluginDest);
64 File parent = pluginSource.getParentFile();
65 File destParent = pluginDest.getParentFile();
66 String[] myDependencies = null;
67 for(String dependency: Utility.getDependencies(pluginSource)){
68 if(myDependencies == null){
69 myDependencies = findStigmataDependencies();
71 boolean include = false;
72 for(String systemDependency: myDependencies){
73 if(dependency.equals(systemDependency)){
79 File dependencyFile = new File(parent, dependency);
80 if(dependencyFile.exists()){
81 copyFile(dependencyFile, new File(destParent, dependency));
84 putMessage(dependency + ": not found. Install this jar file into plugin directory");
89 return getMessageSize() == 0;
92 private String[] findStigmataDependencies(){
93 URL url = getClass().getResource("/jp/sourceforge/stigmata/command/InstallCommand.class");
94 String jarfilePath = url.toString();
95 String[] deps = new String[0];
96 if(jarfilePath.startsWith("jar:")){
97 jarfilePath = jarfilePath.substring("jar:".length(), jarfilePath.lastIndexOf("!"));
99 deps = Utility.getDependencies(new File(new URI(jarfilePath)));
100 } catch(URISyntaxException e){
107 private void copyFile(File source, File dest){
108 byte[] data = new byte[256];
112 InputStream in = new FileInputStream(source);
113 OutputStream out = new FileOutputStream(dest);
115 while((read = in.read(data)) != -1){
116 out.write(data, 0, read);
120 } catch(IOException e){