Commit 31dcab90 authored by Uwe Peuker's avatar Uwe Peuker

Aktualisierung des Rahmenwerksspeichers passiert jetzt nicht mehr im...

Aktualisierung des Rahmenwerksspeichers passiert jetzt nicht mehr im Updater-Thread sondern in einem Job, fixes #21
parent 6f3455b4
...@@ -6,7 +6,8 @@ Produkt Rahmenwerk ...@@ -6,7 +6,8 @@ Produkt Rahmenwerk
## Noch nicht veröffentlicht ## Noch nicht veröffentlicht
- derzeit keine Änderungen - Wenn alte und neue Einstellungen leer waren, wurden diese potentiell in ein einer Endlosschleife aktualisiert
- Update der Einstellungen erfolgt in einem Hintergrundthread, weil potentiell ClientDavInterface#getData aufgerufen werden muss (Fixes #21)
## Version 3.5.0 - Release 2020-05-28 ## Version 3.5.0 - Release 2020-05-28
- Kompatibilität mit aktueller Eclipse-Version ( https://gitlab.nerz-ev.de/ERZ/RW_de.bsvrz.buv.rw/-/issues/12 ) - Kompatibilität mit aktueller Eclipse-Version ( https://gitlab.nerz-ev.de/ERZ/RW_de.bsvrz.buv.rw/-/issues/12 )
......
# Rahmenwerk für eine Bedienoberfläche der NERZ-Software # Rahmenwerk für eine Bedienoberfläche der NERZ-Software
Das Projekt enthält das Rahmenwerk auf Basis der Eclipse 2019-06. Das Projekt enthält das Rahmenwerk auf Basis der Eclipse 2020-03.
## Updateseite ## Updateseite
......
...@@ -2,7 +2,7 @@ Manifest-Version: 1.0 ...@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: Basisbibliothek Bundle-Name: Basisbibliothek
Bundle-SymbolicName: de.bsvrz.buv.rw.basislib;singleton:=true Bundle-SymbolicName: de.bsvrz.buv.rw.basislib;singleton:=true
Bundle-Version: 3.5.0.qualifier Bundle-Version: 3.5.1.qualifier
Bundle-ClassPath: . Bundle-ClassPath: .
Bundle-Activator: de.bsvrz.buv.rw.basislib.internal.RwBasisLibActivator Bundle-Activator: de.bsvrz.buv.rw.basislib.internal.RwBasisLibActivator
Bundle-Vendor: BitCtrl Systems GmbH, Swarco Traffic Systems GmbH Bundle-Vendor: BitCtrl Systems GmbH, Swarco Traffic Systems GmbH
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<feature <feature
id="de.bsvrz.buv.rw.rw.berechtigungen.feature" id="de.bsvrz.buv.rw.rw.berechtigungen.feature"
label="%featureName" label="%featureName"
version="3.5.0.qualifier" version="3.5.1.qualifier"
provider-name="%featureProvider"> provider-name="%featureProvider">
<description> <description>
......
...@@ -2,7 +2,7 @@ Manifest-Version: 1.0 ...@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: Standard-Rahmenwerk-Berechtigungen Bundle-Name: Standard-Rahmenwerk-Berechtigungen
Bundle-SymbolicName: de.bsvrz.buv.rw.rw.berechtigungen;singleton:=true Bundle-SymbolicName: de.bsvrz.buv.rw.rw.berechtigungen;singleton:=true
Bundle-Version: 3.5.0.qualifier Bundle-Version: 3.5.1.qualifier
Bundle-Activator: de.bsvrz.buv.rw.rw.berechtigungen.RwBerechtigungen Bundle-Activator: de.bsvrz.buv.rw.rw.berechtigungen.RwBerechtigungen
Bundle-Vendor: BitCtrl Systems GmbH Bundle-Vendor: BitCtrl Systems GmbH
Require-Bundle: org.eclipse.ui;bundle-version="3.109.0", Require-Bundle: org.eclipse.ui;bundle-version="3.109.0",
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<feature <feature
id="de.bsvrz.buv.rw.rw.core.feature" id="de.bsvrz.buv.rw.rw.core.feature"
label="%featureName" label="%featureName"
version="3.5.0.qualifier" version="3.5.1.qualifier"
provider-name="%featureProvider"> provider-name="%featureProvider">
<description> <description>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<feature <feature
id="de.bsvrz.buv.rw.rw.einstellungen.feature" id="de.bsvrz.buv.rw.rw.einstellungen.feature"
label="%featureName" label="%featureName"
version="3.5.0.qualifier" version="3.5.1.qualifier"
provider-name="%featureProvider"> provider-name="%featureProvider">
<description> <description>
......
...@@ -2,7 +2,7 @@ Manifest-Version: 1.0 ...@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name Bundle-Name: %Bundle-Name
Bundle-SymbolicName: de.bsvrz.buv.rw.rw.einstellungen;singleton:=true Bundle-SymbolicName: de.bsvrz.buv.rw.rw.einstellungen;singleton:=true
Bundle-Version: 3.5.0.qualifier Bundle-Version: 3.5.1.qualifier
Bundle-Activator: de.bsvrz.buv.rw.rw.einstellungen.RwEinstellungenActivator Bundle-Activator: de.bsvrz.buv.rw.rw.einstellungen.RwEinstellungenActivator
Require-Bundle: org.eclipse.ui;bundle-version="3.109.0", Require-Bundle: org.eclipse.ui;bundle-version="3.109.0",
org.eclipse.core.runtime;bundle-version="3.14.0", org.eclipse.core.runtime;bundle-version="3.14.0",
......
...@@ -36,6 +36,8 @@ import javax.xml.parsers.ParserConfigurationException; ...@@ -36,6 +36,8 @@ import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParserFactory;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
...@@ -143,11 +145,14 @@ class BenutzerNetzSpeicher extends NetzSpeicher implements ClientReceiverInterfa ...@@ -143,11 +145,14 @@ class BenutzerNetzSpeicher extends NetzSpeicher implements ClientReceiverInterfa
@Override @Override
public void update(ResultData[] results) { public void update(ResultData[] results) {
for (final ResultData result : results) { Job.create("Update Rahmenwerks - Benutzerspeicher", (monitor) -> {
if (result.hasData()) { for (final ResultData result : results) {
liesEinstellungen(result); if (result.hasData()) {
liesEinstellungen(result);
}
} }
} return Status.OK_STATUS;
}).schedule();;
} }
@Override @Override
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
* Fax: +49-341-49067-15 * Fax: +49-341-49067-15
* mailto: support@bitctrl.de * mailto: support@bitctrl.de
* *
* Partly inspired by the original Rahmenwerk created by Dambach Werke GmbH. * Partly inspired by the original Rahmenwerk created by Dambach Werke GmbH.
*/ */
package de.bsvrz.buv.rw.rw.einstellungen; package de.bsvrz.buv.rw.rw.einstellungen;
...@@ -40,6 +40,9 @@ import java.util.Queue; ...@@ -40,6 +40,9 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import de.bsvrz.buv.rw.basislib.Rahmenwerk; import de.bsvrz.buv.rw.basislib.Rahmenwerk;
import de.bsvrz.buv.rw.basislib.dav.DavVerbindungsEvent; import de.bsvrz.buv.rw.basislib.dav.DavVerbindungsEvent;
import de.bsvrz.buv.rw.basislib.dav.DavVerbindungsListener; import de.bsvrz.buv.rw.basislib.dav.DavVerbindungsListener;
...@@ -102,23 +105,30 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv ...@@ -102,23 +105,30 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj) {
return true; return true;
if (obj == null) }
if (obj == null) {
return false; return false;
if (getClass() != obj.getClass()) }
if (getClass() != obj.getClass()) {
return false; return false;
}
final Anmeldung other = (Anmeldung) obj; final Anmeldung other = (Anmeldung) obj;
if (dataDesc == null) { if (dataDesc == null) {
if (other.dataDesc != null) if (other.dataDesc != null) {
return false; return false;
} else if (!dataDesc.equals(other.dataDesc)) }
} else if (!dataDesc.equals(other.dataDesc)) {
return false; return false;
}
if (systemObject == null) { if (systemObject == null) {
if (other.systemObject != null) if (other.systemObject != null) {
return false; return false;
} else if (!systemObject.equals(other.systemObject)) }
} else if (!systemObject.equals(other.systemObject)) {
return false; return false;
}
return true; return true;
} }
} }
...@@ -347,11 +357,14 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv ...@@ -347,11 +357,14 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv
@Override @Override
public void update(ResultData[] results) { public void update(ResultData[] results) {
for (final ResultData result : results) { Job.create("Update Rahmenwerks - Netzspeicher", monitor -> {
if (result.hasData()) { for (final ResultData result : results) {
liesEinstellungen(result); if (result.hasData()) {
liesEinstellungen(result);
}
} }
} return Status.OK_STATUS;
}).schedule();;
} }
protected final void liesEinstellungen(ResultData result) { protected final void liesEinstellungen(ResultData result) {
...@@ -366,6 +379,7 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv ...@@ -366,6 +379,7 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv
} else if (ATG_RAHMENWERK_EINSTELLUNGEN.equals(pid)) { } else if (ATG_RAHMENWERK_EINSTELLUNGEN.equals(pid)) {
final Array einstellungen = result.getData().getArray("Einstellungen"); final Array einstellungen = result.getData().getArray("Einstellungen");
if (einstellungen.getLength() == 0) { if (einstellungen.getLength() == 0) {
aktualisiereEinstellungen(getNeuesSpeicherObjekt(rahmenwerk)); aktualisiereEinstellungen(getNeuesSpeicherObjekt(rahmenwerk));
} else { } else {
ladeEinstellungen(result.getData()); ladeEinstellungen(result.getData());
...@@ -410,6 +424,17 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv ...@@ -410,6 +424,17 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv
protected abstract void ladeAlteEinstellungen(Data daten); protected abstract void ladeAlteEinstellungen(Data daten);
/**
* Aktualisiert die Einstellungen aus den alten Einstellungsparametern des
* Rahmenwerks.
*
* Die Funktion wird normalerweise nur aufgerufen, wenn die neuen Einstellungen
* leer sind. Wenn alten Einstellungen ebenfalls leer sind, werden diese nicht
* zurückgeschrieben, da es ansonsten zum zyklischen Aufruf der Funktion kommt.
*
* @param neuesObjekt das Objekt an dem die neuen Einstellungen gespeichert
* werden
*/
protected final void aktualisiereEinstellungen(SystemObject neuesObjekt) { protected final void aktualisiereEinstellungen(SystemObject neuesObjekt) {
final ClientDavInterface davVerbindung = rahmenwerk.getDavVerbindung(); final ClientDavInterface davVerbindung = rahmenwerk.getDavVerbindung();
if (davVerbindung == null) { if (davVerbindung == null) {
...@@ -439,6 +464,10 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv ...@@ -439,6 +464,10 @@ abstract class NetzSpeicher extends EinstellungsSpeicher implements ClientReceiv
final Data neueDaten = davVerbindung.createData(atg); final Data neueDaten = davVerbindung.createData(atg);
final Collection<Einstellung> einstellungen = getEinstellungen(); final Collection<Einstellung> einstellungen = getEinstellungen();
if (einstellungen.isEmpty()) {
return;
}
final Array array = neueDaten.getArray("Einstellungen"); final Array array = neueDaten.getArray("Einstellungen");
array.setLength(einstellungen.size()); array.setLength(einstellungen.size());
int idx = 0; int idx = 0;
......
...@@ -2,7 +2,7 @@ Manifest-Version: 1.0 ...@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name Bundle-Name: %Bundle-Name
Bundle-SymbolicName: de.bsvrz.buv.rw.rw;singleton:=true Bundle-SymbolicName: de.bsvrz.buv.rw.rw;singleton:=true
Bundle-Version: 3.5.0.qualifier Bundle-Version: 3.5.1.qualifier
Bundle-ClassPath: ., Bundle-ClassPath: .,
de.bsvrz.buv.rw.rw.jar de.bsvrz.buv.rw.rw.jar
Bundle-Activator: de.bsvrz.buv.rw.rw.RahmenwerkActivator Bundle-Activator: de.bsvrz.buv.rw.rw.RahmenwerkActivator
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
</property> </property>
<property <property
name="aboutText" name="aboutText"
value="Rahmenwerk 3 (Eclipse 2020-03 basiert), Version 3.5.0&#x0A;&#x0A;Realisiert im Auftrag des Landes Baden-Württemberg,&#x0A;Regierungspräsidium Tübingen, Landesstelle für&#x0A;Straßentechnik durch BitCtrl Systems GmbH"> value="Rahmenwerk 3 (Eclipse 2020-03 basiert), Version 3.5.1&#x0A;&#x0A;Realisiert im Auftrag des Landes Baden-Württemberg,&#x0A;Regierungspräsidium Tübingen, Landesstelle für&#x0A;Straßentechnik durch BitCtrl Systems GmbH">
</property> </property>
<property <property
name="windowImages" name="windowImages"
......
...@@ -47,6 +47,7 @@ import javax.xml.parsers.ParserConfigurationException; ...@@ -47,6 +47,7 @@ import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Creatable; import org.eclipse.e4.core.di.annotations.Creatable;
...@@ -120,16 +121,21 @@ public class RwProcessor { ...@@ -120,16 +121,21 @@ public class RwProcessor {
@Override @Override
public void verbindungHergestellt(final DavVerbindungsEvent event) { public void verbindungHergestellt(final DavVerbindungsEvent event) {
for (final MWindow modelWindow : application.getChildren()) {
final IWorkbenchWindow iWorkbenchWindow = modelWindow.getContext().get(IWorkbenchWindow.class); Job job = UIJob.create("Verbindung herstellen....", (monitor) -> {
setMainMenu(modelWindow, iWorkbenchWindow); for (final MWindow modelWindow : application.getChildren()) {
if (modelWindow instanceof MTrimmedWindow) { final IWorkbenchWindow iWorkbenchWindow = modelWindow.getContext().get(IWorkbenchWindow.class);
final MTrimmedWindow trimmedWindow = (MTrimmedWindow) modelWindow; setMainMenu(modelWindow, iWorkbenchWindow);
setRwStatusLeiste(trimmedWindow, iWorkbenchWindow); if (modelWindow instanceof MTrimmedWindow) {
setRwSymbolLeiste(trimmedWindow, iWorkbenchWindow); final MTrimmedWindow trimmedWindow = (MTrimmedWindow) modelWindow;
setRwStatusLeiste(trimmedWindow, iWorkbenchWindow);
setRwSymbolLeiste(trimmedWindow, iWorkbenchWindow);
}
modelWindow.setToBeRendered(true);
} }
modelWindow.setToBeRendered(true); return Status.OK_STATUS;
} });
job.schedule();
} }
@Override @Override
...@@ -139,21 +145,22 @@ public class RwProcessor { ...@@ -139,21 +145,22 @@ public class RwProcessor {
@Override @Override
public void verbindungGetrennt(final DavVerbindungsEvent event) { public void verbindungGetrennt(final DavVerbindungsEvent event) {
for (final MWindow modelWindow : application.getChildren()) { final UIJob uiJob = new UIJob("Verbindung wurde getrennt...") {
final IWorkbenchWindow iWorkbenchWindow = modelWindow.getContext().get(IWorkbenchWindow.class);
setMainMenu(modelWindow, iWorkbenchWindow);
if (modelWindow instanceof MTrimmedWindow) {
final MTrimmedWindow trimmedWindow = (MTrimmedWindow) modelWindow;
setRwStatusLeiste(trimmedWindow, iWorkbenchWindow);
setRwSymbolLeiste(trimmedWindow, iWorkbenchWindow);
}
modelWindow.setToBeRendered(true);
}
final UIJob uiJob = new UIJob("Reconnect Dialog") {
@Override @Override
public IStatus runInUIThread(final IProgressMonitor monitor) { public IStatus runInUIThread(final IProgressMonitor monitor) {
for (final MWindow modelWindow : application.getChildren()) {
final IWorkbenchWindow iWorkbenchWindow = modelWindow.getContext().get(IWorkbenchWindow.class);
setMainMenu(modelWindow, iWorkbenchWindow);
if (modelWindow instanceof MTrimmedWindow) {
final MTrimmedWindow trimmedWindow = (MTrimmedWindow) modelWindow;
setRwStatusLeiste(trimmedWindow, iWorkbenchWindow);
setRwSymbolLeiste(trimmedWindow, iWorkbenchWindow);
}
modelWindow.setToBeRendered(true);
}
final Dialog dialog = new ReconnectDialog(shell); final Dialog dialog = new ReconnectDialog(shell);
dialog.open(); dialog.open();
return Status.OK_STATUS; return Status.OK_STATUS;
...@@ -242,21 +249,21 @@ public class RwProcessor { ...@@ -242,21 +249,21 @@ public class RwProcessor {
private String ladeMenuXmlDefinition(String id) { private String ladeMenuXmlDefinition(String id) {
if( !getName(id).isEmpty()) { if (!getName(id).isEmpty()) {
return null; return null;
} }
String argument = null; String argument = null;
if( id.startsWith(MenueEditor.PARAM_STRUCT_MENULEISTE)) { if (id.startsWith(MenueEditor.PARAM_STRUCT_MENULEISTE)) {
argument = "-menueXmlDatei"; argument = "-menueXmlDatei";
} else if( id.startsWith(StatusleisteEditor.PARAM_STRUCT_STATUSLEISTE)) { } else if (id.startsWith(StatusleisteEditor.PARAM_STRUCT_STATUSLEISTE)) {
argument = "-statusXmlDatei"; argument = "-statusXmlDatei";
}else if( id.startsWith(ToolbarEditor.PARAM_STRUCT_SYMBOLLEISTE)) { } else if (id.startsWith(ToolbarEditor.PARAM_STRUCT_SYMBOLLEISTE)) {
argument = "-symbolXmlDatei"; argument = "-symbolXmlDatei";
} else { } else {
return null; return null;
} }
final ArgumentList startParameter = RahmenwerkImpl.getInstanz().getStartParameter(); final ArgumentList startParameter = RahmenwerkImpl.getInstanz().getStartParameter();
if (startParameter.hasArgument(argument)) { if (startParameter.hasArgument(argument)) {
final String fileName = startParameter.fetchArgument(argument).getValue(); final String fileName = startParameter.fetchArgument(argument).getValue();
...@@ -269,20 +276,20 @@ public class RwProcessor { ...@@ -269,20 +276,20 @@ public class RwProcessor {
} }
} }
} }
return null; return null;
} }
private static String getName(String id) { private static String getName(String id) {
int index = id.indexOf(":"); int index = id.indexOf(":");
if( index < 0) { if (index < 0) {
return ""; return "";
} }
return id.substring(index + 1); return id.substring(index + 1);
} }
@Inject @Inject
@Optional @Optional
public void onPerspectiveClose(@UIEventTopic(UIEvents.ElementContainer.TOPIC_CHILDREN) final Event event, public void onPerspectiveClose(@UIEventTopic(UIEvents.ElementContainer.TOPIC_CHILDREN) final Event event,
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>de.bsvrz.buv.rw</groupId> <groupId>de.bsvrz.buv.rw</groupId>
<artifactId>de.bsvrz.buv.rw.tycho.master</artifactId> <artifactId>de.bsvrz.buv.rw.tycho.master</artifactId>
<version>3.5.0</version> <version>3.5.1</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<artifactId>de.bsvrz.buv.rw.tycho.product</artifactId> <artifactId>de.bsvrz.buv.rw.tycho.product</artifactId>
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?pde version="3.5"?> <?pde version="3.5"?>
<product name="Rahmenwerk 3.5" uid="de.bsvrz.buv.rw" id="de.bsvrz.buv.rw.rw.product" application="de.bsvrz.buv.rw.rw.application" version="3.5.0.qualifier" useFeatures="true" includeLaunchers="true"> <product name="Rahmenwerk 3.5" uid="de.bsvrz.buv.rw" id="de.bsvrz.buv.rw.rw.product" application="de.bsvrz.buv.rw.rw.application" version="3.5.1.qualifier" useFeatures="true" includeLaunchers="true">
<aboutInfo> <aboutInfo>
<image path="/de.bsvrz.buv.rw.rw/icons/wizban/bitctrl_wizard_default.png"/> <image path="/de.bsvrz.buv.rw.rw/icons/wizban/bitctrl_wizard_default.png"/>
<text> <text>
Rahmenwerk 3 (Eclipse 2020-03 basiert), Version 3.5.0 Rahmenwerk 3 (Eclipse 2020-03 basiert), Version 3.5.1
Realisiert im Auftrag des Landes Baden-Württemberg, Realisiert im Auftrag des Landes Baden-Württemberg,
Regierungspräsidium Tübingen, Landesstelle für Regierungspräsidium Tübingen, Landesstelle für
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.bsvrz.buv.rw</groupId> <groupId>de.bsvrz.buv.rw</groupId>
<version>3.5.0</version> <version>3.5.1</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Maven Build Rahmenwerk 3.x</name> <name>Maven Build Rahmenwerk 3.x</name>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment