← Back to team overview

syncany-team team mailing list archive

Re: lp:~isak-karlsson/syncany/syncany-remote-watch-interval into lp:syncany

 

Hi Isak,

Although the syncing stuff will be briefly described in the thesis, is
not really the core of my thesis -- I'm doing that just for fun :-D
The thesis is more about optimizing the bandwidth and storage
utilization.

I'll push the code as soon as it's working. Hopefully today or tomorrow :-D

Cheers
Philipp

On Sat, Jun 18, 2011 at 1:34 AM, isakkarlsson <isak.karlsson@xxxxxxxxx> wrote:
> Hi,
>
> Sounds like a plan. When will the thesis (on the algorithm) be publised?
> Sounds like an interesting read.
>
> Regards
>
> On 06/17/2011 09:27 PM, Philipp C. Heckel wrote:
>> Hi Isak,
>>
>> Just so you know; I reviewed the code and it looks good. However, I
>> did not yet merge it into the trunk, but I already merged it in my
>> local version. It'll be in the branch with the new sync algorithm (not
>> yet published).
>>
>> Cheers,
>> Philipp
>>
>> On Thu, Jun 16, 2011 at 8:12 PM, isakkarlsson<isak.karlsson@xxxxxxxxx>  wrote:
>>> I've fixed it now.
>>>
>>> On 06/16/2011 07:31 PM, Philipp C. Heckel wrote:
>>>> While you're at it: I noticed that due to your chanes in the GUI, the
>>>> internationalization stuff (resourceBundle...) has been kicked out. It
>>>> was in the Netbeans-do-not-change block, so the editor must have
>>>> overwritten it.
>>>>
>>>> Could you by any chance try to make it work again? Maybe just
>>>> overwrite the values in the constructor of the frame:
>>>> lblXYZ.setText(resourceBundle...)
>>>>
>>>> On Thu, Jun 16, 2011 at 7:16 PM, isakkarlsson<isak.karlsson@xxxxxxxxx>    wrote:
>>>>> I'll fix the native.py script first..
>>>>>
>>>>> On 06/16/2011 05:13 PM, Philipp C. Heckel wrote:
>>>>>> I'll review this tonight and then merge it :-D
>>>>>>
>>>>>> On Thu, Jun 16, 2011 at 4:58 PM, isakkarlsson<isak.karlsson@xxxxxxxxx>      wrote:
>>>>>>> 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);
>>>>>>> +    }
>>>>>>>     }
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Mailing list: https://launchpad.net/~syncany-team
>>>>>>> Post to     : syncany-team@xxxxxxxxxxxxxxxxxxx
>>>>>>> Unsubscribe : https://launchpad.net/~syncany-team
>>>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>>
>>>>>
>>>>> --
>>>>> 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.
>>>>>
>>>>> --
>>>>> Mailing list: https://launchpad.net/~syncany-team
>>>>> Post to     : syncany-team@xxxxxxxxxxxxxxxxxxx
>>>>> Unsubscribe : https://launchpad.net/~syncany-team
>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>
>>>>
>>>
>>> --
>>> 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.
>>>
>>> --
>>> Mailing list: https://launchpad.net/~syncany-team
>>> Post to     : syncany-team@xxxxxxxxxxxxxxxxxxx
>>> Unsubscribe : https://launchpad.net/~syncany-team
>>> More help   : https://help.launchpad.net/ListHelp
>>>
>>
>
> --
> 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.
>
> --
> Mailing list: https://launchpad.net/~syncany-team
> Post to     : syncany-team@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~syncany-team
> More help   : https://help.launchpad.net/ListHelp
>

-- 
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.


References