Ejemplo n.º 1
0
  @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);
    }
  }