PageRenderTime 41ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/modules-legacy/prov-rdf/src/main/java/org/openprovenance/prov/rdf/collector/QualifiedCollector.java

http://github.com/lucmoreau/ProvToolbox
Java | 654 lines | 555 code | 93 blank | 6 comment | 51 complexity | 0e78eb9c6586cdd918a8053fd4dffe1d MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0, GPL-3.0
  1. package org.openprovenance.prov.rdf.collector;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8. import javax.xml.datatype.XMLGregorianCalendar;
  9. import org.openprovenance.prov.rdf.Ontology;
  10. import org.openprovenance.prov.rdf.collector.Types;
  11. import org.openprovenance.prov.model.ActedOnBehalfOf;
  12. import org.openprovenance.prov.model.Attribute;
  13. import org.openprovenance.prov.model.DerivedByInsertionFrom;
  14. import org.openprovenance.prov.model.DerivedByRemovalFrom;
  15. import org.openprovenance.prov.model.Identifiable;
  16. import org.openprovenance.prov.model.ProvFactory;
  17. import org.openprovenance.prov.model.Key;
  18. import org.openprovenance.prov.model.QualifiedName;
  19. import org.openprovenance.prov.model.StatementOrBundle;
  20. import org.openprovenance.prov.model.Type;
  21. import org.openprovenance.prov.model.Used;
  22. import org.openprovenance.prov.model.WasAssociatedWith;
  23. import org.openprovenance.prov.model.WasAttributedTo;
  24. import org.openprovenance.prov.model.WasDerivedFrom;
  25. import org.openprovenance.prov.model.WasEndedBy;
  26. import org.openprovenance.prov.model.WasGeneratedBy;
  27. import org.openprovenance.prov.model.WasInfluencedBy;
  28. import org.openprovenance.prov.model.WasInformedBy;
  29. import org.openprovenance.prov.model.WasInvalidatedBy;
  30. import org.openprovenance.prov.model.WasStartedBy;
  31. import org.openrdf.model.BNode;
  32. import org.openrdf.model.Literal;
  33. import org.openrdf.model.Resource;
  34. import org.openrdf.model.Statement;
  35. import org.openrdf.model.Value;
  36. import org.openrdf.model.impl.BNodeImpl;
  37. public class QualifiedCollector extends RdfCollector {
  38. public QualifiedCollector(ProvFactory pFactory, Ontology onto)
  39. {
  40. super(pFactory,onto);
  41. }
  42. /*
  43. * Given two lists, this creates a list of permutations of those lists. e.g.
  44. * Given [1,2], [[3,4]], returns [[1,3],[1,4],[2,3],[2,4]]
  45. */
  46. private ArrayList<List<?>> permute(List<?>... lists)
  47. {
  48. ArrayList<List<?>> output = new ArrayList<List<?>>();
  49. if (lists.length == 0)
  50. {
  51. output.add(new ArrayList<Object>());
  52. return output;
  53. }
  54. for (List<?> list : lists)
  55. {
  56. // We require that the result has as many elements as the number
  57. // of lists passed - so if a list is empty, add in a single null.
  58. if (list.size() == 0)
  59. list.add(null);
  60. }
  61. List<?> first = lists[0];
  62. List<?>[] rest = Arrays.copyOfRange(lists, 1, lists.length);
  63. for (Object x : first)
  64. {
  65. ArrayList<List<?>> permuted = permute(rest);
  66. for (List<?> tocombine : permuted)
  67. {
  68. ArrayList<Object> l = new ArrayList<Object>();
  69. l.add(x);
  70. l.addAll(tocombine);
  71. output.add(l);
  72. }
  73. }
  74. return output;
  75. }
  76. private List<QualifiedName> getSubjects(QualifiedName context, QualifiedName pred, QualifiedName object)
  77. {
  78. HashMap<QualifiedName, List<Statement>> resources = collators.get(context);
  79. List<QualifiedName> subjects = new ArrayList<QualifiedName>();
  80. for (QualifiedName subject : resources.keySet())
  81. {
  82. List<Statement> statements = resources.get(subject);
  83. for (Statement statement : statements)
  84. {
  85. QualifiedName predQ = convertURIToQualifiedName(statement.getPredicate());
  86. Value value = statement.getObject();
  87. if (pred.equals(predQ) && value instanceof Resource)
  88. {
  89. QualifiedName valQ = convertResourceToQualifiedName((Resource) value);
  90. if (valQ.equals(object))
  91. {
  92. subjects.add(subject);
  93. }
  94. }
  95. }
  96. }
  97. return subjects;
  98. }
  99. @Override
  100. protected void buildGraph()
  101. {
  102. super.buildGraph();
  103. for (QualifiedName contextQ : collators.keySet())
  104. {
  105. HashMap<QualifiedName, List<Statement>> collator = collators.get(contextQ);
  106. for (QualifiedName qualifiedName : collator.keySet())
  107. {
  108. Types.ProvType[] types = getExplicitTypes(contextQ, qualifiedName);
  109. for (Types.ProvType type : types)
  110. {
  111. switch (type)
  112. {
  113. case GENERATION:
  114. createGeneration(contextQ, qualifiedName);
  115. break;
  116. case USAGE:
  117. createUsage(contextQ, qualifiedName);
  118. break;
  119. case ASSOCIATION:
  120. createAssociation(contextQ, qualifiedName);
  121. break;
  122. case ATTRIBUTION:
  123. createAttribution(contextQ, qualifiedName);
  124. break;
  125. case COMMUNICATION:
  126. createCommunication(contextQ, qualifiedName);
  127. break;
  128. case DELEGATION:
  129. createDelegation(contextQ, qualifiedName);
  130. break;
  131. case DERIVATION:
  132. createDerivation(contextQ, qualifiedName,
  133. onto.QualifiedName_PROVO_qualifiedDerivation);
  134. break;
  135. case PRIMARYSOURCE:
  136. createPrimarySource(contextQ, qualifiedName);
  137. break;
  138. case QUOTATION:
  139. createQuotation(contextQ, qualifiedName);
  140. break;
  141. case REVISION:
  142. createRevision(contextQ, qualifiedName);
  143. break;
  144. case END:
  145. createEnd(contextQ, qualifiedName);
  146. break;
  147. case INVALIDATION:
  148. createInvalidation(contextQ, qualifiedName);
  149. break;
  150. case START:
  151. createStart(contextQ, qualifiedName);
  152. break;
  153. case INFLUENCE:
  154. createInfluence(contextQ, qualifiedName);
  155. break;
  156. case INSERTION:
  157. createInsertion(contextQ, qualifiedName);
  158. break;
  159. case REMOVAL:
  160. createRemoval(contextQ,qualifiedName);
  161. break;
  162. default:
  163. break;
  164. }
  165. }
  166. }
  167. }
  168. }
  169. @Override
  170. public void endRDF()
  171. {
  172. super.endRDF();
  173. nullifyBNodes();
  174. }
  175. private void nullifyBNodes()
  176. {
  177. for (StatementOrBundle sob : document
  178. .getStatementOrBundle())
  179. {
  180. if (sob instanceof Identifiable)
  181. {
  182. Identifiable idsob = (Identifiable) sob;
  183. if (idsob.getId() != null
  184. && idsob.getId().getNamespaceURI().equals(BNODE_NS))
  185. {
  186. if (!isBNodeReferenced(new BNodeImpl(idsob.getId()
  187. .getLocalPart())))
  188. {
  189. idsob.setId(null);
  190. }
  191. }
  192. }
  193. }
  194. }
  195. private List<XMLGregorianCalendar> getInstantaneousTimes(
  196. List<Statement> statements)
  197. {
  198. List<XMLGregorianCalendar> times = new ArrayList<XMLGregorianCalendar>();
  199. for (Statement statement : statements)
  200. {
  201. QualifiedName predQ = convertURIToQualifiedName(statement.getPredicate());
  202. Value value = statement.getObject();
  203. if (value instanceof Literal)
  204. {
  205. if (predQ.equals(onto.QualifiedName_PROVO_atTime))
  206. {
  207. times.add((XMLGregorianCalendar) super
  208. .decodeLiteral((Literal) value));
  209. }
  210. }
  211. }
  212. return times;
  213. }
  214. private void createRevision(QualifiedName contextQ, QualifiedName qualifiedName)
  215. {
  216. List<WasDerivedFrom> wdfs = createDerivation(contextQ, qualifiedName,
  217. onto.QualifiedName_PROVO_qualifiedRevision);
  218. QualifiedName q = onto.QualifiedName_PROVO_Revision;
  219. Type type=pFactory.newType(q, name.PROV_QUALIFIED_NAME);
  220. for (WasDerivedFrom wdf : wdfs)
  221. {
  222. if (!wdf.getType().contains(type))
  223. {
  224. wdf.getType().add(type);
  225. }
  226. }
  227. }
  228. private void createQuotation(QualifiedName contextQ, QualifiedName qualifiedName)
  229. {
  230. List<WasDerivedFrom> wdfs = createDerivation(contextQ, qualifiedName,
  231. onto.QualifiedName_PROVO_qualifiedQuotation);
  232. QualifiedName q = onto.QualifiedName_PROVO_Quotation;
  233. Type type=pFactory.newType(q, name.PROV_QUALIFIED_NAME);
  234. for (WasDerivedFrom wdf : wdfs)
  235. {
  236. if (!wdf.getType().contains(type))
  237. {
  238. wdf.getType().add(type);
  239. }
  240. }
  241. }
  242. private void createPrimarySource(QualifiedName context, QualifiedName qualifiedName)
  243. {
  244. List<WasDerivedFrom> wdfs = createDerivation(context, qualifiedName,
  245. onto.QualifiedName_PROVO_qualifiedPrimarySource);
  246. QualifiedName q = onto.QualifiedName_PROVO_PrimarySource;
  247. Type type=pFactory.newType(q, name.PROV_QUALIFIED_NAME);
  248. for (WasDerivedFrom wdf : wdfs)
  249. {
  250. if (!wdf.getType().contains(type))
  251. {
  252. wdf.getType().add(type);
  253. }
  254. }
  255. }
  256. private List<WasDerivedFrom> createDerivation(QualifiedName context, QualifiedName qualifiedName,
  257. QualifiedName pred)
  258. {
  259. List<QualifiedName> entities = getObjects(context, qualifiedName,
  260. onto.QualifiedName_PROVO_entity);
  261. List<QualifiedName> activities = getObjects(context, qualifiedName,
  262. onto.QualifiedName_PROVO_hadActivity);
  263. List<QualifiedName> generations = getObjects(context, qualifiedName,
  264. onto.QualifiedName_PROVO_hadGeneration);
  265. List<QualifiedName> usages = getObjects(context, qualifiedName,
  266. onto.QualifiedName_PROVO_hadUsage);
  267. List<QualifiedName> generated = getSubjects(context, pred, qualifiedName);
  268. List<Attribute> attributes = collectAttributes(context,
  269. qualifiedName,
  270. Types.ProvType.DERIVATION);
  271. qualifiedName = getQualqualifiedName(qualifiedName);
  272. List<WasDerivedFrom> wdfs = new ArrayList<WasDerivedFrom>();
  273. List<List<?>> perms = permute(generated, entities, activities,
  274. generations, usages);
  275. for (List<?> perm : perms)
  276. {
  277. WasDerivedFrom wdf = pFactory.newWasDerivedFrom(qualifiedName,
  278. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1),
  279. (QualifiedName) perm.get(2), (QualifiedName) perm.get(3),
  280. (QualifiedName) perm.get(4), attributes);
  281. store(context, wdf);
  282. wdfs.add(wdf);
  283. }
  284. return wdfs;
  285. }
  286. private List<WasInfluencedBy> createInfluence(QualifiedName context, QualifiedName qualifiedName)
  287. {
  288. HashSet<QualifiedName> all_influencers = new HashSet<QualifiedName>();
  289. List<QualifiedName> influencers = getObjects(context, qualifiedName,
  290. onto.QualifiedName_PROVO_influencer);
  291. List<QualifiedName> agents = getObjects(context, qualifiedName,
  292. onto.QualifiedName_PROVO_agent);
  293. List<QualifiedName> entities = getObjects(context, qualifiedName,
  294. onto.QualifiedName_PROVO_entity);
  295. List<QualifiedName> activities = getObjects(context, qualifiedName,
  296. onto.QualifiedName_PROVO_activity);
  297. all_influencers.addAll(influencers);
  298. all_influencers.addAll(agents);
  299. all_influencers.addAll(entities);
  300. all_influencers.addAll(activities);
  301. List<QualifiedName> influencees = getSubjects(context,
  302. onto.QualifiedName_PROVO_qualifiedInfluence, qualifiedName);
  303. List<Attribute> attributes = collectAttributes(context,
  304. qualifiedName,
  305. Types.ProvType.INFLUENCE);
  306. qualifiedName = getQualqualifiedName(qualifiedName);
  307. List<WasInfluencedBy> wibs = new ArrayList<WasInfluencedBy>();
  308. List<List<?>> perms = permute(influencees, new ArrayList<QualifiedName>(
  309. all_influencers));
  310. for (List<?> perm : perms)
  311. {
  312. WasInfluencedBy wib = pFactory.newWasInfluencedBy(qualifiedName,
  313. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1), attributes);
  314. store(context, wib);
  315. wibs.add(wib);
  316. }
  317. return wibs;
  318. }
  319. private void createEnd(QualifiedName context, QualifiedName qualifiedName)
  320. {
  321. List<Statement> statements = collators.get(context).get(qualifiedName);
  322. List<XMLGregorianCalendar> times = getInstantaneousTimes(statements);
  323. List<QualifiedName> triggers = getObjects(context, qualifiedName,
  324. onto.QualifiedName_PROVO_entity);
  325. List<QualifiedName> enders = getObjects(context, qualifiedName,
  326. onto.QualifiedName_PROVO_hadActivity);
  327. List<QualifiedName> activities = getSubjects(context,
  328. onto.QualifiedName_PROVO_qualifiedEnd, qualifiedName);
  329. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  330. Types.ProvType.END);
  331. qualifiedName = getQualqualifiedName(qualifiedName);
  332. List<List<?>> perms = permute(activities, triggers, enders, times);
  333. for (List<?> perm : perms)
  334. {
  335. WasEndedBy web = pFactory.newWasEndedBy(qualifiedName, (QualifiedName) perm.get(0),
  336. (QualifiedName) perm.get(1), (QualifiedName) perm.get(2),
  337. (XMLGregorianCalendar) perm.get(3), attributes);
  338. store(context, web);
  339. }
  340. }
  341. private void createInsertion(QualifiedName context, QualifiedName qualifiedName)
  342. {
  343. List<QualifiedName> objectDictionaries = getObjects(context, qualifiedName,
  344. onto.QualifiedName_PROVO_dictionary);
  345. List<QualifiedName> pairs = getObjects(context, qualifiedName,
  346. onto.QualifiedName_PROVO_insertedKeyEntityPair);
  347. List<QualifiedName> subjectDictionaries = getSubjects(context,
  348. onto.QualifiedName_PROVO_qualifiedInsertion, qualifiedName);
  349. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  350. Types.ProvType.INSERTION);
  351. qualifiedName = getQualqualifiedName(qualifiedName);
  352. List<List<?>> perms = permute(subjectDictionaries, objectDictionaries);
  353. for (List<?> perm : perms)
  354. {
  355. DerivedByInsertionFrom dbif = pFactory.newDerivedByInsertionFrom(qualifiedName,
  356. (QualifiedName) perm.get(0),
  357. (QualifiedName) perm.get(1),
  358. createKeyEntityPairs(context, pairs),
  359. attributes);
  360. store(context, dbif);
  361. }
  362. }
  363. private void createRemoval(QualifiedName context, QualifiedName qualifiedName)
  364. {
  365. List<QualifiedName> objectDictionaries = getObjects(context, qualifiedName,
  366. onto.QualifiedName_PROVO_dictionary);
  367. List<Value> keys = getDataObjects(context,
  368. qualifiedName,
  369. onto.QualifiedName_PROVO_removedKey);
  370. List<QualifiedName> subjectDictionaries = getSubjects(context,
  371. onto.QualifiedName_PROVO_qualifiedRemoval, qualifiedName);
  372. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  373. Types.ProvType.REMOVAL);
  374. qualifiedName = getQualqualifiedName(qualifiedName);
  375. List<Key> theKeys=new LinkedList<Key>();
  376. for (Value key: keys) {
  377. theKeys.add(valueToKey(key));
  378. }
  379. List<List<?>> perms = permute(subjectDictionaries, objectDictionaries);
  380. for (List<?> perm : perms) {
  381. DerivedByRemovalFrom dbif = pFactory.newDerivedByRemovalFrom(qualifiedName,
  382. (QualifiedName) perm.get(0),
  383. (QualifiedName) perm.get(1),
  384. theKeys,
  385. attributes);
  386. store(context, dbif);
  387. }
  388. }
  389. private void createStart(QualifiedName context, QualifiedName qualifiedName)
  390. {
  391. List<Statement> statements = collators.get(context).get(qualifiedName);
  392. List<XMLGregorianCalendar> times = getInstantaneousTimes(statements);
  393. List<QualifiedName> triggers = getObjects(context, qualifiedName,
  394. onto.QualifiedName_PROVO_entity);
  395. List<QualifiedName> starters = getObjects(context, qualifiedName,
  396. onto.QualifiedName_PROVO_hadActivity);
  397. List<QualifiedName> activities = getSubjects(context,
  398. onto.QualifiedName_PROVO_qualifiedStart, qualifiedName);
  399. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  400. Types.ProvType.START);
  401. qualifiedName = getQualqualifiedName(qualifiedName);
  402. List<List<?>> perms = permute(activities, triggers, starters, times);
  403. for (List<?> perm : perms)
  404. {
  405. WasStartedBy wsb = pFactory.newWasStartedBy(qualifiedName,
  406. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1),
  407. (QualifiedName) perm.get(2), (XMLGregorianCalendar) perm.get(3),
  408. attributes);
  409. store(context, wsb);
  410. }
  411. }
  412. private void createInvalidation(QualifiedName context, QualifiedName qualifiedName)
  413. {
  414. List<Statement> statements = collators.get(context).get(qualifiedName);
  415. List<XMLGregorianCalendar> times = getInstantaneousTimes(statements);
  416. List<QualifiedName> activities = getObjects(context, qualifiedName,
  417. onto.QualifiedName_PROVO_activity);
  418. List<QualifiedName> entities = getSubjects(context,
  419. onto.QualifiedName_PROVO_qualifiedInvalidation, qualifiedName);
  420. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  421. Types.ProvType.INVALIDATION);
  422. qualifiedName = getQualqualifiedName(qualifiedName);
  423. List<List<?>> perms = permute(entities, activities, times);
  424. for (List<?> perm : perms)
  425. {
  426. WasInvalidatedBy wib = pFactory.newWasInvalidatedBy(qualifiedName,
  427. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1),
  428. (XMLGregorianCalendar) perm.get(2), attributes);
  429. store(context, wib);
  430. }
  431. }
  432. private void createDelegation(QualifiedName context, QualifiedName qualifiedName)
  433. {
  434. List<QualifiedName> activities = getObjects(context, qualifiedName,
  435. onto.QualifiedName_PROVO_hadActivity);
  436. List<QualifiedName> agents = getObjects(context, qualifiedName,
  437. onto.QualifiedName_PROVO_agent);
  438. List<QualifiedName> subordinates = getSubjects(context,
  439. onto.QualifiedName_PROVO_qualifiedDelegation, qualifiedName);
  440. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  441. Types.ProvType.DELEGATION);
  442. qualifiedName = getQualqualifiedName(qualifiedName);
  443. List<List<?>> perms = permute(subordinates, agents, activities);
  444. for (List<?> perm : perms)
  445. {
  446. ActedOnBehalfOf aobo = pFactory.newActedOnBehalfOf(qualifiedName,
  447. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1),
  448. (QualifiedName) perm.get(2), attributes);
  449. store(context, aobo);
  450. }
  451. }
  452. private void createCommunication(QualifiedName context, QualifiedName qualifiedName)
  453. {
  454. List<QualifiedName> activities = getObjects(context, qualifiedName,
  455. onto.QualifiedName_PROVO_activity);
  456. List<QualifiedName> effects = getSubjects(context,
  457. onto.QualifiedName_PROVO_qualifiedCommunication, qualifiedName);
  458. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  459. Types.ProvType.COMMUNICATION);
  460. qualifiedName = getQualqualifiedName(qualifiedName);
  461. List<List<?>> perms = permute(effects, activities);
  462. for (List<?> perm : perms)
  463. {
  464. WasInformedBy wib = pFactory.newWasInformedBy(qualifiedName,
  465. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1), attributes);
  466. store(context, wib);
  467. }
  468. }
  469. private void createAttribution(QualifiedName context, QualifiedName qualifiedName)
  470. {
  471. List<QualifiedName> agents = getObjects(context, qualifiedName,
  472. onto.QualifiedName_PROVO_agent);
  473. List<QualifiedName> entities = getSubjects(context,
  474. onto.QualifiedName_PROVO_qualifiedAttribution, qualifiedName);
  475. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  476. Types.ProvType.ATTRIBUTION);
  477. qualifiedName = getQualqualifiedName(qualifiedName);
  478. List<List<?>> perms = permute(entities, agents);
  479. for (List<?> perm : perms)
  480. {
  481. WasAttributedTo wat = pFactory.newWasAttributedTo(qualifiedName,
  482. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1), attributes);
  483. store(context, wat);
  484. }
  485. }
  486. private void createAssociation(QualifiedName context, QualifiedName qualifiedName)
  487. {
  488. List<QualifiedName> plans = getObjects(context, qualifiedName,
  489. onto.QualifiedName_PROVO_hadPlan);
  490. List<QualifiedName> agents = getObjects(context, qualifiedName,
  491. onto.QualifiedName_PROVO_agent);
  492. List<QualifiedName> activities = getSubjects(context,
  493. onto.QualifiedName_PROVO_qualifiedAssociation, qualifiedName);
  494. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  495. Types.ProvType.ASSOCIATION);
  496. qualifiedName = getQualqualifiedName(qualifiedName);
  497. List<List<?>> perms = permute(activities, agents, plans);
  498. for (List<?> perm : perms)
  499. {
  500. WasAssociatedWith waw = pFactory.newWasAssociatedWith(qualifiedName,
  501. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1),
  502. (QualifiedName) perm.get(2), attributes);
  503. store(context, waw);
  504. }
  505. }
  506. private void createUsage(QualifiedName context, QualifiedName qualifiedName)
  507. {
  508. List<Statement> statements = collators.get(context).get(qualifiedName);
  509. List<XMLGregorianCalendar> times = getInstantaneousTimes(statements);
  510. List<QualifiedName> entities = getObjects(context, qualifiedName,
  511. onto.QualifiedName_PROVO_entity);
  512. List<QualifiedName> activities = getSubjects(context,
  513. onto.QualifiedName_PROVO_qualifiedUsage, qualifiedName);
  514. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  515. Types.ProvType.USAGE);
  516. qualifiedName = getQualqualifiedName(qualifiedName);
  517. List<List<?>> perms = permute(activities, entities, times);
  518. for (List<?> perm : perms)
  519. {
  520. Used used = pFactory.newUsed(qualifiedName,
  521. (QualifiedName) perm.get(0),
  522. (QualifiedName) perm.get(1),
  523. (XMLGregorianCalendar) perm.get(2),
  524. attributes);
  525. store(context, used);
  526. }
  527. }
  528. private QualifiedName getQualqualifiedName(QualifiedName qualifiedName)
  529. {
  530. if (qualifiedName.getNamespaceURI() == "" || qualifiedName.getNamespaceURI() == null || qualifiedName.getNamespaceURI().equals(BNODE_NS))
  531. {
  532. BNode bnode = new BNodeImpl(qualifiedName.getLocalPart());
  533. if (!isBNodeReferenced(bnode))
  534. {
  535. return null;
  536. }
  537. return pFactory.newQualifiedName(BNODE_NS, qualifiedName.getLocalPart(), "bnode");
  538. }
  539. return qualifiedName;
  540. }
  541. private void createGeneration(QualifiedName context, QualifiedName qualifiedName)
  542. {
  543. List<Statement> statements = collators.get(context).get(qualifiedName);
  544. List<XMLGregorianCalendar> times = getInstantaneousTimes(statements);
  545. List<QualifiedName> activities = getObjects(context, qualifiedName,
  546. onto.QualifiedName_PROVO_activity);
  547. List<QualifiedName> entities = getSubjects(context,
  548. onto.QualifiedName_PROVO_qualifiedGeneration, qualifiedName);
  549. List<Attribute> attributes = collectAttributes(context, qualifiedName,
  550. Types.ProvType.GENERATION);
  551. qualifiedName = getQualqualifiedName(qualifiedName);
  552. List<List<?>> perms = permute(entities, activities, times);
  553. for (List<?> perm : perms)
  554. {
  555. WasGeneratedBy wgb = pFactory.newWasGeneratedBy(qualifiedName,
  556. (QualifiedName) perm.get(0), (QualifiedName) perm.get(1),
  557. (XMLGregorianCalendar) perm.get(2), attributes);
  558. store(context, wgb);
  559. }
  560. }
  561. }