/**
   * addLink
   *
   * <p>Create a link between two items
   *
   * <pre>
   * Version	Date		Developer				Description
   * 0.1		26/04/2012	Genevieve Turner (GT)	Initial
   * 0.19		27/09/2012	Genevieve Turner (GT)	Updated to generate reverse links
   * </pre>
   *
   * @param fedoraObject The item to transform to a display
   * @param form Contains the parameters from the request
   * @return A response for the web page
   * @throws FedoraClientException
   */
  @Override
  public void addLink(FedoraObject fedoraObject, String linkType, String itemId)
      throws FedoraClientException {
    String link = GlobalProps.getProperty(GlobalProps.PROP_FEDORA_RELATEDURI);

    LinkTypeDAO linkTypeDAO = new LinkTypeDAOImpl();
    LinkType linkTypeRecord = linkTypeDAO.getByCode(linkType);
    if (null == linkTypeRecord) {
      throw new WebApplicationException(
          Response.status(400).entity("Invalid relation type").build());
    }

    FedoraReference reference = new FedoraReference();
    String referenceType = linkType;
    String referenceItem = itemId;
    reference.setPredicate_(link + referenceType);
    reference.setObject_(referenceItem);
    reference.setIsLiteral_(Boolean.FALSE);
    FedoraBroker.addRelationship(fedoraObject.getObject_id(), reference);

    if (referenceItem.startsWith("info:fedora/")) {
      String referenceItemID = referenceItem.substring(12);
      FedoraReference reverseReference = new FedoraReference();
      reverseReference.setPredicate_(link + linkTypeRecord.getReverse());
      reverseReference.setObject_("info:fedora/" + fedoraObject.getObject_id());
      reverseReference.setIsLiteral_(Boolean.FALSE);
      FedoraBroker.addRelationship(referenceItemID, reverseReference);
    }
  }
 /**
  * delete
  *
  * <p>Set the status of the given object to deleted
  *
  * @param fedoraObject The fedora object
  * @throws FedoraClientException
  */
 public void delete(FedoraObject fedoraObject) throws FedoraClientException {
   FedoraBroker.updateObjectState(fedoraObject.getObject_id(), "D");
   // Add this as a work around for the fact that commitWithin does not seem to work for
   // the Solr XML delete so we want to commit after delete
   SolrServer solrServer = SolrManager.getInstance().getSolrServer();
   try {
     solrServer.deleteById(fedoraObject.getObject_id(), 5000);
   } catch (IOException e) {
     LOGGER.debug("Exception committing delete", e);
   } catch (SolrServerException e) {
     LOGGER.debug("Exception committing delete", e);
   }
 }
  @Override
  public void generateDoi(String pid, String tmplt, Long rid) throws FedoraObjectException {
    InputStream datastream = null;
    try {
      Unmarshaller um = dataContext.createUnmarshaller();
      datastream = FedoraBroker.getDatastreamAsStream(pid, Constants.XML_SOURCE);
      Data itemData = (Data) um.unmarshal(datastream);

      // Check if it's a collection.
      String type = itemData.getFirstElementByName("type").getValue();
      if (!type.equalsIgnoreCase("collection"))
        throw new FedoraObjectException(
            "Item is not of type 'collection'. Digital Object Identifiers can only be minted for collections.");

      // Check if a DOI already exists.
      if (itemData.getFirstElementByName("doi") != null) {
        throw new FedoraObjectException("Collection already has a Digital Object Identifier.");
      }

      // TODO Change the following code as required for checking if the item's published or not.
      //			List<DatastreamType> datastreams = FedoraBroker.getDatastreamList(pid);
      //			for (DatastreamType iDs : datastreams)
      //			{
      //				if (iDs.getDsid().equals(Constants.XML_PUBLISHED))
      //				{
      //					throw new FedoraObjectException("Item's already published.");
      //				}
      //			}

      org.datacite.schema.kernel_2.Resource doiResource =
          new DoiResourceAdapter(itemData).createDoiResource();
      DoiClient doiClient = new DoiClient();
      doiClient.mint(pid, doiResource);

      String mintedDoi = doiClient.getDoiResponse().getDoi();
      FedoraObject fedoraObject = getItemByPid(pid);
      Map<String, List<String>> form = new HashMap<String, List<String>>();
      form.put("doi", Arrays.asList(mintedDoi));
      saveEdit(fedoraObject, tmplt, form, rid);
    } catch (FedoraClientException e) {
      throw new FedoraObjectException(e.getMessage(), e);
    } catch (JAXBException e) {
      throw new FedoraObjectException(e.getMessage(), e);
    } catch (DoiException e) {
      throw new FedoraObjectException(e.getMessage(), e);
    } finally {
      IOUtils.closeQuietly(datastream);
    }
  }