PageRenderTime 50ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/iks-ri/branches/alpha/rick/model/clerezza/src/main/java/eu/iksproject/rick/model/clerezza/RdfRepresentation.java

http://iks-project.googlecode.com/
Java | 362 lines | 331 code | 20 blank | 11 comment | 84 complexity | f5f861ec799ebbb3c0f2f0ee25873cf5 MD5 | raw file
Possible License(s): CC-BY-3.0
  1. package eu.iksproject.rick.model.clerezza;
  2. import java.net.URI;
  3. import java.net.URL;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. import java.util.Iterator;
  7. import org.apache.clerezza.rdf.core.Literal;
  8. import org.apache.clerezza.rdf.core.NoConvertorException;
  9. import org.apache.clerezza.rdf.core.Resource;
  10. import org.apache.clerezza.rdf.core.TripleCollection;
  11. import org.apache.clerezza.rdf.core.UriRef;
  12. import org.apache.clerezza.rdf.utils.GraphNode;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import eu.iksproject.rick.core.utils.AdaptingIterator;
  16. import eu.iksproject.rick.core.utils.ModelUtils;
  17. import eu.iksproject.rick.core.utils.TypeSaveIterator;
  18. import eu.iksproject.rick.model.clerezza.impl.Literal2TextAdapter;
  19. import eu.iksproject.rick.model.clerezza.impl.LiteralAdapter;
  20. import eu.iksproject.rick.model.clerezza.impl.NaturalLanguageLiteralIterator;
  21. import eu.iksproject.rick.model.clerezza.impl.ReferenceIterator;
  22. import eu.iksproject.rick.model.clerezza.impl.Resource2ValueAdapter;
  23. import eu.iksproject.rick.model.clerezza.impl.UriRefAdapter;
  24. import eu.iksproject.rick.model.clerezza.utils.Resource2StringAdapter;
  25. import eu.iksproject.rick.servicesapi.model.Reference;
  26. import eu.iksproject.rick.servicesapi.model.Representation;
  27. import eu.iksproject.rick.servicesapi.model.Text;
  28. import eu.iksproject.rick.servicesapi.model.UnsupportedTypeException;
  29. import eu.iksproject.rick.servicesapi.model.rdf.RdfResourceEnum;
  30. public class RdfRepresentation implements Representation{
  31. private static final Logger log = LoggerFactory.getLogger(RdfRepresentation.class);
  32. private static final UriRef REPRESENTATION_TYPE_PROPERTY = new UriRef(RdfResourceEnum.signType.getUri());
  33. private final RdfValueFactory valueFactory = RdfValueFactory.getInstance();
  34. private final GraphNode graphNode;
  35. protected final GraphNode getGraphNode() {
  36. return graphNode;
  37. }
  38. protected RdfRepresentation(UriRef resource, TripleCollection graph) {
  39. this.graphNode = new GraphNode(resource, graph);
  40. }
  41. /**
  42. * Getter for the read only view onto the RDF data of this representation
  43. * @return The RDF graph of this Representation
  44. */
  45. public TripleCollection getRdfGraph(){
  46. return graphNode.getGraph();
  47. }
  48. protected UriRef getRepresentationType(){
  49. Iterator<UriRef> it = this.graphNode.getUriRefObjects(REPRESENTATION_TYPE_PROPERTY);
  50. return it.hasNext()?it.next():null;
  51. }
  52. @Override
  53. public void add(String field, Object value) {
  54. if(field == null) {
  55. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  56. }
  57. if(value == null){
  58. log.warn("NULL parsed as value in add method for symbol "+getId()+" and field "+field+" -> call ignored");
  59. return;
  60. }
  61. UriRef fieldUriRef = new UriRef(field);
  62. Collection<Object> values = new ArrayList<Object>();
  63. //process the parsed value with the Utility Method ->
  64. // this converts Objects as defined in the specification
  65. ModelUtils.checkValues(valueFactory, value, values);
  66. //We still need to implement support for specific types supported by this implementation
  67. for(Object current : values){
  68. if(current instanceof Resource){ //native support for Clerezza types!
  69. graphNode.addProperty(fieldUriRef, (Resource)current);
  70. } else if(current instanceof RdfReference){
  71. //treat RDF Implementations special to avoid creating new instances
  72. graphNode.addProperty(fieldUriRef, ((RdfReference) current).getUriRef());
  73. } else if(current instanceof Reference){
  74. graphNode.addProperty(fieldUriRef, new UriRef(((Reference) current).getReference()));
  75. addReference(field,((Reference)current).getReference());
  76. } else if(current instanceof RdfText){
  77. //treat RDF Implementations special to avoid creating new instances
  78. graphNode.addProperty(fieldUriRef,((RdfText) current).getLiteral());
  79. } else if(current instanceof Text){
  80. addNaturalText(fieldUriRef, ((Text)current).getText(), ((Text)current).getLanguage());
  81. } else { //else add an typed Literal!
  82. addTypedLiteral(fieldUriRef, current);
  83. }
  84. }
  85. }
  86. private void addTypedLiteral(UriRef field, Object literalValue){
  87. Literal literal;
  88. try {
  89. literal = RdfResourceUtils.createLiteral(literalValue);
  90. } catch (NoConvertorException e){
  91. log.info("No Converter for value type "+literalValue.getClass()+" (parsed for field "+field+") use toString() to get String representation");
  92. literal = RdfResourceUtils.createLiteral(literalValue.toString(), null);
  93. }
  94. graphNode.addProperty(field, literal);
  95. }
  96. @Override
  97. public void addReference(String field, String reference) {
  98. if(field == null) {
  99. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  100. }
  101. if(reference == null){
  102. log.warn("NULL parsed as value in add method for symbol "+getId()+" and field "+field+" -> call ignored");
  103. }
  104. graphNode.addProperty(new UriRef(field), new UriRef(reference));
  105. }
  106. @Override
  107. public void addNaturalText(String field, String text, String...languages) {
  108. if(field == null) {
  109. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  110. }
  111. if(text == null){
  112. log.warn("NULL parsed as value in add method for symbol "+getId()+" and field "+field+" -> call ignored");
  113. }
  114. this.addNaturalText(new UriRef(field), text, languages);
  115. }
  116. private void addNaturalText(UriRef field, String text, String...languages) {
  117. if(languages == null){
  118. log.debug("NULL parsed as languages -> replacing with \"new String []{null}\"" +
  119. " -> assuming a missing explicit cast to (Stirng) in the var arg");
  120. languages = new String []{null};
  121. }
  122. for(String language : languages){
  123. graphNode.addProperty(field, RdfResourceUtils.createLiteral(text, language));
  124. }
  125. }
  126. @SuppressWarnings("unchecked")
  127. @Override
  128. public <T> Iterator<T> get(String field, final Class<T> type) throws UnsupportedTypeException {
  129. UriRef fieldUriRef = new UriRef(field);
  130. if(Resource.class.isAssignableFrom(type)){ //native support for Clerezza types
  131. return new TypeSaveIterator<T>(graphNode.getObjects(fieldUriRef), type);
  132. } else if(type.equals(String.class)){ //support to convert anything to String
  133. return (Iterator<T>) new AdaptingIterator<Resource,String>(
  134. graphNode.getObjects(fieldUriRef),
  135. new Resource2StringAdapter<Resource>(),
  136. String.class);
  137. } else if(type.equals(URI.class) || type.equals(URL.class)){ //support for References
  138. return new AdaptingIterator<UriRef, T>(
  139. graphNode.getUriRefObjects(fieldUriRef),
  140. new UriRefAdapter<T>(),
  141. type);
  142. } else if(Reference.class.isAssignableFrom(type)){
  143. return (Iterator<T>) new ReferenceIterator(
  144. graphNode.getUriRefObjects(fieldUriRef));
  145. } else if(Text.class.isAssignableFrom(type)){
  146. return (Iterator<T>)new AdaptingIterator<Literal, Text>(
  147. graphNode.getLiterals(fieldUriRef),
  148. new Literal2TextAdapter<Literal>(),
  149. Text.class);
  150. } else { //support for Literals -> Type conversions
  151. return new AdaptingIterator<Literal, T>(
  152. graphNode.getLiterals(fieldUriRef),
  153. new LiteralAdapter<Literal, T>(),
  154. type);
  155. }
  156. }
  157. @Override
  158. public Iterator<Reference> getReferences(String field) {
  159. Iterator<UriRef> it = graphNode.getUriRefObjects(new UriRef(field));
  160. return new ReferenceIterator(it);
  161. }
  162. @Override
  163. public Iterator<Text> getText(String field) {
  164. return new AdaptingIterator<Literal, Text>(
  165. graphNode.getLiterals(new UriRef(field)),
  166. new Literal2TextAdapter<Literal>(),
  167. Text.class);
  168. }
  169. @Override
  170. public Iterator<Object> get(String field) {
  171. return new AdaptingIterator<Resource, Object>(graphNode.getObjects(new UriRef(field)),
  172. new Resource2ValueAdapter<Resource>(),Object.class);
  173. }
  174. @Override
  175. public Iterator<Text> get(String field, String...languages) {
  176. if(languages == null){
  177. log.debug("NULL parsed as languages -> replacing with \"new String []{null}\"" +
  178. " -> assuming a missing explicit cast to (Stirng) in the var arg");
  179. languages = new String []{null};
  180. }
  181. return new AdaptingIterator<Literal, Text>(
  182. graphNode.getLiterals(new UriRef(field)),
  183. new Literal2TextAdapter<Literal>(languages),
  184. Text.class);
  185. }
  186. @Override
  187. public Iterator<String> getFieldNames() {
  188. return new AdaptingIterator<UriRef, String>(graphNode.getProperties(),
  189. new Resource2StringAdapter<UriRef>(), String.class);
  190. }
  191. @Override
  192. public <T> T getFirst(String field, Class<T> type) throws UnsupportedTypeException {
  193. Iterator<T> it = get(field,type);
  194. if(it.hasNext()){
  195. return it.next();
  196. } else {
  197. return null;
  198. }
  199. }
  200. @Override
  201. public Object getFirst(String field) {
  202. Iterator<Object> it = get(field);
  203. if(it.hasNext()){
  204. return it.next();
  205. } else {
  206. return null;
  207. }
  208. }
  209. @Override
  210. public Reference getFirstReference(String field) {
  211. Iterator<Reference> it = getReferences(field);
  212. return it.hasNext()?it.next():null;
  213. }
  214. @Override
  215. public Text getFirst(String field, String...languages) {
  216. if(languages == null){
  217. log.debug("NULL parsed as languages -> replacing with \"new String []{null}\"" +
  218. " -> assuming a missing explicit cast to (Stirng) in the var arg");
  219. languages = new String []{null};
  220. }
  221. Iterator<Text> it = get(field,languages);
  222. if(it.hasNext()){
  223. return it.next();
  224. } else {
  225. return null;
  226. }
  227. }
  228. @Override
  229. public String getId() {
  230. return ((UriRef)graphNode.getNode()).getUnicodeString();
  231. }
  232. @Override
  233. public void remove(String field, Object value) {
  234. if(field == null) {
  235. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  236. }
  237. if(value == null){
  238. log.warn("NULL parsed as value in remove method for symbol "+getId()+" and field "+field+" -> call ignored");
  239. }
  240. UriRef fieldUriRef = new UriRef(field);
  241. if(value instanceof Resource){ //native support for Clerezza types!
  242. graphNode.deleteProperty(fieldUriRef, (Resource)value);
  243. } else if(value instanceof URI || value instanceof URL){
  244. removeReference(field, value.toString());
  245. } else if (value instanceof String[]){
  246. if(((String[])value).length>0){
  247. if(((String[])value).length>1){
  248. removeNaturalText(field, ((String[])value)[0],((String[])value)[1]);
  249. } else {
  250. removeNaturalText(field, ((String[])value)[0],(String)null);
  251. }
  252. }
  253. } else {
  254. removeTypedLiteral(fieldUriRef, value);
  255. }
  256. }
  257. @Override
  258. public void removeReference(String field, String reference) {
  259. if(field == null) {
  260. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  261. }
  262. if(reference == null){
  263. log.warn("NULL parsed as value in remove method for symbol "+getId()+" and field "+field+" -> call ignored");
  264. }
  265. graphNode.deleteProperty(new UriRef(field), new UriRef(reference));
  266. }
  267. protected void removeTypedLiteral(UriRef field, Object object){
  268. Literal literal;
  269. try{
  270. literal = RdfResourceUtils.createLiteral(object);
  271. } catch (NoConvertorException e){
  272. log.info("No Converter for value type "+object.getClass()+" (parsed for field "+field+") use toString() Method to get String representation");
  273. literal = RdfResourceUtils.createLiteral(object.toString(), null);
  274. }
  275. graphNode.deleteProperty(field,literal);
  276. }
  277. @Override
  278. public void removeNaturalText(String field, String value, String... languages) {
  279. if(field == null) {
  280. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  281. }
  282. if(value == null){
  283. log.warn("NULL parsed as value in remove method for symbol "+getId()+" and field "+field+" -> call ignored");
  284. }
  285. if(languages == null){
  286. log.debug("NULL parsed as languages -> replacing with \"new String []{null}\"" +
  287. " -> assuming a missing explicit cast to (Stirng) in the var arg");
  288. languages = new String []{null};
  289. }
  290. UriRef fieldUriRef = new UriRef(field);
  291. for(String language : languages){
  292. graphNode.deleteProperty(fieldUriRef,RdfResourceUtils.createLiteral(value, language));
  293. }
  294. }
  295. @Override
  296. public void removeAll(String field) {
  297. graphNode.deleteProperties(new UriRef(field));
  298. }
  299. @Override
  300. public void removeAllNaturalText(String field, String... languages) {
  301. if(field == null) {
  302. throw new IllegalArgumentException("Parameter \"String field\" MUST NOT be NULL!");
  303. }
  304. if(languages == null){
  305. log.debug("NULL parsed as languages -> replacing with \"new String []{null}\"" +
  306. " -> assuming a missing explicit cast to (Stirng) in the var arg");
  307. languages = new String []{null};
  308. }
  309. UriRef fieldUriRef = new UriRef(field);
  310. Collection<Literal> literals = new ArrayList<Literal>();
  311. //get all the affected Literals
  312. for(Iterator<Literal> it = new NaturalLanguageLiteralIterator(graphNode.getLiterals(fieldUriRef), languages);
  313. it.hasNext();
  314. literals.add(it.next())
  315. );
  316. //delete the found literals
  317. for(Literal literal:literals){
  318. graphNode.deleteProperty(fieldUriRef, literal);
  319. }
  320. }
  321. @Override
  322. public void set(String field, Object value) {
  323. removeAll(field);
  324. if(value != null){
  325. add(field,value);
  326. }
  327. }
  328. @Override
  329. public void setReference(String field, String reference) {
  330. removeAll(reference);
  331. if(reference != null){
  332. addReference(field, reference);
  333. }
  334. }
  335. @Override
  336. public void setNaturalText(String field, String text, String...languages) {
  337. removeAllNaturalText(field, languages);
  338. if(text != null){
  339. addNaturalText(field, text, languages);
  340. }
  341. }
  342. }