changeset 7766:945d25675a32

merged.
author Raimund Renkert <rrenkert@intevation.de>
date Thu, 27 Feb 2014 16:45:36 +0100
parents 03cb95071d21 (current diff) 819528f6fabb (diff)
children 754ed00963d6 19472d3877d6
files
diffstat 15 files changed, 180 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/doc/howto_commit_windows.txt	Thu Feb 27 16:45:36 2014 +0100
@@ -0,0 +1,89 @@
+Diese Anleitung erklärt wie man Änderungen an der Codebasis von
+D4E-River unter Windows durchführen kann. In dieser Anleitung
+wird dazu TortoiseHg und Putty verwendet.
+
+Hintergrund:
+D4E-River wird mit dem Versionskontrollsystem Mercurial
+( http://de.wikipedia.org/wiki/Mercurial ) verwaltet und ist auf
+der Plattform "Wald" ( http://wald.intevation.org/ ) gehostet.
+TortoiseHg ist eine Windows Explorer Erweiterung um ein graphisches
+Frontend für Mercurial zu bieten.
+
+
+Schritte 1-3 sind einmalig auszuführen. Schritt 4 muss immer wenn
+man eine Änderung durchführen möchte geschehen.
+
+Schritt 1: Registrieren eines Benutzerkontos auf wald.intevation.de
+
+* Browser öffnen auf Seite https://www.wald.intevation.org/account/register.php
+  Das zugehörige Wurzelzertifikat kann unter https://ssl.intevation.de
+  (Root CA 2010) beschafft werden.
+* Accountdetails eintragen (Nur Felder mit * müssen beachtet werden)
+* Registrieren drücken.
+-> Ihnen wird eine E-Mail mit einem Link zur Bestätigung gesendet.
+* Link aus der E-Mail öffnen.
+* Unter: https://wald.intevation.org/projects/dive4elements/ einen Beitrittsgesuch
+  (Link dafür ist Rechts unten auf der Seite unter den Mitgliedern)
+  Knappen Kommentar einfügen: "Beitrittsgesuch Frau Mustermann" o.Ä.
+-> Ein Admin in diesem Projekt muss Sie nun manuell freischalten.
+
+Schritt 2: SSH Schlüssel erstellen und in Wald hinterlegen
+
+(Dieser Teil geht davon aus das Putty bereits installiert ist)
+* Puttygen starten
+* "Generate a public/private key pair" Ausführen
+* ggf. Einen Key Comment z.B. "Wald Schluessel" angeben.
+* ggf. Eine passphrase angeben
+* Save private key -> Schlüssel abspeichern z.B: c:\Benutzer\name\wald-schluessel.ppk
+* Save public key -> Öffentlichen Schlüssel abspeichern z.B: c:\Benutzer\name\wald-schluessel-pub.txt
+* Kopieren Sie den Inhalt des Bereichs "Public key for pasting into OpenSSH authorized_keys file:"
+* Fügen Sie den öffentlichen Schlüssel in dem Eingabefeld unter:
+  http://wald.intevation.org/account/editsshkeys.php
+  ein.
+* Speichern des Schlüssels durch drücken auf den Button "Aktualisierung".
+
+! Achtung: Es kann bis zu einer Stunde dauern bis der Schlüssel im System
+  synchronisiert ist.
+
+
+Schritt 3: TortoiseHg (Software zur Versionskontrolle) installieren
+* Unter: http://tortoisehg.bitbucket.org/ TortoiseHg herunterladen
+  Die passende Version hängt von der Architektur ihres Systems (32/64-Bit ab)
+* TortoiseHg installieren. Die Standardoptionen sind ausreichend.
+* Fügen Sie nun den Privaten Schlüssel den Sie in Schritt 2 generiert haben
+  in Pageant ein.
+  (Wenn Pageant noch nicht installiert ist kann auch der Pageant aus TortoiseHg
+  verwendet werden. z.B. Installiert in (C:\Programme\TortoiseHg\Pageant.exe)
+* Navigieren Sie im Windows Explorer in ein Verzeichnis in welchem
+  das D4E-River Repository angelegt werden soll.
+* Rechtsklick im Windows Explorer zeigt nun neue Kontext Optionen für TortoiseHg.
+  TortoiseHg -> clone
+* Tragen Sie als Quelle ssh://<ihrbenutzername>@scm.wald.intevation.org/hg/dive4elements/river/
+  ein. Als Ziel einen Ordnernamen für ihr Lokales Repository.
+-> Bei der ersten Verbindung werden Sie darauf hingewiesen das der Host Key des Servers
+   noch unbekannt ist. Der RSA Fingerprint von Wald ist:
+   24:d2:13:1f:fa:02:54:f1:79:4f:5d:a0:aa:d3:ed
+
+Tritt kein Fehler auf haben Sie nun einen Authentifizierten Klon des D4E-River
+Repositories.
+
+
+Schritt 4: Änderungen durchführen.
+* Sicherstellen das Pageant gestartet ist und den Key enthält.
+* Aktualisieren der lokalen Kopie im Ordner des Repositories
+  - Rechtsklick -> TortoiseHg -> Synchronize
+  - Auswählen "Nach dem Abfurfen" -> Update
+  - Eingehende Änderungen von der ausgewählten URL abrufen
+* Änderungen an den Dateien durchführen.
+* Rechtsklick auf die geänderte Datei -> Hg Commit...
+* Eine Versionsmeldung im Fenster die knapp zusammenfasst was / warum
+  Sie etwas geändert haben. (Am liebsten in Englisch)
+  z.B.: "Corrected usage of the word 'fixation' in english translations"
+* Änderungen zum Server übertragen
+ - Rechtsklick -> TortoiseHg -> Synchronize
+ - Ausgehende Änderungen an die ausgewählte URL übertragen
+
+Hinweis: Beim ersten "Commit" werden Sie gebeten sich zu Identifizieren.
+Im darauffolgenden Einstellungs Fenster müssen Sie dann einen Benutzernamen
+Angeben. Dieser sollte das Format vorname nachname <email> haben.
+z.B.: Andre Heinecke <aheinecke@intevation.de>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/D4EArtifact.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/D4EArtifact.java	Thu Feb 27 16:45:36 2014 +0100
@@ -219,6 +219,16 @@
         }
         setCurrentState(states.get(0));
 
+        handleInitModel(data, context, callMeta);
+
+        filterFacets = buildFilterFacets(data);
+
+        extractOut(data);
+    }
+
+    protected void handleInitModel(Document data, Object context, CallMeta callMeta) {
+        RiverContext flysContext = RiverUtils.getFlysContext(context);
+
         String model = XMLUtils.xpathString(
             data,
             XPATH_MODEL_ARTIFACT,
@@ -235,10 +245,6 @@
                 log.error(adbe, adbe);
             }
         }
-
-        filterFacets = buildFilterFacets(data);
-
-        extractOut(data);
     }
 
     protected void extractOut(Document data) {
@@ -1607,7 +1613,7 @@
             String      out     = entry.getKey();
             List<Facet> filters = entry.getValue();
 
-            log.debug("There are " + filters.size() + " filters for: " +out);
+            log.debug("There are " + filters.size() + " filters for: " + out);
 
             for (Facet filter: filters) {
                 log.debug("  filter: " + filter.getName());
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/MapArtifact.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/MapArtifact.java	Thu Feb 27 16:45:36 2014 +0100
@@ -52,6 +52,9 @@
         List<State> states = getStates(context);
 
         setCurrentState(states.get(0));
+
+        // Needed if cloning another artifact.
+        super.handleInitModel(data, context, callmeta);
     }
 
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/map/WMSDBLayerFacet.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/map/WMSDBLayerFacet.java	Thu Feb 27 16:45:36 2014 +0100
@@ -9,6 +9,7 @@
 package org.dive4elements.river.artifacts.model.map;
 
 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
+import org.dive4elements.artifactdatabase.state.Facet;
 
 
 public class WMSDBLayerFacet extends WMSLayerFacet {
@@ -110,5 +111,27 @@
     public boolean isQueryable() {
         return true;
     }
+
+    /** Clone Facet-bound data. */
+    protected void cloneData(WMSDBLayerFacet copy) {
+        super.cloneData(copy);
+        copy.setFilter(this.getFilter());
+        copy.setData(this.getData());
+        copy.setGeometryType(this.getGeometryType());
+        copy.setConnection(this.getConnection());
+        copy.setConnectionType(this.getConnectionType());
+        copy.setLabelItem(this.getLabelItem());
+    }
+
+    /** Copy deeply. */
+    @Override
+    public Facet deepCopy() {
+        WMSDBLayerFacet copy = new WMSDBLayerFacet();
+        copy.set(this);
+
+        cloneData(copy);
+
+        return copy;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/map/WMSLayerFacet.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/map/WMSLayerFacet.java	Thu Feb 27 16:45:36 2014 +0100
@@ -173,18 +173,31 @@
     }
 
 
+    /** Clone facet-bound data. */
+    protected void cloneData(WMSLayerFacet copy) {
+        copy.type    = type;
+        copy.stateId = stateId;
+        copy.hash    = hash;
+
+        if (layers != null) {
+            copy.layers  = new ArrayList<String>(layers);
+        }
+        else {
+            copy.layers = new ArrayList<String>();
+        }
+
+        copy.originalExtent = originalExtent;
+        copy.url     = url;
+        copy.extent  = extent;
+        copy.srid    = srid;
+    }
+
     @Override
     public Facet deepCopy() {
         WMSLayerFacet copy = new WMSLayerFacet();
         copy.set(this);
 
-        copy.type    = type;
-        copy.layers  = new ArrayList<String>(layers);
-        copy.stateId = stateId;
-        copy.hash    = hash;
-        copy.url     = url;
-        copy.extent  = extent;
-        copy.srid    = srid;
+        cloneData(copy);
 
         return copy;
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/map/WSPLGENLayerFacet.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/map/WSPLGENLayerFacet.java	Thu Feb 27 16:45:36 2014 +0100
@@ -9,6 +9,7 @@
 package org.dive4elements.river.artifacts.model.map;
 
 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
+import org.dive4elements.artifactdatabase.state.Facet;
 
 public class WSPLGENLayerFacet
 extends      WMSLayerFacet
@@ -50,5 +51,17 @@
     public boolean isQueryable() {
         return true;
     }
+
+
+    /** Copy deeply. */
+    @Override
+    public Facet deepCopy() {
+        WSPLGENLayerFacet copy = new WSPLGENLayerFacet();
+        copy.set(this);
+
+        cloneData(copy);
+
+        return copy;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/backend/doc/schema/oracle.sql	Thu Feb 27 16:43:24 2014 +0100
+++ b/backend/doc/schema/oracle.sql	Thu Feb 27 16:45:36 2014 +0100
@@ -262,7 +262,7 @@
 
 CREATE TABLE rivers (
     id                  NUMBER(38,0) NOT NULL,
-    uuid                CHAR(37 CHAR),
+    model_uuid          CHAR(36 CHAR) UNIQUE,
     official_number     NUMBER(38,0),
     km_up               NUMBER(38,0) DEFAULT 0 NOT NULL,
     name                VARCHAR2(255) NOT NULL UNIQUE,
--- a/backend/doc/schema/postgresql.sql	Thu Feb 27 16:43:24 2014 +0100
+++ b/backend/doc/schema/postgresql.sql	Thu Feb 27 16:45:36 2014 +0100
@@ -12,7 +12,7 @@
 
 CREATE TABLE rivers (
     id              int PRIMARY KEY NOT NULL,
-    uuid            CHAR(37),
+    model_uuid      CHAR(36)        UNIQUE,
     official_number int8,
     name            VARCHAR(256)    NOT NULL UNIQUE,
     km_up           BOOLEAN         NOT NULL DEFAULT true,
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java	Thu Feb 27 16:45:36 2014 +0100
@@ -228,6 +228,8 @@
 
     String wrongFormat();
 
+    String toShouldNotBeNegative();
+
     String atLeastOneValue();
 
     String missingInput();
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Thu Feb 27 16:45:36 2014 +0100
@@ -129,6 +129,7 @@
 unitDiffInM = Diff [m]:
 unitLocation = km
 wrongFormat = Wrong format
+toShouldNotBeNegative = Field 'to' has to contain a positive value.
 atLeastOneValue = You need to insert at least one value.
 missingInput = You need to enter a value.
 too_many_values = Only one value allowed
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Thu Feb 27 16:45:36 2014 +0100
@@ -129,6 +129,7 @@
 unitDiffInM = Diff [m]:
 unitLocation = km
 wrongFormat = Falsches Format
+toShouldNotBeNegative = Feld 'bis' muss einen positiven Wert enthalten.
 atLeastOneValue = Sie m\u00fcssen mindestens einen Wert eingeben.
 missingInput = Sie m\u00fcssen einen Wert eingeben.
 too_many_values = Nur ein Eingabewert erlaubt
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties	Thu Feb 27 16:45:36 2014 +0100
@@ -130,6 +130,7 @@
 unitDiffInM = Diff [m]:
 unitLocation = km
 wrongFormat = Wrong format
+toShouldNotBeNegative = Field 'to' has to contain a positive value.
 atLeastOneValue = You need to insert at least one value.
 missingInput = You need to enter a value.
 too_many_values = Only one value allowed
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java	Thu Feb 27 16:45:36 2014 +0100
@@ -423,6 +423,7 @@
     }
 
 
+    /** Gets the double from default in data, null if none. */
     protected double getDefaultValue(Data data)
     throws NumberFormatException
     {
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleRangePanel.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DoubleRangePanel.java	Thu Feb 27 16:45:36 2014 +0100
@@ -54,6 +54,10 @@
     public DoubleRangePanel() {
     }
 
+    public FloatItem getToItem() {
+        return toItem;
+    }
+
 
     /**
      * Creates a new form with a single input field that displays an array of
@@ -153,7 +157,6 @@
         stepItem.setValue(f.format(steps));
     }
 
-
     public boolean validateForm() {
         try {
             return
@@ -171,6 +174,9 @@
      * there are values that doesn't represent a valid float, an error is
      * displayed.
      *
+     * Also if negativeToAllowed is false, an error is registered if
+     * the 'to' field contains a negative value.
+     *
      * @param item The FormItem.
      */
     @SuppressWarnings("unchecked")
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WaterlevelGroundPanel.java	Thu Feb 27 16:43:24 2014 +0100
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WaterlevelGroundPanel.java	Thu Feb 27 16:45:36 2014 +0100
@@ -8,7 +8,7 @@
 
 package org.dive4elements.river.client.client.ui;
 
-import java.util.List;
+import com.smartgwt.client.widgets.form.validator.FloatRangeValidator;
 
 public class WaterlevelGroundPanel extends DistancePanel {
 
@@ -21,6 +21,11 @@
 
     public WaterlevelGroundPanel() {
         super("left");
+
+        FloatRangeValidator frv = new FloatRangeValidator();
+        frv.setMin(0f);
+        frv.setMax(Float.MAX_VALUE);
+        distancePanel.getToItem().setValidators(frv);
     }
 
 
@@ -125,16 +130,5 @@
         // We don't need a helper panel here. But we have to override this
         // method to avoid the table creation in the parent class.
     }
-
-    @Override
-    protected void validateTo(List<String> errors) {
-        double to = distancePanel.getTo();
-
-        if (to < 0d) {
-            distancePanel.setTo(max);
-            errors.add(MSG.negative_values_not_allowed_for_to());
-        }
-        super.validateTo(errors);
-    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org