osgi Preferences, letzter pathName

tanzverfuehrung

Bekanntes Mitglied
Ich habe eine MEthode node
Java:
public org.osgi.service.prefs.Preferences node(String pathName) {
	
		SimplePreferences value = nodeMap.get(pathName);
		
		if (value == null) {
			value = new SimplePreferences();
			nodeMap.put(pathName, value);
		}
		return value;
		}

wo der path name ausgeben werden soll!
nun das klappt soweit!
jetz will ich aber immer nur den letzen pfad name ausgeben bekommen
also wenn der pfd name "/blblblbl/blub/abc" ist,
dann soll mir abc zurück gegeben werden
habe jetzt schon mehrere sachen probiert wie

Java:
public org.osgi.service.prefs.Preferences node(String pathName) {
	
		SimplePreferences value = nodeMap.get(pathName);
		
		if (value == null) {
			value = new SimplePreferences();
			nodeMap.put(pathName, value);
		}
	int länge = pathName.length();

	
		return 	nodeMap.get(länge-1);
		}

oder

Java:
public org.osgi.service.prefs.Preferences node(String pathName) {
	
		SimplePreferences value = nodeMap.get(pathName);
		
		if (value == null) {
			value = new SimplePreferences();
			nodeMap.put(pathName, value);
		}

		return 	nodeMap.get(pathName.lastIndexOf(pathName));
		}

so und wie mache ich es nun richtig!?

danke schon mal für die hilfe!;:)shock::bahnhof::eek:
 
Zuletzt bearbeitet von einem Moderator:

Andi_CH

Top Contributor
Java:
	String name = "/blblblbl/blub/abc";
	String rest = name.substring(name.lastIndexOf('/') + 1);
	System.out.println(rest);
 

tanzverfuehrung

Bekanntes Mitglied
Java:
	String name = "/blblblbl/blub/abc";
	String rest = name.substring(name.lastIndexOf('/') + 1);
	System.out.println(rest);

hat mir schon mal weiter geholfen und ein großes danke dafür1
nun ist aber mein problem das ich den rest mit return nciht wiedergeben kann!

return rest;

?
weil rest ein String ist und der Rückgabetyp ein Simple Preferences!
lässt sich das nciht vereinen.
wie kann ich das rest in ein preferences umwandeln?!?!?!!?:rtfm:
 

tanzverfuehrung

Bekanntes Mitglied
also ich komme einfach nicht weiter.bräuchte mal nen gedanken stoß!
also mein junit test soll grün schlagen

JUINT TEST:
Java:
@Test
	public void testNextPfad() throws Exception {
		 Preferences b = simple.node("a/b");
		 
		 assertThat(b.name(),is("b"));
		 Preferences a = b.parent();
		assertThat(a.name(),is("a"));
		Preferences simpleAB = a.parent();
		assertThat(simpleAB.name(),is("simple"));

	}
und das ist meine methode zu dem test!
aber es funktioniert noich nicht wirklich!

