package org.argeo.jackrabbit.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.RepositoryFactory; import javax.jcr.Session; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.protocol.HttpContext; import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory; import org.apache.jackrabbit.jcr2spi.Jcr2spiRepositoryFactory; import org.apache.jackrabbit.jcr2spi.RepositoryImpl; import org.apache.jackrabbit.spi.RepositoryService; import org.apache.jackrabbit.spi.RepositoryServiceFactory; import org.apache.jackrabbit.spi.SessionInfo; import org.apache.jackrabbit.spi.commons.ItemInfoCacheImpl; import org.apache.jackrabbit.spi2davex.BatchReadConfig; import org.apache.jackrabbit.spi2davex.RepositoryServiceImpl; import org.apache.jackrabbit.spi2davex.Spi2davexRepositoryServiceFactory; import org.argeo.jcr.JcrUtils; /** Minimal client to test JCR DAVEX connectivity. */ public class JackrabbitClient { final static String JACKRABBIT_REPOSITORY_URI = "org.apache.jackrabbit.repository.uri"; final static String JACKRABBIT_DAVEX_URI = "org.apache.jackrabbit.spi2davex.uri"; final static String JACKRABBIT_REMOTE_DEFAULT_WORKSPACE = "org.apache.jackrabbit.spi2davex.WorkspaceNameDefault"; public static void main(String[] args) { String repoUri = args.length == 0 ? "http://root:demo@localhost:7070/jcr/ego" : args[0]; String workspace = args.length < 2 ? "home" : args[1]; Repository repository = null; Session session = null; URI uri; try { uri = new URI(repoUri); } catch (URISyntaxException e1) { throw new IllegalArgumentException(e1); } if (uri.getScheme().equals("http") || uri.getScheme().equals("https")) { RepositoryFactory repositoryFactory = new Jcr2davRepositoryFactory() { @SuppressWarnings("rawtypes") public Repository getRepository(Map parameters) throws RepositoryException { RepositoryServiceFactory repositoryServiceFactory = new Spi2davexRepositoryServiceFactory() { @Override public RepositoryService createRepositoryService(Map parameters) throws RepositoryException { Object uri = parameters.get(JACKRABBIT_DAVEX_URI); Object defaultWorkspace = parameters.get(JACKRABBIT_REMOTE_DEFAULT_WORKSPACE); BatchReadConfig brc = null; // FIXME adapt to change in Jackrabbit // return new RepositoryServiceImpl(uri.toString(), defaultWorkspace.toString(), brc, // ItemInfoCacheImpl.DEFAULT_CACHE_SIZE) { // // @Override // protected HttpContext getContext(SessionInfo sessionInfo) throws RepositoryException { // HttpClientContext result = HttpClientContext.create(); // result.setAuthCache(new NonSerialBasicAuthCache()); // return result; // } // // }; return null; } }; return RepositoryImpl.create( new Jcr2spiRepositoryFactory.RepositoryConfigImpl(repositoryServiceFactory, parameters)); } }; Map params = new HashMap(); params.put(JACKRABBIT_DAVEX_URI, repoUri.toString()); // FIXME make it configurable params.put(JACKRABBIT_REMOTE_DEFAULT_WORKSPACE, "sys"); try { repository = repositoryFactory.getRepository(params); if (repository != null) session = repository.login(workspace); else throw new IllegalArgumentException("Repository " + repoUri + " not found"); } catch (RepositoryException e) { e.printStackTrace(); } } else { Path path = Paths.get(uri.getPath()); } try { Node rootNode = session.getRootNode(); NodeIterator nit = rootNode.getNodes(); while (nit.hasNext()) { System.out.println(nit.nextNode().getPath()); } Node newNode = JcrUtils.mkdirs(rootNode, "dir/subdir"); System.out.println("Created folder " + newNode.getPath()); Node newFile = JcrUtils.copyBytesAsFile(newNode, "test.txt", "TEST".getBytes()); System.out.println("Created file " + newFile.getPath()); try (BufferedReader reader = new BufferedReader(new InputStreamReader(JcrUtils.getFileAsStream(newFile)))) { System.out.println("Read " + reader.readLine()); } catch (IOException e) { e.printStackTrace(); } newNode.getParent().remove(); System.out.println("Removed new nodes"); } catch (RepositoryException e) { e.printStackTrace(); } } }