code: @Override
      public void addedStatement(final Statement input) {
          if (Operation.ADD == statements.get(input)) {
              return;
          }
          try {
              final Resource subject = input.getSubject();
              validateSubject(subject);
              LOGGER.debug(">> adding statement {}", input);
  
              final Statement s = jcrRdfTools.skolemize(idTranslator, input, topic.toString());
  
              final FedoraResource resource = idTranslator.convert(s.getSubject());
              final FedoraResource description = resource.getDescription();
  
              // special logic for handling rdf:type updates.
              // if the object is an already-existing mixin, update
              // the node's mixins. If it isn't, just treat it normally.
              final Property property = s.getPredicate();
              final RDFNode objectNode = s.getObject();
              if (property.equals(RDF.type) && objectNode.isResource()) {
                  final Resource mixinResource = objectNode.asResource();
                  jcrRdfTools.addMixin(description, mixinResource, input.getModel().getNsPrefixMap());
                  statements.put(input, Operation.ADD);
                  return;
              }
  
              jcrRdfTools.addProperty(description, property, objectNode, input.getModel().getNsPrefixMap());
              statements.put(input, Operation.ADD);
          } catch (final ConstraintViolationException e) {
              throw e;
          } catch (final javax.jcr.AccessDeniedException e) {
              throw new AccessDeniedException(e);
          } catch (final RepositoryException | RepositoryRuntimeException e) {
              exceptions.add(e);
          }
  
      }
docs: When a statement is added to the graph, serialize it to a JCR property
  
  @param input the input statement