und ich kriege shcon kopf weh;(


Java:
	@Override
	public org.osgi.service.prefs.Preferences node(String pathName) {
	
		SimplePreferences value = nodeMap.get(pathName);
		if (value == null) {
			value = new SimplePreferences();
			nodeMap.put(pathName, value);
		}
	
	    String rest= pathName.substring(pathName.lastIndexOf('/') + 1);
	    System.out.println(rest);
	    value = nodeMap.get(rest);

		return value;
	}

ich hoffe es kann mir jemand schnell auf die sprünge helfen!DANKE schon mal:toll:
 
S

SlaterB

Gast
neues Thema irgendwie zum selben Thema hierher verschoben,
bitte keine ständigen neuen Themen und saubere verständliche Fragen stellen,
Füllwörter und Bestandteile wie 'helfen', 'danke', 'kopf weh', Smilys, '?!?!?!!' stören bei sowas übrigens eher
 
Zuletzt bearbeitet von einem Moderator:

tanzverfuehrung

Bekanntes Mitglied
also ich soll den absoluten pfad trennen!
also der passende junit test ist dafür
Java:
	@Test
	public void testNextPfad() throws Exception {
		 Preferences b = simple.node("a/b");
		 
		 assertThat(b.name(),is("b"));
		 Preferences a = b.parent();
		assertThat(a.name(),is("a"));
		Preferences simpleAB = a.parent();
		assertThat(simpleAB.name(),is("simple"));

	}

und meine methode ist
Java:
@Override
	public org.osgi.service.prefs.Preferences node(String pathName) {

		SimplePreferences value = nodeMap.get(pathName);

		if (pathName == "") {
			return value;
		}
		if (value == null) {
			value = new SimplePreferences();

			nodeMap.put(pathName, value);
		}
		String[] pfade = pathName.split("/");

		if (pfade.length > 1) {
			// wurzel
			Preferences root = value.parent();
			if (root == null)
				root = value;

			for (int i = pfade.length; i == 0; i--) {
				Preferences node = root;
				String stringNode = node.toString();
				stringNode = pfade[i - 1];
				return node;
			}
		} else
			return value;

	}

	
	public org.osgi.service.prefs.Preferences parent(Node pathName) {

		return (Preferences) pathName.getParentNode();
	}


kann mir jemand sagen , wo mein denkfehler ist?!:eek:
 

tanzverfuehrung

Bekanntes Mitglied
Was soll denn dabei rauskommen? Dir ist bewusst, dass die Schleife in der Methode maximal einmal durchlaufen wird?

habe meine methode nochmal über arbeitet!
diesmAM ganz anders.
Java:
@Override
	public org.osgi.service.prefs.Preferences node(String pathName) {

		SimplePreferences value = nodeMap.get(pathName);

		if (value == null) {
			value = new SimplePreferences(pathName);
			nodeMap.put(pathName, value);
			return value;
		}
		if (pathName == "") {
			pathName = new String();
			return value;
		}

		String[] pfade = pathName.split("/");
		for (int i = 0; i < pfade.length; i++) {
			String filePath = testFolder.getRoot().getAbsolutePath();
			Preferences specificDevice = value.node(pathName);
			specificDevice.put(pfade[i], filePath);
			 specificDevice.node(pfade[i]).put(pfade[i], pfade[i]);
			return specificDevice;
		}
		return value;
	}
naja wenn mein pfad z.b.
a/b/c
ist
dann soll cmir ausgegeben werden
 

Michael...

Top Contributor
Die Schleife wird immer noch maximal einmal durchlaufen.

Wenn aber ohnehin nur c interessant ist, dann braucht man keine Schleife.
Man muss nur prüfen, ob das "Split" Array gefüllt ist und wenn ja das letzte Element des Arrays verwenden.
 

tanzverfuehrung

Bekanntes Mitglied
Wenn aber ohnehin nur c interessant ist, dann braucht man keine Schleife.
Man muss nur prüfen, ob das "Split" Array gefüllt ist und wenn ja das letzte Element des Arrays verwenden.

ja ok also das hört sich natülich auch gut an!
aber denke damit ist mein ausbilder nicht zufrieden
*leider*
habe grad nochmal mit ihm besprochen

also es soll der ElternKnoten ermittelt werden und dann den kinderKnoten bilden und dann soll der kinderknoten zum neuen eltern Knoten werden!

das alles solange bis es keine kinder knoten mehr gibt!
und dann den letzten kinder knoten zurück geben!

so nun habe ich mir gleich gedanken gemacht und die methode überarbeiten!
aber der junit test schlägt immer noch fehl!;(

Java:
	@Override
	public org.osgi.service.prefs.Preferences node(String pathName) {

		SimplePreferences value = nodeMap.get(pathName);

			
		if (value == null) {
			value = new SimplePreferences(pathName);
			nodeMap.put(pathName, value);
			return value;
		}
		String[] path = pathName.split("/");
			Preferences parentNode = value.node(path[0]);
			
		if (pathName == "") {
			return parentNode;
		}

	
		for (int i = 1; i < path.length; i++) {
			Preferences childNode = parentNode.node(path[i]);
			parentNode = childNode;
	
			return childNode;
		}
		return value;
	}

und dann wenn das erstmal klappt muss ich noch unterscheiden zwischen relativen und absoluten pfad!;)




Die Schleife wird immer noch maximal einmal durchlaufen.
aber das verstehe ich nicht ganz?!wieso ist das so?dachte hat was mit der bedingung zututn!
mh...???:L???:L???:L
 

Michael...

Top Contributor
Achso, es geht um den rekursiven Aufruf?! Den hab ich vorher nicht gesehen. Dann musst Du die Schleife definitiv weg lassen und die Methode muss sich ausschließlich selbst aufrufen.

Und der Pfad wird als String übergeben? Das split vorgeschrieben oder kommt jetzt nur von Dir?
 

tanzverfuehrung

Bekanntes Mitglied
Achso, es geht um den rekursiven Aufruf?! Den hab ich vorher nicht gesehen. Dann musst Du die Schleife definitiv weg lassen und die Methode muss sich ausschließlich selbst aufrufen.

Und der Pfad wird als String übergeben? Das split vorgeschrieben oder kommt jetzt nur von Dir?


ja genau der pfad wird als string übergeben und die split methode gibt es in der API unter String!


ich muss die schleiße aufjedenfall weg machen?WIESO????:L
und dann lieber mit einer WHILE anweisung arbeiten oder wie?????


und wie ruft sich ne Methode selbst auf!?


tut mir leid,aber bin halt noch extremer anfänger!:rtfm:
 

Michael...

Top Contributor
Naja man kann das Problem per Iteration (Schleife) oder per Rekursion lösen.
Was Du vorhast ist mir nicht ganz klar, da Du zum einen eine Schleife verwendest in der Schleife aber wiederum die Methode aufrufst (Rekursion, s. Codezeile 21 Deines letzten Postings). Das mag manchmal Sinn machen - in Deinem Fall aber nicht.

Und wenn ich Dich richtig verstanden habe, dann sollst der Code sich ja bis zum letzten Element "durchhangeln"

Die OSGI Packages kenne ich nicht, habe ich nicht und brauch ich nicht ;-), daher mal ein Bsp wie man einen einfachen String einmal rekursiv und einmal iterativ bis zum letzten Element durcharbeiten könnte:

