├── .codeclimate.yml ├── .github └── workflows │ └── build.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── Makefile ├── README.md ├── auth-api ├── pom.xml └── src │ ├── main │ └── java │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── auth │ │ └── api │ │ ├── AccessPrincipalConstants.java │ │ ├── Permission.java │ │ ├── UserRole.java │ │ ├── exceptions │ │ ├── AccessRestrictionException.java │ │ └── InvalidAssignmentException.java │ │ ├── models │ │ ├── AccessGroupSet.java │ │ ├── AgentPrincipals.java │ │ └── RoleAssignment.java │ │ └── services │ │ ├── AccessControlService.java │ │ ├── AclFactory.java │ │ ├── DatastreamPermissionUtil.java │ │ ├── EmbargoUtil.java │ │ ├── GlobalPermissionEvaluator.java │ │ └── PrincipalClassifier.java │ └── test │ └── java │ └── edu │ └── unc │ └── lib │ └── boxc │ └── auth │ └── api │ ├── UserRoleTest.java │ └── services │ ├── DatastreamPermissionUtilTest.java │ ├── EmbargoUtilTest.java │ └── PrincipalClassifierTest.java ├── auth-fcrepo ├── pom.xml └── src │ ├── main │ └── java │ │ ├── META-INF │ │ └── MANIFEST.MF │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── auth │ │ └── fcrepo │ │ ├── models │ │ ├── AccessGroupSetImpl.java │ │ └── AgentPrincipalsImpl.java │ │ └── services │ │ ├── AccessControlServiceImpl.java │ │ ├── ContentObjectAccessRestrictionValidator.java │ │ ├── GlobalPermissionEvaluatorImpl.java │ │ ├── GroupsThreadStore.java │ │ ├── InheritedAclFactory.java │ │ ├── InheritedPermissionEvaluator.java │ │ └── ObjectAclFactory.java │ └── test │ ├── java │ ├── META-INF │ │ └── MANIFEST.MF │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── auth │ │ └── fcrepo │ │ ├── model │ │ ├── AccessGroupSetImplTest.java │ │ └── AgentPrincipalsImplTest.java │ │ └── services │ │ ├── ContentObjectAccessRestrictionValidatorTest.java │ │ ├── GlobalPermissionEvaluatorTest.java │ │ ├── GroupsThreadStoreTest.java │ │ ├── InheritedAclFactoryTest.java │ │ ├── InheritedPermissionEvaluatorTest.java │ │ └── ObjectACLFactoryTest.java │ └── resources │ └── logback-test.xml ├── clamd.conf ├── common-utils ├── pom.xml └── src │ ├── main │ ├── java │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── common │ │ │ ├── errors │ │ │ └── CommandException.java │ │ │ ├── http │ │ │ ├── EntityTag.java │ │ │ └── MimetypeHelpers.java │ │ │ ├── metrics │ │ │ ├── CounterFactory.java │ │ │ ├── HistogramFactory.java │ │ │ ├── RegistryService.java │ │ │ ├── ReporterFactory.java │ │ │ └── TimerFactory.java │ │ │ ├── util │ │ │ ├── CLIUtil.java │ │ │ ├── DateTimeUtil.java │ │ │ ├── URIUtil.java │ │ │ └── ZipFileUtil.java │ │ │ └── xml │ │ │ └── SecureXMLFactory.java │ └── resources │ │ ├── checkstyle │ │ ├── checkstyle-suppressions.xml │ │ └── checkstyle.xml │ │ └── schemas │ │ ├── acl.xsd │ │ ├── dc.xsd │ │ ├── dcmitype.xsd │ │ ├── dcterms.xsd │ │ ├── mets.xsd │ │ ├── mods-3-8.xsd │ │ ├── premis-v2-0.xsd │ │ ├── qualifieddc.xsd │ │ ├── xlink.xsd │ │ └── xml.xsd │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── common │ │ ├── http │ │ ├── EntityTagTest.java │ │ └── MimetypeHelpersTest.java │ │ ├── test │ │ ├── SelfReturningAnswer.java │ │ └── TestHelpers.java │ │ └── util │ │ ├── CLIUtilTest.java │ │ ├── DateTimeUtilTest.java │ │ ├── URIUtilTest.java │ │ └── ZipFileUtilTest.java │ └── resources │ └── samples │ ├── bad-zip-with-relative-path.zip │ └── test-mets-zip.zip ├── deposit-app ├── .gitignore ├── README.md ├── pom.xml └── src │ ├── main │ ├── java │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── deposit │ │ │ ├── CleanupDepositJob.java │ │ │ ├── GetProperty.java │ │ │ ├── SpringDepositServiceInitiator.java │ │ │ ├── fcrepo4 │ │ │ ├── IngestContentObjectsJob.java │ │ │ ├── IngestDepositRecordJob.java │ │ │ └── StaffOnlyPermissionJob.java │ │ │ ├── normalize │ │ │ ├── AbstractFileServerToBagJob.java │ │ │ ├── AbstractMETS2N3BagJob.java │ │ │ ├── AssignStorageLocationsJob.java │ │ │ ├── BagIt2N3BagJob.java │ │ │ ├── CDRMETS2N3BagJob.java │ │ │ ├── CDRMETSGraphExtractor.java │ │ │ ├── DirectoryToBagJob.java │ │ │ ├── FilePathFunction.java │ │ │ ├── METSHelper.java │ │ │ ├── NormalizeFileObjectsJob.java │ │ │ ├── PreconstructedDepositJob.java │ │ │ ├── Simple2N3BagJob.java │ │ │ ├── UnpackDepositJob.java │ │ │ ├── VocabularyEnforcementJob.java │ │ │ ├── WorkFormData.java │ │ │ ├── WorkFormModsTransformer.java │ │ │ └── WorkFormToBagJob.java │ │ │ ├── transfer │ │ │ └── TransferBinariesToStorageJob.java │ │ │ ├── validate │ │ │ ├── DepositSetMemberOrderValidator.java │ │ │ ├── ExtractTechnicalMetadataJob.java │ │ │ ├── FixityCheckJob.java │ │ │ ├── PackageIntegrityCheckJob.java │ │ │ ├── ValidateContentModelJob.java │ │ │ ├── ValidateDescriptionJob.java │ │ │ ├── ValidateDestinationJob.java │ │ │ ├── ValidateFileAvailabilityJob.java │ │ │ ├── VerifyObjectsAreInFedoraService.java │ │ │ └── VirusScanJob.java │ │ │ └── work │ │ │ ├── AbstractConcurrentDepositJob.java │ │ │ ├── AbstractDepositJob.java │ │ │ ├── DepositEmailHandler.java │ │ │ ├── DepositFailedException.java │ │ │ ├── DepositGraphUtils.java │ │ │ ├── DepositSupervisor.java │ │ │ ├── JedisFactory.java │ │ │ ├── JobFailedException.java │ │ │ ├── JobInterruptedException.java │ │ │ └── JobPausedException.java │ ├── resources │ │ ├── cdr-schema.ttl │ │ ├── completed_html.txt │ │ ├── completed_text.txt │ │ ├── epdcx2mods.xsl │ │ ├── failed_html.txt │ │ ├── failed_text.txt │ │ ├── freemark_templates │ │ │ └── work_form_mods.ftl │ │ ├── iso-639-1-to-639-2b.xsl │ │ ├── languageMappings.xsl │ │ └── logback.xml │ └── webapp │ │ └── WEB-INF │ │ ├── deposit-jobs-context.xml │ │ ├── fcrepo-clients-context.xml │ │ ├── service-context.xml │ │ └── web.xml │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── deposit │ │ ├── CleanupDepositJobTest.java │ │ ├── DepositTestUtils.java │ │ ├── fcrepo4 │ │ ├── AbstractDepositJobTest.java │ │ ├── AbstractFedoraDepositJobIT.java │ │ ├── IngestContentObjectsJobIT.java │ │ ├── IngestContentObjectsJobTest.java │ │ ├── IngestDepositRecordJobIT.java │ │ └── StaffOnlyPermissionJobTest.java │ │ ├── normalize │ │ ├── AbstractNormalizationJobTest.java │ │ ├── AssignStorageLocationsJobTest.java │ │ ├── BagIt2N3BagJobTest.java │ │ ├── CDRMETS2N3BagJobTest.java │ │ ├── DirectoryToBagJobTest.java │ │ ├── NormalizeFileObjectsJobTest.java │ │ ├── PackageIntegrityCheckJobTest.java │ │ ├── PreconstructedDepositJobTest.java │ │ ├── Simple2N3BagJobTest.java │ │ ├── UnpackDepositJobTest.java │ │ ├── VocabularyEnforcementJobTest.java │ │ ├── WorkFormModsTransformerTest.java │ │ └── WorkFormToBagJobTest.java │ │ ├── transfer │ │ └── TransferBinariesToStorageJobTest.java │ │ ├── validate │ │ ├── DepositSetMemberOrderValidatorTest.java │ │ ├── ExtractTechnicalMetadataJobTest.java │ │ ├── FixityCheckJobTest.java │ │ ├── ValidateContentModelJobTest.java │ │ ├── ValidateDescriptionJobTest.java │ │ ├── ValidateDestinationJobIT.java │ │ ├── ValidateFileAvailabilityJobTest.java │ │ ├── VerifyObjectsAreInFedoraServiceTest.java │ │ └── VirusScanJobTest.java │ │ └── work │ │ └── DepositSupervisorTest.java │ └── resources │ ├── accessControlsTest.cdr.xml │ ├── acl-global-config.properties │ ├── application.properties │ ├── atomPubEntryBag.zip │ ├── cdrMETS.zip │ ├── cleanupStage │ └── project │ │ ├── folderA │ │ ├── ingested │ │ └── leftover │ │ └── folderB │ │ ├── also_ingested │ │ └── ingested │ ├── deposit.properties │ ├── depositFileZipped.zip │ ├── examples │ ├── image.jpg │ ├── pdf.pdf │ └── text.txt │ ├── fitsReports │ ├── conflictRankingReport.xml │ ├── conflictTypeReport.xml │ ├── exifReport.xml │ ├── exifSingleResult.xml │ ├── exifSymlinkConflict.xml │ ├── imageReport.xml │ ├── textReport.xml │ └── unknownReport.xml │ ├── form_submissions │ ├── continuing_maximal.json │ ├── continuing_minimal.json │ ├── generic_maximal.json │ ├── generic_minimal.json │ └── generic_with_xml_chars.json │ ├── ingest-bags │ ├── fcrepo4 │ │ └── valid-bag.n3 │ └── proquest-bag.zip │ ├── logback-test.xml │ ├── mets.xml │ ├── mets_object_only.xml │ ├── mods │ ├── multipleNameAffiliationsMods.xml │ └── singleAffiliationMods.xml │ ├── paths │ ├── flat-bag │ │ ├── bagit.txt │ │ ├── data │ │ │ ├── ipsum.txt │ │ │ └── lorem.txt │ │ └── manifest-md5.txt │ ├── invalid-bag │ │ └── test │ │ │ └── lorem.txt │ └── valid-bag │ │ ├── bagit.txt │ │ ├── data │ │ └── test │ │ │ ├── ipsum.txt │ │ │ └── lorem.txt │ │ └── manifest-md5.txt │ ├── simpleMods.xml │ ├── spring-test │ ├── cdr-client-container.xml │ └── deposit-supervisor-test-context.xml │ └── staging_config.json ├── deposit-utils ├── pom.xml └── src │ ├── main │ └── java │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── deposit │ │ ├── api │ │ ├── DepositConstants.java │ │ ├── DepositMethod.java │ │ ├── RedisWorkerConstants.java │ │ ├── exceptions │ │ │ ├── DepositException.java │ │ │ ├── InterruptedRuntimeException.java │ │ │ └── METSParseException.java │ │ └── submit │ │ │ ├── DepositData.java │ │ │ └── DepositHandler.java │ │ ├── impl │ │ ├── mets │ │ │ ├── METSProfile.java │ │ │ └── MetsHeaderScanner.java │ │ ├── model │ │ │ ├── AbstractJedisFactory.java │ │ │ ├── ActivityMetricsClient.java │ │ │ ├── DepositDirectoryManager.java │ │ │ ├── DepositModelHelpers.java │ │ │ ├── DepositModelManager.java │ │ │ ├── DepositPipelineStatusFactory.java │ │ │ ├── DepositStatusFactory.java │ │ │ └── JobStatusFactory.java │ │ └── submit │ │ │ ├── AbstractDepositHandler.java │ │ │ ├── CDRMETSDepositHandler.java │ │ │ ├── DepositSubmissionService.java │ │ │ ├── FileServerDepositHandler.java │ │ │ ├── PreconstructedDepositHandler.java │ │ │ └── SimpleObjectDepositHandler.java │ │ └── utils │ │ ├── NoResolutionResourceResolver.java │ │ └── SpringJobFactory.java │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── deposit │ │ └── impl │ │ ├── model │ │ ├── DepositDirectoryManagerTest.java │ │ ├── DepositPipelineStatusFactoryIT.java │ │ ├── DepositStatusFactoryIT.java │ │ └── JobStatusFactoryTest.java │ │ └── submit │ │ ├── CDRMETSDepositHandlerTest.java │ │ ├── DepositSubmissionServiceTest.java │ │ ├── FileServerDepositHandlerTest.java │ │ └── SimpleObjectDepositHandlerTest.java │ └── resources │ ├── cdr_mets_package.xml │ └── spring │ └── jedis-context.xml ├── docker-compose.yml ├── etc ├── ide_setup │ ├── README.md │ └── boxc_code_profile.xml └── solr-config │ ├── access │ ├── conf │ │ ├── lang │ │ │ └── stopwords_en.txt │ │ ├── schema.xml │ │ ├── solrconfig.xml │ │ └── synonyms.txt │ └── core.properties │ ├── log4j2.xml │ └── solr.xml ├── fcrepo-utils ├── pom.xml └── src │ ├── .gitignore │ ├── main │ ├── java │ │ ├── META-INF │ │ │ └── MANIFEST.MF │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── fcrepo │ │ │ ├── FcrepoJmsConstants.java │ │ │ ├── FcrepoPaths.java │ │ │ ├── exceptions │ │ │ ├── AuthorizationException.java │ │ │ ├── ChecksumMismatchException.java │ │ │ ├── ConflictException.java │ │ │ ├── FedoraTimeoutException.java │ │ │ ├── OptimisticLockException.java │ │ │ ├── RangeNotSatisfiableException.java │ │ │ ├── ServiceException.java │ │ │ └── TransactionCancelledException.java │ │ │ └── utils │ │ │ ├── ClientFaultResolver.java │ │ │ ├── FcrepoClientFactory.java │ │ │ ├── FedoraSparqlUpdateService.java │ │ │ ├── FedoraTransaction.java │ │ │ ├── FedoraTransactionRefresher.java │ │ │ ├── SanitizeServerManagedTriplesSelector.java │ │ │ ├── TransactionManager.java │ │ │ └── TransactionalFcrepoClient.java │ └── resources │ │ └── .keep │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── fcrepo │ │ ├── exceptions │ │ └── RangeNotSatisfiableExceptionTest.java │ │ └── utils │ │ ├── FedoraTransactionRefresherTest.java │ │ └── TransactionalFcrepoClientTest.java │ └── resources │ └── logback-test.xml ├── indexing-solr ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── META-INF │ │ │ └── MANIFEST.MF │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── indexing │ │ │ └── solr │ │ │ ├── ChildSetRequest.java │ │ │ ├── ProcessingStatus.java │ │ │ ├── SolrUpdateRequest.java │ │ │ ├── UpdateNodeRequest.java │ │ │ ├── action │ │ │ ├── AbstractIndexingAction.java │ │ │ ├── ClearIndexAction.java │ │ │ ├── CommitAction.java │ │ │ ├── DeleteObjectAction.java │ │ │ ├── DeleteSolrTreeAction.java │ │ │ ├── DeleteStaleChildren.java │ │ │ ├── IndexTreeCleanAction.java │ │ │ ├── IndexTreeInplaceAction.java │ │ │ ├── IndexingAction.java │ │ │ ├── RecursiveTreeIndexer.java │ │ │ ├── SeparateRootAndDescendantsUpdateAction.java │ │ │ ├── UpdateObjectAction.java │ │ │ ├── UpdateTreeAction.java │ │ │ └── UpdateTreeSetAction.java │ │ │ ├── exception │ │ │ ├── IndexingException.java │ │ │ ├── ObjectTombstonedException.java │ │ │ ├── OrphanedObjectException.java │ │ │ └── RecoverableIndexingException.java │ │ │ ├── filter │ │ │ ├── IndexDocumentFilter.java │ │ │ ├── SetAccessControlFilter.java │ │ │ ├── SetAccessStatusFilter.java │ │ │ ├── SetAltTextFilter.java │ │ │ ├── SetAspaceRefIdFilter.java │ │ │ ├── SetCollectionSupplementalInformationFilter.java │ │ │ ├── SetContentStatusFilter.java │ │ │ ├── SetContentTypeFilter.java │ │ │ ├── SetDatastreamFilter.java │ │ │ ├── SetDescriptiveMetadataFilter.java │ │ │ ├── SetFullTextFilter.java │ │ │ ├── SetMemberOrderFilter.java │ │ │ ├── SetObjectTypeFilter.java │ │ │ ├── SetPathFilter.java │ │ │ ├── SetRecordDatesFilter.java │ │ │ ├── SetStreamingPropertiesFilter.java │ │ │ ├── SetViewBehaviorFilter.java │ │ │ └── collection │ │ │ │ ├── CollectionSupplementalInformationFilter.java │ │ │ │ └── RLASupplementalFilter.java │ │ │ ├── indexing │ │ │ ├── DocumentFilteringPipeline.java │ │ │ ├── DocumentIndexingPackage.java │ │ │ ├── DocumentIndexingPackageDataLoader.java │ │ │ ├── DocumentIndexingPackageFactory.java │ │ │ ├── DocumentIndexingPipeline.java │ │ │ ├── SolrUpdateDriver.java │ │ │ └── TolerantConcurrentUpdateSolrClient.java │ │ │ └── utils │ │ │ ├── JDOMQueryUtil.java │ │ │ ├── Jp2Info.java │ │ │ ├── Jp2InfoService.java │ │ │ ├── KduJp2InfoService.java │ │ │ ├── MemberOrderService.java │ │ │ ├── NoOpJp2InfoService.java │ │ │ └── TechnicalMetadataService.java │ └── resources │ │ ├── extensionMimetypeOverrides.properties │ │ ├── iso639LangMappings.txt │ │ ├── mimetypeToDescription.properties │ │ ├── rightsUriMappings.txt │ │ └── toContentType.properties │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── indexing │ │ └── solr │ │ ├── action │ │ ├── BaseEmbeddedSolrTest.java │ │ ├── ClearIndexActionTest.java │ │ ├── DeleteSolrTreeTest.java │ │ ├── IndexTreeCleanActionTest.java │ │ ├── IndexTreeInplaceActionTest.java │ │ ├── RecursiveTreeIndexerTest.java │ │ ├── UpdateTreeActionTest.java │ │ └── UpdateTreeSetActionTest.java │ │ ├── filter │ │ ├── SetAccessControlFilterTest.java │ │ ├── SetAccessStatusFilterTest.java │ │ ├── SetAltTextFilterTest.java │ │ ├── SetAspaceRefIdFilterTest.java │ │ ├── SetContentStatusFilterTest.java │ │ ├── SetContentTypeFilterTest.java │ │ ├── SetDatastreamFilterTest.java │ │ ├── SetDescriptiveMetadataFilterTest.java │ │ ├── SetFullTextFilterTest.java │ │ ├── SetMemberOrderFilterTest.java │ │ ├── SetObjectTypeFilterTest.java │ │ ├── SetPathFilterTest.java │ │ ├── SetRecordDatesFilterTest.java │ │ ├── SetStreamingPropertiesFilterTest.java │ │ └── SetViewBehaviorFilterTest.java │ │ ├── indexing │ │ ├── DocumentIndexingPackageDataLoaderTest.java │ │ ├── DocumentIndexingPipelineTest.java │ │ └── SolrUpdateDriverTest.java │ │ ├── test │ │ ├── MockRepositoryObjectHelpers.java │ │ ├── RepositoryObjectSolrIndexer.java │ │ └── TestCorpus.java │ │ └── utils │ │ ├── KduJp2InfoServiceTest.java │ │ └── MemberOrderServiceTest.java │ └── resources │ ├── datastream │ ├── dateCaptured.xml │ ├── dateCreatedYearIssue.xml │ ├── dateIssued.xml │ ├── invalidLanguage.xml │ ├── inventoryMods.xml │ ├── multipleCreators.xml │ ├── nameParts.xml │ ├── techmd.xml │ ├── techmdImageNoDimensions.xml │ ├── techmd_colon_separated_milliseconds.xml │ ├── techmd_dot_separated_milliseconds.xml │ ├── techmd_mp3.xml │ ├── techmd_mp4.xml │ ├── techmd_mp4_no_tracks.xml │ ├── techmd_mpeg.xml │ ├── techmd_no_duration.xml │ ├── techmd_no_height_width.xml │ └── techmd_no_milliseconds_field.xml │ ├── logback-test.xml │ ├── search.properties │ ├── server.properties │ ├── solr-ingest-context-unit.xml │ ├── solr-ingest.properties │ └── solr.properties ├── integration ├── README.md ├── pom.xml └── src │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── integration │ │ ├── acl │ │ └── AccessControlServiceImplIT.java │ │ ├── factories │ │ ├── AdminUnitFactory.java │ │ ├── CollectionFactory.java │ │ ├── ContentObjectFactory.java │ │ ├── ContentRootObjectFactory.java │ │ ├── FileFactory.java │ │ ├── FolderFactory.java │ │ ├── ModsFactory.java │ │ └── WorkFactory.java │ │ ├── fcrepo │ │ ├── AbstractFedoraIT.java │ │ ├── FedoraSparqlUpdateServiceIT.java │ │ ├── FedoraTransactionIT.java │ │ └── TransactionalFcrepoClientIT.java │ │ ├── model │ │ └── fcrepo │ │ │ ├── event │ │ │ └── RepositoryPremisLoggerIT.java │ │ │ ├── objects │ │ │ ├── AbstractFedoraIT.java │ │ │ ├── AdminUnitIT.java │ │ │ ├── BinaryObjectIT.java │ │ │ ├── CollectionObjectIT.java │ │ │ ├── DepositRecordIT.java │ │ │ ├── FileObjectIT.java │ │ │ ├── FolderObjectIT.java │ │ │ └── WorkObjectIT.java │ │ │ └── services │ │ │ ├── ContentPathFactoryIT.java │ │ │ ├── LdpContainerFactoryIT.java │ │ │ ├── RepositoryInitializerIT.java │ │ │ └── RepositoryObjectFactoryIT.java │ │ └── web │ │ └── access │ │ ├── CollectionsEndpointIT.java │ │ ├── EndpointIT.java │ │ └── SearchEndpointIT.java │ └── resources │ ├── access-app.properties │ ├── acl-config.properties │ ├── acl │ └── config.properties │ ├── application.properties │ ├── datastream │ └── techmd_image.xml │ ├── jetty-test.xml │ ├── logback-test.xml │ ├── patronPrincipalConfig.json │ ├── search.properties │ ├── solr.properties │ └── spring-test │ ├── acl-service-context.xml │ ├── cdr-client-container.xml │ ├── object-factory-context.xml │ ├── solr-embedded-context.xml │ ├── solr-indexing-context.xml │ └── solr-standalone-context.xml ├── it_config ├── allowed_external_paths.txt └── fcrepo_logback.xml ├── model-api ├── pom.xml └── src │ ├── main │ └── java │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── model │ │ └── api │ │ ├── DatastreamType.java │ │ ├── ResourceType.java │ │ ├── SoftwareAgentConstants.java │ │ ├── StoragePolicy.java │ │ ├── StreamingConstants.java │ │ ├── event │ │ └── PremisLog.java │ │ ├── exceptions │ │ ├── FedoraException.java │ │ ├── InterruptedLockException.java │ │ ├── InvalidOperationForObjectType.java │ │ ├── InvalidPidException.java │ │ ├── InvalidRelationshipException.java │ │ ├── NotFoundException.java │ │ ├── ObjectExistsException.java │ │ ├── ObjectHierarchyException.java │ │ ├── ObjectPersistenceException.java │ │ ├── ObjectTypeMismatchException.java │ │ ├── OrphanedObjectException.java │ │ ├── RepositoryException.java │ │ └── TombstoneFoundException.java │ │ ├── ids │ │ ├── ContentPathConstants.java │ │ ├── PID.java │ │ ├── PIDConstants.java │ │ ├── PIDMinter.java │ │ └── RepositoryPathConstants.java │ │ ├── objects │ │ ├── AdminUnit.java │ │ ├── BinaryObject.java │ │ ├── CollectionObject.java │ │ ├── ContentContainerObject.java │ │ ├── ContentObject.java │ │ ├── ContentRootObject.java │ │ ├── DepositRecord.java │ │ ├── FileObject.java │ │ ├── FolderObject.java │ │ ├── RepositoryObject.java │ │ ├── RepositoryObjectLoader.java │ │ ├── Tombstone.java │ │ └── WorkObject.java │ │ ├── rdf │ │ ├── Cdr.java │ │ ├── CdrAcl.java │ │ ├── CdrAspace.java │ │ ├── CdrDeposit.java │ │ ├── CdrView.java │ │ ├── DcElements.java │ │ ├── Ebucore.java │ │ ├── Fcrepo4Repository.java │ │ ├── IanaRelation.java │ │ ├── Ldp.java │ │ ├── Memento.java │ │ ├── PcdmModels.java │ │ ├── PcdmUse.java │ │ ├── Premis.java │ │ ├── PremisAgentType.java │ │ ├── Prov.java │ │ ├── RDFModelUtil.java │ │ ├── Rdf.java │ │ └── Rdfs.java │ │ ├── services │ │ ├── ContentPathFactory.java │ │ ├── MembershipService.java │ │ └── RepositoryObjectFactory.java │ │ ├── sparql │ │ ├── SparqlQueryService.java │ │ ├── SparqlUpdateHelper.java │ │ └── SparqlUpdateService.java │ │ └── xml │ │ ├── DescriptionConstants.java │ │ ├── JDOMNamespaceUtil.java │ │ └── NamespaceConstants.java │ └── test │ └── java │ └── edu │ └── unc │ └── lib │ └── boxc │ └── model │ └── api │ ├── DatastreamTypeTest.java │ ├── sparql │ └── SparqlUpdateHelperTest.java │ └── xml │ └── NamespaceConstantsTest.java ├── model-fcrepo ├── pom.xml └── src │ ├── main │ └── java │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── model │ │ └── fcrepo │ │ ├── event │ │ └── RepositoryPremisLog.java │ │ ├── ids │ │ ├── AgentPids.java │ │ ├── DatastreamPids.java │ │ ├── FedoraPID.java │ │ ├── PIDs.java │ │ ├── PidLockManager.java │ │ ├── RepositoryPIDMinter.java │ │ └── RepositoryPaths.java │ │ ├── objects │ │ ├── AbstractContentContainerObject.java │ │ ├── AbstractContentObject.java │ │ ├── AbstractRepositoryObject.java │ │ ├── AdminUnitImpl.java │ │ ├── BinaryObjectImpl.java │ │ ├── CollectionObjectImpl.java │ │ ├── ContentRootObjectImpl.java │ │ ├── DepositRecordImpl.java │ │ ├── FileObjectImpl.java │ │ ├── FolderObjectImpl.java │ │ ├── RepositoryObjectCacheLoader.java │ │ ├── TombstoneImpl.java │ │ └── WorkObjectImpl.java │ │ ├── services │ │ ├── ContentPathFactoryImpl.java │ │ ├── DerivativeService.java │ │ ├── LdpContainerFactory.java │ │ ├── PcdmMembershipService.java │ │ ├── RepositoryInitializer.java │ │ ├── RepositoryObjectDriver.java │ │ ├── RepositoryObjectFactoryImpl.java │ │ └── RepositoryObjectLoaderImpl.java │ │ └── sparql │ │ ├── FusekiSparqlQueryServiceImpl.java │ │ ├── JenaSparqlQueryServiceImpl.java │ │ ├── SparqlListingHelper.java │ │ └── TripleStoreSparqlUpdateService.java │ └── test │ └── java │ └── edu │ └── unc │ └── lib │ └── boxc │ └── model │ └── fcrepo │ ├── ids │ ├── AgentPidsTest.java │ ├── DatastreamPidsTest.java │ ├── PIDsTest.java │ ├── PidLockManagerTest.java │ └── RepositoryPIDMinterTest.java │ ├── objects │ ├── AbstractFedoraObjectTest.java │ ├── AdminUnitTest.java │ ├── BinaryObjectTest.java │ ├── CollectionObjectTest.java │ ├── ContentRootObjectTest.java │ ├── DepositRecordTest.java │ ├── FileObjectTest.java │ ├── FolderObjectTest.java │ ├── TombstoneTest.java │ └── WorkObjectTest.java │ ├── services │ ├── DerivativeServiceTest.java │ ├── PcdmMembershipServiceTest.java │ ├── RepositoryObjectCacheLoaderTest.java │ ├── RepositoryObjectDriverTest.java │ ├── RepositoryObjectFactoryTest.java │ └── RepositoryObjectLoaderTest.java │ └── test │ ├── AclModelBuilder.java │ ├── RepositoryObjectTreeIndexer.java │ ├── TestHelper.java │ └── TestRepositoryDeinitializer.java ├── operations-jms ├── pom.xml └── src │ ├── main │ └── java │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── operations │ │ └── jms │ │ ├── ActionMessage.java │ │ ├── JMSMessageUtil.java │ │ ├── MessageSender.java │ │ ├── OperationsMessageSender.java │ │ ├── RunEnhancementsMessageHelpers.java │ │ ├── accessSurrogates │ │ ├── AccessSurrogateRequest.java │ │ ├── AccessSurrogateRequestSender.java │ │ └── AccessSurrogateRequestSerializationHelper.java │ │ ├── altText │ │ └── AltTextUpdateRequest.java │ │ ├── destroy │ │ ├── DestroyObjectsHelper.java │ │ ├── DestroyObjectsMessageHelpers.java │ │ ├── DestroyObjectsRequest.java │ │ └── DestroyObjectsService.java │ │ ├── exportxml │ │ ├── BulkXMLConstants.java │ │ ├── ExportXMLRequest.java │ │ └── ExportXMLRequestService.java │ │ ├── indexing │ │ ├── IndexingActionType.java │ │ ├── IndexingMessageHelper.java │ │ ├── IndexingMessageSender.java │ │ ├── IndexingPriority.java │ │ └── IndexingService.java │ │ ├── order │ │ ├── MemberOrderRequestSender.java │ │ ├── MultiParentOrderRequest.java │ │ ├── OrderOperationType.java │ │ ├── OrderRequest.java │ │ ├── OrderRequestSerializationHelper.java │ │ └── SingleParentOrderRequest.java │ │ ├── streaming │ │ ├── StreamingPropertiesRequest.java │ │ ├── StreamingPropertiesRequestSender.java │ │ └── StreamingPropertiesRequestSerializationHelper.java │ │ ├── thumbnails │ │ ├── ImportThumbnailRequest.java │ │ ├── ImportThumbnailRequestSerializationHelper.java │ │ ├── ThumbnailRequest.java │ │ ├── ThumbnailRequestSender.java │ │ └── ThumbnailRequestSerializationHelper.java │ │ └── viewSettings │ │ ├── ViewSettingRequest.java │ │ ├── ViewSettingRequestSender.java │ │ └── ViewSettingRequestSerializationHelper.java │ └── test │ └── java │ └── edu │ └── unc │ └── lib │ └── boxc │ └── operations │ └── jms │ ├── accessSurrogates │ └── AccessSurrogateRequestSerializationHelperTest.java │ ├── indexing │ └── IndexingServiceTest.java │ ├── order │ └── MemberOrderRequestSenderTest.java │ ├── streaming │ ├── StreamingPropertiesRequestSenderTest.java │ └── StreamingPropertiesRequestSerializationHelperTest.java │ └── thumbnails │ └── ThumbnailRequestSenderTest.java ├── operations ├── pom.xml └── src │ ├── main │ ├── java │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── operations │ │ │ ├── api │ │ │ ├── events │ │ │ │ ├── PremisEventBuilder.java │ │ │ │ ├── PremisLogger.java │ │ │ │ └── PremisLoggerFactory.java │ │ │ ├── exceptions │ │ │ │ ├── MetadataValidationException.java │ │ │ │ └── StateUnmodifiedException.java │ │ │ ├── images │ │ │ │ └── ImageServerUtil.java │ │ │ ├── order │ │ │ │ ├── MemberOrderHelper.java │ │ │ │ └── OrderValidator.java │ │ │ └── vocab │ │ │ │ └── VocabularyHelper.java │ │ │ └── impl │ │ │ ├── acl │ │ │ ├── ExpireEmbargoService.java │ │ │ ├── PatronAccessAssignmentService.java │ │ │ ├── PatronAccessDetails.java │ │ │ ├── PatronAccessOperationSender.java │ │ │ └── StaffRoleAssignmentService.java │ │ │ ├── altText │ │ │ └── AltTextUpdateService.java │ │ │ ├── aspace │ │ │ ├── RefIdRequest.java │ │ │ └── RefIdService.java │ │ │ ├── delete │ │ │ ├── MarkForDeletionJob.java │ │ │ ├── MarkForDeletionService.java │ │ │ └── RestoreDeletedJob.java │ │ │ ├── destroy │ │ │ ├── AbstractDestroyObjectsJob.java │ │ │ ├── DestroyObjectsCompletelyJob.java │ │ │ ├── DestroyObjectsJob.java │ │ │ ├── DestroyProxyService.java │ │ │ ├── ServerManagedProperties.java │ │ │ └── TombstonePropertySelector.java │ │ │ ├── download │ │ │ ├── DownloadBulkRequest.java │ │ │ └── DownloadBulkService.java │ │ │ ├── edit │ │ │ ├── EditFilenameService.java │ │ │ ├── EditTitleService.java │ │ │ └── UpdateDescriptionService.java │ │ │ ├── events │ │ │ ├── FilePremisLogger.java │ │ │ ├── PremisEventBuilderImpl.java │ │ │ ├── PremisLoggerFactoryImpl.java │ │ │ └── RepositoryPremisLogger.java │ │ │ ├── importxml │ │ │ ├── ImportXMLJob.java │ │ │ ├── ImportXMLRequest.java │ │ │ └── ImportXMLService.java │ │ │ ├── metadata │ │ │ └── ExportDominoMetadataService.java │ │ │ ├── move │ │ │ ├── MoveObjectsJob.java │ │ │ └── MoveObjectsService.java │ │ │ ├── order │ │ │ ├── ClearOrderJob.java │ │ │ ├── ClearOrderValidator.java │ │ │ ├── OrderJobFactory.java │ │ │ ├── OrderRequestFactory.java │ │ │ ├── OrderValidatorFactory.java │ │ │ ├── RemoveFromOrderJob.java │ │ │ ├── RemoveFromOrderValidator.java │ │ │ ├── SetOrderJob.java │ │ │ └── SetOrderValidator.java │ │ │ ├── utils │ │ │ └── EmailHandler.java │ │ │ ├── validation │ │ │ ├── MODSValidator.java │ │ │ └── SchematronValidator.java │ │ │ ├── versioning │ │ │ ├── DatastreamHistoryLog.java │ │ │ └── VersionedDatastreamService.java │ │ │ └── vocab │ │ │ ├── JSONVocabularyHelper.java │ │ │ └── VocabularyHelperManager.java │ └── resources │ │ ├── edu │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── operations │ │ │ └── impl │ │ │ └── validation │ │ │ ├── ISO-639-2_utf-8.txt │ │ │ ├── ISO-639-2_utf-8.xml │ │ │ ├── genres_eprints_swap.xml │ │ │ ├── iso_schematron_skeleton.xsl │ │ │ ├── iso_svrl.xsl │ │ │ ├── object-mods.sch │ │ │ ├── simple_mets_profile.sch │ │ │ ├── tgm2.xml │ │ │ └── vocabularies-mods.sch │ │ └── samples │ │ ├── bad-acl-test.xml │ │ ├── bad-missing-mets-hdr.xml │ │ ├── bad-test.xml │ │ ├── good-eprints-test.xml │ │ ├── good-simple-form.xml │ │ ├── good-test.xml │ │ ├── missing-flocat-test.xml │ │ ├── raschke_mods.xml │ │ └── simple-xxe-mets.xml │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── operations │ │ ├── impl │ │ ├── acl │ │ │ ├── ExpireEmbargoServiceIT.java │ │ │ ├── PatronAccessAssignmentServiceIT.java │ │ │ └── StaffRoleAssignmentServiceIT.java │ │ ├── altText │ │ │ └── AltTextUpdateServiceTest.java │ │ ├── aspace │ │ │ └── RefIdServiceTest.java │ │ ├── delete │ │ │ ├── MarkForDeletionJobTest.java │ │ │ └── RestoreDeletedJobTest.java │ │ ├── destroy │ │ │ ├── DestroyObjectsCompletelyJobIT.java │ │ │ ├── DestroyObjectsJobIT.java │ │ │ ├── DestroyObjectsJobTest.java │ │ │ └── TombstonePropertySelectorTest.java │ │ ├── download │ │ │ └── DownloadBulkServiceTest.java │ │ ├── edit │ │ │ ├── EditFilenameServiceTest.java │ │ │ ├── EditTitleServiceTest.java │ │ │ ├── UpdateDescriptionServiceIT.java │ │ │ └── UpdateDescriptionServiceTest.java │ │ ├── events │ │ │ └── FilePremisLoggerTest.java │ │ ├── importxml │ │ │ ├── ImportXMLJobIT.java │ │ │ └── ImportXMLJobTest.java │ │ ├── metadata │ │ │ └── ExportDominoMetadataServiceTest.java │ │ ├── move │ │ │ └── MoveObjectsServiceTest.java │ │ ├── order │ │ │ ├── ClearOrderJobTest.java │ │ │ ├── OrderJobFactoryTest.java │ │ │ ├── OrderValidatorFactoryTest.java │ │ │ ├── RemoveFromJobTest.java │ │ │ ├── RemoveFromOrderValidatorTest.java │ │ │ ├── SetOrderJobTest.java │ │ │ └── SetOrderValidatorTest.java │ │ ├── validation │ │ │ ├── MODSValidatorTest.java │ │ │ └── SchematronValidatorTest.java │ │ ├── versioning │ │ │ ├── DatastreamHistoryLogTest.java │ │ │ ├── VersionedDatastreamServiceIT.java │ │ │ └── VersionedDatastreamServiceTest.java │ │ └── vocab │ │ │ ├── JSONVocabularyHelperTest.java │ │ │ └── TestVocabularyHelper.java │ │ └── test │ │ ├── ModsTestHelper.java │ │ └── OrderTestHelper.java │ └── resources │ ├── acl-config.properties │ ├── jsonVocab.json │ ├── logback-test.xml │ ├── samples │ ├── 1471-2458-11-702.zip │ ├── DCD_4401_1.MD_EVENTS.xml │ ├── aggregateSplitDepartments.xml │ ├── bad-acl-test.xml │ ├── bad-eprints-test.xml │ ├── bad-missing-mets-hdr.xml │ ├── bad-test.xml │ ├── creator_xpath_mods.xml │ ├── good-eprints-test.xml │ ├── good-simple-form.xml │ ├── good-test.xml │ ├── missing-flocat-test.xml │ ├── mods.xml │ ├── modsNormalized.xml │ ├── mods_collection_template.xml │ ├── raschke_mods.xml │ ├── shc_mods.xml │ └── simple-xxe-mets.xml │ ├── spring-test │ ├── acl-service-context.xml │ ├── cdr-client-container.xml │ ├── destroy-completely-it-context.xml │ ├── import-job-it.xml │ └── staff-role-service-container.xml │ └── vocabTest.xml ├── persistence-api ├── pom.xml └── src │ └── main │ └── java │ └── edu │ └── unc │ └── lib │ └── boxc │ └── persist │ └── api │ ├── DigestAlgorithm.java │ ├── PackagingType.java │ ├── exceptions │ ├── InvalidChecksumException.java │ ├── InvalidIngestSourceCandidateException.java │ ├── UnknownIngestSourceException.java │ ├── UnsupportedAlgorithmException.java │ └── UnsupportedPackagingTypeException.java │ ├── sources │ ├── IngestSource.java │ ├── IngestSourceCandidate.java │ └── IngestSourceManager.java │ ├── storage │ ├── BinaryDetails.java │ ├── StorageLocation.java │ ├── StorageLocationManager.java │ ├── StorageType.java │ └── UnknownStorageLocationException.java │ └── transfer │ ├── BinaryAlreadyExistsException.java │ ├── BinaryTransferClient.java │ ├── BinaryTransferException.java │ ├── BinaryTransferOutcome.java │ ├── BinaryTransferService.java │ ├── BinaryTransferSession.java │ ├── MultiDestinationTransferSession.java │ └── StreamTransferClient.java ├── persistence ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── META-INF │ │ │ └── MANIFEST.MF │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── persist │ │ │ └── impl │ │ │ ├── InputStreamDigestUtil.java │ │ │ ├── MultiDigestInputStreamWrapper.java │ │ │ ├── sources │ │ │ ├── FilesystemIngestSource.java │ │ │ └── IngestSourceManagerImpl.java │ │ │ ├── storage │ │ │ ├── BinaryDetailsImpl.java │ │ │ ├── HashedFilesystemStorageLocation.java │ │ │ ├── HashedPosixStorageLocation.java │ │ │ └── StorageLocationManagerImpl.java │ │ │ └── transfer │ │ │ ├── BinaryTransferOutcomeImpl.java │ │ │ ├── BinaryTransferServiceImpl.java │ │ │ ├── BinaryTransferSessionImpl.java │ │ │ ├── FSToFSTransferClient.java │ │ │ ├── FSToPosixTransferClient.java │ │ │ ├── FileSystemTransferHelpers.java │ │ │ ├── FileTransferHelpers.java │ │ │ ├── MultiDestinationTransferSessionImpl.java │ │ │ ├── StreamToFSTransferClient.java │ │ │ └── StreamToPosixTransferClient.java │ └── resources │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── dl │ │ └── services │ │ ├── IngestFailHtml.ftl │ │ ├── IngestFailText.ftl │ │ ├── IngestSuccessHtml.ftl │ │ └── IngestSuccessText.ftl │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── persist │ │ └── impl │ │ ├── InputStreamDigestUtilTest.java │ │ ├── MultiDigestInputStreamWrapperTest.java │ │ ├── sources │ │ ├── FilesystemIngestSourceTest.java │ │ ├── IngestSourceManagerImplTest.java │ │ └── IngestSourceTestHelper.java │ │ ├── storage │ │ ├── HashedFilesystemStorageLocationTest.java │ │ ├── HashedPosixStorageLocationTest.java │ │ ├── StorageLocationManagerImplTest.java │ │ └── StorageLocationTestHelper.java │ │ └── transfer │ │ ├── AbstractBinaryTransferTest.java │ │ ├── BinaryTransferServiceImplIT.java │ │ ├── BinaryTransferSessionImplTest.java │ │ ├── FSToFSTransferClientTest.java │ │ ├── FSToPosixTransferClientTest.java │ │ ├── MultiDestinationTransferSessionImplTest.java │ │ ├── StreamToFSTransferClientTest.java │ │ └── StreamToPosixTransferClientTest.java │ └── resources │ ├── ingestSources │ └── bag_with_files │ │ ├── bag-info.txt │ │ ├── bagit.txt │ │ ├── data │ │ ├── test1.txt │ │ ├── test2.txt │ │ └── test3.txt │ │ ├── manifest-md5.txt │ │ └── tagmanifest-md5.txt │ ├── logback-test.xml │ └── spring-test │ └── cdr-client-container.xml ├── pom.xml ├── search-api ├── pom.xml └── src │ └── main │ └── java │ └── edu │ └── unc │ └── lib │ └── boxc │ └── search │ └── api │ ├── ContentCategory.java │ ├── FacetConstants.java │ ├── SearchFieldKey.java │ ├── exceptions │ ├── InvalidFacetException.java │ ├── InvalidHierarchicalFacetException.java │ └── SolrRuntimeException.java │ ├── facets │ ├── CutoffFacet.java │ ├── CutoffFacetNode.java │ ├── FacetFieldList.java │ ├── FacetFieldObject.java │ ├── HierarchicalFacet.java │ ├── HierarchicalFacetNode.java │ └── SearchFacet.java │ ├── filters │ └── QueryFilter.java │ ├── models │ ├── ContentObjectRecord.java │ ├── Datastream.java │ ├── GroupedContentObjectRecord.java │ ├── ObjectPath.java │ └── ObjectPathEntry.java │ ├── ranges │ └── RangeValue.java │ └── requests │ ├── FacetValuesRequest.java │ ├── HierarchicalBrowseRequest.java │ ├── IdListRequest.java │ ├── SearchRequest.java │ ├── SearchState.java │ └── SimpleIdRequest.java ├── search-solr ├── pom.xml └── src │ ├── main │ └── java │ │ ├── META-INF │ │ └── MANIFEST.MF │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── search │ │ └── solr │ │ ├── config │ │ ├── AbstractSettings.java │ │ ├── SearchSettings.java │ │ └── SolrSettings.java │ │ ├── facets │ │ ├── AbstractHierarchicalFacet.java │ │ ├── CutoffFacetImpl.java │ │ ├── CutoffFacetNodeImpl.java │ │ ├── FilterableDisplayValueFacet.java │ │ ├── GenericFacet.java │ │ ├── MultivaluedHierarchicalFacetNode.java │ │ └── RoleGroupFacet.java │ │ ├── filters │ │ ├── HasPopulatedFieldFilter.java │ │ ├── HasValuesFilter.java │ │ ├── IIIFv3ViewableFilter.java │ │ ├── MultipleDirectlyOwnedDatastreamsFilter.java │ │ ├── NamedDatastreamFilter.java │ │ └── QueryFilterFactory.java │ │ ├── models │ │ ├── ContentObjectSolrRecord.java │ │ ├── DatastreamImpl.java │ │ ├── GroupedContentObjectSolrRecord.java │ │ ├── IndexDocumentBean.java │ │ └── ObjectPathImpl.java │ │ ├── ranges │ │ ├── RangePair.java │ │ └── UnknownRange.java │ │ ├── responses │ │ ├── HierarchicalBrowseResultResponse.java │ │ └── SearchResultResponse.java │ │ ├── services │ │ ├── AbstractFacetListService.java │ │ ├── AbstractQueryService.java │ │ ├── ChildrenCountService.java │ │ ├── FacetFieldFactory.java │ │ ├── FacetValuesService.java │ │ ├── GetCollectionIdService.java │ │ ├── MultiSelectFacetListService.java │ │ ├── NeighborQueryService.java │ │ ├── ObjectPathFactory.java │ │ ├── SearchStateFactory.java │ │ ├── SetFacetTitleByIdService.java │ │ ├── SolrSearchService.java │ │ ├── StructureQueryService.java │ │ └── TitleRetrievalService.java │ │ └── utils │ │ ├── AccessRestrictionUtil.java │ │ ├── DateFormatUtil.java │ │ ├── FacetFieldUtil.java │ │ └── SearchStateUtil.java │ └── test │ ├── java │ ├── META-INF │ │ └── MANIFEST.MF │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── search │ │ └── solr │ │ ├── config │ │ └── SolrSettingsTest.java │ │ ├── facets │ │ └── CutoffFacetTest.java │ │ ├── filters │ │ └── QueryFilterFactoryTest.java │ │ ├── models │ │ ├── ContentObjectSolrRecordTest.java │ │ ├── DatastreamTest.java │ │ ├── HierarchicalBrowseResultResponseTest.java │ │ └── SearchStateTest.java │ │ ├── services │ │ ├── ChildrenCountServiceIT.java │ │ ├── FacetValuesServiceIT.java │ │ ├── GetCollectionIdServiceIT.java │ │ ├── MultiSelectFacetListServiceIT.java │ │ ├── NeighborQueryServiceIT.java │ │ ├── ObjectPathFactoryIT.java │ │ ├── SearchStateFactoryTest.java │ │ ├── SetFacetTitleByIdServiceIT.java │ │ ├── SolrSearchServiceIT.java │ │ └── StructureQueryServiceIT.java │ │ ├── test │ │ ├── BaseEmbeddedSolrTest.java │ │ └── TestCorpus.java │ │ └── utils │ │ ├── AccessRestrictionUtilTest.java │ │ ├── DateFormatUtilTest.java │ │ ├── FacetFieldUtilTest.java │ │ └── SearchStateUtilTest.java │ └── resources │ ├── logback-test.xml │ ├── search.properties │ ├── server.properties │ └── solr.properties ├── services-camel-app ├── pom.xml └── src │ ├── main │ ├── java │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── services │ │ │ └── camel │ │ │ ├── AddFailedRouteProcessor.java │ │ │ ├── BinaryEnhancementProcessor.java │ │ │ ├── BinaryMetadataProcessor.java │ │ │ ├── accessSurrogates │ │ │ ├── AccessSurrogateRequestProcessor.java │ │ │ └── AccessSurrogateRouter.java │ │ │ ├── audio │ │ │ ├── AudioDerivativeProcessor.java │ │ │ └── AudioEnhancementsRouter.java │ │ │ ├── binaryCleanup │ │ │ ├── BinaryCleanupProcessor.java │ │ │ └── BinaryCleanupRouter.java │ │ │ ├── cdrEvents │ │ │ ├── CdrEventProcessor.java │ │ │ └── CdrEventRouter.java │ │ │ ├── destroy │ │ │ ├── DestroyObjectsProcessor.java │ │ │ └── DestroyObjectsRouter.java │ │ │ ├── destroyDerivatives │ │ │ ├── DestroyDerivativesProcessor.java │ │ │ ├── DestroyDerivativesRouter.java │ │ │ └── DestroyedMsgProcessor.java │ │ │ ├── enhancements │ │ │ └── EnhancementRouter.java │ │ │ ├── exportxml │ │ │ ├── ExportXMLProcessor.java │ │ │ └── ExportXMLRouter.java │ │ │ ├── fulltext │ │ │ ├── FulltextProcessor.java │ │ │ └── FulltextRouter.java │ │ │ ├── http │ │ │ └── HealthChecksController.java │ │ │ ├── images │ │ │ ├── AddDerivativeProcessor.java │ │ │ ├── ImageCacheInvalidationProcessor.java │ │ │ ├── ImageDerivativeProcessor.java │ │ │ ├── ImageEnhancementsRouter.java │ │ │ ├── Jp2Processor.java │ │ │ └── PdfImageProcessor.java │ │ │ ├── importxml │ │ │ ├── ImportXMLProcessor.java │ │ │ └── ImportXMLRouter.java │ │ │ ├── longleaf │ │ │ ├── AbstractLongleafProcessor.java │ │ │ ├── DeregisterLongleafProcessor.java │ │ │ ├── GetUrisProcessor.java │ │ │ ├── LongleafAggregationStrategy.java │ │ │ ├── LongleafRouter.java │ │ │ └── RegisterToLongleafProcessor.java │ │ │ ├── order │ │ │ ├── OrderMembersRouter.java │ │ │ ├── OrderNotificationBuilder.java │ │ │ ├── OrderNotificationService.java │ │ │ └── OrderRequestProcessor.java │ │ │ ├── patronAccess │ │ │ ├── PatronAccessAssignmentProcessor.java │ │ │ └── PatronAccessAssignmentRouter.java │ │ │ ├── routing │ │ │ ├── FedoraIdFilters.java │ │ │ └── MetaServicesRouter.java │ │ │ ├── solr │ │ │ ├── CdrEventToSolrUpdateProcessor.java │ │ │ ├── SolrIngestProcessor.java │ │ │ └── SolrRouter.java │ │ │ ├── solrUpdate │ │ │ ├── AggregateUpdateProcessor.java │ │ │ ├── SolrUpdatePreprocessor.java │ │ │ ├── SolrUpdateProcessor.java │ │ │ └── SolrUpdateRouter.java │ │ │ ├── streaming │ │ │ ├── StreamingPropertiesRequestProcessor.java │ │ │ └── StreamingPropertiesRouter.java │ │ │ ├── thumbnails │ │ │ ├── ImportThumbnailRequestProcessor.java │ │ │ ├── ThumbnailRequestProcessor.java │ │ │ └── ThumbnailRouter.java │ │ │ ├── triplesReindexing │ │ │ ├── IndexingMessageProcessor.java │ │ │ ├── TriplesReindexingRouter.java │ │ │ └── TriplestoreRouter.java │ │ │ ├── util │ │ │ ├── BodyListAggregationStrategy.java │ │ │ ├── CacheInvalidatingProcessor.java │ │ │ ├── CdrFcrepoHeaders.java │ │ │ ├── EventTypes.java │ │ │ ├── IndexingActionUtil.java │ │ │ ├── MessageUtil.java │ │ │ └── OrderedSetAggregationStrategy.java │ │ │ └── viewSettings │ │ │ ├── ViewSettingRequestProcessor.java │ │ │ └── ViewSettingRouter.java │ ├── resources │ │ ├── logback.xml │ │ ├── search.properties │ │ ├── solr.properties │ │ ├── update-complete-html.txt │ │ └── update-failed-html.txt │ └── webapp │ │ └── WEB-INF │ │ ├── activemq-context.xml │ │ ├── rest-servlet.xml │ │ ├── service-context.xml │ │ ├── solr-indexing-context.xml │ │ └── web.xml │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── services │ │ └── camel │ │ ├── BinaryEnhancementProcessorTest.java │ │ ├── BinaryMetadataProcessorTest.java │ │ ├── TestHelper.java │ │ ├── accessSurrogates │ │ ├── AccessSurrogateRequestProcessorTest.java │ │ └── AccessSurrogateRouterTest.java │ │ ├── audio │ │ └── AudioEnhancementsRouterTest.java │ │ ├── binaryCleanup │ │ ├── BinaryCleanupProcessorIT.java │ │ └── BinaryCleanupRouterTest.java │ │ ├── cdrEvents │ │ ├── CdrEventProcessorTest.java │ │ ├── CdrEventRouterTest.java │ │ └── CdrEventRoutingTest.java │ │ ├── destroy │ │ └── DestroyObjectsRouterTest.java │ │ ├── destroyDerivatives │ │ ├── DestroyDerivativesProcessorTest.java │ │ ├── DestroyDerivativesRouterIT.java │ │ └── DestroyDerivativesRouterTest.java │ │ ├── enhancements │ │ └── EnhancementRouterIT.java │ │ ├── exportxml │ │ └── ExportXMLRouteIT.java │ │ ├── fulltext │ │ ├── FulltextProcessorTest.java │ │ └── FulltextRouterTest.java │ │ ├── http │ │ └── HealthChecksControllerTest.java │ │ ├── images │ │ ├── AddDerivativeProcessorTest.java │ │ ├── ImageCacheInvalidationProcessorTest.java │ │ ├── ImageDerivativeProcessorTest.java │ │ ├── ImageEnhancementsRouterTest.java │ │ ├── Jp2ProcessorTest.java │ │ └── PdfImageProcessorTest.java │ │ ├── importxml │ │ └── ImportXMLIT.java │ │ ├── longleaf │ │ ├── AbstractLongleafRouteTest.java │ │ ├── DeregisterLongleafRouteTest.java │ │ ├── LongleafTestHelpers.java │ │ ├── RegisterLongleafRouteTest.java │ │ ├── RegisterToLongleafProcessorIT.java │ │ └── RegisterToLongleafProcessorTest.java │ │ ├── order │ │ ├── OrderMembersRouterTest.java │ │ ├── OrderNotificationBuilderTest.java │ │ ├── OrderNotificationServiceTest.java │ │ └── OrderRequestProcessorTest.java │ │ ├── patronAccess │ │ └── PatronAccessAssignmentRouterTest.java │ │ ├── routing │ │ └── MetaServicesRouterTest.java │ │ ├── solr │ │ ├── AbstractSolrProcessorIT.java │ │ ├── CdrEventToSolrUpdateProcessorTest.java │ │ ├── SolrIngestProcessorIT.java │ │ ├── SolrIngestProcessorTest.java │ │ └── SolrRouterTest.java │ │ ├── solrUpdate │ │ ├── SolrUpdateProcessorIT.java │ │ ├── SolrUpdateProcessorTest.java │ │ └── SolrUpdateRouterTest.java │ │ ├── streaming │ │ ├── StreamingPropertiesProcessorTest.java │ │ └── StreamingPropertiesRouterTest.java │ │ ├── thumbnails │ │ ├── ImportThumbnailProcessorTest.java │ │ ├── ThumbnailProcessorTest.java │ │ └── ThumbnailRouterTest.java │ │ ├── triplesReindexing │ │ └── TriplesReindexingRouterIT.java │ │ ├── util │ │ └── CacheInvalidatingProcessorTest.java │ │ └── viewSettings │ │ ├── ViewSettingRequestProcessorTest.java │ │ └── ViewSettingRouterTest.java │ └── resources │ ├── application.properties │ ├── audio-context.xml │ ├── boxy.pdf │ ├── cdr-event-routing-it-config.properties │ ├── cdr-event-routing-it-context.xml │ ├── config.properties │ ├── convert │ └── ignore_tag_stderr.txt │ ├── datastreams │ ├── invalid.pdf │ ├── modsWithRla.xml │ └── simpleMods.xml │ ├── deregister-longleaf-router-context.xml │ ├── destroy-derivatives-router-it-config.properties │ ├── destroy-derivatives-router-it-context.xml │ ├── enhancement-router-it-config.properties │ ├── enhancement-router-it-context.xml │ ├── export-xml-route-it-context.xml │ ├── external_file.txt │ ├── images-context.xml │ ├── import-xml-it-config.properties │ ├── import-xml-it-context.xml │ ├── logback-test.xml │ ├── longleaf-router-config.properties │ ├── metaservices-context.xml │ ├── patron-access-test-config.properties │ ├── patron-access-test-context.xml │ ├── register-longleaf-router-context.xml │ ├── service-context.xml │ ├── solr-indexing-it-context.xml │ ├── solr-ingest-context.xml │ ├── solr-update-config.properties │ ├── solr-update-context.xml │ ├── solr-update-processor-it-context.xml │ ├── spring-test │ ├── acl-service-context.xml │ ├── cdr-client-container.xml │ ├── jms-context.xml │ └── solr-indexing-context.xml │ ├── streaming-context.xml │ ├── thumbnails-config.properties │ ├── thumbnails-context.xml │ ├── triples-reindexing-it-config.properties │ ├── triples-reindexing-it-context.xml │ ├── uploaded-files │ └── burndown.png │ └── view-setting-context.xml ├── spoof ├── pom.xml └── src │ └── main │ └── webapp │ └── WEB-INF │ ├── jsp │ ├── dump.jsp │ └── spoof.jsp │ └── web.xml ├── static ├── css │ ├── admin │ │ ├── admin_forms.css │ │ ├── cdradmin.css │ │ ├── images │ │ │ ├── animated-overlay.gif │ │ │ ├── clear.png │ │ │ ├── loading.gif │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ ├── ui-icons_888888_256x240.png │ │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── jquery-ui.css │ │ ├── jquery.contextMenu.css │ │ ├── jquery.qtip.css │ │ ├── jquery.xmleditor.css │ │ ├── search_results.css │ │ └── status_monitor.css │ ├── bulma-no-dark-mode.min.css │ ├── cdr-homepage.css │ ├── cdr_common.css │ ├── cdrui_styles.css │ ├── fontawesome.min.css │ ├── images │ │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png │ │ ├── ui-bg_diagonals-thick_20_666666_40x40.png │ │ ├── ui-bg_flat_10_000000_40x100.png │ │ ├── ui-bg_glass_100_ebf5fa_1x400.png │ │ ├── ui-bg_glass_100_f6f6f6_1x400.png │ │ ├── ui-bg_glass_65_ebf5fa_1x400.png │ │ ├── ui-bg_gloss-wave_35_0a5274_500x100.png │ │ ├── ui-bg_highlight-soft_100_eeeeee_1x100.png │ │ ├── ui-bg_highlight-soft_75_5aabcf_1x100.png │ │ ├── ui-icons_053a53_256x240.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_228ef1_256x240.png │ │ ├── ui-icons_5aabcf_256x240.png │ │ ├── ui-icons_ffd27a_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ ├── jquery-ui.css │ ├── jquery.qtip.min.css │ ├── reset.css │ ├── sass │ │ ├── cdr_homepage.scss │ │ ├── cdr_ui_styles.scss │ │ └── cdr_vue_modal_styles.scss │ └── structure_browse.css ├── deposit-forms │ ├── continuing_resource_item.json │ ├── data │ │ └── iso639-2b.json │ └── generic_work.json ├── front │ ├── banner.jpg │ ├── nc-collection.png │ ├── rare-book-collection.png │ ├── southern-folklife-collection.png │ ├── southern-historical-collection.png │ ├── university-archives.png │ └── university-libraries-logo.png ├── images │ ├── admin │ │ ├── gear.png │ │ ├── gear_dark.png │ │ ├── loading_large.gif │ │ ├── loading_small.gif │ │ └── sort.png │ ├── ajax-loader-lg.gif │ ├── ajax_loader.gif │ ├── cdrui_contentshadowbottom.png │ ├── cdrui_contentshadowright.png │ ├── email_logo.png │ ├── favicon.ico │ ├── file-audio.png │ ├── structure.png │ ├── trash_can.png │ ├── unc-icon.png │ └── uncwell.png ├── js │ ├── admin │ │ ├── editDescription.js │ │ ├── lib │ │ │ ├── cycle.js │ │ │ ├── jquery-ui.min.js │ │ │ ├── jquery.contextMenu.js │ │ │ ├── jquery.detachplus.js │ │ │ ├── jquery.min.js │ │ │ ├── jquery.qtip.min.js │ │ │ ├── jqueryui-editable.min.js │ │ │ ├── moment.min.js │ │ │ ├── require.js │ │ │ ├── text.js │ │ │ ├── tpl.js │ │ │ └── underscore.js │ │ ├── resultList.js │ │ ├── src │ │ │ ├── AbstractFileUploadForm.js │ │ │ ├── AbstractForm.js │ │ │ ├── ActionButton.js │ │ │ ├── ActionEventHandler.js │ │ │ ├── AddFileForm.js │ │ │ ├── AddMenu.js │ │ │ ├── AlertHandler.js │ │ │ ├── ConfirmationDialog.js │ │ │ ├── CreateContainerForm.js │ │ │ ├── DeleteForm.js │ │ │ ├── EditAccesSurrogateForm.js │ │ │ ├── EditAccessControlForm.js │ │ │ ├── EditAltTextForm.js │ │ │ ├── EditAspaceRefIdForm.js │ │ │ ├── EditFilenameForm.js │ │ │ ├── EditStreamingPropertiesForm.js │ │ │ ├── EditThumbnailForm.js │ │ │ ├── EditTitleForm.js │ │ │ ├── ExportMenu.js │ │ │ ├── ImportMemberOrderForm.js │ │ │ ├── ImportMenu.js │ │ │ ├── ImportMetadataXMLForm.js │ │ │ ├── IngestFromSourceForm.js │ │ │ ├── IngestPackageForm.js │ │ │ ├── IsSorted.js │ │ │ ├── ModalCreate.js │ │ │ ├── ModalLoadingOverlay.js │ │ │ ├── MoveDropLocation.js │ │ │ ├── PID.js │ │ │ ├── ParentResultObject.js │ │ │ ├── RemoteStateChangeMonitor.js │ │ │ ├── ResubmitPackageForm.js │ │ │ ├── ResultObject.js │ │ │ ├── ResultObjectActionMenu.js │ │ │ ├── ResultObjectList.js │ │ │ ├── ResultTableActionMenu.js │ │ │ ├── ResultTableView.js │ │ │ ├── ResultView.js │ │ │ ├── SearchMenu.js │ │ │ ├── SearchTags.js │ │ │ ├── StringUtilities.js │ │ │ ├── URLUtilities.js │ │ │ ├── ViewSettingsForm.js │ │ │ ├── action │ │ │ │ ├── AbstractBatchAction.js │ │ │ │ ├── AjaxCallbackAction.js │ │ │ │ ├── AssignAsThumbnailAction.js │ │ │ │ ├── ChangeDepositPipelineStateAction.js │ │ │ │ ├── ChangeLocationAction.js │ │ │ │ ├── ClearAccessSurrogateAction.js │ │ │ │ ├── ClearAssignedThumbnailAction.js │ │ │ │ ├── ClearPrimaryObjectResultAction.js │ │ │ │ ├── DeleteBatchAction.js │ │ │ │ ├── DeleteResultAction.js │ │ │ │ ├── DeleteStreamingPropertiesResultAction.js │ │ │ │ ├── DestroyBatchAction.js │ │ │ │ ├── DestroyResultAction.js │ │ │ │ ├── EditCollectionSettingsAction.js │ │ │ │ ├── EditTypeBatchAction.js │ │ │ │ ├── ExportMetadataXMLBatchAction.js │ │ │ │ ├── ExportOptionsAction.js │ │ │ │ ├── MoveObjectsAction.js │ │ │ │ ├── OpenDeleteBatchAction.js │ │ │ │ ├── RefreshResultAction.js │ │ │ │ ├── ReindexResultAction.js │ │ │ │ ├── RestoreBatchAction.js │ │ │ │ ├── RestoreResultAction.js │ │ │ │ ├── RunEnhancementsBatchAction.js │ │ │ │ ├── SetAsPrimaryObjectResultAction.js │ │ │ │ ├── UpdatePatronAccessBatchAction.js │ │ │ │ └── UpdateViewSettingsBatchAction.js │ │ │ └── statusMonitor │ │ │ │ ├── AbstractStatusMonitor.js │ │ │ │ ├── DepositMonitor.js │ │ │ │ └── StatusMonitorManager.js │ │ ├── statusMonitor.js │ │ └── vue-cdr-admin │ │ │ ├── .browserslistrc │ │ │ ├── .gitignore │ │ │ ├── babel.config.js │ │ │ ├── index.html │ │ │ ├── jest.config.js │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── src │ │ │ ├── App.vue │ │ │ ├── assets │ │ │ │ ├── common-styles.css │ │ │ │ └── vueform.nodark.css │ │ │ ├── components │ │ │ │ ├── chompb │ │ │ │ │ ├── preIngest.vue │ │ │ │ │ └── velocicroptorReport.vue │ │ │ │ ├── forms-app │ │ │ │ │ └── modalDepositForms.vue │ │ │ │ ├── modal.vue │ │ │ │ └── permissions-editor │ │ │ │ │ ├── embargo.vue │ │ │ │ │ ├── modalPermissionsEditor.vue │ │ │ │ │ ├── patronDisplayRow.vue │ │ │ │ │ ├── patronRoles.vue │ │ │ │ │ ├── staffRoles.vue │ │ │ │ │ └── staffRolesSelect.vue │ │ │ ├── main.js │ │ │ ├── mixins │ │ │ │ ├── displayModal.js │ │ │ │ ├── patronHelpers.js │ │ │ │ └── staffRoleList.js │ │ │ ├── router.js │ │ │ └── stores │ │ │ │ ├── forms.js │ │ │ │ └── permissions.js │ │ │ ├── tests │ │ │ └── unit │ │ │ │ ├── chompb │ │ │ │ ├── preIngest.spec.js │ │ │ │ └── velocicroptorReport.spec.js │ │ │ │ ├── forms-app │ │ │ │ └── modalDepositForms.spec.js │ │ │ │ ├── modal.spec.js │ │ │ │ └── permissions-editor │ │ │ │ ├── embargo.spec.js │ │ │ │ ├── modalPermissionsEditor.spec.js │ │ │ │ ├── patronDisplayRow.spec.js │ │ │ │ ├── patronRoles.spec.js │ │ │ │ ├── staffRoleList.spec.js │ │ │ │ ├── staffRoles.spec.js │ │ │ │ └── staffRolesSelect.spec.js │ │ │ ├── vite.config.js │ │ │ └── vueform.config.js │ ├── public │ │ └── src │ │ │ ├── ResourceTypeUtilities.js │ │ │ ├── StructureEntry.js │ │ │ └── StructureView.js │ ├── vue-cdr-access │ │ ├── .browserslistrc │ │ ├── .gitignore │ │ ├── __mocks__ │ │ │ └── fileMock.js │ │ ├── babel.config.js │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ │ ├── App.vue │ │ │ ├── assets │ │ │ │ ├── common-styles.css │ │ │ │ └── nouislider.css │ │ │ ├── components │ │ │ │ ├── aboutRepository.vue │ │ │ │ ├── advancedSearch.vue │ │ │ │ ├── browseSearch.vue │ │ │ │ ├── browseSort.vue │ │ │ │ ├── clearFacetsButton.vue │ │ │ │ ├── clearFilters.vue │ │ │ │ ├── collectionBrowseWrapper.vue │ │ │ │ ├── dcrFooter.vue │ │ │ │ ├── displayWrapper.vue │ │ │ │ ├── error_pages │ │ │ │ │ ├── notAvailable.vue │ │ │ │ │ └── notFound.vue │ │ │ │ ├── facetModal.vue │ │ │ │ ├── facets.vue │ │ │ │ ├── filterTags.vue │ │ │ │ ├── frontPage.vue │ │ │ │ ├── full_record │ │ │ │ │ ├── abstract.vue │ │ │ │ │ ├── adminUnit.vue │ │ │ │ │ ├── aggregateRecord.vue │ │ │ │ │ ├── breadCrumbs.vue │ │ │ │ │ ├── bulkDownload.vue │ │ │ │ │ ├── collectionRecord.vue │ │ │ │ │ ├── downloadOptions.vue │ │ │ │ │ ├── fileList.vue │ │ │ │ │ ├── fileRecord.vue │ │ │ │ │ ├── folderRecord.vue │ │ │ │ │ ├── metadataDisplay.vue │ │ │ │ │ ├── neighborList.vue │ │ │ │ │ ├── objectActions.vue │ │ │ │ │ ├── player.vue │ │ │ │ │ ├── singleUseLink.vue │ │ │ │ │ ├── streamingPlayer.vue │ │ │ │ │ └── thumbnail.vue │ │ │ │ ├── galleryDisplay.vue │ │ │ │ ├── header │ │ │ │ │ ├── headerHome.vue │ │ │ │ │ └── headerSmall.vue │ │ │ │ ├── listDisplay.vue │ │ │ │ ├── modalMetadata.vue │ │ │ │ ├── pagination.vue │ │ │ │ ├── searchWrapper.vue │ │ │ │ ├── slider.vue │ │ │ │ ├── viewType.vue │ │ │ │ └── worksOnly.vue │ │ │ ├── main.js │ │ │ ├── mixins │ │ │ │ ├── analyticsUtils.js │ │ │ │ ├── displayUtils.js │ │ │ │ ├── errorUtils.js │ │ │ │ ├── fileUtils.js │ │ │ │ ├── fullRecordUtils.js │ │ │ │ ├── headerUtils.js │ │ │ │ ├── imageUtils.js │ │ │ │ ├── loginUrlUtils.js │ │ │ │ ├── matomoUtils.js │ │ │ │ ├── permissionUtils.js │ │ │ │ └── routeUtils.js │ │ │ ├── router.js │ │ │ ├── stores │ │ │ │ └── access.js │ │ │ └── translations.js │ │ ├── tests │ │ │ ├── fixtures │ │ │ │ ├── displayWrapperFixtures.js │ │ │ │ └── recordListFixture.js │ │ │ └── unit │ │ │ │ ├── aboutRepository.spec.js │ │ │ │ ├── abstract.spec.js │ │ │ │ ├── adminUnit.spec.js │ │ │ │ ├── advancedSearch.spec.js │ │ │ │ ├── aggregateRecord.spec.js │ │ │ │ ├── analyticsUtils.spec.js │ │ │ │ ├── breadCrumbs.spec.js │ │ │ │ ├── browseSearch.spec.js │ │ │ │ ├── browseSort.spec.js │ │ │ │ ├── bulkDownload.spec.js │ │ │ │ ├── clearFilters.spec.js │ │ │ │ ├── collectionBrowseWrapper.spec.js │ │ │ │ ├── collectionRecord.spec.js │ │ │ │ ├── dcrFooter.spec.js │ │ │ │ ├── displayWrapper.spec.js │ │ │ │ ├── downloadOptions.spec.js │ │ │ │ ├── facetModal.spec.js │ │ │ │ ├── facets.spec.js │ │ │ │ ├── fileList.spec.js │ │ │ │ ├── fileRecord.spec.js │ │ │ │ ├── fileUtils.spec.js │ │ │ │ ├── filterTags.spec.js │ │ │ │ ├── folderRecord.spec.js │ │ │ │ ├── frontPage.spec.js │ │ │ │ ├── fullRecordUtils.spec.js │ │ │ │ ├── galleryDisplay.spec.js │ │ │ │ ├── headerHome.spec.js │ │ │ │ ├── headerSmall.spec.js │ │ │ │ ├── headerUtils.spec.js │ │ │ │ ├── listDisplay.spec.js │ │ │ │ ├── matomoUtils.spec.js │ │ │ │ ├── metadataDisplay.spec.js │ │ │ │ ├── modalMetadata.spec.js │ │ │ │ ├── neighborList.spec.js │ │ │ │ ├── notAvailable.spec.js │ │ │ │ ├── notFound.spec.js │ │ │ │ ├── objectActions.spec.js │ │ │ │ ├── pagination.spec.js │ │ │ │ ├── permissionUtils.spec.js │ │ │ │ ├── player.spec.js │ │ │ │ ├── routeUtils.spec.js │ │ │ │ ├── searchWrapper.spec.js │ │ │ │ ├── singleUseLink.spec.js │ │ │ │ ├── slider.spec.js │ │ │ │ ├── streamingPlayer.spec.js │ │ │ │ ├── thumbnail.spec.js │ │ │ │ ├── viewType.spec.js │ │ │ │ └── worksOnly.spec.js │ │ ├── vite.config.js │ │ └── vue.config.js │ └── xmleditor │ │ ├── jquery.xmleditor.js │ │ ├── lib │ │ ├── ace │ │ │ └── src-min │ │ │ │ ├── ace.js │ │ │ │ ├── keybinding-emacs.js │ │ │ │ ├── keybinding-vim.js │ │ │ │ ├── mode-xml.js │ │ │ │ └── theme-textmate.js │ │ ├── cycle.js │ │ ├── jquery-ui.min.js │ │ ├── jquery.autosize-min.js │ │ ├── jquery.min.js │ │ ├── json2.js │ │ ├── text.js │ │ └── vkbeautify.js │ │ ├── templates │ │ ├── archives.xml │ │ ├── continuing_resource.xml │ │ ├── generic.xml │ │ ├── minimal_metadata.xml │ │ ├── mods.xml │ │ ├── oral_histories_interviews.xml │ │ └── oral_histories_series.xml │ │ └── xsd2json.js ├── maintenance.html ├── schemas │ └── mods-3-8.json ├── service-unavailable.html ├── templates │ ├── admin │ │ ├── addFileForm.html │ │ ├── createContainerForm.html │ │ ├── deleteForm.html │ │ ├── editAccessSurrogateForm.html │ │ ├── editAltTextForm.html │ │ ├── editAspaceRefIdForm.html │ │ ├── editCollectionSettings.html │ │ ├── editFilenameForm.html │ │ ├── editStreamingPropertiesForm.html │ │ ├── editThumbnailForm.html │ │ ├── editTitleForm.html │ │ ├── editTypeForm.html │ │ ├── exportMetadataForm.html │ │ ├── importMemberOrderForm.html │ │ ├── importMetadataXMLForm.html │ │ ├── ingestPackageForm.html │ │ ├── ingestSourceCandidates.html │ │ ├── ingestSourceMetadata.html │ │ ├── invalidVocab.html │ │ ├── navigationBar.html │ │ ├── pathTrail.html │ │ ├── resubmitPackageForm.html │ │ ├── resultEntry.html │ │ ├── resultTableHeader.html │ │ ├── resultTableView.html │ │ ├── reviewTableHeader.html │ │ ├── runEnhancementsForm.html │ │ ├── searchMenu.html │ │ ├── statusMonitor │ │ │ ├── depositMonitorJob.html │ │ │ ├── depositMonitorJobDetails.html │ │ │ ├── details.html │ │ │ └── overview.html │ │ ├── trashResultEntry.html │ │ ├── trashTableHeader.html │ │ └── viewSettingsForm.html │ └── structureEntry.html └── webfonts │ ├── fa-brands-400.eot │ ├── fa-brands-400.svg │ ├── fa-brands-400.ttf │ ├── fa-brands-400.woff │ ├── fa-brands-400.woff2 │ ├── fa-regular-400.eot │ ├── fa-regular-400.svg │ ├── fa-regular-400.ttf │ ├── fa-regular-400.woff │ ├── fa-regular-400.woff2 │ ├── fa-solid-900.eot │ ├── fa-solid-900.svg │ ├── fa-solid-900.ttf │ ├── fa-solid-900.woff │ └── fa-solid-900.woff2 ├── web-access-app ├── pom.xml └── src │ ├── main │ ├── java │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── web │ │ │ └── access │ │ │ └── controllers │ │ │ ├── AdvancedSearchFormController.java │ │ │ ├── BasicSearchFormController.java │ │ │ ├── FedoraContentController.java │ │ │ ├── FrontPageController.java │ │ │ ├── FullRecordController.java │ │ │ └── SearchActionController.java │ ├── resources │ │ ├── logback.xml │ │ ├── modsExclusionXPaths.json │ │ ├── recordTransformations │ │ │ ├── languageNames.xsl │ │ │ ├── modsToFullRecord.xsl │ │ │ └── scriptNames.xsl │ │ ├── search.properties │ │ └── solr.properties │ └── webapp │ │ ├── META-INF │ │ └── MANIFEST.MF │ │ ├── WEB-INF │ │ ├── access-fedora-context.xml │ │ ├── html │ │ │ └── headElements.html │ │ ├── service-context.xml │ │ ├── solr-search-context.xml │ │ ├── uiapp-servlet.xml │ │ └── web.xml │ │ └── robots.txt │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── web │ │ └── access │ │ └── controllers │ │ ├── FedoraContentControllerIT.java │ │ ├── FedoraContentControllerTest.java │ │ ├── FrontPageControllerIT.java │ │ ├── FullRecordControllerTest.java │ │ └── MODSFullRecordViewTest.java │ └── resources │ ├── fedora-content-it-servlet.xml │ ├── logback-test.xml │ ├── mods │ ├── relatedItems.xml │ └── simple.xml │ └── spring-test │ └── cdr-client-container.xml ├── web-admin-app ├── pom.xml └── src │ ├── main │ ├── java │ │ └── edu │ │ │ └── unc │ │ │ └── lib │ │ │ └── boxc │ │ │ └── web │ │ │ └── admin │ │ │ └── controllers │ │ │ ├── AbstractSearchController.java │ │ │ ├── AccessErrorController.java │ │ │ ├── ChompbController.java │ │ │ ├── DashboardController.java │ │ │ ├── GetFacetsController.java │ │ │ ├── MODSController.java │ │ │ ├── ResultEntryController.java │ │ │ ├── SearchController.java │ │ │ ├── StatusMonitorController.java │ │ │ ├── processing │ │ │ └── ChompbPreIngestService.java │ │ │ ├── structure │ │ │ └── StructureResultsController.java │ │ │ └── view │ │ │ └── CDRViewResolver.java │ ├── resources │ │ ├── logback.xml │ │ ├── search.properties │ │ └── solr.properties │ └── webapp │ │ └── WEB-INF │ │ ├── access-fedora-context.xml │ │ ├── cdrUI.tld │ │ ├── jsp │ │ ├── common │ │ │ ├── headElements.jsp │ │ │ └── header.jsp │ │ ├── edit │ │ │ ├── createContainer.jsp │ │ │ └── description.jsp │ │ ├── error │ │ │ ├── 403.jsp │ │ │ ├── 404.jsp │ │ │ ├── exception.jsp │ │ │ ├── login.jsp │ │ │ └── nonAdmin.jsp │ │ ├── index.jsp │ │ ├── report │ │ │ ├── chompb.jsp │ │ │ └── statusMonitor.jsp │ │ ├── search │ │ │ ├── collectionList.jsp │ │ │ ├── navigationBar.jsp │ │ │ ├── resultList.jsp │ │ │ └── searchMenu.jsp │ │ ├── template │ │ │ ├── ajaxTemplate.jsp │ │ │ ├── default.jsp │ │ │ └── jsonTemplate.jsp │ │ └── util │ │ │ └── facetList.jsp │ │ ├── service-context.xml │ │ ├── solr-search-context.xml │ │ ├── uiapp-servlet.xml │ │ └── web.xml │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── web │ │ └── admin │ │ ├── SpringContextTest.java │ │ └── controllers │ │ ├── ChompbControllerIT.java │ │ ├── GetFacetsControllerTest.java │ │ ├── processing │ │ └── ChompbPreIngestServiceTest.java │ │ └── views │ │ └── CDRViewResolverTest.java │ └── resources │ ├── acl-config.properties │ ├── logback-test.xml │ ├── patronPrincipalConfig.json │ └── server.properties ├── web-common ├── pom.xml └── src │ ├── main │ └── java │ │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── web │ │ └── common │ │ ├── auth │ │ ├── AccessLevel.java │ │ ├── HttpAuthHeaders.java │ │ ├── IPAddressPatronPrincipalConfig.java │ │ ├── PatronActionPermissionsUtil.java │ │ ├── PatronPrincipalProvider.java │ │ ├── RemoteUserUtil.java │ │ └── filters │ │ │ ├── RequireLoginFilter.java │ │ │ ├── SpoofShibbolethFilter.java │ │ │ ├── SpoofShibbolethRequestWrapper.java │ │ │ ├── StoreAccessLevelFilter.java │ │ │ └── StoreUserAccessControlFilter.java │ │ ├── controllers │ │ ├── AbstractErrorHandlingSearchController.java │ │ ├── AbstractSolrSearchController.java │ │ ├── AbstractStructureResultsController.java │ │ ├── ErrorController.java │ │ └── UserInformationController.java │ │ ├── exceptions │ │ ├── ClientAbortException.java │ │ ├── InvalidRecordRequestException.java │ │ ├── RenderViewException.java │ │ └── ResourceNotFoundException.java │ │ ├── services │ │ ├── AccessCopiesService.java │ │ ├── DerivativeContentService.java │ │ ├── FedoraContentService.java │ │ ├── FindingAidUrlService.java │ │ ├── PermissionsHelper.java │ │ ├── SolrQueryLayerService.java │ │ ├── WorkFilesizeService.java │ │ └── XmlDocumentFilteringService.java │ │ ├── utils │ │ ├── AnalyticsTrackerUtil.java │ │ ├── DatastreamUtil.java │ │ ├── ModsUtil.java │ │ ├── SearchConstants.java │ │ ├── SearchStateSerializationUtil.java │ │ ├── SerializationUtil.java │ │ └── StringFormatUtil.java │ │ └── view │ │ ├── XSLComponentView.java │ │ └── XSLViewResolver.java │ └── test │ ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── web │ │ └── common │ │ ├── auth │ │ ├── PatronActionPermissionsUtilTest.java │ │ ├── PatronPrincipalProviderTest.java │ │ └── filters │ │ │ └── StoreUserAccessControlFilterTest.java │ │ ├── controllers │ │ └── ErrorControllerTest.java │ │ ├── services │ │ ├── AccessCopiesServiceTest.java │ │ ├── DerivativeContentServiceTest.java │ │ ├── FedoraContentServiceTest.java │ │ ├── FindingAidUrlServiceTest.java │ │ ├── PermissionsHelperTest.java │ │ ├── StoreAccessLevelFilterTest.java │ │ ├── WorkFilesizeServiceTest.java │ │ └── XmlDocumentFilteringServiceTest.java │ │ └── utils │ │ ├── AnalyticsTrackerUtilTest.java │ │ ├── DatastreamUtilTest.java │ │ ├── ModsUtilTest.java │ │ ├── SearchStateSerializationUtilTest.java │ │ ├── SerializationUtilTest.java │ │ └── StringFormatUtilTest.java │ └── resources │ ├── mods │ ├── exclusion_record.xml │ └── test_record.xml │ ├── search.properties │ ├── solr-search-context-unit.xml │ └── tokki.jpg └── web-services-app ├── pom.xml └── src ├── main ├── java │ └── edu │ │ └── unc │ │ └── lib │ │ └── boxc │ │ └── web │ │ └── services │ │ ├── processing │ │ ├── AddContainerService.java │ │ ├── DownloadImageService.java │ │ ├── ExportCsvService.java │ │ ├── IiifV3ManifestService.java │ │ ├── ImageServerProxyService.java │ │ ├── ImageServerV2Service.java │ │ ├── ImportThumbnailService.java │ │ ├── MemberOrderCsvConstants.java │ │ ├── MemberOrderCsvExporter.java │ │ ├── MemberOrderCsvTransformer.java │ │ ├── RunEnhancementsRequest.java │ │ ├── RunEnhancementsService.java │ │ ├── SetAsPrimaryObjectService.java │ │ └── SingleUseKeyService.java │ │ ├── rest │ │ ├── AccessControlRetrievalController.java │ │ ├── DatastreamController.java │ │ ├── DepositController.java │ │ ├── DepositPipelineController.java │ │ ├── DownloadBulkController.java │ │ ├── DownloadImageController.java │ │ ├── FacetRestController.java │ │ ├── IiifV3ManifestController.java │ │ ├── ImageServerProxyController.java │ │ ├── ImageServerV2Controller.java │ │ ├── ItemInfoRestController.java │ │ ├── RunEnhancementsController.java │ │ ├── SearchRestController.java │ │ ├── SingleUseKeyController.java │ │ ├── exceptions │ │ │ └── RestResponseEntityExceptionHandler.java │ │ └── modify │ │ │ ├── AccessSurrogateController.java │ │ │ ├── AddContainerController.java │ │ │ ├── AltTextController.java │ │ │ ├── ContentModelController.java │ │ │ ├── DestroyObjectsController.java │ │ │ ├── EditFilenameController.java │ │ │ ├── EditRefIdController.java │ │ │ ├── EditTitleController.java │ │ │ ├── ExportCsvController.java │ │ │ ├── ExportXMLController.java │ │ │ ├── ImportXMLController.java │ │ │ ├── IndexingController.java │ │ │ ├── IngestController.java │ │ │ ├── IngestSourceController.java │ │ │ ├── MarkForDeletionController.java │ │ │ ├── MemberOrderController.java │ │ │ ├── MoveObjectsController.java │ │ │ ├── SetAsPrimaryObjectController.java │ │ │ ├── StreamingPropertiesController.java │ │ │ ├── ThumbnailController.java │ │ │ ├── UpdateDescriptionController.java │ │ │ ├── UpdatePatronAccessController.java │ │ │ ├── UpdateStaffAccessController.java │ │ │ └── ViewSettingController.java │ │ └── utils │ │ └── CsvUtil.java ├── resources │ ├── logback.xml │ ├── search.properties │ └── solr.properties └── webapp │ ├── META-INF │ └── MANIFEST.MF │ ├── WEB-INF │ ├── access-fedora-context.xml │ ├── deposits-context.xml │ ├── rest-servlet.xml │ ├── service-context.xml │ ├── solr-search-context.xml │ └── web.xml │ ├── error │ └── 401.html │ └── index.jsp └── test ├── java └── edu │ └── unc │ └── lib │ └── boxc │ └── web │ └── services │ ├── processing │ ├── AddContainerServiceTest.java │ ├── ExportCsvServiceTest.java │ ├── IiifV3ManifestServiceTest.java │ ├── ImageServerV2ServiceTest.java │ ├── ImportThumbnailServiceTest.java │ ├── MemberOrderCsvExporterTest.java │ ├── MemberOrderCsvTransformerTest.java │ ├── RunEnhancementsServiceTest.java │ ├── SetAsPrimaryObjectServiceTest.java │ └── SingleUseKeyServiceTest.java │ ├── rest │ ├── DatastreamRestControllerIT.java │ ├── DepositPipelineControllerIT.java │ ├── DownloadBulkControllerIT.java │ ├── DownloadImageControllerIT.java │ ├── FacetRestControllerIT.java │ ├── IiifV3ManifestControllerTest.java │ ├── ImageServerProxyControllerTest.java │ ├── ImageServerV2ControllerTest.java │ ├── ItemInfoRestControllerIT.java │ ├── MvcTestHelpers.java │ ├── RetrievePatronRolesIT.java │ ├── RetrieveStaffRolesIT.java │ ├── RunEnhancementsIT.java │ ├── SingleUseKeyControllerIT.java │ └── modify │ │ ├── AbstractAPIIT.java │ │ ├── AccessSurrogateIT.java │ │ ├── AddContainerIT.java │ │ ├── AltTextControllerTest.java │ │ ├── DestroyObjectsIT.java │ │ ├── EditFilenameIT.java │ │ ├── EditRefIdControllerTest.java │ │ ├── EditTitleIT.java │ │ ├── ExportCsvIT.java │ │ ├── ExportXMLIT.java │ │ ├── ImportXMLIT.java │ │ ├── IndexingIT.java │ │ ├── IngestControllerIT.java │ │ ├── IngestSourceControllerIT.java │ │ ├── MarkForDeletionIT.java │ │ ├── MemberOrderControllerTest.java │ │ ├── MoveObjectsIT.java │ │ ├── SetAsPrimaryObjectIT.java │ │ ├── StreamingPropertiesIT.java │ │ ├── ThumbnailIT.java │ │ ├── UpdateDescriptionIT.java │ │ ├── UpdatePatronAccessIT.java │ │ ├── UpdateStaffRolesIT.java │ │ └── ViewSettingIT.java │ └── utils │ ├── DownloadTestHelper.java │ ├── EmbeddedActiveMQBroker.java │ └── SingleUseKeyUtil.java └── resources ├── __files ├── bunny.jpg └── placeholder.png ├── access-control-retrieval-it-servlet.xml ├── acl-config.properties ├── add-container-it-servlet.xml ├── application.properties ├── bag_with_files.zip ├── cdr_mets_package.xml ├── datastream-content-it-servlet.xml ├── deposit-pipeline-it-servlet.xml ├── destroy-objects-it-servlet.xml ├── edit-filename-it-servlet.xml ├── edit-title-it-servlet.xml ├── export-csv-it-servlet.xml ├── export-csv-it.properties ├── export-xml-it-servlet.xml ├── facet-rest-it-servlet.xml ├── image-server-proxy-servlet.xml ├── import-xml-it-servlet.xml ├── indexing-it-servlet.xml ├── logback-test.xml ├── mark-for-deletion-it-servlet.xml ├── mods ├── invalid-mods.xml ├── valid-mods.xml ├── valid-mods2.xml └── work-mods.xml ├── move-objects-it-servlet.xml ├── patron-principals.json ├── set-as-primary-object-it-servlet.xml ├── spring-test ├── acl-service-context.xml ├── cdr-client-container.xml ├── redis-server-context.xml └── solr-indexing-context.xml ├── update-description-it-servlet.xml ├── update-patron-it-servlet.xml ├── update-staff-it-servlet.xml └── upload-files └── burndown.png /.gitignore: -------------------------------------------------------------------------------- 1 | /*/.classpath 2 | .project 3 | /*/.settings 4 | /*/target 5 | /*/bin 6 | !/etc/bin 7 | /*/tmp 8 | /*/dist 9 | /*/doc 10 | /*/build 11 | /.settings 12 | /*/src/jaxb 13 | .DS_Store 14 | /ssh_config 15 | /static.tar.gz 16 | /puppet.tar.gz 17 | */fcrepo4-data 18 | .idea 19 | static/index.html 20 | static/assets 21 | static/js/vue-cdr-access/.env 22 | static/build 23 | *.log* 24 | *.iml 25 | dump.rdb 26 | authorized_keys 27 | staging-areas 28 | target 29 | fcrepo-cdr-fesl 30 | fcrepo-irods-storage 31 | services-worker 32 | **/activemq-data 33 | .sass-cache 34 | *.css.map 35 | dependency-reduced-pom.xml 36 | etc/solr-config/access/data/ 37 | it_config/logs/* -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "clamav-java"] 2 | path = clamav-java 3 | url = https://github.com/UNC-Libraries/clamav-java.git 4 | [submodule "jp24u"] 5 | path = jp24u 6 | url = https://github.com/UNC-Libraries/jp24u.git 7 | -------------------------------------------------------------------------------- /auth-api/src/main/java/edu/unc/lib/boxc/auth/api/Permission.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.api; 2 | 3 | /** 4 | * Permissions for user actions within the repository 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public enum Permission { 10 | viewMetadata, 11 | viewAccessCopies, 12 | viewReducedResImages, 13 | viewOriginal, 14 | // Staff Permissions 15 | viewHidden, 16 | editDescription, 17 | bulkUpdateDescription, 18 | ingest, 19 | orderMembers, 20 | move, 21 | markForDeletion, 22 | markForDeletionUnit, 23 | destroy, 24 | destroyUnit, 25 | createCollection, 26 | createAdminUnit, 27 | changePatronAccess, 28 | assignStaffRoles, 29 | editAspaceProperties, 30 | editResourceType, 31 | editViewSettings, 32 | runEnhancements, 33 | reindex; 34 | } 35 | -------------------------------------------------------------------------------- /auth-api/src/main/java/edu/unc/lib/boxc/auth/api/exceptions/AccessRestrictionException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.api.exceptions; 2 | 3 | /** 4 | * Access restriction exceptions. 5 | * 6 | * @author bbpennel 7 | */ 8 | public class AccessRestrictionException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public AccessRestrictionException() { 12 | } 13 | 14 | public AccessRestrictionException(String msg) { 15 | super(msg); 16 | } 17 | } -------------------------------------------------------------------------------- /auth-api/src/main/java/edu/unc/lib/boxc/auth/api/exceptions/InvalidAssignmentException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.api.exceptions; 2 | 3 | /** 4 | * Exception thrown when an invalid access restriction is assigned to an object. 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public class InvalidAssignmentException extends AccessRestrictionException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public InvalidAssignmentException() { 13 | } 14 | 15 | public InvalidAssignmentException(String msg) { 16 | super(msg); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /auth-api/src/main/java/edu/unc/lib/boxc/auth/api/models/AccessGroupSet.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.api.models; 2 | 3 | import java.util.Set; 4 | 5 | /** 6 | * Storage class for a list of access groups related to a single entity. 7 | * @author bbpennel 8 | */ 9 | public interface AccessGroupSet extends Set { 10 | 11 | void addAccessGroup(String group); 12 | 13 | String joinAccessGroups(String delimiter); 14 | 15 | String joinAccessGroups(String delimiter, String prefix, boolean escapeColons); 16 | 17 | } -------------------------------------------------------------------------------- /auth-api/src/main/java/edu/unc/lib/boxc/auth/api/models/AgentPrincipals.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.api.models; 2 | 3 | /** 4 | * Stores the authentication principals for an agent. 5 | * @author bbpennel 6 | */ 7 | public interface AgentPrincipals { 8 | 9 | /** 10 | * @return the username 11 | */ 12 | String getUsername(); 13 | 14 | /** 15 | * @return the namespaced username 16 | */ 17 | String getUsernameUri(); 18 | 19 | /** 20 | * @return set of all principals for this agent 21 | */ 22 | AccessGroupSet getPrincipals(); 23 | 24 | } -------------------------------------------------------------------------------- /auth-api/src/main/java/edu/unc/lib/boxc/auth/api/services/EmbargoUtil.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.api.services; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * Helper methods for interacting with embargoes 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public class EmbargoUtil { 12 | 13 | private EmbargoUtil() { 14 | } 15 | 16 | /** 17 | * Returns true if the provided embargo end date is active based 18 | * on the current date. 19 | * 20 | * @param embargoUntil 21 | * @return true if the embargo is active. 22 | */ 23 | public static boolean isEmbargoActive(Date embargoUntil) { 24 | if (embargoUntil != null) { 25 | Date currentDate = new Date(); 26 | if (currentDate.before(embargoUntil)) { 27 | return true; 28 | } 29 | } 30 | return false; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /auth-fcrepo/src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /auth-fcrepo/src/test/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /auth-fcrepo/src/test/java/edu/unc/lib/boxc/auth/fcrepo/services/GroupsThreadStoreTest.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.auth.fcrepo.services; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import org.junit.jupiter.api.Test; 5 | 6 | public class GroupsThreadStoreTest extends Assertions { 7 | 8 | @Test 9 | public void nullGroupsTest() { 10 | GroupsThreadStore.storeGroups(null); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /auth-fcrepo/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /clamd.conf: -------------------------------------------------------------------------------- 1 | Foreground yes 2 | TCPSocket 3310 3 | TCPAddr 127.0.0.1 -------------------------------------------------------------------------------- /common-utils/src/main/resources/checkstyle/checkstyle-suppressions.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /common-utils/src/test/java/edu/unc/lib/boxc/common/test/SelfReturningAnswer.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.common.test; 2 | 3 | import static org.mockito.Mockito.RETURNS_DEFAULTS; 4 | 5 | import org.mockito.invocation.InvocationOnMock; 6 | import org.mockito.stubbing.Answer; 7 | 8 | /** 9 | * Mockito answer which returns the mocked object for all unstubbed method calls. 10 | * 11 | */ 12 | public class SelfReturningAnswer implements Answer { 13 | 14 | public Object answer(InvocationOnMock invocation) throws Throwable { 15 | Object mock = invocation.getMock(); 16 | 17 | if (invocation.getMethod().getReturnType().isInstance(mock)) { 18 | return mock; 19 | } else { 20 | return RETURNS_DEFAULTS.answer(invocation); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common-utils/src/test/resources/samples/bad-zip-with-relative-path.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/common-utils/src/test/resources/samples/bad-zip-with-relative-path.zip -------------------------------------------------------------------------------- /common-utils/src/test/resources/samples/test-mets-zip.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/common-utils/src/test/resources/samples/test-mets-zip.zip -------------------------------------------------------------------------------- /deposit-app/.gitignore: -------------------------------------------------------------------------------- 1 | dependency-reduced-pom.xml 2 | -------------------------------------------------------------------------------- /deposit-app/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/README.md -------------------------------------------------------------------------------- /deposit-app/src/main/java/edu/unc/lib/boxc/deposit/normalize/FilePathFunction.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.normalize; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | * 7 | */ 8 | public interface FilePathFunction { 9 | public String getPath(String piduri); 10 | } -------------------------------------------------------------------------------- /deposit-app/src/main/java/edu/unc/lib/boxc/deposit/work/DepositFailedException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.work; 2 | 3 | /** 4 | * Thrown whenever the deposit cannot be completed for a given reason. 5 | * @author count0 6 | * 7 | */ 8 | public class DepositFailedException extends RuntimeException { 9 | 10 | /** 11 | * 12 | */ 13 | private static final long serialVersionUID = -4818301461775253637L; 14 | 15 | public DepositFailedException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | 19 | public DepositFailedException(String message) { 20 | super(message); 21 | } 22 | 23 | public DepositFailedException(Throwable cause) { 24 | super(cause); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /deposit-app/src/main/java/edu/unc/lib/boxc/deposit/work/JobFailedException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.work; 2 | 3 | /** 4 | * @author bbpennel 5 | */ 6 | public class JobFailedException extends RuntimeException { 7 | 8 | private static final long serialVersionUID = 2094423835072435563L; 9 | 10 | private String details; 11 | 12 | public String getDetails() { 13 | return details; 14 | } 15 | 16 | public JobFailedException(String message) { 17 | super(message); 18 | } 19 | 20 | public JobFailedException(String message, String details) { 21 | super(message); 22 | this.details = details; 23 | } 24 | 25 | public JobFailedException(String message, Throwable cause) { 26 | super(message, cause); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /deposit-app/src/main/java/edu/unc/lib/boxc/deposit/work/JobInterruptedException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.work; 2 | 3 | /** 4 | * @author bbpennel 5 | * @date Aug 4, 2014 6 | */ 7 | public class JobInterruptedException extends RuntimeException { 8 | 9 | private static final long serialVersionUID = 718488999114016706L; 10 | 11 | public JobInterruptedException(String message) { 12 | super(message); 13 | } 14 | 15 | public JobInterruptedException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /deposit-app/src/main/java/edu/unc/lib/boxc/deposit/work/JobPausedException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.work; 2 | 3 | /** 4 | * Thrown if a deposit job is paused 5 | * 6 | * @author bbpennel 7 | */ 8 | public class JobPausedException extends JobInterruptedException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | /** 12 | * @param message 13 | */ 14 | public JobPausedException(String message) { 15 | super(message); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /deposit-app/src/main/resources/completed_text.txt: -------------------------------------------------------------------------------- 1 | DCR deposit complete{{#fileName}}: {{fileName}}{{/fileName}} 2 | 3 | {{#ingestedObjects}}{{ingestedObjects}} item(s) successfully deposited. 4 | 5 | {{/ingestedObjects}} 6 | {{#isOpen}}Your materials are now available in the DCR: 7 | 8 | {{baseUrl}}/record/{{objectPid}} 9 | 10 | {{/isOpen}} 11 | {{#isClosed}}Materials requiring review will be made accessible upon approval by the relevant department. 12 | 13 | {{/isClosed}} 14 | Thank you for contributing to the Digital Collections Repository, a service of the University of North Carolina at Chapel Hill Libraries. 15 | 16 | Digital Collections Repository: {{baseUrl}} 17 | UNC Chapel Hill Libraries: http://www.lib.unc.edu/ 18 | -------------------------------------------------------------------------------- /deposit-app/src/main/resources/failed_html.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | DCR deposit failed{{#fileName}}: {{fileName}}{{/fileName}} 5 | 6 | 7 | 8 | 9 | UNC Libraries logo 10 | 11 |

DCR deposit failed{{#fileName}}: {{fileName}}{{/fileName}}

12 | 13 |

There was an error processing your deposit.

14 | 15 | {{#errorMessage}} 16 |
{{errorMessage}}
17 | {{/errorMessage}} 18 | 19 |

For details, see the status monitor.

20 | 21 |

Thank you for contributing to the Digital Collections Repository, a service of the University of North Carolina at Chapel Hill Libraries.

22 | 23 | 24 | -------------------------------------------------------------------------------- /deposit-app/src/main/resources/failed_text.txt: -------------------------------------------------------------------------------- 1 | DCR deposit failed{{#fileName}}: {{fileName}}{{/fileName}} 2 | 3 | There was an error processing your deposit. 4 | {{#errorMessage}} 5 | {{errorMessage}} 6 | {{/errorMessage}} 7 | 8 | For details, see the status monitor: 9 | 10 | {{baseUrl}}/admin/statusMonitor 11 | 12 | Thank you for contributing to the Digital Collections Repository, a service of the University of North Carolina at Chapel Hill Libraries. 13 | 14 | Digital Collections Repository: {{baseUrl}} 15 | UNC Chapel Hill Libraries: http://www.lib.unc.edu/ 16 | -------------------------------------------------------------------------------- /deposit-app/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %d %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /deposit-app/src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | Deposit 8 | 9 | 10 | org.springframework.web.context.ContextLoaderListener 11 | 12 | 13 | contextConfigLocation 14 | 15 | /WEB-INF/deposit-jobs-context.xml 16 | /WEB-INF/fcrepo-clients-context.xml 17 | /WEB-INF/service-context.xml 18 | 19 | 20 | -------------------------------------------------------------------------------- /deposit-app/src/test/java/edu/unc/lib/boxc/deposit/DepositTestUtils.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | 6 | import org.apache.commons.io.FileUtils; 7 | 8 | import edu.unc.lib.boxc.common.util.ZipFileUtil; 9 | 10 | public class DepositTestUtils { 11 | 12 | public static String makeTestDir(File parent, String dirName, File zippedContent) { 13 | File workingDir = new File(parent, dirName); 14 | try { 15 | if (workingDir.exists()) { 16 | FileUtils.deleteDirectory(workingDir); 17 | } 18 | ZipFileUtil.unzipToDir(zippedContent, workingDir); 19 | } catch (IOException e) { 20 | throw new Error( 21 | "Unable to unpack your deposit: " + zippedContent, e); 22 | } 23 | return workingDir.getAbsolutePath(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/acl-global-config.properties: -------------------------------------------------------------------------------- 1 | cdr.acl.globalRoles.administrator=adminGroup 2 | cdr.acl.globalRoles.canIngest=ingestGroup 3 | cdr.acl.globalRoles.canDescribe=rdm 4 | cdr.acl.globalRoles.canAccess=auditors -------------------------------------------------------------------------------- /deposit-app/src/test/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/application.properties -------------------------------------------------------------------------------- /deposit-app/src/test/resources/atomPubEntryBag.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/atomPubEntryBag.zip -------------------------------------------------------------------------------- /deposit-app/src/test/resources/cdrMETS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/cdrMETS.zip -------------------------------------------------------------------------------- /deposit-app/src/test/resources/cleanupStage/project/folderA/ingested: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/cleanupStage/project/folderA/ingested -------------------------------------------------------------------------------- /deposit-app/src/test/resources/cleanupStage/project/folderA/leftover: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/cleanupStage/project/folderA/leftover -------------------------------------------------------------------------------- /deposit-app/src/test/resources/cleanupStage/project/folderB/also_ingested: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/cleanupStage/project/folderB/also_ingested -------------------------------------------------------------------------------- /deposit-app/src/test/resources/cleanupStage/project/folderB/ingested: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/cleanupStage/project/folderB/ingested -------------------------------------------------------------------------------- /deposit-app/src/test/resources/deposit.properties: -------------------------------------------------------------------------------- 1 | # Deposit Configuration 2 | # optional properties shown in comments with defaults 3 | 4 | # Folder where deposits are stored at submission time 5 | deposits.dir=/tmp/deposit-tests 6 | 7 | cleanup.delay.seconds=3600 8 | status.keys.expire.seconds=60 9 | 10 | # redis.host=localhost 11 | # redis.port=6379 12 | 13 | # fedora.protocol=https 14 | # fedora.host=localhost 15 | # fedora.port=443 16 | # fedora.context=fedora 17 | # fedora.username 18 | # fedora.password 19 | fedora.stagesConfiguration=src/test/resources/localConfig.json 20 | 21 | # ClamAV Daemon (uses streaming API) 22 | # clamd.host=localhost 23 | # clamd.port=3310 24 | # clamd.timeout=60000 # milliseconds 25 | 26 | # smtp.host=localhost 27 | # smtp.port=25 28 | # from.email=no-reply@example.com 29 | # baseUrl=https://www.example.com -------------------------------------------------------------------------------- /deposit-app/src/test/resources/depositFileZipped.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/depositFileZipped.zip -------------------------------------------------------------------------------- /deposit-app/src/test/resources/examples/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/examples/image.jpg -------------------------------------------------------------------------------- /deposit-app/src/test/resources/examples/text.txt: -------------------------------------------------------------------------------- 1 | text -------------------------------------------------------------------------------- /deposit-app/src/test/resources/form_submissions/continuing_minimal.json: -------------------------------------------------------------------------------- 1 | { 2 | "dateOfIssue": "", 3 | "volume": "", 4 | "number": "", 5 | "title": "test publication", 6 | "alternateTitle": "", 7 | "precedingTitle": "", 8 | "succeedingTitle": "", 9 | "genre": null, 10 | "resourceType": null, 11 | "publisher": "", 12 | "placeOfPublication": "", 13 | "issuance": "continuing", 14 | "frequency": null, 15 | "language": "eng", 16 | "relatedUrl": "", 17 | "subjectTopical": [ 18 | { 19 | "subjectTopical": "" 20 | } 21 | ], 22 | "subjectPersonal": [ 23 | { 24 | "subjectPersonal": "" 25 | } 26 | ], 27 | "subjectCorporate": [ 28 | { 29 | "subjectCorporate": "" 30 | } 31 | ], 32 | "subjectGeographic": [ 33 | { 34 | "subjectGeographic": "" 35 | } 36 | ], 37 | "file": [ 38 | { 39 | "originalName": "test.json", 40 | "tmp": "ingest-10861526686260870997.tmp" 41 | } 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/form_submissions/generic_minimal.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "generic test", 3 | "dateCreated": "", 4 | "description": "hello world", 5 | "keywords": [], 6 | "language": "eng", 7 | "resourceType": "text", 8 | "creatorInfo": [ 9 | { 10 | "fname": "", 11 | "lname": "", 12 | "termsAddress": "", 13 | "dates": "" 14 | } 15 | ], 16 | "corporateCreator": [ 17 | { 18 | "name": "" 19 | } 20 | ], 21 | "subjectTopical": [ 22 | { 23 | "subjectTopical": "" 24 | } 25 | ], 26 | "subjectPersonal": [ 27 | { 28 | "subjectPersonal": "" 29 | } 30 | ], 31 | "subjectCorporate": [ 32 | { 33 | "subjectCorporate": "" 34 | } 35 | ], 36 | "subjectGeographic": [ 37 | { 38 | "subjectGeographic": "" 39 | } 40 | ], 41 | "file": [ 42 | { 43 | "originalName": "test.json", 44 | "tmp": "ingest-5277341109740044922.tmp" 45 | } 46 | ] 47 | } 48 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/ingest-bags/proquest-bag.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/deposit-app/src/test/resources/ingest-bags/proquest-bag.zip -------------------------------------------------------------------------------- /deposit-app/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/mods/multipleNameAffiliationsMods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Multiple Named Affiliations Test 5 | 6 | 7 | 8 | Test 9 | dept1 10 | 11 | 12 | 13 | Test2 14 | 15 | 16 | 17 | Test3 18 | dept1 19 | dept2 20 | 21 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/mods/singleAffiliationMods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Affiliations Test 5 | 6 | 7 | 8 | Test 9 | dept1 10 | 11 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/flat-bag/bagit.txt: -------------------------------------------------------------------------------- 1 | BagIt-Version: 0.97 2 | Tag-File-Character-Encoding: UTF-8 3 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/flat-bag/data/ipsum.txt: -------------------------------------------------------------------------------- 1 | ipsum -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/flat-bag/data/lorem.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/flat-bag/manifest-md5.txt: -------------------------------------------------------------------------------- 1 | fa5c89f3c88b81bfd5e821b0316569af data/lorem.txt 2 | e78f5438b48b39bcbdea61b73679449d data/ipsum.txt 3 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/invalid-bag/test/lorem.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/valid-bag/bagit.txt: -------------------------------------------------------------------------------- 1 | BagIt-Version: 0.97 2 | Tag-File-Character-Encoding: UTF-8 3 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/valid-bag/data/test/ipsum.txt: -------------------------------------------------------------------------------- 1 | ipsum -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/valid-bag/data/test/lorem.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -------------------------------------------------------------------------------- /deposit-app/src/test/resources/paths/valid-bag/manifest-md5.txt: -------------------------------------------------------------------------------- 1 | fa5c89f3c88b81bfd5e821b0316569af data/test/lorem.txt 2 | e78f5438b48b39bcbdea61b73679449d data/test/ipsum.txt 3 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/simpleMods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Simple MODS document 4 | 5 | 6 | eng 7 | 8 | 9 | Test 10 | 11 | creator 12 | 13 | 14 | -------------------------------------------------------------------------------- /deposit-app/src/test/resources/staging_config.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "path":"staging_location1/", 4 | "name":"Stage1", 5 | "cleanupPolicy":"DELETE_INGESTED_FILES_EMPTY_FOLDERS" 6 | }, 7 | { 8 | "path":"staging_location2/", 9 | "name":"Stage2", 10 | "cleanupPolicy":"DO_NOTHING" 11 | } 12 | ] -------------------------------------------------------------------------------- /deposit-utils/src/main/java/edu/unc/lib/boxc/deposit/api/DepositMethod.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.api; 2 | 3 | /** 4 | * Deposit method 5 | * @author bbpennel 6 | * 7 | */ 8 | public enum DepositMethod { 9 | Unspecified("Unspecified Method"), 10 | WebForm("CDR Web Form"), 11 | CDRAPI1("CDR API 1.0"), 12 | CDRCollector("CDR Collector 1.0"), 13 | BXC3_TO_5_MIGRATION_UTIL("BXC3 To BXC5 Migration Utility"), 14 | CDM_TO_BXC_MIGRATION("CDM To Box-c Migration"); 15 | 16 | private String label; 17 | 18 | DepositMethod(String label) { 19 | this.label = label; 20 | } 21 | 22 | public String getLabel() { 23 | return this.label; 24 | } 25 | 26 | @Override 27 | public String toString() { 28 | return this.label; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /deposit-utils/src/main/java/edu/unc/lib/boxc/deposit/api/exceptions/DepositException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.api.exceptions; 2 | 3 | /** 4 | * @author bbpennel 5 | * @date Mar 24, 2014 6 | */ 7 | public class DepositException extends Exception { 8 | 9 | private static final long serialVersionUID = -4065348103957132332L; 10 | 11 | public DepositException(String msg) { 12 | super(msg); 13 | } 14 | 15 | public DepositException(String msg, Throwable e) { 16 | super(msg, e); 17 | } 18 | } -------------------------------------------------------------------------------- /deposit-utils/src/main/java/edu/unc/lib/boxc/deposit/api/exceptions/InterruptedRuntimeException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.api.exceptions; 2 | 3 | /** 4 | * Unchecked InterruptedException 5 | * 6 | * @author bbpennel 7 | */ 8 | public class InterruptedRuntimeException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public InterruptedRuntimeException() { 12 | super(); 13 | } 14 | 15 | public InterruptedRuntimeException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | 19 | public InterruptedRuntimeException(String message) { 20 | super(message); 21 | } 22 | 23 | public InterruptedRuntimeException(Throwable cause) { 24 | super(cause); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /deposit-utils/src/main/java/edu/unc/lib/boxc/deposit/api/submit/DepositHandler.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.api.submit; 2 | 3 | import edu.unc.lib.boxc.deposit.api.exceptions.DepositException; 4 | import edu.unc.lib.boxc.model.api.ids.PID; 5 | 6 | /** 7 | * Interface for a deposit handler used to submit deposits to the deposit pipeline 8 | * 9 | * @author bbpennel 10 | * 11 | */ 12 | public interface DepositHandler { 13 | /** 14 | * Perform this deposit handler, submitting a deposit request to the pipeline 15 | * 16 | * @param destination PID of the object to deposit into 17 | * @param deposit details about the deposit 18 | * @return PID of the deposit 19 | * @throws DepositException 20 | */ 21 | public PID doDeposit(PID destination, DepositData deposit) throws DepositException; 22 | } 23 | -------------------------------------------------------------------------------- /deposit-utils/src/main/java/edu/unc/lib/boxc/deposit/impl/mets/METSProfile.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.impl.mets; 2 | 3 | /** 4 | * METS Profile 5 | * @author bbpennel 6 | * 7 | */ 8 | public enum METSProfile { 9 | CDR_SIMPLE("http://cdr.unc.edu/METS/profiles/Simple"); 10 | 11 | private String name; 12 | 13 | METSProfile(final String name) { 14 | this.name = name; 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | 21 | public boolean equals(final String name) { 22 | return this.name.equals(name); 23 | } 24 | 25 | @Override 26 | public String toString() { 27 | return name; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /deposit-utils/src/main/java/edu/unc/lib/boxc/deposit/utils/NoResolutionResourceResolver.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.deposit.utils; 2 | 3 | import static java.lang.String.format; 4 | 5 | import org.w3c.dom.ls.LSInput; 6 | import org.w3c.dom.ls.LSResourceResolver; 7 | 8 | /** 9 | * External resource resolver which throws an exception any time a resource is resolved, to prevent injection attacks. 10 | * 11 | * @author bbpennel 12 | * 13 | */ 14 | public class NoResolutionResourceResolver implements LSResourceResolver { 15 | 16 | @Override 17 | public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { 18 | throw new RuntimeException(format("Rejecting resolution of resource: %s|%s|%s|%s|%s", 19 | type, namespaceURI, publicId, baseURI, systemId)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /etc/solr-config/access/core.properties: -------------------------------------------------------------------------------- 1 | name=access -------------------------------------------------------------------------------- /etc/solr-config/solr.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 20 | access 21 | 22 | -------------------------------------------------------------------------------- /fcrepo-utils/src/.gitignore: -------------------------------------------------------------------------------- 1 | /jaxb 2 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/FcrepoPaths.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo; 2 | 3 | /** 4 | * Constants for paths related to a Fedora instance 5 | * 6 | * @author bbpennel 7 | */ 8 | public class FcrepoPaths { 9 | 10 | private static String baseUri; 11 | static { 12 | setBaseUri(System.getProperty("fcrepo.baseUri")); 13 | } 14 | 15 | private FcrepoPaths() { 16 | } 17 | 18 | private static void setBaseUri(String uri) { 19 | baseUri = uri; 20 | if (!baseUri.endsWith("/")) { 21 | baseUri += "/"; 22 | } 23 | } 24 | 25 | /** 26 | * Get a string of the uri identifying the base of the fedora repository. 27 | * 28 | * @return 29 | */ 30 | public static String getBaseUri() { 31 | return baseUri; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/exceptions/ChecksumMismatchException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.FedoraException; 4 | 5 | /** 6 | * Checksum did not match the provided checksum value. 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public class ChecksumMismatchException extends FedoraException { 12 | 13 | private static final long serialVersionUID = -7456278395813803155L; 14 | 15 | public ChecksumMismatchException(Exception e) { 16 | super(e); 17 | } 18 | 19 | public ChecksumMismatchException(String message, Exception e) { 20 | super(message, e); 21 | } 22 | 23 | public ChecksumMismatchException(String message) { 24 | super(message); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/exceptions/ConflictException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.FedoraException; 4 | 5 | /** 6 | * Request failed due to a conflict 7 | * 8 | * @author bbpennel 9 | */ 10 | public class ConflictException extends FedoraException { 11 | 12 | /** 13 | * @param e 14 | */ 15 | public ConflictException(Exception e) { 16 | super(e); 17 | } 18 | 19 | /** 20 | * @param message 21 | * @param e 22 | */ 23 | public ConflictException(String message, Exception e) { 24 | super(message, e); 25 | } 26 | 27 | /** 28 | * @param message 29 | */ 30 | public ConflictException(String message) { 31 | super(message); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/exceptions/FedoraTimeoutException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo.exceptions; 2 | 3 | /** 4 | * @author Gregory Jansen 5 | * 6 | */ 7 | public class FedoraTimeoutException extends ServiceException { 8 | 9 | /** 10 | * 11 | */ 12 | private static final long serialVersionUID = -5509017474926163463L; 13 | 14 | public FedoraTimeoutException(String desc) { 15 | super(desc); 16 | } 17 | 18 | /** 19 | * @param cause 20 | */ 21 | public FedoraTimeoutException(Throwable cause) { 22 | super(cause); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/exceptions/OptimisticLockException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.FedoraException; 4 | 5 | /** 6 | * @author bbpennel 7 | * @date Feb 4, 2015 8 | */ 9 | public class OptimisticLockException extends FedoraException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | public OptimisticLockException(String message) { 14 | super(message); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/exceptions/RangeNotSatisfiableException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.FedoraException; 4 | 5 | /** 6 | * Error indicates that a HTTP range request could not be satisfied 7 | * 8 | * @author bbpennel 9 | */ 10 | public class RangeNotSatisfiableException extends FedoraException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public RangeNotSatisfiableException(String message) { 14 | super(message); 15 | } 16 | 17 | public RangeNotSatisfiableException(Throwable cause) { 18 | super(cause); 19 | } 20 | 21 | public RangeNotSatisfiableException(String message, Throwable cause) { 22 | super(message, cause); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/java/edu/unc/lib/boxc/fcrepo/exceptions/TransactionCancelledException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.fcrepo.exceptions; 2 | 3 | /** 4 | * 5 | * @author harring 6 | * 7 | */ 8 | public class TransactionCancelledException extends RuntimeException { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | public TransactionCancelledException() { 13 | super(); 14 | } 15 | 16 | public TransactionCancelledException(String message) { 17 | super(message); 18 | } 19 | 20 | public TransactionCancelledException(String message, Throwable t) { 21 | super(message, t); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /fcrepo-utils/src/main/resources/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/fcrepo-utils/src/main/resources/.keep -------------------------------------------------------------------------------- /fcrepo-utils/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/ProcessingStatus.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | * 7 | */ 8 | public enum ProcessingStatus { 9 | ACTIVE("active"), INPROGRESS("inprogress"), BLOCKED("blocked"), 10 | QUEUED("queued"), FINISHED("finished"), FAILED("failed"), IGNORED("ignored"); 11 | 12 | String name; 13 | 14 | ProcessingStatus(String name) { 15 | this.name = name; 16 | } 17 | 18 | public String toString() { 19 | return name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/action/ClearIndexAction.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.action; 2 | 3 | import edu.unc.lib.boxc.indexing.solr.SolrUpdateRequest; 4 | import edu.unc.lib.boxc.indexing.solr.exception.IndexingException; 5 | 6 | /** 7 | * Deletes all records from the index 8 | * 9 | * @author bbpennel 10 | * 11 | */ 12 | public class ClearIndexAction extends AbstractIndexingAction { 13 | 14 | @Override 15 | public void performAction(SolrUpdateRequest updateRequest) throws IndexingException { 16 | solrUpdateDriver.deleteByQuery("*:*"); 17 | solrUpdateDriver.commit(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/action/CommitAction.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.action; 2 | 3 | import edu.unc.lib.boxc.indexing.solr.SolrUpdateRequest; 4 | import edu.unc.lib.boxc.indexing.solr.exception.IndexingException; 5 | 6 | /** 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public class CommitAction extends AbstractIndexingAction { 12 | 13 | @Override 14 | public void performAction(SolrUpdateRequest updateRequest) throws IndexingException { 15 | solrUpdateDriver.commit(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/action/DeleteObjectAction.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.action; 2 | 3 | import edu.unc.lib.boxc.indexing.solr.SolrUpdateRequest; 4 | import edu.unc.lib.boxc.indexing.solr.exception.IndexingException; 5 | 6 | /** 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public class DeleteObjectAction extends AbstractIndexingAction { 12 | 13 | @Override 14 | public void performAction(SolrUpdateRequest updateRequest) throws IndexingException { 15 | solrUpdateDriver.delete(updateRequest.getTargetID()); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/action/IndexingAction.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.action; 2 | 3 | import edu.unc.lib.boxc.indexing.solr.SolrUpdateRequest; 4 | import edu.unc.lib.boxc.indexing.solr.exception.IndexingException; 5 | 6 | /** 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public interface IndexingAction { 12 | /** 13 | * Performs an indexing action based on the update request received 14 | * 15 | * @param updateRequest 16 | * @throws IndexingException 17 | */ 18 | public void performAction(SolrUpdateRequest updateRequest) throws IndexingException; 19 | } 20 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/exception/IndexingException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.exception; 2 | 3 | /** 4 | * Exception while attempting to index to solr 5 | * 6 | * @author bbpennel 7 | */ 8 | public class IndexingException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | private String body; 11 | 12 | public IndexingException(String message, Throwable cause, String body) { 13 | super(message, cause); 14 | this.body = body; 15 | } 16 | 17 | public IndexingException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | public IndexingException(String message) { 22 | super(message); 23 | } 24 | 25 | public String getBody() { 26 | return body; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/exception/ObjectTombstonedException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.exception; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | * 7 | */ 8 | public class ObjectTombstonedException extends IndexingException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public ObjectTombstonedException(String message) { 12 | super(message); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/exception/OrphanedObjectException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.exception; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | * 7 | */ 8 | public class OrphanedObjectException extends IndexingException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public OrphanedObjectException(String message) { 12 | super(message); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/exception/RecoverableIndexingException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.exception; 2 | 3 | /** 4 | * Indexing exception which it may be possible to recover from 5 | * 6 | * @author bbpennel 7 | */ 8 | public class RecoverableIndexingException extends IndexingException { 9 | 10 | public RecoverableIndexingException(String message, Throwable cause, String body) { 11 | super(message, cause, body); 12 | } 13 | 14 | public RecoverableIndexingException(String message, Throwable cause) { 15 | super(message, cause); 16 | } 17 | 18 | public RecoverableIndexingException(String message) { 19 | super(message); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/filter/IndexDocumentFilter.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.filter; 2 | 3 | import edu.unc.lib.boxc.indexing.solr.exception.IndexingException; 4 | import edu.unc.lib.boxc.indexing.solr.indexing.DocumentIndexingPackage; 5 | 6 | /** 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public interface IndexDocumentFilter { 12 | public void filter(DocumentIndexingPackage dip) throws IndexingException; 13 | } 14 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/filter/collection/CollectionSupplementalInformationFilter.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.filter.collection; 2 | 3 | import edu.unc.lib.boxc.indexing.solr.filter.IndexDocumentFilter; 4 | import edu.unc.lib.boxc.indexing.solr.indexing.DocumentIndexingPackage; 5 | 6 | /** 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public abstract class CollectionSupplementalInformationFilter implements IndexDocumentFilter { 12 | public boolean isApplicable(DocumentIndexingPackage dip) { 13 | return false; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/indexing/DocumentFilteringPipeline.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.indexing; 2 | 3 | import java.util.List; 4 | 5 | import edu.unc.lib.boxc.indexing.solr.exception.IndexingException; 6 | import edu.unc.lib.boxc.indexing.solr.filter.IndexDocumentFilter; 7 | 8 | /** 9 | * Pipeline class which interates through a collection of filters to modify the 10 | * document indexing package submitted to the process method. 11 | * 12 | * @author bbpennel 13 | * 14 | */ 15 | public interface DocumentFilteringPipeline { 16 | 17 | /** 18 | * Performs a series of filters to the provided document indexing package. 19 | * 20 | * @param dip Indexing package being modified 21 | * @throws IndexingException 22 | */ 23 | public void process(DocumentIndexingPackage dip) throws IndexingException; 24 | 25 | public void setFilters(List filters); 26 | } 27 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/utils/Jp2Info.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.utils; 2 | 3 | /** 4 | * Info about Jp2 images 5 | * 6 | * @author bbpennel 7 | */ 8 | public class Jp2Info { 9 | private int width; 10 | private int height; 11 | 12 | public Jp2Info() { 13 | } 14 | 15 | public Jp2Info(int width, int height) { 16 | this.width = width; 17 | this.height = height; 18 | } 19 | 20 | /** 21 | * @return the Jp2's info formatted as an extent string, which is heightxwidth, or an empty string if no dimensions 22 | */ 23 | public String getExtent() { 24 | if (width == 0 || height == 0) { 25 | return ""; 26 | } 27 | return height + "x" + width; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/utils/Jp2InfoService.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.utils; 2 | 3 | import java.nio.file.Path; 4 | 5 | /** 6 | * A service which extracts information about JPEG 2000 images 7 | * 8 | * @author bbpennel 9 | */ 10 | public interface Jp2InfoService { 11 | /** 12 | * Gets dimension info about the provided jp2 file 13 | * @param path Path of the jp2 file 14 | * @return Jp2Info object populated with dimension details 15 | */ 16 | Jp2Info getDimensions(Path path); 17 | } 18 | -------------------------------------------------------------------------------- /indexing-solr/src/main/java/edu/unc/lib/boxc/indexing/solr/utils/NoOpJp2InfoService.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.indexing.solr.utils; 2 | 3 | import java.nio.file.Path; 4 | 5 | /** 6 | * Jp2InfoService for environments where no implementation is available for retrieving jp2 info 7 | * 8 | * @author bbpennel 9 | */ 10 | public class NoOpJp2InfoService implements Jp2InfoService { 11 | @Override 12 | public Jp2Info getDimensions(Path path) { 13 | return new Jp2Info(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /indexing-solr/src/main/resources/extensionMimetypeOverrides.properties: -------------------------------------------------------------------------------- 1 | css,text/plain=text/css 2 | csv,text/plain=text/csv 3 | json,text/plain=application/json 4 | ods,application/octet-stream=application/vnd.oasis.opendocument.spreadsheet 5 | rtf,text/plain=application/rtf -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/datastream/dateCaptured.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Paper title 5 | 6 | Dissertation 7 | 8 | Test resource 9 | 10 | 11 | 2006-03 12 | 13 | -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/datastream/dateCreatedYearIssue.xml: -------------------------------------------------------------------------------- 1 | 2 | 120 3 | 4 | Map of Hanover, Henrico, and and part of Chesterfield Counties, Virginia 5 | 6 | 7 | 1862 8 | 1862 9 | 10 | -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/datastream/dateIssued.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Paper title 5 | 6 | Dissertation 7 | 8 | Test resource 9 | 10 | 11 | 2006-05 12 | 13 | 14 | 2006-03 15 | 16 | -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/datastream/invalidLanguage.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Paper title 5 | 6 | Dissertation 7 | 8 | xyz 9 | 10 | -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/datastream/multipleCreators.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Paper title 5 | 6 | Dissertation 7 | 8 | Music 9 | Test, Creator1 10 | 11 | Creator 12 | 13 | 14 | 15 | Test, Creator2 16 | 17 | Creator 18 | 19 | 20 | -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/search.properties: -------------------------------------------------------------------------------- 1 | #Fields which are searchable via keyword searches 2 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX 3 | search.facet.fields=ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,SUBJECT,LANGUAGE,CREATOR_TYPE -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/server.properties: -------------------------------------------------------------------------------- 1 | # SERVER PROPERTIES CONFIGURATION 2 | 3 | # Fedora Commons Repository (https, localhost, 443, fedora, fedoraAdmin, ??) 4 | fedora.protocol=${fedoraProtocol} 5 | fedora.host=${fedoraHost} 6 | fedora.port=${fedoraPort} 7 | fedora.context=${fedoraContext} 8 | fedora.admin.username=${fedoraAdminUsername} 9 | fedora.admin.password=${fedoraAdminPassword} 10 | 11 | # SOLR Server (http, localhost, 80, solr) 12 | solr.protocol=${solrProtocol} 13 | solr.host=${solrHost} 14 | solr.port=${solrPort} 15 | solr.context=${solrContext} 16 | 17 | # Mulgara Triple Store (localhost, 8080, blank context) 18 | mulgara.protocol=${mulgaraProtocol} 19 | mulgara.host=${mulgaraHost} 20 | mulgara.port=${mulgaraPort} 21 | mulgara.context=${mulgaraContext} 22 | mulgara.model.uri=${mulgaraHost} -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/solr-ingest-context-unit.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/indexing-solr/src/test/resources/solr-ingest-context-unit.xml -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/solr-ingest.properties: -------------------------------------------------------------------------------- 1 | #add doc xslt location 2 | addDocXslName=generateAddDoc.xsl 3 | maxSolrIngestThreads=3 -------------------------------------------------------------------------------- /indexing-solr/src/test/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.core= 2 | solr.socketTimeout=10000 3 | solr.connectionTimeout=10000 4 | solr.defaultMaxConnectionsPerHost=100 5 | solr.maxConnections=100 6 | solr.maxRetries=3 -------------------------------------------------------------------------------- /integration/src/test/java/edu/unc/lib/boxc/integration/factories/FolderFactory.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.integration.factories; 2 | 3 | import edu.unc.lib.boxc.model.api.objects.CollectionObject; 4 | import edu.unc.lib.boxc.model.api.objects.FolderObject; 5 | 6 | import java.util.Map; 7 | 8 | /** 9 | * @author snluong 10 | */ 11 | public class FolderFactory extends ContentObjectFactory { 12 | public FolderObject createFolder(CollectionObject collection, Map options) throws Exception { 13 | var accessModel = getAccessModel(options); 14 | var folder = repositoryObjectFactory.createFolderObject(accessModel); 15 | collection.addMember(folder); 16 | prepareObject(folder, options); 17 | 18 | return folder; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /integration/src/test/resources/acl-config.properties: -------------------------------------------------------------------------------- 1 | cdr.acl.globalRoles.administrator=adminGroup 2 | 3 | cache.contentPath.maxSize=500 4 | cache.contentPath.timeToLive=5000 5 | 6 | cache.objectAcls.maxSize=100 7 | cache.objectAcls.timeToLive=5000 -------------------------------------------------------------------------------- /integration/src/test/resources/acl/config.properties: -------------------------------------------------------------------------------- 1 | cdr.acl.globalRoles.administrator=adminGroup 2 | cdr.acl.globalRoles.canDescribe=rdm 3 | cdr.acl.globalRoles.canAccess=auditors -------------------------------------------------------------------------------- /integration/src/test/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/integration/src/test/resources/application.properties -------------------------------------------------------------------------------- /integration/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /integration/src/test/resources/patronPrincipalConfig.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /integration/src/test/resources/search.properties: -------------------------------------------------------------------------------- 1 | search.results.defaultPerPage=20 2 | search.results.maxPerPage=500 3 | search.results.pagesToDisplay=10 4 | search.results.neighborItems=7 5 | search.results.maxBrowsePerPage=500 6 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX,IDENTIFIER\ 7 | ,RLA_SITE_CODE,RLA_CATALOG_NUMBER,RLA_CONTEXT_1 8 | #Set to one higher than you want to display as the last value indicates whether the UI should show a "show more" link 9 | search.facet.fields=ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,SUBJECT,GENRE,LANGUAGE,PARENT_COLLECTION,RESOURCE_TYPE,STATUS,CONTENT_STATUS,SCOPE,ROLE_GROUP 10 | search.facet.defaultSearch=PARENT_COLLECTION,ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,LANGUAGE,SUBJECT 11 | search.access.allowPatrons=true -------------------------------------------------------------------------------- /integration/src/test/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.core=access 2 | solr.socketTimeout=40000 3 | solr.connectionTimeout=20000 4 | solr.defaultMaxConnectionsPerHost=100 5 | solr.maxConnections=100 6 | solr.maxRetries=1 7 | #Dynamic fields 8 | solr.field.RLA_SITE_CODE=rla_site_code_d 9 | solr.field.RLA_CATALOG_NUMBER=rla_catalog_number_d 10 | solr.field.RLA_CONTEXT_1=rla_context_1_d -------------------------------------------------------------------------------- /it_config/allowed_external_paths.txt: -------------------------------------------------------------------------------- 1 | file:/tmp/boxc_test_storage/ 2 | -------------------------------------------------------------------------------- /it_config/fcrepo_logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | /config/logs/fedora.log 6 | true 7 | true 8 | 9 | %d %-5level [%thread] %logger{35} - %msg%n 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/StoragePolicy.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api; 2 | 3 | /** 4 | * Storage policy describing how a datastream should be stored and addressed. 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public enum StoragePolicy { 10 | INTERNAL("Stored within the repository's internally managed datastore."), 11 | PROXIED("Managed and served via the repository from an external URI."), 12 | EXTERNAL("Stored, addressed and managed outside of repository."), 13 | REDIRECTED("Tracked by repository, requests are redirected to an external URI."); 14 | 15 | private final String description; 16 | 17 | private StoragePolicy(String description) { 18 | this.description = description; 19 | } 20 | 21 | /** 22 | * @return description of the storage policy 23 | */ 24 | public String getDescription() { 25 | return description; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/StreamingConstants.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api; 2 | 3 | /** 4 | * Constants related to streaming media 5 | * 6 | * @author bbpennel 7 | */ 8 | public class StreamingConstants { 9 | private StreamingConstants() { 10 | } 11 | 12 | // If you change this value it also needs to be updated in static/js/admin/src/EditStreamingPropertiesForm.js 13 | public static final String STREAMREAPER_PREFIX_URL = "https://durastream.lib.unc.edu/player"; 14 | public static final String STREAMING_TYPE_SOUND = "sound"; 15 | public static final String STREAMING_TYPE_VIDEO = "video"; 16 | } 17 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/event/PremisLog.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.event; 2 | 3 | import org.apache.jena.rdf.model.Model; 4 | 5 | /** 6 | * A readable PREMIS log object 7 | * 8 | * @author bbpennel 9 | */ 10 | public interface PremisLog { 11 | /** 12 | * @return a model containing the events in this log. 13 | */ 14 | public Model getEventsModel(); 15 | } 16 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/FedoraException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * @author Gregory Jansen 5 | * 6 | */ 7 | public class FedoraException extends RuntimeException { 8 | 9 | private static final long serialVersionUID = 7276162681909269101L; 10 | 11 | public FedoraException(Throwable e) { 12 | super(e); 13 | } 14 | 15 | public FedoraException(String message, Throwable e) { 16 | super(message, e); 17 | } 18 | 19 | public FedoraException(String message) { 20 | super(message); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/InterruptedLockException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception indicating that a lock or acquisition of one was interrupted 5 | * 6 | * @author bbpennel 7 | */ 8 | public class InterruptedLockException extends RepositoryException { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | /** 13 | * @param message 14 | */ 15 | public InterruptedLockException(String message) { 16 | super(message); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/InvalidPidException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception indicating that the provided value was not a valid PID 5 | * 6 | * @author bbpennel 7 | */ 8 | public class InvalidPidException extends RepositoryException { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | public InvalidPidException(String message) { 13 | super(message); 14 | } 15 | 16 | public InvalidPidException(Throwable ex) { 17 | super(ex); 18 | } 19 | 20 | public InvalidPidException(String message, Throwable ex) { 21 | super(message, ex); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/InvalidRelationshipException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception thrown when the definition of a relationship does not match usage 5 | * or schema requirements, such as if the object or subject were of an invalid 6 | * type 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public class InvalidRelationshipException extends RuntimeException { 12 | 13 | private static final long serialVersionUID = 5027174492232921223L; 14 | 15 | public InvalidRelationshipException(String message) { 16 | super(message); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/NotFoundException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * 5 | * @author count0 6 | * 7 | */ 8 | public class NotFoundException extends FedoraException { 9 | 10 | /** 11 | * 12 | */ 13 | private static final long serialVersionUID = 4086598984144235534L; 14 | 15 | public NotFoundException(Exception e) { 16 | super(e); 17 | } 18 | 19 | public NotFoundException(String message) { 20 | super(message); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/ObjectExistsException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * @author Gregory Jansen 5 | * 6 | */ 7 | public class ObjectExistsException extends FedoraException { 8 | /** 9 | * 10 | */ 11 | private static final long serialVersionUID = 2177327948413175683L; 12 | 13 | public ObjectExistsException(String message) { 14 | super(message); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/ObjectHierarchyException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception indicating that an invalid membership hierarchy was encountered 5 | * 6 | * @author bbpennel 7 | */ 8 | public class ObjectHierarchyException extends RepositoryException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public ObjectHierarchyException(String message) { 12 | super(message); 13 | } 14 | 15 | public ObjectHierarchyException(Throwable ex) { 16 | super(ex); 17 | } 18 | 19 | public ObjectHierarchyException(String message, Throwable ex) { 20 | super(message, ex); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/ObjectPersistenceException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception thrown when persisting an object or its content fails, either in 5 | * the repository or locally. 6 | * 7 | * @author bbpennel 8 | * 9 | */ 10 | public class ObjectPersistenceException extends RuntimeException { 11 | 12 | private static final long serialVersionUID = 3956045265306679210L; 13 | 14 | public ObjectPersistenceException(String message, Throwable e) { 15 | super(message, e); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/ObjectTypeMismatchException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception which indicates that a repository object did not match the expected RDF types 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public class ObjectTypeMismatchException extends FedoraException { 10 | 11 | private static final long serialVersionUID = -1660852243627715050L; 12 | 13 | public ObjectTypeMismatchException(Exception e) { 14 | super(e); 15 | } 16 | 17 | public ObjectTypeMismatchException(String value) { 18 | super(value); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/OrphanedObjectException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception thrown when an object is not part of the membership hierarchy of the repository. 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public class OrphanedObjectException extends RepositoryException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public OrphanedObjectException(String message) { 13 | super(message); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/RepositoryException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * General exception related to the state of the box-c repository 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public class RepositoryException extends RuntimeException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | public RepositoryException(String message) { 13 | super(message); 14 | } 15 | 16 | public RepositoryException(Throwable ex) { 17 | super(ex); 18 | } 19 | 20 | public RepositoryException(String message, Throwable ex) { 21 | super(message, ex); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/exceptions/TombstoneFoundException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.exceptions; 2 | 3 | /** 4 | * Exception indicating that the requested resource has been destroyed and replaced by a tombstone object 5 | * 6 | * @author bbpennel 7 | */ 8 | public class TombstoneFoundException extends RepositoryException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public TombstoneFoundException(String message) { 12 | super(message); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/ids/ContentPathConstants.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.ids; 2 | 3 | /** 4 | * Constants related to Content paths 5 | * 6 | * @author bbpennel 7 | */ 8 | public class ContentPathConstants { 9 | private ContentPathConstants() { 10 | } 11 | 12 | // Content path depth where collection objects are located 13 | public static final int COLLECTION_DEPTH = 2; 14 | 15 | // Content path depth where unit objects are located 16 | public static final int UNIT_DEPTH = 1; 17 | } 18 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/ids/PIDConstants.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.ids; 2 | 3 | /** 4 | * Constants used by PID objects 5 | * 6 | * @author bbpennel 7 | */ 8 | public class PIDConstants { 9 | 10 | private PIDConstants() { 11 | } 12 | 13 | // PID Qualifiers for major categories of objects 14 | public static final String CONTENT_QUALIFIER = "content"; 15 | 16 | public static final String DEPOSITS_QUALIFIER = "deposits"; 17 | 18 | public static final String AGENTS_QUALIFIER = "agents"; 19 | } 20 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/ids/PIDMinter.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.ids; 2 | 3 | /** 4 | * @author bbpennel 5 | */ 6 | public interface PIDMinter { 7 | 8 | /** 9 | * Mint a PID for a new deposit record object 10 | * 11 | * @return PID in the deposit record path 12 | */ 13 | PID mintDepositRecordPid(); 14 | 15 | /** 16 | * Mint a PID for a new content object 17 | * 18 | * @return PID in the content path 19 | */ 20 | PID mintContentPid(); 21 | 22 | /** 23 | * Mints a URL for a new event object belonging to the provided parent object 24 | * 25 | * @param parentPid The object which this event will belong to. 26 | * @return 27 | */ 28 | PID mintPremisEventPid(PID parentPid); 29 | 30 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/objects/AdminUnit.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.objects; 2 | 3 | /** 4 | * An Administrative Unit content object 5 | * @author bbpennel 6 | */ 7 | public interface AdminUnit extends ContentContainerObject { 8 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/objects/CollectionObject.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.objects; 2 | 3 | /** 4 | * Represents a collection within the repository. This is a second-level container to which 5 | * folders and works can be added. 6 | * @author bbpennel 7 | */ 8 | public interface CollectionObject extends ContentContainerObject { 9 | 10 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/objects/ContentRootObject.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.objects; 2 | 3 | /** 4 | * A repository object which represents the root of the content tree. Can only 5 | * contain AdminUnit objects as direct children. 6 | * @author bbpennel 7 | */ 8 | public interface ContentRootObject extends ContentContainerObject { 9 | 10 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/objects/RepositoryObjectLoader.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.objects; 2 | 3 | import edu.unc.lib.boxc.model.api.ids.PID; 4 | 5 | /** 6 | * @author bbpennel 7 | */ 8 | public interface RepositoryObjectLoader { 9 | 10 | AdminUnit getAdminUnit(PID pid); 11 | 12 | CollectionObject getCollectionObject(PID pid); 13 | 14 | ContentRootObject getContentRootObject(PID pid); 15 | 16 | FolderObject getFolderObject(PID pid); 17 | 18 | WorkObject getWorkObject(PID pid); 19 | 20 | FileObject getFileObject(PID pid); 21 | 22 | BinaryObject getBinaryObject(PID pid); 23 | 24 | DepositRecord getDepositRecord(PID pid); 25 | 26 | Tombstone getTombstone(PID pid); 27 | 28 | RepositoryObject getRepositoryObject(PID pid); 29 | 30 | /** 31 | * Clear any cache entry for the provided pid 32 | * @param pid 33 | */ 34 | void invalidate(PID pid); 35 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/objects/Tombstone.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.objects; 2 | 3 | /** 4 | * A tombstone for a content object within the repository 5 | * @author bbpennel 6 | */ 7 | public interface Tombstone extends ContentObject { 8 | 9 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/rdf/Prov.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.rdf; 2 | 3 | import static org.apache.jena.rdf.model.ResourceFactory.createProperty; 4 | 5 | import org.apache.jena.rdf.model.Property; 6 | 7 | /** 8 | * PROV namespace properties 9 | * 10 | * @author bbpennel 11 | */ 12 | public class Prov { 13 | private Prov() { 14 | } 15 | 16 | public static final String NS = "http://w3.org/ns/prov#"; 17 | 18 | /** The namespace of the vocabulary as a string 19 | * @see #NS */ 20 | public static String getURI() { 21 | return NS; 22 | } 23 | 24 | public static final Property generated = createProperty(NS + "generated"); 25 | public static final Property used = createProperty(NS + "used"); 26 | } 27 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/services/ContentPathFactory.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.services; 2 | 3 | import java.util.List; 4 | 5 | import edu.unc.lib.boxc.model.api.ids.PID; 6 | 7 | /** 8 | * Factory for retrieving path information for content objects 9 | * @author bbpennel 10 | */ 11 | public interface ContentPathFactory { 12 | 13 | /** 14 | * Returns the list of PIDs for content objects which are parents of the provided 15 | * PID, ordered from the base of the hierarchy to the immediate parent of the PID. 16 | * 17 | * @param pid 18 | * @return 19 | */ 20 | List getAncestorPids(PID pid); 21 | 22 | /** 23 | * Invalidates cached data for the provided pid 24 | * @param pid 25 | */ 26 | void invalidate(PID pid); 27 | } -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/services/MembershipService.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.services; 2 | 3 | import edu.unc.lib.boxc.model.api.ids.PID; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Service for accessing repository object member information 9 | * 10 | * @author bbpennel 11 | */ 12 | public interface MembershipService { 13 | /** 14 | * List the members of the specified object 15 | * @param parentPid 16 | * @return List of member PIDs 17 | */ 18 | List listMembers(PID parentPid); 19 | } 20 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/sparql/SparqlQueryService.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.sparql; 2 | 3 | import org.apache.jena.query.QueryExecution; 4 | 5 | /** 6 | * Execute Sparql query 7 | * @author bbpennel 8 | * 9 | */ 10 | public interface SparqlQueryService { 11 | 12 | public QueryExecution executeQuery(String queryString); 13 | } 14 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/sparql/SparqlUpdateService.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.sparql; 2 | 3 | /** 4 | * Service for executing sparql update queries. 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public interface SparqlUpdateService { 10 | 11 | /** 12 | * Execute the provided sparql update query against the resource identified 13 | * by uri 14 | * 15 | * @param uri 16 | * @param updateString 17 | */ 18 | public void executeUpdate(String uri, String updateString); 19 | 20 | public void executeUpdate(String updateString); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /model-api/src/main/java/edu/unc/lib/boxc/model/api/xml/DescriptionConstants.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.model.api.xml; 2 | 3 | /** 4 | * Constants used in description records 5 | * @author bbpennel 6 | */ 7 | public class DescriptionConstants { 8 | public static final String COLLECTION_NUMBER_EL = "identifier"; 9 | public static final String COLLECTION_NUMBER_TYPE = "local"; 10 | public static final String COLLECTION_NUMBER_LABEL = "Collection Number"; 11 | 12 | private DescriptionConstants() { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/indexing/IndexingPriority.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.operations.jms.indexing; 2 | 3 | /** 4 | * Indexing priority flag values 5 | * 6 | * @author bbpennel 7 | */ 8 | public enum IndexingPriority { 9 | low, normal, high; 10 | } 11 | -------------------------------------------------------------------------------- /operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/order/OrderOperationType.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.operations.jms.order; 2 | 3 | /** 4 | * Enumeration of member ordering operation types 5 | * 6 | * @author bbpennel 7 | */ 8 | public enum OrderOperationType { 9 | SET, CLEAR, REMOVE_FROM, ADD_TO; 10 | } 11 | -------------------------------------------------------------------------------- /operations-jms/src/main/java/edu/unc/lib/boxc/operations/jms/order/OrderRequest.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.operations.jms.order; 2 | 3 | import edu.unc.lib.boxc.model.api.ids.PID; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Request to perform an ordering operation 9 | * 10 | * @author bbpennel 11 | */ 12 | public interface OrderRequest { 13 | /** 14 | * @return the operation type for this request 15 | */ 16 | public OrderOperationType getOperation(); 17 | 18 | /** 19 | * @return parent of the objects being ordered 20 | */ 21 | public PID getParentPid(); 22 | 23 | /** 24 | * @return list of ordered children 25 | */ 26 | public List getOrderedChildren(); 27 | } 28 | -------------------------------------------------------------------------------- /operations/src/main/java/edu/unc/lib/boxc/operations/api/exceptions/StateUnmodifiedException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.operations.api.exceptions; 2 | 3 | /** 4 | * Exception thrown when an operation is skipped due to the incoming state being the same as the existing state. 5 | * 6 | * @author bbpennel 7 | */ 8 | public class StateUnmodifiedException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public StateUnmodifiedException(String message) { 12 | super(message); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /operations/src/main/java/edu/unc/lib/boxc/operations/api/order/OrderValidator.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.operations.api.order; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Validator for a order request object 7 | * @author bbpennel 8 | */ 9 | public interface OrderValidator { 10 | /** 11 | * Get whether an order request was valid or not 12 | * @return true if the order request was valid 13 | */ 14 | boolean isValid(); 15 | 16 | /** 17 | * Get the list of validation errors 18 | * @return List of validation errors, or an empty list if there were no errors 19 | */ 20 | List getErrors(); 21 | } 22 | -------------------------------------------------------------------------------- /operations/src/main/resources/edu/unc/lib/boxc/operations/impl/validation/tgm2.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/operations/src/main/resources/edu/unc/lib/boxc/operations/impl/validation/tgm2.xml -------------------------------------------------------------------------------- /operations/src/test/resources/acl-config.properties: -------------------------------------------------------------------------------- 1 | cdr.acl.globalRoles.administrator=adminGroup 2 | 3 | cache.contentPath.maxSize=500 4 | cache.contentPath.timeToLive=5000 5 | 6 | cache.objectAcls.maxSize=100 7 | cache.objectAcls.timeToLive=5000 -------------------------------------------------------------------------------- /operations/src/test/resources/jsonVocab.json: -------------------------------------------------------------------------------- 1 | ["Creator", "Multi-institutional User", "ERES", "Granular Microscopy", "Reticulated Spline", "Resource"] -------------------------------------------------------------------------------- /operations/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /operations/src/test/resources/samples/1471-2458-11-702.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/operations/src/test/resources/samples/1471-2458-11-702.zip -------------------------------------------------------------------------------- /operations/src/test/resources/samples/modsNormalized.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SCHOLARLY COMMUNICATIONS CONVOCATION 4 | Final Report 5 | The 6 | 7 | presentation slides 8 | 9 | Director, Wilson Institute 10 | Wilson, Charlie 11 | 12 | contributor 13 | 14 | 15 | 16 | 20070619 17 | 20070510 18 | 19 | 20 | eng 21 | 22 | 23 | scholarly communications 24 | 25 | -------------------------------------------------------------------------------- /operations/src/test/resources/vocabTest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | Creator 6 | Advisor 7 | Reticulated Spline 8 | 9 | Wright, Will 10 | 11 | 12 | 13 | Designated Destroyer 14 | 15 | Bowsers 16 | 17 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/exceptions/InvalidChecksumException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.RepositoryException; 4 | 5 | /** 6 | * Exception indicating that a checksum did not match the expected value 7 | * 8 | * @author bbpennel 9 | */ 10 | public class InvalidChecksumException extends RepositoryException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 14 | * @param message 15 | */ 16 | public InvalidChecksumException(String message) { 17 | super(message); 18 | } 19 | 20 | /** 21 | * @param ex 22 | */ 23 | public InvalidChecksumException(Throwable ex) { 24 | super(ex); 25 | } 26 | 27 | /** 28 | * @param message 29 | * @param ex 30 | */ 31 | public InvalidChecksumException(String message, Throwable ex) { 32 | super(message, ex); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/exceptions/InvalidIngestSourceCandidateException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.RepositoryException; 4 | 5 | /** 6 | * @author bbpennel 7 | * 8 | */ 9 | public class InvalidIngestSourceCandidateException extends RepositoryException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | /** 13 | * @param message 14 | */ 15 | public InvalidIngestSourceCandidateException(String message) { 16 | super(message); 17 | } 18 | 19 | public InvalidIngestSourceCandidateException(String message, Throwable ex) { 20 | super(message, ex); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/exceptions/UnknownIngestSourceException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.RepositoryException; 4 | 5 | /** 6 | * @author bbpennel 7 | * 8 | */ 9 | public class UnknownIngestSourceException extends RepositoryException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | /** 13 | * @param message 14 | */ 15 | public UnknownIngestSourceException(String message) { 16 | super(message); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/exceptions/UnsupportedPackagingTypeException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.exceptions; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.RepositoryException; 4 | 5 | /** 6 | * Exception indicating that an unsupport packaging type was submitted for deposit 7 | * 8 | * @author bbpennel 9 | * 10 | */ 11 | public class UnsupportedPackagingTypeException extends RepositoryException { 12 | private static final long serialVersionUID = 1L; 13 | 14 | public UnsupportedPackagingTypeException(String msg) { 15 | super(msg); 16 | } 17 | 18 | public UnsupportedPackagingTypeException(String msg, Throwable e) { 19 | super(msg, e); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/storage/BinaryDetails.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.storage; 2 | 3 | import java.net.URI; 4 | import java.util.Date; 5 | 6 | /** 7 | * Details of a binary file 8 | * 9 | * @author bbpennel 10 | */ 11 | public interface BinaryDetails { 12 | 13 | /** 14 | * @return the URI of the stored binary 15 | */ 16 | URI getDestinationUri(); 17 | 18 | /** 19 | * @return last modified timestamp of the binary 20 | */ 21 | Date getLastModified(); 22 | 23 | /** 24 | * @return file size of the binary 25 | */ 26 | long getSize(); 27 | 28 | /** 29 | * @return the digest for the binary 30 | */ 31 | String getDigest(); 32 | } 33 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/storage/StorageType.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.storage; 2 | 3 | /** 4 | * @author bbpennel 5 | * 6 | */ 7 | public enum StorageType { 8 | FILESYSTEM("filesystem"), 9 | POSIX_FS("posix"); 10 | 11 | private final String id; 12 | 13 | private StorageType(String id) { 14 | this.id = id; 15 | } 16 | 17 | /** 18 | * @return the id 19 | */ 20 | public String getId() { 21 | return id; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/storage/UnknownStorageLocationException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.storage; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.RepositoryException; 4 | 5 | /** 6 | * @author bbpennel 7 | * 8 | */ 9 | public class UnknownStorageLocationException extends RepositoryException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | /** 13 | * @param message 14 | */ 15 | public UnknownStorageLocationException(String message) { 16 | super(message); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/transfer/BinaryAlreadyExistsException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.transfer; 2 | 3 | /** 4 | * @author bbpennel 5 | * 6 | */ 7 | public class BinaryAlreadyExistsException extends BinaryTransferException { 8 | private static final long serialVersionUID = 1L; 9 | 10 | /** 11 | * @param message 12 | */ 13 | public BinaryAlreadyExistsException(String message) { 14 | super(message); 15 | } 16 | 17 | /** 18 | * @param message 19 | * @param ex 20 | */ 21 | public BinaryAlreadyExistsException(String message, Throwable ex) { 22 | super(message, ex); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/transfer/BinaryTransferException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.transfer; 2 | 3 | import edu.unc.lib.boxc.model.api.exceptions.RepositoryException; 4 | 5 | /** 6 | * @author bbpennel 7 | * 8 | */ 9 | public class BinaryTransferException extends RepositoryException { 10 | 11 | private static final long serialVersionUID = 1L; 12 | 13 | /** 14 | * @param message 15 | */ 16 | public BinaryTransferException(String message) { 17 | super(message); 18 | } 19 | 20 | /** 21 | * @param message 22 | * @param ex 23 | */ 24 | public BinaryTransferException(String message, Throwable ex) { 25 | super(message, ex); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /persistence-api/src/main/java/edu/unc/lib/boxc/persist/api/transfer/BinaryTransferOutcome.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.persist.api.transfer; 2 | 3 | import java.net.URI; 4 | 5 | import edu.unc.lib.boxc.model.api.ids.PID; 6 | 7 | /** 8 | * Information describing the outcome of a binary transfer operation 9 | * 10 | * @author bbpennel 11 | */ 12 | public interface BinaryTransferOutcome { 13 | 14 | /** 15 | * @return PID of the binary object the transferred file was associated with. 16 | */ 17 | PID getBinaryPid(); 18 | 19 | /** 20 | * @return URI where the binary is stored after the transfer 21 | */ 22 | URI getDestinationUri(); 23 | 24 | /** 25 | * @return ID of the storage location where the binary was transferred to 26 | */ 27 | String getDestinationId(); 28 | 29 | /** 30 | * @return SHA1 calculated of the binary during transfer 31 | */ 32 | String getSha1(); 33 | } 34 | -------------------------------------------------------------------------------- /persistence/src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /persistence/src/main/resources/edu/unc/lib/dl/services/IngestSuccessText.ftl: -------------------------------------------------------------------------------- 1 | <#if 1 < numberOfObjects> 2 | ${numberOfObjects} items were successfully ingested into the repository in <#if 1 < tops?size>these locations<#else>this location: 3 | <#else> 4 | Your item was successfully ingested into the repository in this location: 5 | 6 | <#list tops as obj> 7 | ${obj.label!"No label set!"} - ${irBaseUrl}record?id=${obj.pid} 8 | 9 | 10 | Thank you for contributing to the Digital Collections Repository, a service of the University of North Carolina at Chapel Hill Libraries. 11 | 12 | Digital Collections Repository: ${irBaseUrl} 13 | UNC Chapel Hill Libraries: http://www.lib.unc.edu/ -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/bag-info.txt: -------------------------------------------------------------------------------- 1 | Payload-Oxum: 15.3 2 | Bagging-Date: 2015-10-23 3 | Bag-Size: 0.1 KB 4 | -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/bagit.txt: -------------------------------------------------------------------------------- 1 | BagIt-Version: 0.96 2 | Tag-File-Character-Encoding: UTF-8 3 | -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/data/test1.txt: -------------------------------------------------------------------------------- 1 | Test1 -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/data/test2.txt: -------------------------------------------------------------------------------- 1 | Test2 -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/data/test3.txt: -------------------------------------------------------------------------------- 1 | Test3 -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/manifest-md5.txt: -------------------------------------------------------------------------------- 1 | e1b849f9631ffc1829b2e31402373e3c data/test1.txt 2 | c454552d52d55d3ef56408742887362b data/test2.txt 3 | b3f66ec1535de7702c38e94408fa4a17 data/test3.txt 4 | -------------------------------------------------------------------------------- /persistence/src/test/resources/ingestSources/bag_with_files/tagmanifest-md5.txt: -------------------------------------------------------------------------------- 1 | ace0ef9419c8edbe164a888d4e4ab7ee bagit.txt 2 | 5f280303ce6dcd25bd913f0d90a55f37 bag-info.txt 3 | 240930276e8e9fb9b159c5d006d8b1ba manifest-md5.txt 4 | -------------------------------------------------------------------------------- /persistence/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/exceptions/InvalidFacetException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.exceptions; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | * 7 | */ 8 | public class InvalidFacetException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public InvalidFacetException(String msg, Exception e) { 12 | super(msg + "\n" + e.getMessage()); 13 | this.setStackTrace(e.getStackTrace()); 14 | } 15 | 16 | public InvalidFacetException(String msg) { 17 | super(msg); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/exceptions/InvalidHierarchicalFacetException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.exceptions; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | * 7 | */ 8 | public class InvalidHierarchicalFacetException extends InvalidFacetException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public InvalidHierarchicalFacetException(String msg, Exception e) { 12 | super(msg); 13 | this.setStackTrace(e.getStackTrace()); 14 | } 15 | 16 | public InvalidHierarchicalFacetException(String msg) { 17 | super(msg); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/exceptions/SolrRuntimeException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.exceptions; 2 | 3 | /** 4 | * Runtime exception originating from a solr interaction 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public class SolrRuntimeException extends RuntimeException { 10 | private static final long serialVersionUID = 5827878385587178461L; 11 | 12 | public SolrRuntimeException() { 13 | } 14 | 15 | public SolrRuntimeException(String message) { 16 | super(message); 17 | } 18 | 19 | public SolrRuntimeException(Throwable cause) { 20 | super(cause); 21 | } 22 | 23 | public SolrRuntimeException(String message, Throwable cause) { 24 | super(message, cause); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/facets/CutoffFacetNode.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.facets; 2 | 3 | /** 4 | * Node within a hierarchical facet which supports cut off operations 5 | * @author bbpennel 6 | */ 7 | public interface CutoffFacetNode extends HierarchicalFacetNode { 8 | /** 9 | * @return the tier this node occupies within the hierarchy of the facet 10 | */ 11 | Integer getTier(); 12 | 13 | } -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/filters/QueryFilter.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.filters; 2 | 3 | import edu.unc.lib.boxc.search.api.SearchFieldKey; 4 | 5 | /** 6 | * A filter used to adjust the results of a query 7 | * 8 | * @author bbpennel 9 | */ 10 | public interface QueryFilter { 11 | /** 12 | * @return this filter represented as a query string 13 | */ 14 | public String toFilterString(); 15 | 16 | /** 17 | * @return SearchFieldKey for the field to apply the filter to 18 | */ 19 | public SearchFieldKey getFieldKey(); 20 | } 21 | -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/models/GroupedContentObjectRecord.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.models; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Record containing aggregated content object records 7 | * 8 | * @author bbpennel 9 | */ 10 | public interface GroupedContentObjectRecord extends ContentObjectRecord { 11 | 12 | /** 13 | * @return ContentObjectRecord to be used as the representative record in place of the aggregate 14 | */ 15 | ContentObjectRecord getRepresentative(); 16 | 17 | /** 18 | * @return All items contained in this grouping 19 | */ 20 | List getItems(); 21 | 22 | /** 23 | * @return Total count of items in this grouping, whether or not they were retrieved 24 | */ 25 | Long getItemCount(); 26 | 27 | /** 28 | * @return identifier for this group 29 | */ 30 | String getGroupId(); 31 | } -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/ranges/RangeValue.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.ranges; 2 | 3 | /** 4 | * Object which identifies a range of values for retrieval 5 | * 6 | * @author bbpennel 7 | */ 8 | public interface RangeValue { 9 | /** 10 | * @return the value of this range represented as a String parameter 11 | */ 12 | public String getParameterValue(); 13 | 14 | public RangeValue clone(); 15 | } 16 | -------------------------------------------------------------------------------- /search-api/src/main/java/edu/unc/lib/boxc/search/api/requests/IdListRequest.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.api.requests; 2 | 3 | import java.util.List; 4 | 5 | import edu.unc.lib.boxc.auth.api.models.AccessGroupSet; 6 | import edu.unc.lib.boxc.model.api.ids.PID; 7 | 8 | /** 9 | * Request object for a a list of IDs 10 | * 11 | * @author bbpennel 12 | * 13 | */ 14 | public class IdListRequest extends SimpleIdRequest { 15 | private List ids; 16 | 17 | public IdListRequest(List ids, List resultFields, AccessGroupSet accessGroups) { 18 | super((PID) null, resultFields, accessGroups); 19 | this.ids = ids; 20 | } 21 | 22 | public List getIds() { 23 | return ids; 24 | } 25 | 26 | public void setIds(List ids) { 27 | this.ids = ids; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /search-solr/src/main/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /search-solr/src/main/java/edu/unc/lib/boxc/search/solr/filters/HasPopulatedFieldFilter.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.solr.filters; 2 | 3 | import edu.unc.lib.boxc.search.api.SearchFieldKey; 4 | import edu.unc.lib.boxc.search.api.filters.QueryFilter; 5 | 6 | /** 7 | * Filter which restricts results to entries which contain populated values for the given search key 8 | * 9 | * @author lfarrell 10 | */ 11 | public class HasPopulatedFieldFilter implements QueryFilter { 12 | private final SearchFieldKey fieldKey; 13 | 14 | protected HasPopulatedFieldFilter(SearchFieldKey fieldKey) { 15 | this.fieldKey = fieldKey; 16 | } 17 | 18 | @Override 19 | public String toFilterString() { 20 | return getFieldKey().getSolrField() + ":*"; 21 | } 22 | 23 | @Override 24 | public SearchFieldKey getFieldKey() { 25 | return fieldKey; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /search-solr/src/main/java/edu/unc/lib/boxc/search/solr/ranges/UnknownRange.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.search.solr.ranges; 2 | 3 | import edu.unc.lib.boxc.search.api.ranges.RangeValue; 4 | 5 | /** 6 | * A range for entries which do not have a value assigned 7 | * 8 | * @author bbpennel 9 | */ 10 | public class UnknownRange implements RangeValue { 11 | public final static String UNKNOWN_VALUE = "unknown"; 12 | 13 | public UnknownRange() { 14 | } 15 | 16 | @Override 17 | public String getParameterValue() { 18 | return UNKNOWN_VALUE; 19 | } 20 | 21 | @Override 22 | public RangeValue clone() { 23 | return new UnknownRange(); 24 | } 25 | 26 | /** 27 | * @param value 28 | * @return true if the range value is unknown 29 | */ 30 | public static boolean isUnknown(String value) { 31 | return UNKNOWN_VALUE.equals(value); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /search-solr/src/test/java/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /search-solr/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /search-solr/src/test/resources/search.properties: -------------------------------------------------------------------------------- 1 | search.results.defaultPerPage=500 2 | search.results.maxPerPage=10000 3 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX 4 | search.facet.fields=ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,SUBJECT,GENRE,LANGUAGE,PARENT_COLLECTION,PARENT_UNIT,RESOURCE_TYPE,STATUS,ROLE_GROUP 5 | search.access.allowPatrons=true -------------------------------------------------------------------------------- /search-solr/src/test/resources/server.properties: -------------------------------------------------------------------------------- 1 | # SOLR Server (http, localhost, :80, solr) 2 | solr.protocol=${solrProtocol} 3 | solr.host=${solrHost} 4 | solr.port=${solrPort} 5 | solr.context=${solrContext} -------------------------------------------------------------------------------- /search-solr/src/test/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.core=access 2 | solr.socketTimeout=5000 3 | solr.connectionTimeout=5000 4 | solr.defaultMaxConnectionsPerHost=100 5 | solr.maxConnections=100 6 | solr.maxRetries=1 -------------------------------------------------------------------------------- /services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/AddFailedRouteProcessor.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.services.camel; 2 | 3 | import org.apache.camel.Exchange; 4 | import org.apache.camel.Processor; 5 | 6 | /** 7 | * Processor which adds info about what route failed to an exchange 8 | * 9 | * @author bbpennel 10 | */ 11 | public class AddFailedRouteProcessor implements Processor { 12 | 13 | @Override 14 | public void process(Exchange exchange) throws Exception { 15 | String originalEndpoint = exchange.getFromEndpoint().getEndpointUri(); 16 | exchange.getIn().setHeader(Exchange.FAILURE_ROUTE_ID, originalEndpoint); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /services-camel-app/src/main/java/edu/unc/lib/boxc/services/camel/util/EventTypes.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.services.camel.util; 2 | 3 | /** 4 | * Constants related to Fedora JMS event types 5 | * 6 | * @author bbpennel 7 | * 8 | */ 9 | public class EventTypes { 10 | 11 | private EventTypes() { 12 | } 13 | 14 | public final static String EVENT_CREATE = "https://www.w3.org/ns/activitystreams#Create"; 15 | public final static String EVENT_DELETE = "https://www.w3.org/ns/activitystreams#Delete"; 16 | public final static String EVENT_UPDATE = "https://www.w3.org/ns/activitystreams#Update"; 17 | public final static String EVENT_MOVE = "https://www.w3.org/ns/activitystreams#Move"; 18 | public final static String EVENT_FOLLOW = "https://www.w3.org/ns/activitystreams#Follow"; 19 | } 20 | -------------------------------------------------------------------------------- /services-camel-app/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %d %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /services-camel-app/src/main/resources/search.properties: -------------------------------------------------------------------------------- 1 | search.results.defaultPerPage=20 2 | search.results.maxPerPage=500 3 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX,IDENTIFIER\ 4 | ,RLA_SITE_CODE,RLA_CATALOG_NUMBER,RLA_CONTEXT_1 5 | search.facet.fields=ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,SUBJECT,GENRE,LANGUAGE,PARENT_COLLECTION,RESOURCE_TYPE,STATUS,CONTENT_STATUS,ROLE_GROUP -------------------------------------------------------------------------------- /services-camel-app/src/main/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.core=access 2 | solr.socketTimeout=40000 3 | solr.connectionTimeout=20000 4 | solr.defaultMaxConnectionsPerHost=100 5 | solr.maxConnections=100 6 | solr.maxRetries=1 7 | #Dynamic fields 8 | solr.field.RLA_SITE_CODE=rla_site_code_d 9 | solr.field.RLA_CATALOG_NUMBER=rla_catalog_number_d 10 | solr.field.RLA_CONTEXT_1=rla_context_1_d -------------------------------------------------------------------------------- /services-camel-app/src/main/resources/update-failed-html.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 |

DCR metadata update failed validation: {{fileName}}

10 | 11 |
12 | {{#problems}} 13 |
{{key}}
14 |
{{value}}
15 | {{/problems}} 16 |
17 | 18 | -------------------------------------------------------------------------------- /services-camel-app/src/main/webapp/WEB-INF/rest-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/services-camel-app/src/test/resources/application.properties -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/boxy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/services-camel-app/src/test/resources/boxy.pdf -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/datastreams/invalid.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/services-camel-app/src/test/resources/datastreams/invalid.pdf -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/datastreams/modsWithRla.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | RLA Item 5 | 6 | 7 | BoXC 5 8 | 9 | 10 | Boxc Ferry 11 | 12 | DBoxc 13 | DBoxc.jpg 14 | 12345 15 | -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/datastreams/simpleMods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Object title 5 | 6 | 7 | Boxy 8 | 9 | Creator 10 | 11 | 12 | -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/destroy-derivatives-router-it-config.properties: -------------------------------------------------------------------------------- 1 | error.retryDelay=0 2 | # In the event of failure, the maximum number of times a redelivery will be attempted. 3 | error.maxRedeliveries=2 4 | error.backOffMultiplier=1 5 | 6 | cdr.stream=activemq:queue:repository.events 7 | cdr.stream.camel=activemq://activemq:queue:repository.events 8 | 9 | cdr.destroy.derivatives.stream=activemq:queue:repository.destroy.derivatives 10 | cdr.destroy.derivatives.stream.camel=activemq://activemq:queue:repository.destroy.derivatives -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/longleaf-router-config.properties: -------------------------------------------------------------------------------- 1 | longleaf.register.dest=direct:register.longleaf 2 | longleaf.register.consumer=direct:register.longleaf.consumer 3 | longleaf.register.batch.consumer=direct:register.batch.longleaf 4 | 5 | longleaf.deregister.dest=direct:deregister.longleaf 6 | longleaf.deregister.consumer=direct:deregister.longleaf.consumer 7 | longleaf.deregister.batch.consumer=direct:deregister.batch.longleaf 8 | 9 | longleaf.filter.deregister=direct:filter.longleaf.deregister 10 | 11 | longleaf.dlq.dest=mock:direct:longleaf.dlq 12 | 13 | longleaf.maxRedelivieries=2 14 | longleaf.redeliveryDelay=1 15 | longleaf.batchSize=1 16 | longleaf.batchTimeout=100 -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/patron-access-test-config.properties: -------------------------------------------------------------------------------- 1 | cdr.patron.access.assignment.stream=activemq:queue:repository.patronAccess 2 | cdr.patron.access.assignment.stream.camel=activemq://activemq:queue:repository.patronAccess -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/solr-update-config.properties: -------------------------------------------------------------------------------- 1 | error.maxRedeliveries=1 2 | error.retryDelay=1000 3 | error.backOffMultiplier=1 4 | 5 | cdr.enhancement.solr.error.maxRedeliveries=1 6 | cdr.enhancement.solr.error.retryDelay=10 7 | cdr.enhancement.solr.error.backOffMultiplier=1.2 8 | 9 | cdr.solrupdate.stream=direct:start 10 | cdr.solrupdate.stream.camel=direct:start 11 | 12 | cdr.solrupdate.large.camel=direct:solr.update.large 13 | cdr.solrupdate.priority.low.camel=direct:solr.update.priority.low 14 | cdr.solrupdate.workObject.fileUpdated.individual=direct:solr.update.workObject.fileUpdated 15 | cdr.solrupdate.workObject.fileUpdated.individual.camel=direct:solr.update.workObject.fileUpdated 16 | cdr.solrupdate.workObject.fileUpdated.batch.camel=direct:solr.update.workObject.fileUpdated.batch 17 | cdr.solrupdate.workObject.fileUpdated.batchSize=4 18 | cdr.solrupdate.workObject.fileUpdated.batchTimeout=200 -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/thumbnails-config.properties: -------------------------------------------------------------------------------- 1 | cdr.thumbnails.stream=direct:startThumbnail 2 | cdr.thumbnails.stream.camel=direct:startThumbnail 3 | 4 | cdr.import.thumbnails.stream=direct:startImport 5 | cdr.import.thumbnails.stream.camel=direct:startImport -------------------------------------------------------------------------------- /services-camel-app/src/test/resources/uploaded-files/burndown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/services-camel-app/src/test/resources/uploaded-files/burndown.png -------------------------------------------------------------------------------- /spoof/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | edu.unc.lib.cdr 6 | cdr 7 | 5.0-SNAPSHOT 8 | 9 | spoof 10 | Spoof 11 | Authentication spoofing application 12 | war 13 | 14 | ${artifactId} 15 | 16 | -------------------------------------------------------------------------------- /static/css/admin/images/animated-overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/animated-overlay.gif -------------------------------------------------------------------------------- /static/css/admin/images/clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/clear.png -------------------------------------------------------------------------------- /static/css/admin/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/loading.gif -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /static/css/admin/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/admin/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_diagonals-thick_20_666666_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_diagonals-thick_20_666666_40x40.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_flat_10_000000_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_flat_10_000000_40x100.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_glass_100_ebf5fa_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_glass_100_ebf5fa_1x400.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_glass_100_f6f6f6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_glass_100_f6f6f6_1x400.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_glass_65_ebf5fa_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_glass_65_ebf5fa_1x400.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_gloss-wave_35_0a5274_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_gloss-wave_35_0a5274_500x100.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png -------------------------------------------------------------------------------- /static/css/images/ui-bg_highlight-soft_75_5aabcf_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-bg_highlight-soft_75_5aabcf_1x100.png -------------------------------------------------------------------------------- /static/css/images/ui-icons_053a53_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-icons_053a53_256x240.png -------------------------------------------------------------------------------- /static/css/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /static/css/images/ui-icons_228ef1_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-icons_228ef1_256x240.png -------------------------------------------------------------------------------- /static/css/images/ui-icons_5aabcf_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-icons_5aabcf_256x240.png -------------------------------------------------------------------------------- /static/css/images/ui-icons_ffd27a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-icons_ffd27a_256x240.png -------------------------------------------------------------------------------- /static/css/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/css/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /static/front/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/banner.jpg -------------------------------------------------------------------------------- /static/front/nc-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/nc-collection.png -------------------------------------------------------------------------------- /static/front/rare-book-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/rare-book-collection.png -------------------------------------------------------------------------------- /static/front/southern-folklife-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/southern-folklife-collection.png -------------------------------------------------------------------------------- /static/front/southern-historical-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/southern-historical-collection.png -------------------------------------------------------------------------------- /static/front/university-archives.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/university-archives.png -------------------------------------------------------------------------------- /static/front/university-libraries-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/front/university-libraries-logo.png -------------------------------------------------------------------------------- /static/images/admin/gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/admin/gear.png -------------------------------------------------------------------------------- /static/images/admin/gear_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/admin/gear_dark.png -------------------------------------------------------------------------------- /static/images/admin/loading_large.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/admin/loading_large.gif -------------------------------------------------------------------------------- /static/images/admin/loading_small.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/admin/loading_small.gif -------------------------------------------------------------------------------- /static/images/admin/sort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/admin/sort.png -------------------------------------------------------------------------------- /static/images/ajax-loader-lg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/ajax-loader-lg.gif -------------------------------------------------------------------------------- /static/images/ajax_loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/ajax_loader.gif -------------------------------------------------------------------------------- /static/images/cdrui_contentshadowbottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/cdrui_contentshadowbottom.png -------------------------------------------------------------------------------- /static/images/cdrui_contentshadowright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/cdrui_contentshadowright.png -------------------------------------------------------------------------------- /static/images/email_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/email_logo.png -------------------------------------------------------------------------------- /static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/favicon.ico -------------------------------------------------------------------------------- /static/images/file-audio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/file-audio.png -------------------------------------------------------------------------------- /static/images/structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/structure.png -------------------------------------------------------------------------------- /static/images/trash_can.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/trash_can.png -------------------------------------------------------------------------------- /static/images/unc-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/unc-icon.png -------------------------------------------------------------------------------- /static/images/uncwell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/images/uncwell.png -------------------------------------------------------------------------------- /static/js/admin/src/IsSorted.js: -------------------------------------------------------------------------------- 1 | define('IsSorted', function() { 2 | function IsSorted() { 3 | this.sorted = JSON.parse(localStorage.getItem('unc-cdr-admin-sort')); 4 | } 5 | 6 | IsSorted.prototype.stale = function() { 7 | var QUARTER_HOUR = 15 * 60 * 1000; 8 | var sorted = this.sorted; 9 | 10 | if (sorted === null) { 11 | return true; 12 | } else if ((Date.now() - sorted.sortTime) < QUARTER_HOUR) { 13 | return false; 14 | } else { 15 | localStorage.removeItem('unc-cdr-admin-sort'); 16 | return true; 17 | } 18 | }; 19 | 20 | IsSorted.prototype.setSorted = function(sortSettings) { 21 | localStorage.setItem('unc-cdr-admin-sort', JSON.stringify(sortSettings)); 22 | }; 23 | 24 | IsSorted.prototype.getSorted = function() { 25 | return this.sorted; 26 | }; 27 | 28 | return new IsSorted; 29 | }); -------------------------------------------------------------------------------- /static/js/admin/src/PID.js: -------------------------------------------------------------------------------- 1 | define('PID', ['jquery'], function($) { 2 | function PID(pidString) { 3 | this.init(pidString); 4 | }; 5 | 6 | $.extend(PID.prototype, { 7 | uriPrefix: "info:fedora/", 8 | pid: null, 9 | 10 | init: function(pidString) { 11 | if (pidString.indexOf(this.uriPrefix) == 0) { 12 | this.pid = pidString.substring(this.uriPrefix.length()); 13 | } else { 14 | this.pid = pidString; 15 | } 16 | }, 17 | 18 | getPid: function() { 19 | return this.pid; 20 | }, 21 | 22 | getURI: function() { 23 | return this.urlPrefix + this.pid; 24 | }, 25 | 26 | getPath: function() { 27 | return this.pid.replace(":", "/"); 28 | } 29 | }); 30 | 31 | return PID; 32 | }); -------------------------------------------------------------------------------- /static/js/admin/src/ParentResultObject.js: -------------------------------------------------------------------------------- 1 | define('ParentResultObject', [ 'jquery', 'ResultObject'], 2 | function($, ResultObject) { 3 | 4 | function ParentResultObject(options) { 5 | ResultObject.call(this, options); 6 | }; 7 | 8 | ParentResultObject.prototype.constructor = ParentResultObject; 9 | ParentResultObject.prototype = Object.create( ResultObject.prototype ); 10 | 11 | ParentResultObject.prototype.init = function(metadata) { 12 | this.metadata = metadata; 13 | this.pid = metadata.id; 14 | this.isDeleted = $.inArray("Marked For Deletion", this.metadata.status) != -1; 15 | this.actionMenuInitialized = false; 16 | this.element = this.options.element; 17 | this.element.data('resultObject', this); 18 | this.links = []; 19 | $(".container_title span", this.element).text(this.metadata.title) 20 | }; 21 | 22 | return ParentResultObject; 23 | }); -------------------------------------------------------------------------------- /static/js/admin/src/StringUtilities.js: -------------------------------------------------------------------------------- 1 | define('StringUtilities', ['jquery'], function($) { 2 | return { 3 | readableFileSize : function(size) { 4 | var fileSize = 0; 5 | if (size > 1024 * 1024 * 1024) 6 | fileSize = (Math.round(size * 100 / (1024 * 1024 * 1024)) / 100).toString() + 'gb'; 7 | if (size > 1024 * 1024) 8 | fileSize = (Math.round(size * 100 / (1024 * 1024)) / 100).toString() + 'mb'; 9 | else 10 | fileSize = (Math.round(size * 100 / 1024) / 100).toString() + 'kb'; 11 | return fileSize; 12 | } 13 | }; 14 | }); -------------------------------------------------------------------------------- /static/js/admin/src/action/ChangeLocationAction.js: -------------------------------------------------------------------------------- 1 | define('ChangeLocationAction', [ 'jquery', 'URLUtilities'], function($, URLUtilities) { 2 | function ChangeLocationAction(context) { 3 | this.context = context; 4 | }; 5 | 6 | ChangeLocationAction.prototype.execute = function() { 7 | var url; 8 | if (this.context.application == "access") { 9 | url = URLUtilities.getAccessUrl(); 10 | } else if (this.context.application == "services") { 11 | url = URLUtilities.getServicesUrl(); 12 | } else { 13 | url = URLUtilities.getAdminUrl(); 14 | } 15 | 16 | url += this.context.url; 17 | 18 | if (this.context.newWindow) { 19 | window.open(url,'_blank'); 20 | } else { 21 | document.location.href = url; 22 | } 23 | }; 24 | 25 | return ChangeLocationAction; 26 | }); -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /coverage 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | .env 24 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@babel/preset-env'], 3 | plugins: ["@babel/plugin-transform-runtime"] 4 | } 5 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/index.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | collectCoverage: true, 3 | collectCoverageFrom: ["**/src/components/**", "**/src/mixins/**"], 4 | coverageProvider: 'v8', 5 | coverageReporters: [["lcov", {"projectRoot": "../../../../"}], "json", "text"], 6 | moduleFileExtensions: ['vue', 'js', 'json'], 7 | testEnvironment: 'jsdom', 8 | testEnvironmentOptions: { 9 | customExportConditions: ['node', 'node-addons'] 10 | }, 11 | transform: { 12 | '^.+\\.vue$': "@vue/vue3-jest", 13 | "^.+\\js$": "babel-jest" 14 | }, 15 | moduleNameMapper: { 16 | '^@/(.*)$': '/src/$1', 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/src/App.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/src/components/modal.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/src/stores/forms.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useFormsStore = defineStore( 'forms',{ 4 | state: () => ({ 5 | alertHandler: { 6 | alertHandler: () => {} 7 | }, 8 | containerId: '', 9 | showFormsModal: false 10 | }), 11 | actions: { 12 | setAlertHandler(alertHandler) { 13 | this.alertHandler = alertHandler; 14 | }, 15 | setContainerId(containerId) { 16 | this.containerId = containerId; 17 | }, 18 | setShowFormsModal(showFormsModal) { 19 | this.showFormsModal = showFormsModal; 20 | } 21 | } 22 | }); -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import vue from '@vitejs/plugin-vue'; 3 | 4 | const path = require('path'); 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [vue()], 9 | resolve: { 10 | alias: { 11 | "@": path.resolve(__dirname, "./src"), 12 | } 13 | }, 14 | build: { 15 | minify: false, 16 | rollupOptions: { 17 | output: { 18 | entryFileNames: `assets/vue-admin-[name].js`, 19 | chunkFileNames: `assets/vue-admin-[name].js`, 20 | assetFileNames: `assets/[name].[ext]` 21 | } 22 | } 23 | } 24 | }); -------------------------------------------------------------------------------- /static/js/admin/vue-cdr-admin/vueform.config.js: -------------------------------------------------------------------------------- 1 | import en from '@vueform/vueform/locales/en' 2 | import vueform from '@vueform/vueform/dist/vueform' 3 | import { defineConfig } from '@vueform/vueform' 4 | 5 | // https://vueform.com/docs/file-uploads#global-upload-endpoint-config 6 | export default defineConfig({ 7 | theme: vueform, 8 | locales: { en }, 9 | locale: 'en', 10 | endpoints: { 11 | uploadTempFile: { 12 | url: '/services/api/edit/ingest/stageFile', 13 | method: 'post' 14 | }, 15 | removeTempFile: { 16 | url: '/services/api/edit/ingest/removeStagedFile', 17 | method: 'post', 18 | } 19 | } 20 | }); -------------------------------------------------------------------------------- /static/js/public/src/ResourceTypeUtilities.js: -------------------------------------------------------------------------------- 1 | define('ResourceTypeUtilities', [], function() { 2 | return { 3 | getIconNameForType : function(resourceType) { 4 | if (resourceType == "File") { 5 | return "fas fa-file"; 6 | } else if (resourceType == "Work") { 7 | return "fas fa-copy"; 8 | } else if (resourceType == "Collection") { 9 | return "fas fa-archive"; 10 | } else if (resourceType == "AdminUnit") { 11 | return "fas fa-university"; 12 | } else if (resourceType == "Folder") { 13 | return "fas fa-folder"; 14 | } else if (resourceType == "ContentRoot") { 15 | return "fas fa-square"; 16 | } 17 | return "fas fa-question-circle"; 18 | } 19 | }; 20 | }); -------------------------------------------------------------------------------- /static/js/vue-cdr-access/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /coverage 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | // fileMock.js 2 | module.exports = 'mock-file'; -------------------------------------------------------------------------------- /static/js/vue-cdr-access/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@babel/preset-env'], 3 | plugins: ["@babel/plugin-transform-runtime", "babel-plugin-transform-import-meta", "babel-plugin-transform-vite-meta-env"] 4 | } 5 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | automock: false, 3 | collectCoverage: true, 4 | collectCoverageFrom: ["**/src/components/**", "**/src/mixins/**"], 5 | coverageProvider: 'v8', 6 | coverageReporters: [["lcov", {"projectRoot": "../../../"}], "json", "text"], 7 | setupFiles: ['jest-localstorage-mock'], 8 | moduleFileExtensions: ['vue', 'js', 'json'], 9 | testEnvironment: 'jsdom', 10 | testEnvironmentOptions: { 11 | customExportConditions: ['node', 'node-addons'], 12 | url: 'https://localhost/record/73bc003c-9603-4cd9-8a65-93a22520ef6a' 13 | }, 14 | "transformIgnorePatterns": ["node_modules/pdf-js-dist"], 15 | transform: { 16 | "^.+\\.vue$": "@vue/vue3-jest", 17 | "^.+\\js$": "babel-jest" 18 | }, 19 | moduleNameMapper: { 20 | '^@/(.*)$': '/src/$1', 21 | '\\.(jpg|jpeg|png|gif|svg|webp)$': '/__mocks__/fileMock.js' 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/App.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/assets/common-styles.css: -------------------------------------------------------------------------------- 1 | .button.is-link { 2 | background-color: #1A698C; 3 | border-radius: 5px; 4 | font-size: .85rem; 5 | margin-bottom: 10px; 6 | margin-top: 10px; 7 | padding: 1.1em 0.8em 1.1em 1.2em; 8 | } 9 | 10 | a.button.is-link { 11 | width: initial; 12 | } 13 | 14 | a.button.is-link.disabled { 15 | background-color: #fff; 16 | border-color: #dbdbdb; 17 | color: #555; 18 | } 19 | 20 | a.button.is-link span { 21 | padding-right: 10px; 22 | } 23 | 24 | .image-download-options a { 25 | border: inherit; 26 | color: black; 27 | } 28 | 29 | .image-download-options .dropdown-menu { 30 | left: unset; 31 | right: 0; 32 | } 33 | 34 | .image-download-options .fa-angle-down { 35 | margin-left: 8px; 36 | pointer-events: none; 37 | } 38 | 39 | /* This removes the thumbnail search button from clover */ 40 | .clover-viewer-media-wrapper div + button { 41 | display: none !important; 42 | } -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/components/error_pages/notAvailable.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/components/full_record/streamingPlayer.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 22 | 23 | -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/mixins/displayUtils.js: -------------------------------------------------------------------------------- 1 | /* 2 | Utilities for search/browse result pages 3 | */ 4 | export default { 5 | methods: { 6 | recordUrl(idOrObject, browse_type = null) { 7 | let id = null; 8 | if (typeof idOrObject === 'string') { 9 | id = idOrObject; 10 | } else { 11 | id = idOrObject.id; 12 | // Don't apply browse types to works and files 13 | if (idOrObject.type === 'Work' || idOrObject.type === 'File') { 14 | browse_type = null; 15 | } 16 | } 17 | if (browse_type) { 18 | return `/record/${id}/?browse_type=${browse_type}`; 19 | } else { 20 | return `/record/${id}`; 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/mixins/imageUtils.js: -------------------------------------------------------------------------------- 1 | export default { 2 | methods: { 3 | /** 4 | * Vite really, really wants all images to be in the project being built and referenced via imports. 5 | * This doesn't make sense for some of our images. The project won't build unless an import or url is given. 6 | * So just return the image url for images that are external to the Vue project. 7 | * @param image 8 | */ 9 | nonVueStaticImageUrl(image) { 10 | return `https://${window.location.host}/static/images/${image}`; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/mixins/loginUrlUtils.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | logoutUrl() { 4 | const current_page = window.location; 5 | return `https://${current_page.host}/Shibboleth.sso/Logout?return=https://sso.unc.edu/idp/logout.jsp?return_url=${encodeURIComponent(current_page)}`; 6 | }, 7 | 8 | loginUrl() { 9 | const current_page = window.location; 10 | return `https://${current_page.host}/Shibboleth.sso/Login?target=${encodeURIComponent(current_page)}`; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /static/js/vue-cdr-access/src/mixins/matomoUtils.js: -------------------------------------------------------------------------------- 1 | export default { 2 | methods: { 3 | matomoSetup() { 4 | let _mtm = window._mtm = window._mtm || []; 5 | _mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'}); 6 | let d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 7 | g.async=true; g.src=window.matomoSiteSrcUrl; s.parentNode.insertBefore(g,s); 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /static/js/vue-cdr-access/tests/unit/dcrFooter.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount, RouterLinkStub } from '@vue/test-utils'; 2 | import cdrFooter from '@/components/dcrFooter.vue'; 3 | 4 | let wrapper; 5 | describe('dcrFooter.vue', () => { 6 | beforeEach(() => { 7 | wrapper = shallowMount(cdrFooter, { 8 | global: { 9 | stubs: { 10 | RouterLink: RouterLinkStub 11 | } 12 | } 13 | }); 14 | }) 15 | 16 | it("loads the dcrFooter", () => { 17 | expect(wrapper.find('footer').exists()).toBe(true); 18 | }); 19 | 20 | it("verify Home url", () => { 21 | expect(wrapper.findComponent(RouterLinkStub).props().to).toEqual('/'); 22 | }); 23 | }); -------------------------------------------------------------------------------- /static/js/vue-cdr-access/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import vue from '@vitejs/plugin-vue'; 3 | import UnheadVite from '@unhead/addons/vite'; 4 | 5 | const path = require('path'); 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [vue(), UnheadVite()], 10 | resolve: { 11 | alias: { 12 | "@": path.resolve(__dirname, "./src"), 13 | } 14 | }, 15 | build: { 16 | minify: false, 17 | rollupOptions: { 18 | output: { 19 | entryFileNames: `assets/access/vue-access-[name].js`, 20 | chunkFileNames: `assets/access/vue-access-[name].js`, 21 | assetFileNames: `assets/access/[name].[ext]`, 22 | inlineDynamicImports: true 23 | } 24 | } 25 | }, 26 | base: '/static/' 27 | }); -------------------------------------------------------------------------------- /static/js/vue-cdr-access/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | configureWebpack: (config) => { 3 | config.devtool = 'source-map' 4 | }, 5 | 6 | chainWebpack: config => { 7 | config.optimization.minimize(false); 8 | 9 | if (config.plugins.has('optimize-css')) { 10 | config.plugins.delete('optimize-css'); 11 | } 12 | } 13 | }; -------------------------------------------------------------------------------- /static/js/xmleditor/templates/archives.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /static/js/xmleditor/templates/minimal_metadata.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Creator 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /static/js/xmleditor/templates/mods.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/templates/admin/createContainerForm.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |
6 | <% if (options.containerType == "Collection") { %> 7 |
8 | 9 | 10 |
11 | <% } %> 12 | <% if (options.staffOnly) { %> 13 |
14 | 15 | 16 |
17 | <% } %> 18 |
19 | 20 |
21 |
-------------------------------------------------------------------------------- /static/templates/admin/deleteForm.html: -------------------------------------------------------------------------------- 1 |
2 |

Deleting

3 |

<%= options.delete_target_message %>

4 |

Reason for deletion*

5 | 6 |
7 | 8 |
9 |
-------------------------------------------------------------------------------- /static/templates/admin/editAltTextForm.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 | 5 |
6 | 7 |
8 | 9 |
10 | 11 |
12 |

Errors

13 |
14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /static/templates/admin/editAspaceRefIdForm.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 | 6 |
7 | 8 |
9 | 10 |
11 | 12 |
13 |

Errors

14 |
15 |
16 |
17 |
-------------------------------------------------------------------------------- /static/templates/admin/editFilenameForm.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 | 6 |
7 | 8 |
9 | 10 |
11 | 12 |
13 |

Errors

14 |
15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /static/templates/admin/editThumbnailForm.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

Edit display thumbnail.

4 |

Add File

5 |
6 | 7 | 8 |
 
9 |
10 |
11 | 12 |
13 |
14 |

Errors

15 |
16 |
17 |
18 |
-------------------------------------------------------------------------------- /static/templates/admin/editTitleForm.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 | 6 |
7 | 8 |
9 | 10 |
11 | 12 |
13 |

Errors

14 |
15 |
16 |
-------------------------------------------------------------------------------- /static/templates/admin/editTypeForm.html: -------------------------------------------------------------------------------- 1 |
2 |

3 |

4 | 5 | 10 |
11 | 12 |
13 | 14 |
15 |

16 | 17 |
18 |

Errors

19 |
20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /static/templates/admin/importMetadataXMLForm.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

Import MODS descriptive metadata for multiple files. The file must be a DCR Bulk Metadata update document, as is exported by the MODS Export action.

4 |
5 | 6 | 7 |
 
8 |
9 |
10 | 11 |
12 |
13 |

Errors

14 |
15 |
16 |
17 |
-------------------------------------------------------------------------------- /static/templates/admin/invalidVocab.html: -------------------------------------------------------------------------------- 1 | <% _.each(groupedTypes, function(termsList, category) { %> 2 |

Vocabulary issues for <%= container.title %>

3 |

Invalid <%= category %> terms

4 |
    5 |
  • 6 | 7 | 8 | <% _.each(termsList, function(results, vocabTerm) { %> 9 | <% _.each(results, function(entry) { %> 10 | 11 | 12 | 13 | <% }); %> 14 | <% }); %> 15 | 16 |
    <%= vocabTerm %><%= entry.title %>Edit descriptionView in DCR
    17 |
  • 18 |
19 | <% }); %> -------------------------------------------------------------------------------- /static/templates/admin/pathTrail.html: -------------------------------------------------------------------------------- 1 | 2 | <% for (var tier in objectPath) { 3 | if (tier != objectPath.length - 1 || !skipLast) { 4 | if (tier > 0) { %>><%} 5 | var url = "/admin/" + queryMethod + "/" + objectPath[tier].pid; 6 | if (filterParams) 7 | url += "?" + filterParams; 8 | %><%= objectPath[tier].name %><% 9 | } 10 | } %> 11 | -------------------------------------------------------------------------------- /static/templates/admin/resubmitPackageForm.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

Package

4 |
5 | 6 | 7 |
 
8 |
9 |
10 | 11 |
12 |
13 |

Errors

14 |
15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /static/templates/admin/statusMonitor/depositMonitorJob.html: -------------------------------------------------------------------------------- 1 | " data-id="<%= data.uuid %>"> 2 | 3 | <%= data.state %> 4 | 5 | 6 | <%= data.depositorName %> 7 | 8 | 9 | <%= dateFormat(data.submitTime) %> 10 | 11 | 12 | <% if (data.completion) {%> 13 | <%= data.completion %> 14 | <% } else if (data.shortName) { %> 15 | <%= data.shortName %> 16 | <% } %> 17 | 18 | 19 | <%= data.fileName || data.depositSlug || data.uuid %> 20 | 21 | 22 | <%= data.message || data.depositMethod %> 23 | 24 | -------------------------------------------------------------------------------- /static/templates/admin/statusMonitor/details.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |

Details

5 | Hide 6 |
7 |
8 |
9 |
10 |
-------------------------------------------------------------------------------- /static/templates/admin/trashTableHeader.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |

6 | Trash<%= container? " -- " + container.title : "" %> 7 |

8 |
9 | 10 |
11 |
12 |
13 |
14 |
15 |
16 |

17 | 18 |

19 |
20 |
21 | <%= navigationBar %> 22 |
23 |
24 |
-------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /static/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /static/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/static/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /web-access-app/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %d %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-access-app/src/main/resources/modsExclusionXPaths.json: -------------------------------------------------------------------------------- 1 | ["//mods:originInfo[@displayLabel=\"Digital Scan Date Raw Scan\"]/mods:dateCaptured", 2 | "//mods:originInfo[@displayLabel=\"Digital Scan Date filename\"]/mods:dateCaptured", 3 | "//mods:identifier[@type=\"filename\"]", 4 | "//mods:physicalDescription/mods:note[@type=\"technical\"]", 5 | "//mods:originInfo/mods:place/mods:placeTerm[@type=\"code\" and @authority=\"marccountry\"]", 6 | "//mods:originInfo/mods:dateIssued[@encoding=\"marc\"]", 7 | "//mods:identifier[@displayLabel=\"HookID\" and @type=\"local\"]", 8 | "//mods:physicalDescription/mods:note[@displayLabel=\"Container type\"]", 9 | "//mods:identifier[@displayLabel=\"CONTENTdm number\" and @type=\"local\"]", 10 | "//mods:accessCondition[@type=\"use and reproduction\" and @displayLabel=\"CONTENTdm Usage Rights\"]"] -------------------------------------------------------------------------------- /web-access-app/src/main/resources/search.properties: -------------------------------------------------------------------------------- 1 | search.results.maxPerPage=2000 2 | #Fields which are searchable via keyword searches 3 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX,IDENTIFIER\ 4 | ,RLA_SITE_CODE,RLA_CATALOG_NUMBER,RLA_CONTEXT_1,COLLECTION_ID 5 | #Set to one higher than you want to display as the last value indicates whether the UI should show a "show more" link 6 | search.facet.facetsPerGroup=6 7 | search.facet.expandedFacetsPerGroup=20 8 | search.facet.maxFacetsPerGroup=50 9 | search.facet.fields=PARENT_UNIT,PARENT_COLLECTION,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,LANGUAGE,SUBJECT,ANCESTOR_PATH,GENRE,LOCATION,PUBLISHER,DATE_CREATED_YEAR,CREATOR_CONTRIBUTOR 10 | search.facet.defaultSearch=PARENT_UNIT,PARENT_COLLECTION,FILE_FORMAT_CATEGORY,GENRE,SUBJECT,LANGUAGE,LOCATION,PUBLISHER,DATE_CREATED_YEAR,CREATOR_CONTRIBUTOR 11 | search.access.allowPatrons=true -------------------------------------------------------------------------------- /web-access-app/src/main/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.reservedCharacters=+-!(){}[]^"~*?:\\ 2 | solr.core=access 3 | solr.socketTimeout=30000 4 | solr.connectionTimeout=15000 5 | solr.defaultMaxConnectionsPerHost=100 6 | solr.maxConnections=100 7 | solr.maxRetries=1 8 | #Dynamic fields 9 | solr.field.RLA_SITE_CODE=rla_site_code_d 10 | solr.field.RLA_CATALOG_NUMBER=rla_catalog_number_d 11 | solr.field.RLA_CONTEXT_1=rla_context_1_d -------------------------------------------------------------------------------- /web-access-app/src/main/webapp/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /web-access-app/src/main/webapp/WEB-INF/html/headElements.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /web-access-app/src/main/webapp/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /content 3 | Disallow: /Shibboleth.sso 4 | Disallow: /api/searchJson 5 | Disallow: /api/advancedSearch 6 | Disallow: /services/api/iiif 7 | Disallow: /services/api/downloadImage 8 | 9 | Crawl-delay: 5 -------------------------------------------------------------------------------- /web-access-app/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-access-app/src/test/resources/mods/relatedItems.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Testing with Related Items 5 | 6 | 7 | 8 | Preceding title here 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-access-app/src/test/resources/mods/simple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Object Title 4 | 5 | 6 | unc 7 | 8 | A short abstract. 9 | -------------------------------------------------------------------------------- /web-admin-app/src/main/java/edu/unc/lib/boxc/web/admin/controllers/AccessErrorController.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.admin.controllers; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RequestMethod; 6 | 7 | /** 8 | * 9 | * @author bbpennel 10 | * 11 | */ 12 | @Controller 13 | public class AccessErrorController { 14 | @RequestMapping(value = "login", method = RequestMethod.GET) 15 | public String toLoginPage() { 16 | return "error/login"; 17 | } 18 | 19 | @RequestMapping(value = "noAccess", method = RequestMethod.GET) 20 | public String nonAdminPage() { 21 | return "error/nonAdmin"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /web-admin-app/src/main/java/edu/unc/lib/boxc/web/admin/controllers/DashboardController.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.admin.controllers; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.stereotype.Controller; 6 | import org.springframework.ui.Model; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.servlet.ModelAndView; 10 | 11 | /** 12 | * 13 | * @author bbpennel 14 | * 15 | */ 16 | @Controller 17 | @RequestMapping(value = {"/", ""}) 18 | public class DashboardController { 19 | @GetMapping 20 | public ModelAndView handleRequest(Model model, HttpServletRequest request) { 21 | return new ModelAndView("redirect:/list"); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /web-admin-app/src/main/java/edu/unc/lib/boxc/web/admin/controllers/StatusMonitorController.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.admin.controllers; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RequestMethod; 6 | 7 | /** 8 | * 9 | * @author bbpennel 10 | * 11 | */ 12 | @Controller 13 | public class StatusMonitorController { 14 | @RequestMapping(value = "statusMonitor", method = RequestMethod.GET) 15 | public String statusMonitor() { 16 | return "report/statusMonitor"; 17 | } 18 | } -------------------------------------------------------------------------------- /web-admin-app/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %d %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-admin-app/src/main/resources/search.properties: -------------------------------------------------------------------------------- 1 | search.results.defaultPerPage=500 2 | search.results.maxPerPage=5000 3 | search.results.maxBrowsePerPage=1000 4 | #Fields which are searchable via keyword searches 5 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX,IDENTIFIER_INDEX 6 | #Set to one higher than you want to display as the last value indicates whether the UI should show a "show more" link 7 | search.facet.facetsPerGroup=15 8 | search.facet.expandedFacetsPerGroup=50 9 | search.facet.maxFacetsPerGroup=50 10 | search.facet.fields=PARENT_UNIT,ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,SUBJECT,GENRE,LANGUAGE,LOCATION,\ 11 | PUBLISHER,PARENT_COLLECTION,CONTENT_MODEL,RESOURCE_TYPE,STATUS,CONTENT_STATUS,ROLE_GROUP,CREATOR_CONTRIBUTOR 12 | search.access.allowPatrons=false -------------------------------------------------------------------------------- /web-admin-app/src/main/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.core=access 2 | solr.socketTimeout=30000 3 | solr.connectionTimeout=15000 4 | solr.defaultMaxConnectionsPerHost=100 5 | solr.maxConnections=100 6 | solr.maxRetries=1 -------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/common/headElements.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/error/403.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 |
4 |

403 Error

5 |

You do not have permission to access the URL you requested.

6 |
-------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/error/404.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 |
4 |

404 Error

5 |

The URL you requested was not found. If you have reached this page in error, please contact us to let us know. Thank you!

6 |
-------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/error/exception.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 |
4 |

Error

5 | An unexpected error occurred. We apologize for the inconvenience. 6 |
-------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/error/nonAdmin.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4 |
5 |

No Permission

6 |

7 | You do not have permission to view this page. If you would like to request access, please contact us. 8 |

9 |

10 | If you have accessed this page by accident and wish to view our collections instead, they can be accessed via the main Digital Collections Repository website. 11 |

12 |
-------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/report/chompb.jsp: -------------------------------------------------------------------------------- 1 | 2 |
-------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/report/statusMonitor.jsp: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 14 | -------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/template/ajaxTemplate.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4 | 5 | 6 | -------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/jsp/template/jsonTemplate.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%> 2 | <%@ page trimDirectiveWhitespaces="true" %> 3 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4 | <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 5 | <%@ taglib prefix="cdr" uri="http://cdr.lib.unc.edu/cdrUI" %> 6 | 7 | 8 | { 9 | "content" : ${cdr:objectToJSON(contentText)} 10 | 11 | , "data" : { 12 | 13 | "${dataEntry.key}" : ${cdr:objectToJSON(dataEntry.value)} 14 | 15 | } 16 | 17 | } 18 | 19 | -------------------------------------------------------------------------------- /web-admin-app/src/main/webapp/WEB-INF/uiapp-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web-admin-app/src/test/resources/acl-config.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-admin-app/src/test/resources/acl-config.properties -------------------------------------------------------------------------------- /web-admin-app/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-admin-app/src/test/resources/patronPrincipalConfig.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/auth/HttpAuthHeaders.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.auth; 2 | 3 | /** 4 | * Constants for headers related to HTTP authentication/authorization. 5 | * 6 | * @author count0 7 | */ 8 | public class HttpAuthHeaders { 9 | public static final String SHIBBOLETH_GROUPS_HEADER = "isMemberOf"; 10 | public static final String FORWARDED_GROUPS_HEADER = "forwardedGroups"; 11 | public static final String FORWARDED_MAIL_HEADER = "forwardedMail"; 12 | 13 | private HttpAuthHeaders() { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/controllers/UserInformationController.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.controllers; 2 | 3 | import org.springframework.http.ResponseEntity; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RequestMethod; 7 | 8 | import static org.springframework.http.HttpStatus.OK; 9 | 10 | /** 11 | * Returns headers with user information, such as username and admin access 12 | * @author lfarrell 13 | */ 14 | @Controller 15 | public class UserInformationController { 16 | @RequestMapping(value = "/api/userInformation", method = RequestMethod.HEAD) 17 | public ResponseEntity getUserInformation() { 18 | return ResponseEntity.status(OK).contentLength(0).build(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/exceptions/ClientAbortException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.exceptions; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * 7 | * @author count0 8 | * 9 | */ 10 | public class ClientAbortException extends IOException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public ClientAbortException(String arg0, Throwable arg1) { 14 | super(arg0, arg1); 15 | } 16 | 17 | public ClientAbortException(String arg0) { 18 | super(arg0); 19 | } 20 | 21 | public ClientAbortException(Throwable arg0) { 22 | super(arg0); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/exceptions/InvalidRecordRequestException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.exceptions; 2 | 3 | /** 4 | * 5 | * @author count0 6 | */ 7 | public class InvalidRecordRequestException extends RuntimeException { 8 | private static final long serialVersionUID = 1L; 9 | 10 | public InvalidRecordRequestException() { 11 | } 12 | 13 | public InvalidRecordRequestException(String message) { 14 | super(message); 15 | } 16 | 17 | public InvalidRecordRequestException(Throwable cause) { 18 | super(cause); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/exceptions/RenderViewException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.exceptions; 2 | 3 | /** 4 | * 5 | * @author bbpennel 6 | */ 7 | public class RenderViewException extends Exception { 8 | private static final long serialVersionUID = -6741051042605136668L; 9 | 10 | public RenderViewException() { 11 | super(); 12 | } 13 | 14 | public RenderViewException(String arg0, Throwable arg1) { 15 | super(arg0, arg1); 16 | } 17 | 18 | public RenderViewException(String arg0) { 19 | super(arg0); 20 | } 21 | 22 | public RenderViewException(Throwable arg0) { 23 | super(arg0); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/exceptions/ResourceNotFoundException.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.exceptions; 2 | 3 | import org.springframework.http.HttpStatus; 4 | import org.springframework.web.bind.annotation.ResponseStatus; 5 | 6 | /** 7 | * 8 | * @author bbpennel 9 | */ 10 | @ResponseStatus(value = HttpStatus.NOT_FOUND) 11 | public class ResourceNotFoundException extends RuntimeException { 12 | private static final long serialVersionUID = 1L; 13 | 14 | public ResourceNotFoundException() { 15 | } 16 | 17 | public ResourceNotFoundException(Throwable cause) { 18 | super(cause); 19 | } 20 | 21 | public ResourceNotFoundException(String message) { 22 | super(message); 23 | } 24 | 25 | public ResourceNotFoundException(String message, Throwable cause) { 26 | super(message, cause); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /web-common/src/main/java/edu/unc/lib/boxc/web/common/utils/SearchConstants.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.common.utils; 2 | 3 | /** 4 | * @author lfarrell 5 | */ 6 | public class SearchConstants { 7 | public static final int MAX_COLLECTIONS_TO_RETRIEVE = 1000; 8 | 9 | private SearchConstants() { 10 | } 11 | } -------------------------------------------------------------------------------- /web-common/src/test/resources/mods/exclusion_record.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7063/original_file 4 | 7054.jp2 5 | Volume37/Dwane Powell_026.tif 6 | Dwane Powell_026.tif 7 | -------------------------------------------------------------------------------- /web-common/src/test/resources/mods/test_record.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | eng 5 | 6 | 7 | Test Document 8 | 9 | 10 | test_type 11 | 12 | This is a test object 13 | For testing purposes 14 | 15 | McPerson, Person 16 | place 17 | 18 | -------------------------------------------------------------------------------- /web-common/src/test/resources/search.properties: -------------------------------------------------------------------------------- 1 | #Fields which are searchable via keyword searches 2 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX,IDENTIFIER 3 | #Set to one higher than you want to display as the last value indicates whether the UI should show a "show more" link 4 | search.facet.fields=PARENT_UNIT,PARENT_COLLECTION,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,LANGUAGE,SUBJECT,ANCESTOR_PATH,GENRE,LOCATION,PUBLISHER,DATE_CREATED_YEAR,CREATOR_CONTRIBUTOR -------------------------------------------------------------------------------- /web-common/src/test/resources/tokki.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-common/src/test/resources/tokki.jpg -------------------------------------------------------------------------------- /web-services-app/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %d %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-services-app/src/main/resources/search.properties: -------------------------------------------------------------------------------- 1 | search.results.defaultPerPage=20 2 | search.results.maxPerPage=500 3 | search.results.pagesToDisplay=10 4 | search.results.neighborItems=7 5 | search.results.maxBrowsePerPage=500 6 | #Fields which are searchable via keyword searches 7 | search.field.searchable=ID,DEFAULT_INDEX,TITLE_INDEX,CONTRIBUTOR_INDEX,SUBJECT_INDEX,IDENTIFIER\ 8 | ,RLA_SITE_CODE,RLA_CATALOG_NUMBER,RLA_CONTEXT_1 9 | #Set to one higher than you want to display as the last value indicates whether the UI should show a "show more" link 10 | search.facet.facetsPerGroup=6 11 | search.facet.expandedFacetsPerGroup=20 12 | search.facet.maxFacetsPerGroup=50 13 | search.facet.fields=PARENT_UNIT,ANCESTOR_PATH,FILE_FORMAT_CATEGORY,FILE_FORMAT_TYPE,SUBJECT,GENRE,LANGUAGE,LOCATION,\ 14 | PUBLISHER,PARENT_COLLECTION,CONTENT_MODEL,RESOURCE_TYPE,STATUS,CONTENT_STATUS,ROLE_GROUP,CREATOR,CONTRIBUTOR,\ 15 | CREATOR_CONTRIBUTOR 16 | search.access.allowPatrons=true -------------------------------------------------------------------------------- /web-services-app/src/main/resources/solr.properties: -------------------------------------------------------------------------------- 1 | solr.core=access 2 | solr.socketTimeout=40000 3 | solr.connectionTimeout=20000 4 | solr.defaultMaxConnectionsPerHost=100 5 | solr.maxConnections=100 6 | solr.maxRetries=1 7 | #Dynamic fields 8 | solr.field.RLA_SITE_CODE=rla_site_code_d 9 | solr.field.RLA_CATALOG_NUMBER=rla_catalog_number_d 10 | solr.field.RLA_CONTEXT_1=rla_context_1_d -------------------------------------------------------------------------------- /web-services-app/src/main/webapp/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | 3 | -------------------------------------------------------------------------------- /web-services-app/src/main/webapp/WEB-INF/rest-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /web-services-app/src/main/webapp/error/401.html: -------------------------------------------------------------------------------- 1 | You are not authorized to access this resource. -------------------------------------------------------------------------------- /web-services-app/src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | 2 | 3 |

CDR Services

4 | 5 | 6 | -------------------------------------------------------------------------------- /web-services-app/src/test/java/edu/unc/lib/boxc/web/services/utils/DownloadTestHelper.java: -------------------------------------------------------------------------------- 1 | package edu.unc.lib.boxc.web.services.utils; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | import org.springframework.mock.web.MockHttpServletResponse; 5 | 6 | import java.io.File; 7 | import java.io.IOException; 8 | 9 | import static org.junit.jupiter.api.Assertions.assertArrayEquals; 10 | 11 | public class DownloadTestHelper { 12 | public static void assertCorrectImageReturned(byte[] actualContent) throws IOException { 13 | byte[] imageContent = FileUtils.readFileToByteArray(new File("src/test/resources/__files/bunny.jpg")); 14 | 15 | assertArrayEquals(imageContent, actualContent); 16 | } 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /web-services-app/src/test/resources/__files/bunny.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-services-app/src/test/resources/__files/bunny.jpg -------------------------------------------------------------------------------- /web-services-app/src/test/resources/__files/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-services-app/src/test/resources/__files/placeholder.png -------------------------------------------------------------------------------- /web-services-app/src/test/resources/acl-config.properties: -------------------------------------------------------------------------------- 1 | cdr.acl.globalRoles.administrator=adminGroup 2 | 3 | cache.contentPath.maxSize=500 4 | cache.contentPath.timeToLive=5000 5 | 6 | cache.objectAcls.maxSize=100 7 | cache.objectAcls.timeToLive=5000 -------------------------------------------------------------------------------- /web-services-app/src/test/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-services-app/src/test/resources/application.properties -------------------------------------------------------------------------------- /web-services-app/src/test/resources/bag_with_files.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-services-app/src/test/resources/bag_with_files.zip -------------------------------------------------------------------------------- /web-services-app/src/test/resources/export-csv-it.properties: -------------------------------------------------------------------------------- 1 | solr.protocol=http 2 | solr.host=localhost 3 | solr.port=:8983 4 | solr.context=solr 5 | 6 | access.group.admin=adminGrp -------------------------------------------------------------------------------- /web-services-app/src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UTF-8 6 | %relative %-5level [%thread] %logger{20} - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web-services-app/src/test/resources/mods/invalid-mods.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web-services-app/src/test/resources/mods/valid-mods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Test 5 | 6 | -------------------------------------------------------------------------------- /web-services-app/src/test/resources/mods/work-mods.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Work Test 5 | 6 | 7 | 2017-10-09 8 | 9 | -------------------------------------------------------------------------------- /web-services-app/src/test/resources/patron-principals.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "principal" : "unc:patron:ipp:test_group", 4 | "name" : "Test Patron Group", 5 | "ipInclude" : "192.168.1.1" 6 | } 7 | ] -------------------------------------------------------------------------------- /web-services-app/src/test/resources/spring-test/redis-server-context.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /web-services-app/src/test/resources/upload-files/burndown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UNC-Libraries/box-c/118152b557c904732bb2dd38d491d15c4c930fca/web-services-app/src/test/resources/upload-files/burndown.png --------------------------------------------------------------------------------