Esempio n. 1
0
  /**
   * Subclasses can override this method to cater to their special needs for
   * UndeterminedRelationships by default, it expects something like this in the original EAD:
   *
   * <p>
   *
   * <pre>{@code
   * <persname source="terezin-victims" authfilenumber="PERSON.ITI.1514982">Kien,
   * Leonhard (* 11.5.1886)</persname>
   * }</pre>
   *
   * <p>it works in unison with the extractRelations() method.
   *
   * @param unit the current unit
   */
  protected void solveUndeterminedRelationships(DocumentaryUnit unit) throws ValidationError {
    // Try to resolve the undetermined relationships
    // we can only create the annotations after the DocumentaryUnit
    // and its Description have been added to the graph,
    // so they have IDs.
    Api api = ApiFactory.noLogging(framedGraph, actioner.as(UserProfile.class));
    Bundle linkBundle =
        new Bundle(EntityClass.LINK)
            .withDataValue(Ontology.LINK_HAS_DESCRIPTION, RESOLVED_LINK_DESC);

    for (Description desc : unit.getDescriptions()) {
      // Put the set of relationships into a HashSet to remove duplicates.
      for (AccessPoint rel : Sets.newHashSet(desc.getAccessPoints())) {
        // the wp2 undetermined relationship that can be resolved have a 'cvoc' and a 'concept'
        // attribute.
        // they need to be found in the vocabularies that are in the graph
        if (rel.getPropertyKeys().contains("cvoc")) {
          String vocab = rel.getProperty("cvoc");
          String conceptId = rel.getProperty("concept");
          if (conceptId == null) {
            conceptId = rel.getProperty("target");
          }
          logger.debug("cvoc: {}, concept: {}", vocab, conceptId);
          try {
            Vocabulary vocabulary = manager.getEntity(vocab, Vocabulary.class);
            for (Concept concept : vocabulary.getConcepts()) {
              logger.debug("********************* {} {}", concept.getId(), concept.getIdentifier());
              if (concept.getIdentifier().equalsIgnoreCase(conceptId)) {
                try {
                  // TODO: Fix link type here...
                  Bundle data = linkBundle.withDataValue(Ontology.LINK_HAS_TYPE, "associative");
                  Link link = api.create(data, Link.class);
                  unit.addLink(link);
                  concept.addLink(link);
                  link.addLinkBody(rel);
                  logger.debug("link created between {} and {}", conceptId, concept.getId());
                } catch (PermissionDenied | DeserializationError ex) {
                  logger.error(ex.getMessage());
                }
              }
            }
          } catch (ItemNotFound ex) {
            logger.error("Vocabulary with id {} not found: {}", vocab, ex.getMessage());
          }
        } else {
          logger.debug("no cvoc found");
        }
      }
    }
  }
 @Test
 public void testCreateLink() throws Exception {
   DocumentaryUnit src = manager.getFrame("c1", DocumentaryUnit.class);
   HistoricalAgent dst = manager.getFrame("a1", HistoricalAgent.class);
   UndeterminedRelationship rel = manager.getFrame("ur1", UndeterminedRelationship.class);
   String linkDesc = "Test Link";
   String linkType = "subjectAccess";
   Bundle linkBundle = getLinkBundle(linkDesc, linkType);
   Link link = linkViews.createLink("c1", "a1", Lists.newArrayList("ur1"), linkBundle, validUser);
   assertEquals(linkDesc, link.getDescription());
   assertEquals(2L, Iterables.size(link.getLinkTargets()));
   assertTrue(Iterables.contains(link.getLinkTargets(), src));
   assertTrue(Iterables.contains(link.getLinkTargets(), dst));
   assertEquals(1L, Iterables.size(link.getLinkBodies()));
   assertTrue(Iterables.contains(link.getLinkBodies(), rel));
 }
 @Test
 public void testCreateAccessPointLink() throws Exception {
   DocumentaryUnit src = manager.getFrame("c1", DocumentaryUnit.class);
   HistoricalAgent dst = manager.getFrame("a1", HistoricalAgent.class);
   DocumentDescription desc = manager.getFrame("cd1", DocumentDescription.class);
   String linkDesc = "Test Link";
   String linkType = "subjectAccess";
   Bundle linkBundle = getLinkBundle(linkDesc, linkType);
   Link link =
       linkViews.createAccessPointLink(
           "c1", "a1", "cd1", linkDesc, linkType, linkBundle, validUser);
   assertEquals(linkDesc, link.getDescription());
   assertEquals(2L, Iterables.size(link.getLinkTargets()));
   assertTrue(Iterables.contains(link.getLinkTargets(), src));
   assertTrue(Iterables.contains(link.getLinkTargets(), dst));
   assertEquals(1L, Iterables.size(link.getLinkBodies()));
   UndeterminedRelationship rel =
       manager.cast(link.getLinkBodies().iterator().next(), UndeterminedRelationship.class);
   assertEquals(rel.getName(), linkDesc);
   assertEquals(rel.getRelationshipType(), linkType);
   Description d = rel.getDescription();
   assertEquals(desc, d);
 }