Java:
public static void main(String[] s) {
	String testString = "a/b/c";
	
	String iterativeLeaf = getChildIterative(testString);
	System.out.println();
	
	String recursiveLeaf = getChildRecursive(testString);
	System.out.println();
	
	System.out.println("Leafnode of \"" + testString + "\" is:");
	System.out.println("iterative: " + iterativeLeaf);
	System.out.println("recursive: " + recursiveLeaf);
}

public static String getChildRecursive(String path) {
	int index = path.indexOf("/");
	System.out.println("recursive checking: \"" + path + "\" | " + index);
	if (index<0) //Wenn der index < 0 ist wurde kein Slash mehr gefunden und im path steht das letzte Element
		return path;
	//Wenn der Index >=0 wurde ein Slash gefunden
	path = path.substring(++index); // Der Anfang des Strings bis zum gefundenen Slash wird abgeschnitten
	return getChildRecursive(path); //die Methode ruft sich selbst mit dem gekürzten path auf
}

public static String getChildIterative(String path) {
	int index = -1;
	while((index=path.indexOf("/"))>=0) {
		System.out.println("iterative checking: \"" + path + "\" | " + index);
		path = path.substring(++index);
	}
	return path;
}
 

Crian

Top Contributor
Bei sowas ist es immer gut, sich erstmal auf dem Papier zu überlegen, was passieren soll.

Pseudocode:

Code:
Method getChild(pfad)
    Falls pfad keinen Trenner hat
        pfad zurückgeben
    anderenfalls
        kürzererPfad = Teil hinter dem ersten Trenner von pfad
        getChild(kürzererPfad) zurückgeben

