/** * 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); }
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"); } } }