OSDN Git Service

introduce plugin update framework
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Fri, 29 May 2009 07:09:59 +0000 (07:09 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Fri, 29 May 2009 07:09:59 +0000 (07:09 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@379 acee48c3-7b26-0410-bdac-b3d0e5314bbc

12 files changed:
pom.xml
src/main/java/jp/sourceforge/stigmata/ui/swing/GUIUtility.java
src/main/java/jp/sourceforge/stigmata/ui/swing/StigmataFrame.java
src/main/java/jp/sourceforge/stigmata/ui/swing/UpdatePluginsPane.java [new file with mode: 0644]
src/main/java/jp/sourceforge/stigmata/utils/HermesUtility.java [new file with mode: 0644]
src/main/resources/resources/hermes.xml [new file with mode: 0644]
src/main/resources/resources/images/database_lightning.png [new file with mode: 0644]
src/main/resources/resources/images/database_save.png [new file with mode: 0644]
src/main/resources/resources/images/database_table.png [new file with mode: 0644]
src/main/resources/resources/messages.properties
src/main/resources/resources/messages_ja.source
src/main/resources/resources/stigmata.xml

diff --git a/pom.xml b/pom.xml
index c1979d8..f9d2064 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
       <version>4.3</version>\r
       <scope>test</scope>\r
     </dependency>\r
+    <dependency>\r
+      <groupId>jp.sourceforge</groupId>\r
+      <artifactId>hermes</artifactId>\r
+      <version>1.0.0-SNAPSHOT</version>\r
+    </dependency>\r
   </dependencies>\r
 \r
   <licenses>\r
index c35f72d..dcb566a 100644 (file)
@@ -4,12 +4,14 @@ package jp.sourceforge.stigmata.ui.swing;
  * $Id$
  */
 
+import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.Image;
-import java.awt.BorderLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.URL;
@@ -24,10 +26,13 @@ import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
-import javax.swing.border.TitledBorder;
+import javax.swing.JTextArea;
 import javax.swing.border.EmptyBorder;
+import javax.swing.border.TitledBorder;
 
 import jp.sourceforge.talisman.i18n.Messages;
 
@@ -231,4 +236,21 @@ public class GUIUtility{
             tabPane.setTabComponentAt(tabPane.getTabCount() - 1, panel);
         }
     }
+
+    public static void showErrorDialog(Component parent, Messages messages, Exception e){
+        JPanel panel = new JPanel(new BorderLayout());
+        JTextArea area = new JTextArea();
+        StringWriter out = new StringWriter();
+        e.printStackTrace(new PrintWriter(out));
+        String stackTrace = out.toString();
+
+        panel.add(new JLabel(e.getLocalizedMessage()), BorderLayout.NORTH);
+        panel.add(new JScrollPane(area), BorderLayout.CENTER);
+        area.setText(stackTrace);
+        area.setEditable(false);
+        panel.setPreferredSize(new Dimension(500, 400));
+        panel.setSize(panel.getPreferredSize());
+
+        JOptionPane.showMessageDialog(parent, panel, messages.get("error.dialog.title"), JOptionPane.WARNING_MESSAGE);
+    }
 }
index 00fec62..cd6f0df 100644 (file)
@@ -445,6 +445,11 @@ public class StigmataFrame extends JFrame{
         }
     }
 
