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 package org.openrdf.elmo.sesame;
30
31 import java.beans.PropertyDescriptor;
32 import java.lang.reflect.Method;
33 import java.util.HashSet;
34 import java.util.Set;
35
36 import org.openrdf.elmo.ElmoProperty;
37 import org.openrdf.elmo.ElmoPropertyFactory;
38 import org.openrdf.elmo.annotations.inverseOf;
39 import org.openrdf.elmo.annotations.localized;
40 import org.openrdf.elmo.annotations.oneOf;
41 import org.openrdf.elmo.annotations.rdf;
42 import org.openrdf.elmo.impl.UnmodifiableElmoProperty;
43 import org.openrdf.elmo.sesame.helpers.PropertyChanger;
44 import org.openrdf.elmo.sesame.roles.SesameEntity;
45 import org.openrdf.model.Literal;
46 import org.openrdf.model.URI;
47 import org.openrdf.model.Value;
48 import org.openrdf.model.ValueFactory;
49 import org.openrdf.model.impl.ValueFactoryImpl;
50
51
52
53
54
55
56
57
58
59 public class SesamePropertyFactory<E> implements ElmoPropertyFactory<E> {
60 private static ValueFactory vf = new ValueFactoryImpl();
61
62 private URI predicate;
63
64 private boolean inverse;
65
66 private boolean localized;
67
68 private boolean readOnly;
69
70 private Set<? extends Value> oneOf;
71
72 private PropertyChanger inferencer;
73
74 public static ValueFactory getValueFactory() {
75 return vf;
76 }
77
78 public URI getPredicate() {
79 return predicate;
80 }
81
82 public Set<? extends Value> getOneOf() {
83 return oneOf;
84 }
85
86 public SesamePropertyFactory<E> setPropertyDescriptor(
87 PropertyDescriptor property) {
88 String uri;
89 Method getter = property.getReadMethod();
90 rdf rdf = getter.getAnnotation(rdf.class);
91 inverseOf inv = getter.getAnnotation(inverseOf.class);
92 if (rdf != null && rdf.value().length > 0) {
93 uri = rdf.value()[0];
94 inverse = false;
95 } else if (inv != null && inv.value().length > 0) {
96 uri = inv.value()[0];
97 inverse = true;
98 } else {
99 throw new IllegalArgumentException(
100 "Property has no Elmo annotations on the getter method");
101 }
102 predicate = vf.createURI(uri);
103 localized = getter.isAnnotationPresent(localized.class);
104 Method setter = property.getWriteMethod();
105 readOnly = setter == null;
106 if (setter != null && setter.isAnnotationPresent(oneOf.class)) {
107 oneOf = convertOneOf(setter.getAnnotation(oneOf.class));
108 }
109 inferencer = getPropertyChanger();
110 return this;
111 }
112
113 public ElmoProperty<E> createElmoProperty(Object bean) {
114 assert bean instanceof SesameEntity : bean;
115 SesameProperty<E> property = createSesameProperty((SesameEntity) bean);
116 if (readOnly)
117 return new UnmodifiableElmoProperty<E>(property);
118 return property;
119 }
120
121 protected PropertyChanger getPropertyChanger() {
122 return new PropertyChanger(predicate, getOneOf());
123 }
124
125 private Set<? extends Value> convertOneOf(oneOf of) {
126 if (of.datatype().length() > 0) {
127 Set<Literal> set = new HashSet<Literal>();
128 URI datatype = vf.createURI(of.datatype());
129 for (String label : of.label()) {
130 set.add(vf.createLiteral(label, datatype));
131 }
132 return set;
133 }
134 Set<URI> set = new HashSet<URI>();
135 for (String uri : of.value()) {
136 set.add(vf.createURI(uri));
137 }
138 return set;
139 }
140
141 @SuppressWarnings("unchecked")
142 private SesameProperty<E> createSesameProperty(SesameEntity bean) {
143 if (localized)
144 return (SesameProperty<E>) new LocalizedSesameProperty(bean,
145 inferencer);
146 if (inverse)
147 return new InverseSesameProperty<E>(bean, inferencer);
148 return new SesameProperty<E>(bean, inferencer);
149 }
150
151 }