I forgot about the in-memory FS, time to check the Wiki....

My junit TestCase code follows. The teardown method shuts down the repository, but I get an IOException (unable to delete a .bin file) even if I wait 15 seconds for unseen threads to terminate.


/**
* Test case for JCR tests. This class handles creation of transient repository.
*/
public abstract class AbstractJcrTestCase extends AbstractDependencyInjectionSpringContextTests { private static final Logger logger = Logger.getLogger(AbstractJcrTestCase.class);
   private static final String WORKSPACE_NAME = null;
   protected Repository repository;
protected Credentials credentials = new SimpleCredentials("userid", "".toCharArray()); private String configFile = "gov/usda/aphis/vsps/dao/jcr/fileRepository.xml";
   private String cndFile = "gov/usda/aphis/vsps/dao/jcr/vsps.cnd";
   private File repositoryDirectory;

   /**
    * TODO: Document method
    *
    * @throws IOException TODO: Document exception
    * @throws RuntimeRepositoryException TODO: Document exception
    */
   public void createRepository() throws IOException {
       // read configuration stream
       InputStream is = Thread.currentThread().getContextClassLoader()
                              .getResourceAsStream(configFile);

       if (is == null) {
           throw new IOException("unable to open configuration stream!");
       }

       // identify good repository directory.
       String tmpdir = System.getProperty("java.io.tmpdir");
       repositoryDirectory = new File(new File(tmpdir),
               "transient-jcr-repository-" + new Date().getTime());

       if (logger.isInfoEnabled()) {
logger.info("repository location: " + repositoryDirectory.getAbsolutePath());
       }

       if (!repositoryDirectory.exists()) {
           repositoryDirectory.mkdir();
       }

       // create repository.
       RepositoryConfig config = null;

       try {
config = RepositoryConfig.create(is, repositoryDirectory.getAbsolutePath());
       } catch (RepositoryException e) {
           throw new RuntimeRepositoryException(e);
       }

       repository = new TransientRepository(config);

       // set up VSPS node types.
       Session session = null;

       try {
           session = repository.login(credentials, WORKSPACE_NAME);

JackrabbitNodeTypeManager manager = (JackrabbitNodeTypeManager) session.getWorkspace() .getNodeTypeManager(); is = Thread.currentThread().getContextClassLoader().getResourceAsStream(cndFile); manager.registerNodeTypes(is, JackrabbitNodeTypeManager.TEXT_X_JCR_CND);
       } catch (RepositoryException e) {
           throw new RuntimeRepositoryException(e);
       } finally {
           if (session != null) {
               session.logout();
           }
       }
   }

   /**
    * Create repository on setup.
    */
   @Override
   public void onSetUp() throws Exception {
       super.onSetUp();
       createRepository();
   }

   /**
    * Destroy repository on teardown.
    */
   @Override
   public void onTearDown() throws Exception {
       // this should not be necessary with transient repository, but it
       // won't hurt.
       if (repository instanceof JackrabbitRepository) {
           ((JackrabbitRepository) repository).shutdown();
       }

       // delete transient repository
       if ((repositoryDirectory != null) && repositoryDirectory.exists()) {
           //FileUtils.deleteDirectory(repositoryDirectory);
       }

       super.onTearDown();
   }
}


Thomas Müller wrote:
Hi,

How do I delete a transient repository?  My code is successfully creating
and shutting down the repository, but when I try to delete the directory
(using jakarta commons IO) I get an exception because of some of the data
files.

That sounds like a bug in Jackrabbit. Which files can not be deleted?

Is there a standard way to do this that is guaranteed to work?

Use Linux. Just joking.

Did you consider using in-memory file system and persistence managers?

Regards,
Thomas

Reply via email to