+    private void onlineUpdate(){
+        UpdatePluginsPane pane = new UpdatePluginsPane(this);
+        JOptionPane.showMessageDialog(this, pane);
+    }
+
     private void installPlugin(){
         File pluginFile = getOpenFile(
             new String[] { "jar", },
@@ -498,6 +503,7 @@ public class StigmataFrame extends JFrame{
         setDefaultUI();
         JMenuBar menubar = new JMenuBar();
         menubar.add(createFileMenu());
+        menubar.add(createPluginsMenu());
         menubar.add(createHelpMenu());
 
         setJMenuBar(menubar);
@@ -537,6 +543,31 @@ public class StigmataFrame extends JFrame{
         setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
     }
 
+    private JMenu createPluginsMenu(){
+        JMenu pluginsMenu = GUIUtility.createJMenu(getMessages(), "pluginsMenu");
+        JMenuItem installMenu = GUIUtility.createJMenuItem(getMessages(), "installplugin");
+        JMenuItem openSettingDirMenu = GUIUtility.createJMenuItem(getMessages(), "opensettingdir", new OpenSettingDirAction(this, getMessages()));
+        JMenuItem onlineUpdate = GUIUtility.createJMenuItem(getMessages(), "onlineupdate");
+
+        pluginsMenu.add(openSettingDirMenu);
+        pluginsMenu.add(installMenu);
+        pluginsMenu.add(new JSeparator());
+        pluginsMenu.add(onlineUpdate);
+
+        installMenu.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                installPlugin();
+            }
+        });
+        onlineUpdate.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                onlineUpdate();
+            }
+        });
+
+        return pluginsMenu;
+    }
+
     private JMenu createFileMenu(){
         JMenu fileMenu = GUIUtility.createJMenu(getMessages(), "fileMenu");
         JMenuItem newFrameMenu = GUIUtility.createJMenuItem(getMessages(), "newframe");
@@ -544,8 +575,6 @@ public class StigmataFrame extends JFrame{
         JMenuItem exportMenu = GUIUtility.createJMenuItem(getMessages(), "exportsetting");
         JMenuItem clearMenu = GUIUtility.createJMenuItem(getMessages(), "clearsetting");
         JMenuItem refreshMenu = GUIUtility.createJMenuItem(getMessages(), "refreshsetting");
-        JMenuItem installMenu = GUIUtility.createJMenuItem(getMessages(), "installplugin");
-        JMenuItem openSettingDirMenu = GUIUtility.createJMenuItem(getMessages(), "opensettingdir", new OpenSettingDirAction(this, getMessages()));
         JMenuItem closeTabMenu = GUIUtility.createJMenuItem(getMessages(), "closetab");
         JMenuItem closeMenu = GUIUtility.createJMenuItem(getMessages(), "closeframe");
         JMenuItem exitMenu = GUIUtility.createJMenuItem(getMessages(), "exit");
@@ -560,9 +589,6 @@ public class StigmataFrame extends JFrame{
         fileMenu.add(refreshMenu);
         fileMenu.add(clearMenu);
         fileMenu.add(new JSeparator());
-        fileMenu.add(openSettingDirMenu);
-        fileMenu.add(installMenu);
-        fileMenu.add(new JSeparator());
         fileMenu.add(closeTabMenu);
         fileMenu.add(closeMenu);
         fileMenu.add(new JSeparator());
@@ -598,11 +624,7 @@ public class StigmataFrame extends JFrame{
                 clearSettings();
             }
         });
-        installMenu.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent evt){
-                installPlugin();
-            }
-        });
+
         refreshMenu.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent evt){
                 reloadSettings(new String[] { "gui", });
diff --git a/src/main/java/jp/sourceforge/stigmata/ui/swing/UpdatePluginsPane.java b/src/main/java/jp/sourceforge/stigmata/ui/swing/UpdatePluginsPane.java
new file mode 100644 (file)
index 0000000..04eb813
--- /dev/null
@@ -0,0 +1,242 @@
+package jp.sourceforge.stigmata.ui.swing;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.border.EmptyBorder;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.DefaultTableModel;
+
+import org.apache.commons.cli.ParseException;
+
+import jp.sourceforge.stigmata.Main;
+import jp.sourceforge.stigmata.utils.HermesUtility;
+import jp.sourceforge.talisman.hermes.HermesEvent;
+import jp.sourceforge.talisman.hermes.HermesException;
+import jp.sourceforge.talisman.hermes.HermesPercentageListener;
+import jp.sourceforge.talisman.hermes.InvalidHermesConfigException;
+import jp.sourceforge.talisman.hermes.maven.Artifact;
+import jp.sourceforge.talisman.i18n.Messages;
+
+public class UpdatePluginsPane extends JPanel{
+    private static final long serialVersionUID = 7595296740059360819L;
+
+    private StigmataFrame stigmata;
+    private HermesUtility hermes;
+    private DefaultTableModel model;
+    private JTable table;
+
+    public UpdatePluginsPane(StigmataFrame stigmata){
+        this.stigmata = stigmata;
+        hermes = new HermesUtility();
+
+        initLayout();
+        reload();
+    }
+
+    public void reload(){
+        try{
+            hermes.loadHermesContext(stigmata.getEnvironment());
+        } catch(InvalidHermesConfigException e){
+            GUIUtility.showErrorDialog(stigmata, stigmata.getMessages(), e);
+        } catch(IOException e){
+            GUIUtility.showErrorDialog(stigmata, stigmata.getMessages(), e);
+        }
+    }
+
+    private void updateArtifacts() throws IOException, HermesException{
+        UpdatePluginsPaneHermesListener listener = new UpdatePluginsPaneHermesListener(this, model);
+        hermes.getHermes().addHermesListener(listener);
+        hermes.update();
+        hermes.getHermes().removeHermesListener(listener);
+        hermes.updateContext(stigmata.getEnvironment());
+        Messages m = stigmata.getMessages();
+        int value = JOptionPane.showOptionDialog(
+            stigmata, m.get("restart.stigmata.requrested"),
+            m.get("message.dialog.title"),
+            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
+            new String[] { m.get("restart.now"), m.get("restart.later"), }, null
+        );
+        if(value == JOptionPane.YES_OPTION){
+            stigmata.dispose();
+            try{
+                new Main(new String[0]);
+            } catch(ParseException e){
+            }
+        }
+    }
+
+    private void showLists() throws IOException, HermesException{
+        Artifact[] artifacts = hermes.getUpdateTarget();
+        showLists(artifacts);
+    }
+
+    private void showLists(Artifact[] artifacts){
+        model.setRowCount(0);
+        for(Artifact artifact: artifacts){
+            Artifact original = hermes.getCurrentArtifact(artifact.getGroupId(), artifact.getArtifactId());
+            model.addRow(new Object[] { 
+                artifact.getGroupId(), artifact.getArtifactId(),
+                original.getVersion(), artifact.getVersion(), 
+                artifact.getScope(), ProgressRenderer.NOT_STARTED
+            });
+        }
+        if(artifacts.length == 0){
+            JOptionPane.showMessageDialog(stigmata, stigmata.getMessages().get("availabe.artifacts.notfound"));
+        }
+    }
+
+    private void initLayout(){
+        Box buttonPane = Box.createHorizontalBox();
+
+        JButton checkButton = GUIUtility.createButton(stigmata.getMessages(), "hermes.check");
+        final JButton updateButton = GUIUtility.createButton(stigmata.getMessages(), "hermes.update");
+
+        checkButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                try{
+                    showLists();
+                    updateButton.setEnabled(model.getRowCount() > 0);
+                } catch(IOException e1){
+                    GUIUtility.showErrorDialog(stigmata, stigmata.getMessages(), e1);
+                } catch(HermesException e1){
+                    GUIUtility.showErrorDialog(stigmata, stigmata.getMessages(), e1);
+                }
+            }
+        });
+        updateButton.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e){
+                try{
+                    updateArtifacts();
+                    updateButton.setEnabled(false);
+                } catch(IOException e1){
+                    GUIUtility.showErrorDialog(stigmata, stigmata.getMessages(), e1);
+                } catch(HermesException e1){
+                    GUIUtility.showErrorDialog(stigmata, stigmata.getMessages(), e1);
+                }
+            }
+        });
+        updateButton.setEnabled(false);
+
+        buttonPane.add(Box.createHorizontalGlue());
+        buttonPane.add(checkButton);
+        buttonPane.add(Box.createHorizontalGlue());
+        buttonPane.add(updateButton);
+        buttonPane.add(Box.createHorizontalGlue());
+
+        model = new DefaultTableModel(){
+            private static final long serialVersionUID = -2538706137335748099L;
+
+            @Override
+            public boolean isCellEditable(int row, int column){
+                return false;
+            }
+
+            public Class<?> getColumnClass(int column){
+                Class<?> clazz = String.class;
+                if(column == ProgressRenderer.PROGRESS_COLUMN){
+                    clazz = Integer.class;
+                }
+                return clazz;
+            }
+        };
+        table = new JTable(model);
+        table.setDefaultRenderer(Integer.class, new ProgressRenderer());
+
+        model.setColumnIdentifiers(stigmata.getMessages().getArray("hermes.artifacts.labels"));
+
+        setLayout(new BorderLayout());
+        add(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS), BorderLayout.CENTER);
+        add(buttonPane, BorderLayout.SOUTH);
+    }
+
+    private static class UpdatePluginsPaneHermesListener implements HermesPercentageListener{
+        private DefaultTableModel model;
+        private UpdatePluginsPane pane;
+        private Map<String, Map<String, Integer>> map;
+
+        public UpdatePluginsPaneHermesListener(UpdatePluginsPane pane, DefaultTableModel model){
+            this.model = model;
+            this.pane = pane;
+        }
+
+        public void downloadDone(HermesEvent e){
+            Artifact a = e.getArtifact();
+            model.setValueAt(ProgressRenderer.DONE, map.get(a.getGroupId()).get(a.getArtifactId()), ProgressRenderer.PROGRESS_COLUMN);
+        }
+
+        public void fileSizeGotten(HermesEvent e){
+        }
+
+        public void progress(HermesEvent e, double progress){
+            Artifact a = e.getArtifact();
+            model.setValueAt(
+                (int)(progress * 100), map.get(a.getGroupId()).get(a.getArtifactId()),
+                ProgressRenderer.PROGRESS_COLUMN
+            );
+        }
+
+        public void finish(HermesEvent e){
+        }
+
+        public void targetResolved(HermesEvent e){
+            Artifact[] artifacts = e.getArtifacts();
+            map = buildArtifactsIndexMap(artifacts);
+            pane.showLists(artifacts);
+        }
+
+        private Map<String, Map<String, Integer>> buildArtifactsIndexMap(Artifact[] artifacts){
+            Map<String, Map<String, Integer>> map = new HashMap<String, Map<String, Integer>>();
+        
+            for(int i = 0; i < artifacts.length; i++){
+                String groupId = artifacts[i].getGroupId();
+                Map<String, Integer> submap = map.get(groupId);
+                if(submap == null){
+                    submap = new HashMap<String, Integer>();
+                    map.put(groupId, submap);
+                }
+                submap.put(artifacts[i].getArtifactId(), i);
+            }
+        
+            return map;
+        }
+    }
+
+
+    private static class ProgressRenderer extends DefaultTableCellRenderer{
+        private static final long serialVersionUID = 3098530332351108648L;
+
+        private static final int PROGRESS_COLUMN = 5;
+        public static final int DONE = 100;
+        public static final int NOT_STARTED = -1;
+        public static final int CANCELED = -2;
+
+        private JProgressBar progressBar = new JProgressBar(0, 100);
+
+        public ProgressRenderer(){
+            super();
+            setOpaque(true);
+            progressBar.setBorder(new EmptyBorder(1, 1, 1, 1));
+        }
+
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object originalValue, boolean isSelected, boolean hasFocus, int row, int column){
+            int value = ((Integer)originalValue).intValue();
+            progressBar.setValue(value);
+
+            return progressBar;
+        }
+    }
+}
diff --git a/src/main/java/jp/sourceforge/stigmata/utils/HermesUtility.java b/src/main/java/jp/sourceforge/stigmata/utils/HermesUtility.java
new file mode 100644 (file)
index 0000000..d522df1
--- /dev/null
@@ -0,0 +1,147 @@
+package jp.sourceforge.stigmata.utils;
+
+/*
+ * $Id$
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import jp.sourceforge.stigmata.BirthmarkEnvironment;
+import jp.sourceforge.talisman.hermes.Hermes;
+import jp.sourceforge.talisman.hermes.HermesContext;
+import jp.sourceforge.talisman.hermes.HermesContextExporter;
+import jp.sourceforge.talisman.hermes.HermesContextParser;
+import jp.sourceforge.talisman.hermes.HermesException;
+import jp.sourceforge.talisman.hermes.InvalidHermesConfigException;
+import jp.sourceforge.talisman.hermes.maven.Artifact;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class HermesUtility{
+    private HermesContext context;
+    private Hermes hermes;
+    private Artifact[] updateTargets;
+
+    public HermesUtility(BirthmarkEnvironment env) throws IOException, InvalidHermesConfigException{
+        loadHermesContext(env);
+    }
+
+    public HermesUtility(){
+    }
+
+    public void updateContext(BirthmarkEnvironment env) throws IOException{
+        String path = env.getProperty("location.hermes.config");
+        OutputStream out = null;
+        if(path != null && path.startsWith("file:")){
+            out = new URL(path).openConnection().getOutputStream();
+        }
+        else{
+            File file = new File(BirthmarkEnvironment.getStigmataHome(), "plugins/hermes.xml");
+            out = new FileOutputStream(file);
+        }
+        HermesContextExporter exporter = new HermesContextExporter();
+        exporter.export(out, context);
+        if(out != null){
+            out.close();
+        }
+    }
+
+    public void loadHermesContext(BirthmarkEnvironment env) throws IOException, InvalidHermesConfigException{
+        HermesContextParser parser = new HermesContextParser();
+        InputStream in = getInputStream(env);
+        context = parser.parse(in);
+        if(in != null){
+            try{
+                in.close();
+            } catch(IOException e){
+                // ignore exception.
+            }
+        }
+        if(context.getDestination().contains("${stigmata.home}")){
+            String dest = context.getDestination();
+            dest = dest.replace("${stigmata.home}", BirthmarkEnvironment.getStigmataHome());
+            context.setDestination(dest);
+        }
+
+        hermes = new Hermes(context);
+    }
+
+    public boolean canUpdate() throws IOException, HermesException{
+        return getUpdateTarget().length > 0;
+    }
+
+    public Artifact getCurrentArtifact(String groupId, String artifactId){
+        return context.getDependency(groupId, artifactId);
+    }
+
+    public Artifact[] getUpdateTarget() throws IOException, HermesException{
+        if(updateTargets == null){
+            updateTargets = hermes.getUpdateTarget();
+        }
+        return updateTargets;
+    }
+
+    public void update() throws IOException, HermesException{
+        hermes.update();
+        updateTargets = null;
+    }
+
+    public Hermes getHermes(){
+        if(hermes == null){
+            throw new IllegalStateException("call loadHermesContext first!");
+        }
+        return hermes;
+    }
+
+    private InputStream getInputStream(BirthmarkEnvironment env) throws IOException{
+        InputStream in = null;
+        if(env.getProperty("location.hermes.config") != null){
+            try{
+                URL url = new URL(env.getProperty("location.hermes.config"));
+                in = url.openStream();
+            } catch(MalformedURLException e){
+                // ignore exception.
+            }
+        }
+        else{
+            File file = new File(BirthmarkEnvironment.getStigmataHome(), "plugins/hermes.xml");
+            if(!file.exists()){
+                copyFile(getClass().getResource("/resources/hermes.xml"), file);
+            }
+
+            in = new FileInputStream(file);
+        }
+        return in;
+    }
+
+    private void copyFile(URL from, File to) throws IOException{
+        InputStream in = null;
+        OutputStream out = null;
+        try{
+            in = from.openStream();
+            out = new FileOutputStream(to);
+            byte[] data = new byte[256];
+            int read = 0;
+            while((read = in.read(data)) != -1){
+                out.write(data, 0, read);
+            }
+        } finally{
+            if(in != null){
+                in.close();
+            }
+            if(out != null){
+                out.close();
+            }
+        }
+    }
+}
diff --git a/src/main/resources/resources/hermes.xml b/src/main/resources/resources/hermes.xml
new file mode 100644 (file)
index 0000000..8e536f9
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<hermes>\r
+  <repository-scope>BOTH</repository-scope>\r
+  <dependency-scope>COMPILE, RUNTIME</dependency-scope>\r
+  <destination>${stigmata.home}/plugins</destination>\r
+  <repositories>\r
+    <repository>\r
+      <id>stigmata.sourceforge.jp</id>\r
+      <name>Stigmata Maven Repository</name>\r
+      <url>http://stigmata.sourceforge.jp/maven2/</url>\r
+    </repository>\r
+  </repositories>\r
+\r
+  <dependencies>\r
+    <dependency>\r
+      <groupId>jp.sourceforge.stigmata.plugins</groupId>\r
+      <artifactId>wsp</artifactId>\r
+      <version>1.0.0</version>\r
+      <scope>COMPILE</scope>\r
+    </dependency>\r
+  </dependencies>\r
+\r
+  <ignores>\r
+    <ignore>\r
+      <groupId>commons-cli</groupId>\r
+      <artifactId>commons-cli</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>jp.sourceforge.talisman</groupId>\r
+      <artifactId>mds</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>jp.sourceforge.talisman</groupId>\r
+      <artifactId>xmlcli</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>jp.sourceforge.talisman</groupId>\r
+      <artifactId>i18n</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>jp.sourceforge.talisman</groupId>\r
+      <artifactId>csvio</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>commons-dbutils</groupId>\r
+      <artifactId>commons-dbutils</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>commons-logging</groupId>\r
+      <artifactId>commons-logging</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>jp.sourceforge</groupId>\r
+      <artifactId>stigmata</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>jp.sourceforge.stigmata</groupId>\r
+      <artifactId>digger</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>commons-beanutils</groupId>\r
+      <artifactId>commons-beanutils</artifactId>\r
+    </ignore>\r
+    <ignore>\r
+      <groupId>asm</groupId>\r
+      <artifactId>asm-all</artifactId>\r
+    </ignore>\r
+  </ignores>\r
+</hermes>\r
diff --git a/src/main/resources/resources/images/database_lightning.png b/src/main/resources/resources/images/database_lightning.png
new file mode 100644 (file)
index 0000000..d9eefc2
Binary files /dev/null and b/src/main/resources/resources/images/database_lightning.png differ
diff --git a/src/main/resources/resources/images/database_save.png b/src/main/resources/resources/images/database_save.png
new file mode 100644 (file)
index 0000000..44c06dd
Binary files /dev/null and b/src/main/resources/resources/images/database_save.png differ
diff --git a/src/main/resources/resources/images/database_table.png b/src/main/resources/resources/images/database_table.png
new file mode 100644 (file)
index 0000000..693709c
Binary files /dev/null and b/src/main/resources/resources/images/database_table.png differ
index 14e1cd5..870e930 100755 (executable)
@@ -765,3 +765,23 @@ show.coordinate.rawstress.label=Raw stress
 show.coordinate.normalizedstress.label=Normalized stress\r
 \r
 title.illegal.argument=Illegal Argument\r
+\r
+hermes.check.button.label=Check\r
+hermes.check.button.tooltip=Check dependencies can update.\r
+hermes.check.button.icon=database_table.png\r
+hermes.update.button.label=Check & Update\r
+hermes.update.button.tooltip=Check dependencies and update them.\r
+hermes.update.button.icon=database_save.png\r
+hermes.artifacts.labels=Group Id,Artifact Id,Current Version,New Version,Scope,Status\r
+\r
+pluginsMenu.menu.label=Plugins\r
+onlineupdate.menuitem.label=Online Update...\r
+onlineupdate.menuitem.tooltip=Execute online update\r
+onlineupdate.menuitem.icon=database_lightning.png\r
+\r
+availabe.artifacts.notfound=An available library is not found.\r
+restart.stigmata.requrested=Restarting stigmata is requested.\r
+Do you restart stigmata now?\r
+message.dialog.title=Message\r
+restart.now=Restart Now\r
+restart.later=Restart Later
\ No newline at end of file
index a20a559..95a58de 100755 (executable)
@@ -512,3 +512,23 @@ rank_3.label=
 rank_4.label=\97Þ\8e\97\93x: (0.6, 0.8]\r
 rank_5.label=\97Þ\8e\97\93x: (0.8, 1.0]\r
 \r
+\r
+hermes.check.button.label=\8dX\90V\8am\94F\r
+hermes.check.button.tooltip=\88Ë\91\83\89\83C\83u\83\89\83\8a\82ª\8dX\90V\89Â\94\\82©\8am\94F\82µ\82Ü\82·\81D\r
+hermes.update.button.label=\8dX\90V\r
+hermes.update.button.tooltip=\88Ë\91\83\89\83C\83u\83\89\83\8a\82ª\8dX\90V\89Â\94\\82Å\82 \82ê\82Î\81C\8dX\90V\82µ\82Ü\82·\81D\r
+hermes.artifacts.labels=\83O\83\8b\81[\83vID,\83A\81[\83e\83B\83t\83@\83N\83gID,\8cÃ\82¢\83o\81[\83W\83\87\83\93,\90V\82µ\82¢\83o\81[\83W\83\87\83\93,\83X\83R\81[\83v,\8fó\91Ô\r
+\r
+pluginsMenu.menu.label=\83v\83\89\83O\83C\83\93\r
+onlineupdate.menuitem.label=\83I\83\93\83\89\83C\83\93\83A\83b\83v\83f\81[\83g...\r
+onlineupdate.menuitem.tooltip=\83I\83\93\83\89\83C\83\93\83A\83b\83v\83f\81[\83g\82ð\8eÀ\8ds\82µ\82Ü\82·\81D\r
+\r
+progress.done=\83_\83E\83\93\83\8d\81[\83h\8fI\97¹\r
+progress.canceled=\83L\83\83\83\93\83Z\83\8b\r
+progress.not_started=\83_\83E\83\93\83\8d\81[\83h\89Â\94\\r
+availabe.artifacts.notfound=\8dX\90V\89Â\94\\82È\83\89\83C\83u\83\89\83\8a\82Í\8c©\82Â\82©\82è\82Ü\82¹\82ñ\82Å\82µ\82½\81D\r
+restart.stigmata.requrested=\8dX\90V\82µ\82½\83\89\83C\83u\83\89\83\8a\82ð\8eg\82¤\82É\82ÍStigmata\82ð\8dÄ\8bN\93®\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81D\r
+\8d¡\82·\82®\8dÄ\8bN\93®\82ð\8ds\82¢\82Ü\82·\82©?\r
+message.dialog.title=\83\81\83b\83Z\81[\83W\r
+restart.now=\8dÄ\8bN\93®\r
+restart.later=\8eè\93®\82Å\8dÄ\8bN\93®
\ No newline at end of file
index 187b056..ecb51ca 100755 (executable)
@@ -238,10 +238,21 @@ $Id$
       <name>birthmark.store.target</name>
       <value>MEMORY</value>
     </property>
-    <property>\r
-      <name>override.exists.plugin</name>\r
-      <value>yes</value>\r
-    </property>\r
+    <property>
+      <name>override.exists.plugin</name>
+      <value>yes</value>
+    </property>
+    <property>
+      <name>update.plugins.startup</name>
+      <value>yes</value>
+    </property>
+<!--
+  If you want to use latest plugins, uncomment below property.
+    <property>
+      <name>location.hermes.config</name>
+      <value>http://stigmata.sourceforge.jp/plugins/hermes.xml</value>
+    </property>
+-->
 <!--
     <property>
       <property-name>name</property-name>