code: @Override
      public DOReader getReader(boolean cachedObjectRequired, Context context,
              String pid) throws ServerException {
          long getReaderStartTime = logger.isDebugEnabled() ?
                  System.currentTimeMillis() : -1;
          String source = null;
          try {
              {
                  DOReader reader = null;
                  if (m_readerCache != null) {
                      reader = m_readerCache.get(pid);
                  }
                  if (reader == null) {
                      reader =
                              new SimpleDOReader(context, this, m_translator,
                                      m_defaultExportFormat,
                                      m_defaultStorageFormat,
                                      m_storageCharacterEncoding,
                                      m_permanentStore.retrieveObject(pid));
                      source = "filesystem";
                      if (m_readerCache != null) {
                          m_readerCache.put(reader, getReaderStartTime);
                      }
                  } else {
                      source = "memory";
                  }
                  return reader;
              }
          } finally {
              if (logger.isDebugEnabled()) {
                  long dur = System.currentTimeMillis() - getReaderStartTime;
                  logger.debug("Got DOReader (source={}) for {} in {}ms.",
                          source, pid, dur);
              }
          }
      }
docs: Gets a reader on an existing digital object.