Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Common DOR services, models, and utility classes used by the SULAIR Digital Library



Require the following:

require 'dor-services'

Configuration is handled through the +Dor::Config+ object:

Dor::Config.configure do
  # Basic DOR configuration
  fedora.url = ''
  gsearch.url = ''

  # If using SSL certificates
  ssl do
    cert_file = File.dirname(__FILE__) + '/../certs/dummy.crt'
    key_file = File.dirname(__FILE__) + '/../certs/dummy.key'
    key_pass = 'dummy'

  # If using SURI service
  suri do
    mint_ids = true
    url = ''
    id_namespace = 'druid'
    user = 'suriuser'
    password = 'suripword'

Values can also be configured individually:


Development and release process

See the consul page for it at:


You can start a pry session with the dor-services gem loaded by executing the script at


It will need the following in order to execute:


You can basically copy the +sul-lyberservices-dev:common-accessioning/current/config/environments/development.rb+ file and the certs from there too

This is located in the ./script subdirectory so that it does not get installed by clients of the gem


  • 0.1.1 Initial release with basic object registration and query_by_id functionality

  • 0.1.3 Replace gsearch/solr with risearch in query_by_id

  • 0.1.4 Change calling signature of :source_id hash parameter in register_object

  • 0.1.5 Remove content model from required parameters for registration; fixed indenting of XML datastreams

  • 0.2.0 Implemented Dor::WorkflowService as a passthrough to existing DOR web services

  • 0.2.1 Added support for :object_admin_class parameter in register_object

  • 0.3.0 Added MetadataService to fetch metadata from various sources (currently Symphony and eXist/MD Toolkit)

  • 1.0.0

    • Richer response from Registration Service

    • MD Toolkit metadata handler work with non-MODS metadata

  • 1.0.1 Changed descMetadata fetcher to pull based on best available “other ID” instead of “source ID”

  • 1.0.2 Added caching of metadata (250 records, 5 minute timeout)

  • 1.0.3 Fix bug in build_datastream

  • 1.1.0 Switched from hand-rolled configuration object to ModCons-based configuration object

  • 1.1.1 Use SSL certificates for gsearch

  • 1.1.2 Hotfix for missing methods in Dor::Item

  • 1.1.3 Hotfix for misspelled objectCreator in registration service

  • 1.1.4 Hotfix for malformed URL stem in Workflow service

  • 1.1.5 Hotfix for issue in which tempfile was not being flushed before copy (in Dor::Item#shelve)

  • 1.2.0 Add Dor::Item#initiate_apo_workflow() to initiate named workflows from the APO

  • 1.2.1 Add basic TEI header support to Dor::Item#generate_dublin_core; switch from guid to uuidtools for UUID creation

  • 1.3.0 Added Druid class for calculation and manipulation of DRUID trees

  • 1.3.1 Rebased workflow changes that were left out of 1.3.0

  • 1.4.0 Add reindex method to Dor::Base

  • 1.4.1

    • Prettify/shrink public XML

    • Improve Dor::SearchService.gsearch parameter handling

  • 1.5.0

    • Add certificate-aware RSolr::Connection class

    • Add Dor::Base.touch(druid) to trigger reindexing without ActiveFedora

  • 1.6.0

    • Implement SdrIngestService and CleanupService

    • Turn off ActiveFedora's automatic SOLR updating

    • Add MD Toolkit metadata handler workaround for NullPointerException in eXist

  • 1.6.1 Fixed configuration of export directory in specs

  • 1.6.2 Fixed configuration reference in cleanup spec

  • 1.6.3 Simplify & speed up MD Toolkit metadata handler queries

  • 1.6.4 Fix MetadataHandler spec tests to match new MD Toolkit implementation

  • 1.7.0

    • LYBERSTRUCTURE-138 Registration - read item-level agreementId from APO

    • LYBERSTRUCTURE-139 Registration - read relationships information from APO

  • 1.7.1

    • Minor tweaks to FOXML, identity metadata, and content metadata

    • Normalize whitespace in descriptive metadata text fields

  • 1.7.2 Add auto-updating Dor::Config.fedora.safeurl (url with user/pass stripped)

  • 2.0.0 Major Release:

    • Service additions: SdrIngest, JHove, Cleanup, ProvenanceMetadata

    • New functionality: Dor::SearchService#reindex(*pids) uses gsearch's XSLT internally

    • Code cleanup: Merged redundant calls into a single #client method on Dor::Config.fedora and Dor::Config.gsearch

    • README formatting: Looks better in HTML, worse in text.

  • 2.1.0 Dor::Item can now build technicalMetadata datastream

  • 2.1.1 Workaround for misbehaving ActiveFedora::Base#datastream_names

  • 2.1.2 Add technicalMetadata to sdr_ingest_transfer's datastream list

  • 2.2.0

    • New Datastreams: EmbargoMetadataDS and EventsDS

    • New Module: Dor::Embargo. Can be mixed in to Dor objects to add embargo functionality

    • Gsearch xslt now indexes the embargoMetadata datastream

  • 2.2.1 Mark EmbargoMetadataDS and EventsDS as dirty when their setters are used

  • 2.2.2 Mark rightsMetadata as dirty when embargo is lifted

  • 2.3.0

    • Dor::WorkflowService#get_lifecycle

    • Only publish metadata if rightsMetadata says so

  • 2.3.1 Publish public xml when <access type=“discover”>

  • 2.4.0

    • Reified workflow

    • Cleaner MODS2DC transformation

    • More robust IdentityMetadataDS object

    • Indexing tweaks

  • 2.4.1

    • Improve Dor::Base.get_foxml()

    • Index lifecycle directly from workflow processes instead of retrieving lifecycle XML

  • 2.4.2 Restrict gsearch stylesheet to pulling XML datastreams

  • 2.5.0 Large-scale refactor of gsearch stylesheet and indexing methods

  • 2.5.1 Use the gsearch REST service for Dor::SearchService.reindex()

  • 2.5.2 Fix xalan/saxon/libxslt issues in gsearch XSLT

  • 2.5.3

    • Handle empty <lifecycle> queries instead of a 404 exception

    • Hotfix for public xml publishing from 2.3.1

  • 2.5.4 Lock ActiveFedora at 3.0.4 for the time being – higher versions expect a fedora.yml file that we don't provide

  • 2.6.0 First usable release of reified workflow objects

  • 2.6.1

    • Publish MODS descMetadata alongside public XML

    • gsearch style sheet updates

  • 2.6.2 Add relationship metadata (straight RELS-EXT clone) to public XML

  • 2.6.3 Filter irrelevant relationships out of public XML

  • 3.0.0

    • Large-scale refactor of gem architecture

    • Built directly on ActiveFedora 3.3 and Solrizer

      • Phasing out fedora-gsearch as the primary index

      • Proper solrization of content model and relationship assertions

    • Configuration change from mod-cons to confstruct

      • Affects dor-services development, but should be invisible to consumers

    • Dor::Item split into multiple ActiveSupport::Concern modules

      • Each Concern provides the structure and methods to deal with one particular aspect of the item:

        • Describable: Descriptive Metadata

        • Embargoable: Embargoes

        • Governable: Admin. Policies

        • Identifiable: Identity Metadata

        • Itemizable: Content Metadata

        • Preservable: Preservation

        • Processable: Workflow

        • Publishable: Publishing

        • Shelvable: Shelving

    • Introduction of Dor::Collection and Dor::Set models

    • Support for unified “workflows” datastream as well as separate xxxxxxxWF datastreams

    • Proper datastream types for Administrative, Content, Descriptive, Embargo, Events, Identity, Role, and Workflow metadata. Most classes now use OM terminologies and automatic Solrizer term extraction.

  • 3.0.1 Corrected Gemfile to remove local active_fedora

  • 3.0.2 Added in missing default configuration files

  • 3.0.3 Added config directory to gemspec

  • 3.0.4

    • Fix inheritance bug in solrization methods

    • Declare contentMetadata as control group 'M'

  • 3.0.5

    • Replace Config#define_custom_fields! and Config#after_config! with real callbacks

    • Make post-configuration callback more tolerant of omitted blocks and values

  • 3.0.6

    • Update dependencies to ActiveFedora ~>3.3.2 and confstruct >=0.2.2

    • Improve indexing of workflows and events datastreams

    • LYBERSTRUCTURE-108 Name formatting error in DC derived from MODS

    • LYBERSTRUCTURE-194 MODS2DC transform – support repository, collection and location mapping to published DC

  • 3.1.0

    • Restructured directory layout: Now organized into datastreams, models, services, workflow, and utils

    • Move Dor-specific datastreams into Dor::* namespace

    • Move Dor::WorkflowService.get_objects_for_workstep from lyber-core

    • Move remaining registration business logic from Argo's registration controller to Dor::RegistrationService

    • Add dor-indexer (console) and dor-indexerd (daemon) executables to reindex objects based on Fedora messages

  • 3.1.1 Remove inline solrization of relationship referents

  • 3.2.0

    • REV-23 Have datastream builders pick up content from workspace if present

    • Retrofit for ActiveFedora 3.3.2 and 4.0 compatibility

    • Improve indexing of IdentityMetadata/sourceId

    • Improved tests

    • Bug fixes

  • 3.3.0

    • Added the Assembleable concern

    • DruidUtils enhancements to create a link as the final node of a druid tree

  • 3.3.1 Indexing and SearchService fixes

  • 3.3.2 (Unreleased)

  • 3.3.3

    • Dor::SuriService.mint_ids() can now generate multiple PIDs with a single call

    • Indexing/Model loading fixes for ActiveFedora 4.0.0rc15

  • 3.3.4

    • Properly convert unqualified MODS dates to DC

    • Minor bug fixes

  • 3.3.5

    • Move SSL config options from fedora block to new ssl block

    • Add Dor::Config#sanitize and Dor::Config#autoconfigure

    • Fix 'repository'/'repo' conflicts in workflow definition/process objects

    • Add status booleans (completed? error? blocked? waiting? ready?) to workflow processes

    • Registration bugfix: Don't try to save datastreams if there's no real object underneath

  • 3.3.6 Recover gracefully (with a warning) from ActiveFedora::Base.load_from_solr() exceptions

  • 3.3.7

    • Load workflows datastream XML directly from workflow service

    • Use ActiveFedora 4.0.0.rc20 until final 4.0.0 release

    • Minor solr indexing fixes

  • 3.4.0

    • Switch from explicit load to autoload for faster startup

    • Add Dor::Config.stomp (and Dor::Config.stomp.client)

    • Add resource-index-based Dor::SearchService.iterate_over_pids

  • 3.4.1

    • Fix field name bug in WorkflowObject.find_by_name

    • Make the indexer queue/worker friendly

    • Update tests to work with ActiveFedora 4.0

    • Improve test stubbing to fix false (order-dependent) failures

  • 3.4.2

    • WorkflowService now requires active_support/core_ext explicitly in order for robots to start

  • 3.5.0

    • Update active-fedora dependency to final 4.0.0 release

    • ARGO-24 Show all name parts for author/creator in citation

    • LYBERSTRUCTURE-205 Deprecate contentMetadata “format” attribute in Common Accessioning

    • LYBERSTRUCTURE-215 Update objects to a single “workflows” datastream, drop workflow specific datastreams

    • LYBERSTRUCTURE-224 Drop <agreementId> from identityMetadata; SDR will verify APO instead

    • LYBERSTRUCTURE-222 identityMetadata - drop AdminPolicy tag and rely on isGovernedBy relationship

    • First round of object remediation using Upgradable concern

    • Add Upgradable concern

    • Index workflow ready/blocked states

    • Add workflow name and archive totals to WorkflowObject index

  • 3.5.1 Hotfix for solrizing malformed tags

  • 3.5.2

    • Fix empty datastream check in Dor::Processable#build_datastream to include cases where the content is equivalent to the default XML template for the datastream class

  • 3.6.0

    • Add keep-alive heartbeat to dor-indexer

    • Add contentMetadata/@type migration

    • Take steps to ensure Upgradables idempotence

    • Record remediation migrations in events datastream

  • 3.6.1

    • Restore adminPolicy to identityMetadataDS (for backward compatibility)

    • Ensure correct content model assertions

    • Remediated objects are tagged with the version of dor-services that updated them

  • 3.6.2 Minor migration and indexing bug fixes

  • 3.6.3 Hotfix for Describable#generate_dublin_core raising the wrong kind of exception

  • 3.6.4 Add abstract to descMetadata

  • 3.7.0 Use Moab versioning service in shelving

  • 3.7.1 Make cm_inv_diff cache aspect-specific

  • 3.7.2 Add net-sftp dependency

  • 3.8.0

    • Versioning support for sdr-ingest-transfer robot

    • Embargo release copies all <access type=“read”> nodes from embargoMetadata to rightsMetadata

  • 3.8.1 (Unreleased)

  • 3.8.2 SDR Ingest service hotfixes

  • 3.8.3 Fix Timeout…rescue bug in dor-indexer

  • 3.8.4 More robust exception handling in RegistrationService and dor-indexer

  • 3.9.0

    • Use options hash for Dor::WorkflowService update workflow and error methods

    • Move REST registration logic from Argo's ObjectsController#create to Dor::RegistrationService#create_from_request

    • Monkey patch ActiveFedora::RelsExtDatastream.short_predicate to create missing mappings on the fly.

  • 3.10.0 Added support for setting rights when registering an object.

  • 3.10.1 Fixed a 1.87->1.93 syntax deprication issue

  • 3.10.2 Changed the method for setting the rightsMetadata stream to trigger a save

  • 3.10.3 Debugging failure to save rights metadata

  • 3.10.4 Found the location where the report parameter from argo was being lost

  • 3.10.5 Corrected the Stanford entry in rights metadata, and truncate the fedora label if it is too long

  • 3.10.6 Removed a remnant from the previous change

  • 3.10.7 Source id is now a required parameter for item registration

  • 3.10.8 A descriptive metadata stream with basic mods created from the label can be created in item registration

  • 3.11.0

    • Dor::WorkflowObject.initial_workflow creates workflow xml from workflow definition objects

    • Added Versionable concern

  • 3.11.1 Include versionable concern with Dor::Item

  • 3.11.2 Call correct workflow initialization method when opening a new version

  • 3.11.3 Use correct Dor::Exception when opening a new version

  • 3.11.4 Add a new 'tags' method to the item, which will return an array of tags; also add a new method to get the tagged content-type

  • 3.11.5 Bump required version of druid-tools gem to 0.2.1

  • 3.12.0 Added some update services for identity metadata, rights metadata, and desc metadata

  • 3.12.2

    - Autoload the TechnicalMetadataService whenever dor-services is required
    - versionMetadata added at object creation and remediation
  • 3.13.0 Create a Dor::DigitalStacksService.stacks_storage_dir method

  • 3.13.1 Patch to create workflows correctly for sdr

  • 3.13.2 Embargo Update should update the datastream</b>

  • 3.13.3 Another embargo fix</b>

  • 3.13.4 initiate_apo_workflow does not create workflows datastream when an object is new</b>

  • 3.14.0

    • technicalMetadata bugfixes

    • use sul-gems as new Gemfile source

  • 3.14.1 Removed dor indexer and registration no longer requires a valid label if md source is mdtoolkit or symphony“

  • 3.14.6 Fixed a 1.9 incompatibility that was breaking things in argo</b>

  • 3.15.0 Use new dor-workflow-service gem

  • 3.16.0 Add methods to query and close object versions

  • 3.16.5 A number of changes to the to_solr methods to remove unneeded stuff and add stuff that makes loading facets more efficient“

  • 3.16.8 Added the ability to create a status string for and object and added that as an indexed field

  • 3.16.9 Using moab-versioning >= 1.1.3

  • 3.17.0 Versionable#close_version now archives versioningWF workflow. Requires a new Dor::Config param, dor_services.url

  • 3.17.1 Added roles and a solr field for the first shelved image in an object

  • 3.17.2 Fixed a typo in get_collection_title and some tests that failed to catch the typo

  • 3.17.3 TechnicalMetadataService and SdrIngestService now find content ok. Updated gem dependenciies

  • 3.17.4 SdrIngestService was creating moab manifests that were missing SHA256 checksums

  • 3.17.5 AddCollectionReference was causing the ng_xml for the desc metadata in the current item instance to be polluted

  • 3.17.6 Added a predicate mapping for hydrus

  • 3.17.7 SdrIngestService was not handling case when new version has no new content files

  • 3.17.9 Now extracts all datastreams from Fedora even if file exists on disk.

  • 3.17.10 SdrIngestService was not handling case when object has no contentMetadata.

  • 3.17.11 Workflow was only set up to work with items from the dor repo.

  • 3.17.12 BuildDatastream can now require the datastream be populated and raise an exception if it isnt

  • 3.17.13 Fixes all known issues caused by nokogiri 1.56

  • 3.18.0 Dor::Versionable.close_version changes to deal with tag and description

  • 3.18.4 The exception caused by a lack of desc metadata is logged silently

  • 3.19.0 Optional params for version number and starting accessioning when archiving workflow

  • 3.21.1 Allow user to specify resource type when adding a resource to content metadata

  • 3.22.0 Remove assembly directories on cleanup

  • 3.23.0 Always generate brand new provenanceMetadata

  • 3.24.0 APO editing functionality

  • 3.24.1 Closing a version no longer archives a workflow

  • 3.24.2 Undoing v3.24.1: closing a version does archive a workflow

  • 4.0.0 ActiveFedora 5 and ruby 1.9.3

  • 4.0.1 Index accessioning errors, expose workflow notes

  • 4.0.2 APO rights work with capitalization

  • 4.0.5 Support for workflow priority

  • 4.1.1 Index gryphondor fields into the argo solr index

  • 4.1.2 Set workflow priority during item registration

  • 4.1.7 Cache workflow information for faster indexing

  • 4.2.0 Nokogiri 1.6.0

  • 4.2.1 Check for versionmetadata datastream when doing sdr-ingest-transfer

  • 4.2.3 Fix an exception that occured when a version had no description

  • 4.3.0 Add some missing hydrus solr fields

  • 4.3.2 Bug fixes and refactoring of object status logic

  • 4.4.3 Use moab 1.3.1

  • 4.4.6 call super in Editable.to_solr

  • 4.4.7 Use OM to index APO data

  • 4.4.8 Fix a broken migration

  • 4.4.9 add remote publishing via dor-services-app

  • 4.4.10

  • 4.4.11

  • 4.4.12

  • 4.4.13

  • 4.4.14 Major cleanup of Gemfiles and README, passes all tests

  • 4.4.15 Added support for Geoable and GeoMetadataDS

  • 4.5.0 Added workflow transactional support when closing a version. Eliminate caching of diff cache

  • 4.12.2 Updating to MOAB Versioning 1.3.3


Copyright © 2014 Stanford University Library. See LICENSE for details.

Something went wrong with that request. Please try again.