syncany-team team mailing list archive
-
syncany-team team
-
Mailing list archive
-
Message #00177
[Merge] lp:~isak-karlsson/syncany/syncany-remote-watch-interval into lp:syncany
isakkarlsson has proposed merging lp:~isak-karlsson/syncany/syncany-remote-watch-interval into lp:syncany.
Requested reviews:
Syncany Team (syncany-team)
For more details, see:
https://code.launchpad.net/~isak-karlsson/syncany/syncany-remote-watch-interval/+merge/64850
Added the ability to change the remote checking inverval.
--
https://code.launchpad.net/~isak-karlsson/syncany/syncany-remote-watch-interval/+merge/64850
Your team Syncany Team is requested to review the proposed merge of lp:~isak-karlsson/syncany/syncany-remote-watch-interval into lp:syncany.
=== modified file 'syncany/bin/native.py'
--- syncany/bin/native.py 2011-06-11 12:47:02 +0000
+++ syncany/bin/native.py 2011-06-16 14:58:24 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python2
#
# Syncany Linux Native Functions
# Copyright (C) 2011 Philipp C. Heckel <philipp.heckel@xxxxxxxxx>
=== modified file 'syncany/src/org/syncany/config/Profile.java'
--- syncany/src/org/syncany/config/Profile.java 2011-05-23 16:50:04 +0000
+++ syncany/src/org/syncany/config/Profile.java 2011-06-16 14:58:24 +0000
@@ -149,6 +149,8 @@
// Repo
repository = new Repository();
repository.load(node.findChildByName("repository"));
+
+ remoteWatcher.load(node.findChildByName("watcher"));
// Folders
folders = new Folders(this);
@@ -175,5 +177,8 @@
// Folders
folders.save(node.findOrCreateChildByXpath("folders", "folders"));
+
+ // Watcher
+ remoteWatcher.save(node.findOrCreateChildByXpath("watcher", "watcher"));
}
}
=== modified file 'syncany/src/org/syncany/gui/settings/ProfilePanel.form'
--- syncany/src/org/syncany/gui/settings/ProfilePanel.form 2011-05-23 16:50:04 +0000
+++ syncany/src/org/syncany/gui/settings/ProfilePanel.form 2011-06-16 14:58:24 +0000
@@ -28,8 +28,8 @@
<Component id="cbActive" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
- <EmptySpace max="-2" attributes="0"/>
- <Component id="txtProfileName" pref="344" max="32767" attributes="0"/>
+ <EmptySpace min="-2" pref="62" max="-2" attributes="0"/>
+ <Component id="txtProfileName" pref="294" max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
=== modified file 'syncany/src/org/syncany/gui/settings/ProfilePanel.java'
--- syncany/src/org/syncany/gui/settings/ProfilePanel.java 2011-06-05 21:26:56 +0000
+++ syncany/src/org/syncany/gui/settings/ProfilePanel.java 2011-06-16 14:58:24 +0000
@@ -69,65 +69,65 @@
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
- // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
- private void initComponents() {
-
- jLabel1 = new javax.swing.JLabel();
- txtProfileName = new javax.swing.JTextField();
- cbActive = new javax.swing.JCheckBox();
- jLabel2 = new javax.swing.JLabel();
-
- setBorder(null);
-
- jLabel1.setLabelFor(txtProfileName);
- jLabel1.setText(resourceBundle.getString("profp_name"));
- jLabel1.setName("jLabel1"); // NOI18N
-
- txtProfileName.setName("txtProfileName"); // NOI18N
-
- cbActive.setText(resourceBundle.getString("profp_activate"));
- cbActive.setName("cbActive"); // NOI18N
-
- jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() | java.awt.Font.BOLD));
- jLabel2.setText(resourceBundle.getString("profp_settings"));
- jLabel2.setName("jLabel2"); // NOI18N
-
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
- this.setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jLabel2)
- .addComponent(cbActive)
- .addGroup(layout.createSequentialGroup()
- .addComponent(jLabel1)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(txtProfileName, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE)))
- .addContainerGap())
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addGap(10, 10, 10)
- .addComponent(jLabel2)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(cbActive)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(txtProfileName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jLabel1))
- .addContainerGap(213, Short.MAX_VALUE))
- );
- }// </editor-fold>//GEN-END:initComponents
-
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JCheckBox cbActive;
- private javax.swing.JLabel jLabel1;
- private javax.swing.JLabel jLabel2;
- private javax.swing.JTextField txtProfileName;
- // End of variables declaration//GEN-END:variables
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jLabel1 = new javax.swing.JLabel();
+ txtProfileName = new javax.swing.JTextField();
+ cbActive = new javax.swing.JCheckBox();
+ jLabel2 = new javax.swing.JLabel();
+
+ setBorder(null);
+
+ jLabel1.setLabelFor(txtProfileName);
+ jLabel1.setText("Profile Name:");
+ jLabel1.setName("jLabel1"); // NOI18N
+
+ txtProfileName.setName("txtProfileName"); // NOI18N
+
+ cbActive.setText("Activate Profile");
+ cbActive.setName("cbActive"); // NOI18N
+
+ jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() | java.awt.Font.BOLD));
+ jLabel2.setText("Profile Settings");
+ jLabel2.setName("jLabel2"); // NOI18N
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jLabel2)
+ .addComponent(cbActive)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabel1)
+ .addGap(62, 62, 62)
+ .addComponent(txtProfileName, javax.swing.GroupLayout.DEFAULT_SIZE, 294, Short.MAX_VALUE)))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(10, 10, 10)
+ .addComponent(jLabel2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(cbActive)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(txtProfileName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel1))
+ .addContainerGap(213, Short.MAX_VALUE))
+ );
+ }// </editor-fold>//GEN-END:initComponents
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JCheckBox cbActive;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JTextField txtProfileName;
+ // End of variables declaration//GEN-END:variables
}
=== modified file 'syncany/src/org/syncany/gui/settings/RepositoryPanel.form'
--- syncany/src/org/syncany/gui/settings/RepositoryPanel.form 2011-05-23 16:50:04 +0000
+++ syncany/src/org/syncany/gui/settings/RepositoryPanel.form 2011-06-16 14:58:24 +0000
@@ -23,22 +23,29 @@
<EmptySpace pref="2" max="-2" attributes="0"/>
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
</Group>
+ <Component id="scrConnection" alignment="0" min="-2" pref="499" max="-2" attributes="0"/>
+ <Component id="lblConnection" alignment="0" min="-2" max="-2" attributes="0"/>
+ <Group type="102" alignment="0" attributes="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="50" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" max="-2" attributes="0">
+ <Component id="jspRemoteInterval" max="32767" attributes="1"/>
+ <Component id="lblEncryption" alignment="0" max="32767" attributes="1"/>
+ </Group>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabel5" min="-2" max="-2" attributes="0"/>
+ </Group>
<Group type="102" alignment="0" attributes="0">
<Component id="jLabel3" min="-2" max="-2" attributes="0"/>
- <EmptySpace min="12" pref="12" max="12" attributes="0"/>
- <Component id="lblStorageType" min="-2" max="-2" attributes="0"/>
- </Group>
- <Group type="102" alignment="0" attributes="0">
- <EmptySpace min="-2" pref="120" max="-2" attributes="0"/>
- <Component id="lblStorageDescription" min="-2" max="-2" attributes="0"/>
- </Group>
- <Group type="102" alignment="0" attributes="0">
- <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
- <EmptySpace min="50" pref="50" max="50" attributes="0"/>
- <Component id="lblEncryption" min="-2" max="-2" attributes="0"/>
- </Group>
- <Component id="lblConnection" alignment="0" min="-2" max="-2" attributes="0"/>
- <Component id="scrConnection" alignment="0" min="-2" pref="499" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="30" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="lblStorageType" min="-2" max="-2" attributes="0"/>
+ <Component id="lblStorageDescription" alignment="0" min="-2" max="-2" attributes="0"/>
+ </Group>
+ </Group>
</Group>
<EmptySpace max="32767" attributes="0"/>
</Group>
@@ -50,20 +57,26 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
- <Group type="103" groupAlignment="0" attributes="0">
- <Component id="jLabel3" min="-2" max="-2" attributes="0"/>
- <Component id="lblStorageType" min="-2" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="lblStorageType" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
- <EmptySpace min="5" pref="5" max="5" attributes="0"/>
+ <EmptySpace min="-2" pref="2" max="-2" attributes="0"/>
<Component id="lblStorageDescription" min="-2" max="-2" attributes="0"/>
- <EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
+ <EmptySpace type="separate" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jLabel4" min="-2" max="-2" attributes="0"/>
<Component id="lblEncryption" min="-2" max="-2" attributes="0"/>
</Group>
- <EmptySpace min="-2" pref="30" max="-2" attributes="0"/>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="jspRemoteInterval" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabel5" alignment="3" min="-2" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace pref="28" max="32767" attributes="0"/>
<Component id="lblConnection" min="-2" max="-2" attributes="0"/>
- <EmptySpace pref="12" max="32767" attributes="0"/>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="scrConnection" min="-2" pref="237" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
@@ -140,5 +153,22 @@
<Property name="name" type="java.lang.String" value="lblStorageDescription" noResource="true"/>
</Properties>
</Component>
+ <Component class="javax.swing.JSpinner" name="jspRemoteInterval">
+ <Properties>
+ <Property name="name" type="java.lang.String" value="jspRemoteInterval" noResource="true"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Watch Interval"/>
+ <Property name="name" type="java.lang.String" value="lblWatchInterval" noResource="true"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel5">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="ms"/>
+ <Property name="name" type="java.lang.String" value="lblMiliSeconds" noResource="true"/>
+ </Properties>
+ </Component>
</SubComponents>
</Form>
=== modified file 'syncany/src/org/syncany/gui/settings/RepositoryPanel.java'
--- syncany/src/org/syncany/gui/settings/RepositoryPanel.java 2011-06-05 21:26:56 +0000
+++ syncany/src/org/syncany/gui/settings/RepositoryPanel.java 2011-06-16 14:58:24 +0000
@@ -21,7 +21,6 @@
*
* Created on Mar 27, 2011, 12:51:42 AM
*/
-
package org.syncany.gui.settings;
import java.util.ResourceBundle;
@@ -37,146 +36,169 @@
* @author Philipp C. Heckel <philipp.heckel@xxxxxxxxx>
*/
public class RepositoryPanel extends SettingsPanel {
+
private Profile profile;
private ConfigPanel pnlConnection;
private ResourceBundle resourceBundle;
/** Creates new form ProxyPanel */
public RepositoryPanel(Profile profile) {
- resourceBundle = Config.getInstance().getResourceBundle();
- initComponents();
+ resourceBundle = Config.getInstance().getResourceBundle();
+ initComponents();
this.profile = profile;
this.pnlConnection = profile.getRepository().getConnection().createConfigPanel();
scrConnection.setViewportView(pnlConnection);
- //scrConnection.getViewport().setViewPosition(new Point(0, 0));
-
+ //scrConnection.getViewport().setViewPosition(new Point(0, 0));
+
}
-
+
@Override
- public void load() {
- Repository repo = profile.getRepository();
- Connection connection = repo.getConnection();
-
- lblStorageType.setText(connection.getPluginInfo().getName() + ", " + resourceBundle.getString("reposp_version") + " " + repo.getConnection().getPluginInfo().getVersionStr());
- lblStorageDescription.setText(connection.getPluginInfo().getDescripton());
- lblEncryption.setText(repo.getEncryption().getCipherStr() + ", " + repo.getEncryption().getKeylength() + " bit");
-
- lblConnection.setText(connection.getPluginInfo().getName()+ resourceBundle.getString("reposp_connection_details"));
+ public void load() {
+ Repository repo = profile.getRepository();
+ Connection connection = repo.getConnection();
+
+ lblStorageType.setText(connection.getPluginInfo().getName() + ", " + resourceBundle.getString("reposp_version") + " " + repo.getConnection().getPluginInfo().getVersionStr());
+ lblStorageDescription.setText(connection.getPluginInfo().getDescripton());
+ lblEncryption.setText(repo.getEncryption().getCipherStr() + ", " + repo.getEncryption().getKeylength() + " bit");
+
+ lblConnection.setText(connection.getPluginInfo().getName() + resourceBundle.getString("reposp_connection_details"));
pnlConnection.load();
+ jspRemoteInterval.setValue(profile.getRemoteWatcher().getInterval());
}
@Override
public void save() {
// TODO
pnlConnection.save();
+ profile.getRemoteWatcher().setInterval((Integer) jspRemoteInterval.getValue());
}
-
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
- // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
- private void initComponents() {
-
- jLabel1 = new javax.swing.JLabel();
- lblConnection = new javax.swing.JLabel();
- scrConnection = new javax.swing.JScrollPane();
- jLabel3 = new javax.swing.JLabel();
- jLabel4 = new javax.swing.JLabel();
- lblStorageType = new javax.swing.JLabel();
- lblEncryption = new javax.swing.JLabel();
- lblStorageDescription = new javax.swing.JLabel();
-
- jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getStyle() | java.awt.Font.BOLD));
- jLabel1.setText(resourceBundle.getString("reposp_remote_storage"));
- jLabel1.setName("jLabel1"); // NOI18N
-
- lblConnection.setFont(lblConnection.getFont().deriveFont(lblConnection.getFont().getStyle() | java.awt.Font.BOLD));
- lblConnection.setText(resourceBundle.getString("reposp_connection"));
- lblConnection.setName("lblConnection"); // NOI18N
-
- scrConnection.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
- scrConnection.setViewportBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
- scrConnection.setName("scrConnection"); // NOI18N
-
- jLabel3.setText(resourceBundle.getString("reposp_connection_type"));
- jLabel3.setName("jLabel3"); // NOI18N
-
- jLabel4.setText(resourceBundle.getString("reposp_encryption"));
- jLabel4.setName("jLabel4"); // NOI18N
-
- lblStorageType.setText(resourceBundle.getString("reposp_temp_type"));
- lblStorageType.setName("lblStorageType"); // NOI18N
-
- lblEncryption.setText(resourceBundle.getString("reposp_temp_encryption"));
- lblEncryption.setName("lblEncryption"); // NOI18N
-
- lblStorageDescription.setText(resourceBundle.getString("reposp_temp_description"));
- lblStorageDescription.setName("lblStorageDescription"); // NOI18N
-
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
- this.setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jLabel1))
- .addGroup(layout.createSequentialGroup()
- .addComponent(jLabel3)
- .addGap(12, 12, 12)
- .addComponent(lblStorageType))
- .addGroup(layout.createSequentialGroup()
- .addGap(120, 120, 120)
- .addComponent(lblStorageDescription))
- .addGroup(layout.createSequentialGroup()
- .addComponent(jLabel4)
- .addGap(50, 50, 50)
- .addComponent(lblEncryption))
- .addComponent(lblConnection)
- .addComponent(scrConnection, javax.swing.GroupLayout.PREFERRED_SIZE, 499, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(jLabel1)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jLabel3)
- .addComponent(lblStorageType))
- .addGap(5, 5, 5)
- .addComponent(lblStorageDescription)
- .addGap(15, 15, 15)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jLabel4)
- .addComponent(lblEncryption))
- .addGap(30, 30, 30)
- .addComponent(lblConnection)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 12, Short.MAX_VALUE)
- .addComponent(scrConnection, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap())
- );
- }// </editor-fold>//GEN-END:initComponents
-
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JLabel jLabel1;
- private javax.swing.JLabel jLabel3;
- private javax.swing.JLabel jLabel4;
- private javax.swing.JLabel lblConnection;
- private javax.swing.JLabel lblEncryption;
- private javax.swing.JLabel lblStorageDescription;
- private javax.swing.JLabel lblStorageType;
- private javax.swing.JScrollPane scrConnection;
- // End of variables declaration//GEN-END:variables
-
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jLabel1 = new javax.swing.JLabel();
+ lblConnection = new javax.swing.JLabel();
+ scrConnection = new javax.swing.JScrollPane();
+ jLabel3 = new javax.swing.JLabel();
+ jLabel4 = new javax.swing.JLabel();
+ lblStorageType = new javax.swing.JLabel();
+ lblEncryption = new javax.swing.JLabel();
+ lblStorageDescription = new javax.swing.JLabel();
+ jspRemoteInterval = new javax.swing.JSpinner();
+ jLabel2 = new javax.swing.JLabel();
+ jLabel5 = new javax.swing.JLabel();
+
+ jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getStyle() | java.awt.Font.BOLD));
+ jLabel1.setText("Remote Storage");
+ jLabel1.setName("jLabel1"); // NOI18N
+
+ lblConnection.setFont(lblConnection.getFont().deriveFont(lblConnection.getFont().getStyle() | java.awt.Font.BOLD));
+ lblConnection.setText("(xyz) Connection");
+ lblConnection.setName("lblConnection"); // NOI18N
+
+ scrConnection.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
+ scrConnection.setViewportBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
+ scrConnection.setName("scrConnection"); // NOI18N
+
+ jLabel3.setText("Connection Type:");
+ jLabel3.setName("jLabel3"); // NOI18N
+
+ jLabel4.setText("Encryption:");
+ jLabel4.setName("jLabel4"); // NOI18N
+
+ lblStorageType.setText("(type)");
+ lblStorageType.setName("lblStorageType"); // NOI18N
+
+ lblEncryption.setText("(encryption)");
+ lblEncryption.setName("lblEncryption"); // NOI18N
+
+ lblStorageDescription.setText("(description)");
+ lblStorageDescription.setName("lblStorageDescription"); // NOI18N
+
+ jspRemoteInterval.setName("jspRemoteInterval"); // NOI18N
+
+ jLabel2.setText("Watch Interval");
+ jLabel2.setName("lblWatchInterval"); // NOI18N
+
+ jLabel5.setText("ms");
+ jLabel5.setName("lblMiliSeconds"); // NOI18N
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel1))
+ .addComponent(scrConnection, javax.swing.GroupLayout.PREFERRED_SIZE, 499, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(lblConnection)
+ .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jLabel4)
+ .addComponent(jLabel2))
+ .addGap(50, 50, 50)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(jspRemoteInterval)
+ .addComponent(lblEncryption, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jLabel5))
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabel3)
+ .addGap(30, 30, 30)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(lblStorageType)
+ .addComponent(lblStorageDescription))))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabel1)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabel3)
+ .addComponent(lblStorageType))
+ .addGap(2, 2, 2)
+ .addComponent(lblStorageDescription)
+ .addGap(18, 18, 18)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jLabel4)
+ .addComponent(lblEncryption))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jspRemoteInterval, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel2)
+ .addComponent(jLabel5))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
+ .addComponent(lblConnection)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(scrConnection, javax.swing.GroupLayout.PREFERRED_SIZE, 237, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap())
+ );
+ }// </editor-fold>//GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel3;
+ private javax.swing.JLabel jLabel4;
+ private javax.swing.JLabel jLabel5;
+ private javax.swing.JSpinner jspRemoteInterval;
+ private javax.swing.JLabel lblConnection;
+ private javax.swing.JLabel lblEncryption;
+ private javax.swing.JLabel lblStorageDescription;
+ private javax.swing.JLabel lblStorageType;
+ private javax.swing.JScrollPane scrConnection;
+ // End of variables declaration//GEN-END:variables
}
=== modified file 'syncany/src/org/syncany/watch/remote/RemoteWatcher.java'
--- syncany/src/org/syncany/watch/remote/RemoteWatcher.java 2011-05-23 16:50:04 +0000
+++ syncany/src/org/syncany/watch/remote/RemoteWatcher.java 2011-06-16 14:58:24 +0000
@@ -19,11 +19,13 @@
import java.util.Map.Entry;
import org.syncany.config.Config;
+import org.syncany.config.ConfigNode;
import org.syncany.config.Profile;
import org.syncany.connection.plugins.TransferManager;
import org.syncany.db.CloneClient;
import org.syncany.db.CloneFile;
import org.syncany.db.DatabaseHelper;
+import org.syncany.exceptions.ConfigException;
import org.syncany.exceptions.RemoteFileNotFoundException;
import org.syncany.repository.files.RemoteFile;
import org.syncany.exceptions.StorageException;
@@ -63,42 +65,33 @@
*
* @author Philipp C. Heckel <philipp.heckel@xxxxxxxxx>
*/
-public class RemoteWatcher {
+public class RemoteWatcher implements org.syncany.config.Configurable {
+
private static final Logger logger = Logger.getLogger(RemoteWatcher.class.getSimpleName());
-
- private static final int INTERVAL = 10000;
+ private static final int DEFAULT_INTERVAL = 10000;
private static final boolean DEBUG_GZIP_AND_ENCRYPT_UPDATE_FILES = false;
-
private Config config;
- private DatabaseHelper db;
-
- private Profile profile;
-
+ private DatabaseHelper db;
+ private int interval = DEFAULT_INTERVAL;
+ private Profile profile;
private ChangeManager changeManager;
private Timer timer;
-
private Map<String, RemoteFile> remoteFileList;
private StructuredFileList fileList;
private UpdateList updateList;
private TransferManager transfer;
-
// TODO this should be in the DB cached somewhere.
private Long lastFileVersionCount;
-
// TODO this should be in the DB cached somewhere.
private Date lastRepoFileUpdate;
-
// TODO this should be in the DB cached somewhere.
private Date lastUpdateFileDate;
-
// TODO this should be in the DB cached somewhere.
private Date lastLocalProfileFileUpdate;
-
// TODO this should be in the DB cached somewhere.
private Date lastLocalImageFileUpdate;
-
- public RemoteWatcher(Profile profile) {
+ public RemoteWatcher(Profile profile) {
this.profile = profile;
this.changeManager = new ChangeManager(profile);
@@ -108,27 +101,34 @@
// cp. start()
this.config = null;
this.db = null;
-
+
// cp. doUpdateCheck()
this.remoteFileList = null;
this.updateList = null;
this.transfer = null;
}
- public synchronized void start() {
+ public synchronized void setInterval(int interval) {
+ if (interval >= 1000) {
+ this.interval = interval;
+ }
+ startUpdateCheck();
+ }
+
+ public int getInterval() {
+ return this.interval;
+ }
+
+ public synchronized void start() {
// Dependencies
if (config == null) {
config = Config.getInstance();
db = DatabaseHelper.getInstance();
}
-
+
// Reset connection
reset();
-
- timer = new Timer("RemoteWatcher");
- timer.scheduleAtFixedRate(new TimerTask() {
- @Override public void run() { doUpdateCheck(); } }, 0, INTERVAL);
-
+ startUpdateCheck();
changeManager.start();
}
@@ -143,8 +143,27 @@
timer = null;
}
+ private void startUpdateCheck() {
+ logger.log(Level.INFO, "Staring remote watcher...");
+ if (timer != null) {
+ try {
+ timer.cancel();
+ } catch (IllegalStateException ex) {
+ logger.log(Level.SEVERE, ex.getMessage());
+ }
+ }
+ timer = new Timer("RemoteWatcher");
+ timer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ logger.log(Level.INFO, "Do Update Check Interval = " + interval);
+ doUpdateCheck();
+ }
+ }, 0, interval);
+ }
+
private void reset() {
-
+
transfer = profile.getRepository().getConnection().createTransferManager();
updateList = new UpdateList(profile);
}
@@ -158,10 +177,10 @@
try {
updateFileList();
-
+
updateRepository();
commitRepository();
-
+
// 1. download update files
downloadUpdates();
@@ -170,112 +189,108 @@
// 4. Create and upload local updates ///////
commitLocalUpdateFile();
-
+
// Profiles
commitLocalProfile();
updateRemoteProfiles();
// Images
- commitLocalImage();
+ commitLocalImage();
updateRemoteImages();
// 5. Delete old updates (only mine!) ///////
deleteOldUpdateFiles();
deleteOldProfileFiles();
deleteOldImageFiles();
- }
- catch (StorageException ex) {
+ } catch (StorageException ex) {
logger.log(Level.WARNING, "Update check failed. Trying again in a couple of seconds.", ex);
- }
- finally {
+ } finally {
if (logger.isLoggable(Level.INFO)) {
logger.info("DONE WITH PERIODIC UPDATE CHECK ...");
}
- try { transfer.disconnect(); }
- catch (StorageException ex) { /* Fressen! */ }
+ try {
+ transfer.disconnect();
+ } catch (StorageException ex) { /* Fressen! */ }
}
-
+
}
private void updateFileList() throws StorageException {
remoteFileList = transfer.list();
fileList = new StructuredFileList(profile.getRepository(), remoteFileList);
}
-
-
+
private void updateRepository() throws StorageException {
RepositoryFile repoFile = fileList.getNewestRepositoryFile();
-
+
if (repoFile == null) {
throw new StorageException("Unable to find repository-* file.");
}
-
+
// Are we already up-to-date?
if (lastRepoFileUpdate != null && !repoFile.getLastUpdate().after(lastRepoFileUpdate)) {
return;
}
-
+
// Do download and read it!
- try {
+ try {
profile.getRepository().update(transfer, fileList);
lastRepoFileUpdate = repoFile.getLastUpdate();
- }
- catch (Exception e) {
+ } catch (Exception e) {
throw new StorageException(e);
}
- }
-
+ }
+
private void commitRepository() throws StorageException {
RepositoryFile repoFile = fileList.getNewestRepositoryFile();
-
+
if (repoFile == null) {
throw new StorageException("Unable to find repository-* file.");
}
-
+
// Are we already up-to-date?
if (!profile.getRepository().isChanged()) {
if (logger.isLoggable(Level.INFO)) {
logger.info("repository has not changed locally. No need to upload.");
}
-
+
return;
}
-
+
// Upload
if (logger.isLoggable(Level.INFO)) {
logger.info("Uploading changed repository file ...");
}
-
- try {
+
+ try {
profile.getRepository().commit(transfer, fileList, false);
- }
- catch (Exception e) {
+ } catch (Exception e) {
throw new StorageException(e);
}
- }
+ }
private void downloadUpdates() throws StorageException {
if (logger.isLoggable(Level.INFO)) {
logger.info("2. Downloading update lists ...");
}
-
+
// Find newest client update files
Collection<UpdateFile> newestUpdateFiles = fileList.getRemoteUpdateFiles().values();
-
+
for (UpdateFile updateFile : newestUpdateFiles) {
// Get client from DB (or create it!)
- CloneClient client = db.getClient(profile, updateFile.getMachineName(), true);
-
+ CloneClient client = db.getClient(profile, updateFile.getMachineName(), true);
+
// Ignore if we are up-to-date
if (client.getLastUpdate() != null && !updateFile.getLastUpdate().after(client.getLastUpdate())) {
if (logger.isLoggable(Level.INFO)) {
logger.log(Level.INFO, " - Client ''{0}'' is up-to-date", updateFile.getMachineName());
}
-
+
continue;
}
-
+
try {
// Download update file
if (logger.isLoggable(Level.INFO)) {
@@ -295,12 +310,11 @@
// Add to update manager
updateList.addRemoteUpdateFile(client, updateFile);
- }
- catch (Exception ex) {
+ } catch (Exception ex) {
if (logger.isLoggable(Level.WARNING)) {
logger.log(Level.WARNING, "Reading update file of client {0} failed. Skipping update check.", client.getMachineName());
}
-
+
throw new StorageException(ex);
}
}
@@ -317,15 +331,15 @@
// TODO should the changes be synchronous?
// TODO because setting the clients' lastUpdate value assumes that the change mgr doesnt crash
-
+
// Update last-updated date of clients
if (logger.isLoggable(Level.INFO)) {
logger.info("3b. Updating client DB entries ...");
}
for (Map.Entry<CloneClient, UpdateFile> e : updateList.getRemoteUpdateFiles().entrySet()) {
- CloneClient client = e.getKey();
- UpdateFile updateFile = e.getValue();
+ CloneClient client = e.getKey();
+ UpdateFile updateFile = e.getValue();
client.setLastUpdate(updateFile.getLastUpdate());
client.merge();
@@ -350,25 +364,24 @@
lastUpdateFileDate = new Date();
lastFileVersionCount = fileVersionCount;
- File localUpdateFile = null;
+ File localUpdateFile = null;
UpdateFile remoteUpdateFile = new UpdateFile(profile.getRepository(), config.getMachineName(), lastUpdateFileDate);
try {
// Make temp. update file
- localUpdateFile = config.getCache().createTempFile("update-"+config.getMachineName());
- logger.info("4. Writing local changes to '"+localUpdateFile+"' ...");
+ localUpdateFile = config.getCache().createTempFile("update-" + config.getMachineName());
+ logger.info("4. Writing local changes to '" + localUpdateFile + "' ...");
List<CloneFile> updatedFiles = db.getHistory(profile);
remoteUpdateFile.setVersions(updatedFiles);
remoteUpdateFile.write(localUpdateFile, DEBUG_GZIP_AND_ENCRYPT_UPDATE_FILES);
// Upload
- logger.info(" - Uploading file to temp. file '"+remoteUpdateFile.getName()+"' ...");
+ logger.info(" - Uploading file to temp. file '" + remoteUpdateFile.getName() + "' ...");
transfer.upload(localUpdateFile, remoteUpdateFile);
localUpdateFile.delete();
- }
- catch (IOException ex) {
+ } catch (IOException ex) {
if (localUpdateFile != null) {
localUpdateFile.delete();
}
@@ -376,18 +389,18 @@
logger.log(Level.SEVERE, null, ex);
}
}
-
+
// Upload new local profile (if changed)
- private void commitLocalProfile() throws StorageException {
+ private void commitLocalProfile() throws StorageException {
ProfileFile localNewestProfileFile = fileList.getNewestProfileFile();
-
+
// Skip if no update needed
- if (!(localNewestProfileFile == null || lastLocalProfileFileUpdate == null ||
- localNewestProfileFile.getLastUpdate().after(lastLocalProfileFileUpdate))) {
-
+ if (!(localNewestProfileFile == null || lastLocalProfileFileUpdate == null
+ || localNewestProfileFile.getLastUpdate().after(lastLocalProfileFileUpdate))) {
+
return;
}
-
+
Date newDate = new Date();
ProfileFile localProfileFile = new ProfileFile(profile.getRepository(), config.getMachineName(), newDate);
@@ -408,13 +421,12 @@
// Update
lastLocalProfileFileUpdate = newDate;
- }
- catch (IOException e) {
+ } catch (IOException e) {
logger.log(Level.SEVERE, "ERROR while uploading local profile.", e);
// TODO do something
}
}
-
+
private void updateRemoteProfiles() throws RemoteFileNotFoundException, StorageException {
/// Download new user profiles
Collection<ProfileFile> remoteProfileFiles = fileList.getRemoteProfileFiles().values();
@@ -426,7 +438,7 @@
if (client.getLastProfileUpdate() != null && !f.getLastUpdate().after(client.getLastProfileUpdate())) {
continue;
}
-
+
if (logger.isLoggable(Level.INFO)) {
logger.log(Level.INFO, "Downloading profile of client ''{0}'' ...", client.getMachineName());
}
@@ -440,68 +452,67 @@
client.setLastProfileUpdate(new Date());
client.setUserName(f.getUserName());
client.merge();
- }
- catch (IOException e) {
+ } catch (IOException e) {
logger.log(Level.SEVERE, "ERROR while downloading remote profile of " + client.getMachineName() + ".", e);
// TODO do something
- }
+ }
}
}
-
+
private void commitLocalImage() throws RemoteFileNotFoundException, StorageException {
// Upload local image (if updated)
ImageFile localNewestImageFile = fileList.getNewestImageFile();
-
+
// Skip if no update needed
- if (!(localNewestImageFile == null || lastLocalImageFileUpdate == null ||
- localNewestImageFile.getLastUpdate().after(lastLocalImageFileUpdate))) {
-
+ if (!(localNewestImageFile == null || lastLocalImageFileUpdate == null
+ || localNewestImageFile.getLastUpdate().after(lastLocalImageFileUpdate))) {
+
return;
}
-
+
return;
/*
Date newDate = new Date();
ImageFile localImageFile = new ImageFile(profile.getRepository(), config.getMachineName(), newDate);
if (lastLocalImageFileUpdate == null || localNewestImageFile == null || localNewestImageFile.getLastUpdate().after(lastLocalImageFileUpdate)) {
- // If 'No Image' is selected, OR (!) if the local image file is not there
- if (config.getUserImageType() == Config.UserImageType.None
- || config.getUserImageFile() == null || !config.getUserImageFile().exists()) {
-
- if (localNewestImageFile != null) {
- transfer.delete(localNewestImageFile);
- }
-
- lastLocalImageFileUpdate = new Date();
- } else {
- try {
- File originalImageFile = null;
-
- if (config.getUserImageType() == Config.UserImageType.System) {
- originalImageFile = config.getCache().createTempFile("image-" + config.getMachineName());
- Image image = ImageUtil.getScaledImage(config.getUserImage(), Constants.PROFILE_IMAGE_MAX_WIDTH, Constants.PROFILE_IMAGE_MAX_HEIGHT);
- ImageIO.write(ImageUtil.toBufferedImage(image), "png", originalImageFile);
- }
- else if (config.getUserImageType() == Config.UserImageType.Other) {
- originalImageFile = config.getUserImageFile();
- }
-
- // TODO encrypt
-
- Date newDate = new Date();
- transfer.upload(originalImageFile, new ImageFile(profile.getRepository(), config.getMachineName(), newDate));
-
- // Update cached value
- lastLocalImageFileUpdate = newDate;
- } catch (IOException e) {
- // TODO do something
- logger.log(Level.WARNING, "Error while uploading local image.", e);
- }
- }
+ // If 'No Image' is selected, OR (!) if the local image file is not there
+ if (config.getUserImageType() == Config.UserImageType.None
+ || config.getUserImageFile() == null || !config.getUserImageFile().exists()) {
+
+ if (localNewestImageFile != null) {
+ transfer.delete(localNewestImageFile);
+ }
+
+ lastLocalImageFileUpdate = new Date();
+ } else {
+ try {
+ File originalImageFile = null;
+
+ if (config.getUserImageType() == Config.UserImageType.System) {
+ originalImageFile = config.getCache().createTempFile("image-" + config.getMachineName());
+ Image image = ImageUtil.getScaledImage(config.getUserImage(), Constants.PROFILE_IMAGE_MAX_WIDTH, Constants.PROFILE_IMAGE_MAX_HEIGHT);
+ ImageIO.write(ImageUtil.toBufferedImage(image), "png", originalImageFile);
+ }
+ else if (config.getUserImageType() == Config.UserImageType.Other) {
+ originalImageFile = config.getUserImageFile();
+ }
+
+ // TODO encrypt
+
+ Date newDate = new Date();
+ transfer.upload(originalImageFile, new ImageFile(profile.getRepository(), config.getMachineName(), newDate));
+
+ // Update cached value
+ lastLocalImageFileUpdate = newDate;
+ } catch (IOException e) {
+ // TODO do something
+ logger.log(Level.WARNING, "Error while uploading local image.", e);
+ }
+ }
}*/
}
-
+
private void updateRemoteImages() {
// Download new user images (if changed)
Map<String, ImageFile> remoteImageFiles = fileList.getRemoteImageFiles();
@@ -513,11 +524,11 @@
if (client.getLastImageUpdate() != null && !f.getLastUpdate().after(client.getLastImageUpdate())) {
continue;
}
-
+
if (logger.isLoggable(Level.INFO)) {
logger.log(Level.INFO, "Downloading image of client ''{0}'' ...", client.getMachineName());
}
-
+
// Download
try {
File tempRemoteImage = config.getCache().createTempFile(f.getName());
@@ -530,8 +541,7 @@
// Apply and persist
client.setLastImageUpdate(new Date());
client.merge();
- }
- catch (Exception e) {
+ } catch (Exception e) {
if (logger.isLoggable(Level.SEVERE)) {
logger.log(Level.SEVERE, "ERROR while downloading remote image of " + client.getMachineName() + ".", e);
}
@@ -541,47 +551,60 @@
private void deleteOldUpdateFiles() {
TreeMap<Long, UpdateFile> localUpdatesMap = fileList.getLocalUpdateFiles();
-
+
while (localUpdatesMap.size() > 1) {
- Entry<Long, UpdateFile> firstEntry = localUpdatesMap.pollFirstEntry();
+ Entry<Long, UpdateFile> firstEntry = localUpdatesMap.pollFirstEntry();
try {
- transfer.delete(firstEntry.getValue());
- }
- catch (Exception e) {
+ transfer.delete(firstEntry.getValue());
+ } catch (Exception e) {
logger.log(Level.WARNING, "Could not delete old update file", e);
}
}
}
-
+
private void deleteOldProfileFiles() {
TreeMap<Long, ProfileFile> localUpdatesMap = fileList.getLocalProfileFiles();
-
+
while (localUpdatesMap.size() > 1) {
- Entry<Long, ProfileFile> firstEntry = localUpdatesMap.pollFirstEntry();
+ Entry<Long, ProfileFile> firstEntry = localUpdatesMap.pollFirstEntry();
try {
- transfer.delete(firstEntry.getValue());
- }
- catch (Exception e) {
+ transfer.delete(firstEntry.getValue());
+ } catch (Exception e) {
logger.log(Level.WARNING, "Could not delete old profile file", e);
}
}
}
-
+
private void deleteOldImageFiles() {
TreeMap<Long, ImageFile> localUpdatesMap = fileList.getLocalImageFiles();
-
+
while (localUpdatesMap.size() > 1) {
- Entry<Long, ImageFile> firstEntry = localUpdatesMap.pollFirstEntry();
+ Entry<Long, ImageFile> firstEntry = localUpdatesMap.pollFirstEntry();
try {
- transfer.delete(firstEntry.getValue());
- }
- catch (Exception e) {
+ transfer.delete(firstEntry.getValue());
+ } catch (Exception e) {
logger.log(Level.WARNING, "Could not delete old image file", e);
}
}
}
+ @Override
+ public void load(ConfigNode node) throws ConfigException {
+ if (node != null) {
+ ConfigNode remote = node.findChildByName("remote");
+ Integer inter = remote.getInteger("interval");
+ if (inter != null) {
+ interval = inter;
+ }
+ }
+ }
+
+ @Override
+ public void save(ConfigNode node) {
+ ConfigNode remote = node.findOrCreateChildByXpath("remote", "remote");
+ remote.setProperty("interval", interval);
+ }
}
Follow ups