Edit:

Java:
path = path.substring(++index);
finde ich hässlich, man sollte schon schreiben, was man meint:
Java:
path = path.substring(index + 1);

Außerdem sollte man dabei testen, ob danach noch was kommt (Vielleicht endet der Pfad auf '/').
 
Zuletzt bearbeitet:

tanzverfuehrung

Bekanntes Mitglied
Bei sowas ist es immer gut, sich erstmal auf dem Papier zu überlegen, was passieren soll.

Pseudocode:

Code:
Method getChild(pfad)
    Falls pfad keinen Trenner hat
        pfad zurückgeben
    anderenfalls
        kürzererPfad = Teil hinter dem ersten Trenner von pfad
        getChild(kürzererPfad) zurückgeben

Edit:

Java:
path = path.substring(++index);
finde ich hässlich, man sollte schon schreiben, was man meint:
Java:
path = path.substring(index + 1);

Außerdem sollte man dabei testen, ob danach noch was kommt (Vielleicht endet der Pfad auf '/').

danke das ist lieb von dir und verstehe auch alles außer...
wieso index++

Java:
path = path.substring(index + 1);

also wieso muss der index um eins erhöht werden?!
verstehe ich nicht???:L
 

Crian

Top Contributor
Genau. Und [c]++index[/c] und [c]index + 1[/c] taten hier zwar faktisch das gleiche, allerdings hat [c]++index[/c] hier noch eine nicht benötigte Nebenwirkung, was nur unnötig irritierend ist:

[c]path = path.substring(index + 1);[/c] bedeutet:
1) Bilde den Teilstring von
Code:
path
ab der Stelle
Code:
index
+1
2) weise ihn
Code:
path
zu.


[c]path = path.substring(++index);[/c] bedeutet:
1) Erhöhe
Code:
index
um 1.
2) Bilde den Teilstring von
Code:
path
ab der Stelle
Code:
index
3) weise ihn
Code:
path
zu.

Hinterher wird
Code:
index
nicht mehr verwendet und man fragt sich, wozu es erhöht wurde. Deshalb fand ich die Methode mit [c]index+1[/c] schöner.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Plugin System (ohne OSGI) Allgemeine Java-Themen 10
P Java EE und OSGi Allgemeine Java-Themen 2
P OSGi Bundle in JBoss zum laufen bringen Allgemeine Java-Themen 0
P OSGi - Bundle-Methode wird nicht aufgerufen Allgemeine Java-Themen 3
G OSGi: ServiceTracker Allgemeine Java-Themen 3
G OSGi String Allgemeine Java-Themen 2
C Drittanbieter- Jar in OSGi- Bundle? Allgemeine Java-Themen 2
M java.util.prefs.Preferences "not visible" Allgemeine Java-Themen 7
R WebDriver Firefox preferences ändern Allgemeine Java-Themen 0
J GUI-Einstellungen mittels Preferences Allgemeine Java-Themen 6
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
G Java Preferences API oder lieber doch nicht? Allgemeine Java-Themen 10
Dit_ Registry, Preferences | Name des Knotens ändern. Allgemeine Java-Themen 2
M In Preferences speichern Allgemeine Java-Themen 3
A Element für Preferences Page Allgemeine Java-Themen 3
T System Preferences + LInux (Ubuntu) Allgemeine Java-Themen 8
G eclipse rcp, preferences Allgemeine Java-Themen 2
C Preferences Allgemeine Java-Themen 6
G Letzter Zugriff auf Datei Allgemeine Java-Themen 5
M Programmablauf nach letzter eingabe erst fortsetzten Allgemeine Java-Themen 2
M Letzter Versuch zum ändern Allgemeine Java-Themen 3
S Beliebige Dateiinformationen auslesen z.B. Letzter Zugriff Allgemeine Java-Themen 4
T Dateieigenschaft "letzter Zugriff" "last acce Allgemeine Java-Themen 5
B letzter Tag des Vormonats Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben