예제 #1
0
  /**
   * Import the file.
   *
   * @param importFile the file to import.
   * @param controller the controller to use.
   * @param progressPanel - the progress panel to display heartbeat messages
   * @return if we succeded
   */
  public boolean importFile(
      File importFile, DomainImportController controller, InfiniteProgressPanel progressPanel)
      throws ImportException {

    Collection<DomainObject> collection = new ArrayList<DomainObject>();

    if (importFile != null) {
      JAXBContext context;
      try {
        LookupListUtils.initIngestReport();
        context = JAXBContext.newInstance("org.archiviststoolkit.structure.accessionImport");
        AccessionRecords accessionRecords =
            (AccessionRecords) context.createUnmarshaller().unmarshal(importFile);
        Accessions accession;
        int recordCount = 1;
        progressPanel.setTextLine("Importing...", 1);
        PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(RecordType.class);
        for (RecordType record : accessionRecords.getRecord()) {
          // check to see if the process was cancelled  at this point if so just return
          if (progressPanel.isProcessCancelled()) {
            return false;
          }

          progressPanel.setTextLine("Processing record " + recordCount, 2);
          accession = new Accessions();
          accession.setRepository(repository);

          for (PropertyDescriptor descriptor : descriptors) {
            Class propertyType = descriptor.getPropertyType();
            if (propertyType == XMLGregorianCalendar.class) {
              ImportUtils.nullSafeDateSet(
                  accession,
                  descriptor.getName(),
                  (XMLGregorianCalendar) descriptor.getReadMethod().invoke(record));
            } else if (propertyType == String.class
                || propertyType == BigInteger.class
                || propertyType == BigDecimal.class) {
              ImportUtils.nullSafeSet(
                  accession, descriptor.getName(), descriptor.getReadMethod().invoke(record));

            } else if (propertyType == Boolean.class) {
              // this hack is needed because jaxb has a bug and the read method starts
              // with "is" instead of "get"
              String writeMethodName = descriptor.getWriteMethod().getName();
              String readMethodName = writeMethodName.replaceFirst("set", "is");
              Method readMethod = RecordType.class.getMethod(readMethodName);
              ImportUtils.nullSafeSet(accession, descriptor.getName(), readMethod.invoke(record));
            }
          }
          parseAccessionNumber(accession, record.getAccessionNumber());
          addSubjects(accession, record.getSubjectLink());
          addNames(accession, record.getNameLink());
          addResource(
              accession,
              record.getResourceIdentifier(),
              controller,
              accession.getAccessionNumber(),
              recordCount);
          collection.add(accession);
          recordCount++;
        }
        controller.domainImport(collection, ApplicationFrame.getInstance(), progressPanel);
        ImportExportLogDialog dialog =
            new ImportExportLogDialog(
                controller.constructFinalImportLogText()
                    + "\n\n"
                    + LookupListUtils.getIngestReport(),
                ImportExportLogDialog.DIALOG_TYPE_IMPORT);
        progressPanel.close();
        dialog.showDialog();
      } catch (JAXBException e) {
        progressPanel.close();
        new ErrorDialog(
                ApplicationFrame.getInstance(), "There is a problem importing accessions.", e)
            .showDialog();
      } catch (IllegalAccessException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (InvocationTargetException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (UnknownLookupListException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (ValidationException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (PersistenceException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (DuplicateLinkException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (NoSuchMethodException e) {
        progressPanel.close();
        new ErrorDialog("", e).showDialog();
      } catch (NoSuchAlgorithmException e) {
        new ErrorDialog("", e).showDialog();
      } catch (UnsupportedEncodingException e) {
        new ErrorDialog("", e).showDialog();
      }
    }
    return (true);
  }
예제 #2
0
  private void addResource(
      Accessions accession,
      IdentifierType resourceId,
      DomainImportController controller,
      String accesionNumber,
      int recordNumber)
      throws ImportException {

    if (resourceId != null) {

      String resourceId1;
      String resourceId2 = null;
      String resourceId3 = null;
      String resourceId4 = null;
      if (resourceId.getComposite() != null) {
        resourceId1 =
            StringHelper.trimToLength(
                resourceId.getComposite(),
                ATFieldInfo.checkFieldLength(
                    Resources.class, Resources.PROPERTYNAME_RESOURCE_IDENTIFIER_1));
      } else {
        resourceId1 = resourceId.getPart1();
        resourceId2 = resourceId.getPart2();
        resourceId3 = resourceId.getPart3();
        resourceId4 = resourceId.getPart4();
      }

      ResourcesDAO resourceDao = new ResourcesDAO();
      Resources resource;
      if (resourceCreation.equalsIgnoreCase(AccessionImportXmlHandler.RESOURCE_CREATION_NONE)) {
        resource =
            resourceDao.lookupResource(
                resourceId1, resourceId2, resourceId3, resourceId4, false, repository);
      } else {
        resource =
            resourceDao.lookupResource(
                resourceId1, resourceId2, resourceId3, resourceId4, true, repository);
      }
      if (resourceDao.getNewRecordCreated()
          && resourceCreation.equalsIgnoreCase(AccessionImportXmlHandler.RESOURCE_CREATION_FULL)) {
        try {
          resource = (Resources) resourceDao.findByPrimaryKeyLongSession(resource.getIdentifier());
          resource.populateResourceFromAccession(accession);
          resourceDao.updateLongSession(resource);

        } catch (LookupException e) {
          throw new ImportException(
              "Error creating resource: " + resourceId + ", " + e.getMessage(), e);
        } catch (PersistenceException e) {
          throw new ImportException(
              "Error creating resource: " + resourceId + ", " + e.getMessage(), e);
        } catch (DuplicateLinkException e) {
          throw new ImportException(
              "Error creating resource: duplicate link" + resourceId + ", " + e.getMessage(), e);
        }
      }
      if (resource != null) {
        AccessionsResources accessionResource = new AccessionsResources(resource, accession);
        accession.addAccessionsResources(accessionResource);
      }
    } else {
      if (!resourceCreation.equalsIgnoreCase(AccessionImportXmlHandler.RESOURCE_CREATION_NONE)) {
        controller.addLineToImportLog(
            "Record # "
                + recordNumber
                + " - "
                + accesionNumber
                + " has no resource id so no resource record was created");
      }
    }
  }