2009-03-23 5 views
2

Die Situation:
Nehmen wir an, wir implementieren eine Blog-Engine basierend auf JCR mit Unterstützung für die Lokalisierung.
Die Inhaltsstruktur sieht so etwas wie dieses /Blogname/content/[Knotenname]JCR 170 Datenmodellierung: Knotennamen

Das Problem: Was ist der beste Weg, um die Inhalts Knoten (/ Blogname/content/[nodename] zu nennen) die folgenden Anforderungen zu erfüllen:

  1. Der Knotenname in HTML verwendbar sein muss REST unterstützen wie URLs, dh: blogname.com/content/nodename auf ein einzelnes Inhaltselement anweisen.
  2. Die obige Anforderung darf keine hässlichen URLs erzeugen, zB:/content/knotenname ist gut,/content/node% 20name ist schlecht.
  3. Programmatic Retrieval sollte einfach mit dem Knotennamen sein, zum Beispiel: // content [@ knotenname = einige-name]
  4. Das Benennungsschema muss die Eindeutigkeit des Knotennamens garantieren.

PS: Die Umsetzung JCR verwendete JackRabbit

Antwort

0

Zu Punkt 3. Ich habe vor kurzem erfahren, dass XPath-Abfragen erlauben keine Gegenstände mit einer Reihe zu starten. Wenn Ihr Knotenname mit einer Nummer beginnt, kann er immer noch abgefragt werden, indem das erste Byte des Namens entfernt wird. Ihre Abfragen werden jedoch einfacher, wenn Sie alle Knotennamen mit einem Buchstaben beginnen.

(. Ich bin über Eigenschaftsnamen nicht sicher, habe noch nie gesehen, die nicht mit einem Buchstaben beginnen hat.)

1

für 1. bis 3. Die Antwort ist einfach: nur Zeichen verwenden Sie möchten in den Knotennamen sehen, dh. entkomme die Eingabezeichenfolge, die du hast (z. B. den Titel des Blogposts), gegen einen eingeschränkten Zeichensatz wie the one for URIs.

Zum Beispiel erlauben Sie keine Leerzeichen (die für JCR-Knotennamen erlaubt sind, aber die hässlichen in URLs erzeugen würden) und andere Zeichen, die in URLs kodiert sein müssen. Sie können diese Zeichen entfernen oder einfach durch einen Unterstrich ersetzen, da dies in den meisten Fällen gut aussieht.

Bei eindeutigen Namen (4.) können Sie entweder die aktuelle Uhrzeit inkl. Millisekunden hinein oder Sie überprüfen explizit auf Kollisionen. Das erste mag ein bisschen hässlich aussehen, aber sollte wahrscheinlich nie für ein Blog-Szenario ausfallen. Letzteres kann getan werden, indem auf die ausgelöste Ausnahme reagiert wird, wenn ein Knoten mit einem solchen Namen bereits existiert und z. einen inkrementierenden Zähler und versuchen Sie es erneut (z. B. my_great_post1, my_great_post2, etc.). Sie können den übergeordneten Knoten auch sperren, so dass nur eine Sitzung gleichzeitig einen Knoten hinzufügen kann. Dadurch wird eine Testschleife vermieden, die Blockierung geht jedoch verloren.

Hinweis://content[@node_name=some-name] ist keine gültige JCR-Xpath-Abfrage. Sie möchten wahrscheinlich /jcr:root/content//some-name dafür verwenden.

0

Eindeutige Namen: Um schnell einen eindeutigen Namen von den ersten Zeichen eines Titels sowie eine Zufallszahl zu erzeugen (zur Lösung von Konflikten), können Sie den folgenden Algorithmus verwenden:

String title = "JCR 170 Data modeling: Node names"; 
String name = title.substring(0, Math.min(title.length(), 10)).trim().replace(' ', '_'); 
if (name is not unique) { 
    name += "_"; 
    Random r = new Random(); 
    while (name is not unqiue) { 
     name += Integer.toString(r.nextInt(10)); 
    } 
} 

Der Vorteil einer zufälligen zu verwenden Nummer ist: selbst wenn Sie viele ähnliche Namen haben, löst dies Konflikte sehr schnell.

Verwandte Themen