Public Id Generator

Ein PublicIdGenerator macht in JSF an mehreren Stellen Sinn. Hier möchte ich kurz wo es Sinn machen kann, und warum. Zum andern zeige ich euch dann den Code für den PublicIdGenerator. Die Verwendung ist glaube ich selbsterklärend.

Wo kann man den Generator verweden

  • Wenn man die interne (Datenbank) Id einer Klasse (Entität) nicht nach außen geben will.
  • Wenn man noch gar keine interne Id einer Klasse hat, weil eben diese z.B. noch nicht persistiert wurde.

Im Wesentlichen lassen sich alle Anwendungsszenarien darauf zurück führen. Wie in einem vorhergehenden Artikel beschrieben, kann man diese Id für die Generierung eine Style-Class verwenden, und dann nochmal in einem CientBehavior um JavaScript-Code zu generieren. Oder man benötigt sie für die Identifiezierung eines Objectes in Comboboxen, da bietet sich ein einfacher Object Konverter an.

Generator Code

Der Generator ist eigentlich straightforward implementiert.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@ViewAccessScoped
@Named
public class PublicIdGenerator implements Serializable {
private Map<String, Key> publicIds;
private Map<Key, String> objects;
protected PublicIdGenerator() {
publicIds = new HashMap<String, Key>();
objects = new HashMap<Key, String>();
}
public String generatePublicId(final Object object) {
return generatePublicId(object.getClass(), object);
}
public String generatePublicId(final Class<?> clazz, final Object object) {
final String publicId;
final Key key = new Key(clazz, object);
if (objects.containsKey(key)) {
publicId = objects.get(key);
} else {
publicId = generateId();
publicIds.put(publicId, key);
objects.put(key, publicId);
}
return publicId;
}
private String generateId() {
return UUID.randomUUID().toString();
}
public Object lookup(final Class<?> clazz, final String publicId) {
Key key = publicIds.get(publicId);
if (key == null) {
throw new IllegalStateException("No entry for public id " + publicId + ". Possible manipulation detected.");
}
if (!clazz.equals(key.getClazz())) {
throw new IllegalStateException("Invalid clazz " + clazz.getName() + " for public id " + publicId);
}
return key.getObject();
}
private static class Key implements Serializable {
private final Class<?> clazz;
private final Object object;
Key(final Class<?> clazz, final Object object) {
super();
this.clazz = notNull(clazz, "Parameter 'clazz' must not be 'NULL'");
this.object = notNull(object, "Parameter 'object' must not be 'NULL'");
}
Class<?> getClazz() {
return clazz;
}
Object getObject() {
return object;
}
//TODO Generate Equals and HashCode
}
}