/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.client; import java.io.InputStream; import java.net.ConnectException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.jcr.AccessDeniedException; import javax.jcr.Credentials; import javax.jcr.InvalidItemStateException; import javax.jcr.ItemExistsException; import javax.jcr.ItemNotFoundException; import javax.jcr.LoginException; import javax.jcr.MergeException; import javax.jcr.NamespaceException; import javax.jcr.NoSuchWorkspaceException; import javax.jcr.PathNotFoundException; import javax.jcr.ReferentialIntegrityException; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.RepositoryFactory; import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.ValueFormatException; import javax.jcr.lock.LockException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.nodetype.InvalidNodeTypeDefinitionException; import javax.jcr.nodetype.NoSuchNodeTypeException; import javax.jcr.nodetype.NodeTypeExistsException; import javax.jcr.query.InvalidQueryException; import javax.jcr.version.VersionException; import junit.framework.TestCase; import org.apache.jackrabbit.jcr2spi.config.CacheBehaviour; import org.apache.jackrabbit.jcr2spi.config.RepositoryConfig; import org.apache.jackrabbit.spi.Batch; import org.apache.jackrabbit.spi.ChildInfo; import org.apache.jackrabbit.spi.EventBundle; import org.apache.jackrabbit.spi.EventFilter; import org.apache.jackrabbit.spi.IdFactory; import org.apache.jackrabbit.spi.ItemId; import org.apache.jackrabbit.spi.ItemInfo; import org.apache.jackrabbit.spi.ItemInfoCache; import org.apache.jackrabbit.spi.LockInfo; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.NameFactory; import org.apache.jackrabbit.spi.NodeId; import org.apache.jackrabbit.spi.NodeInfo; import org.apache.jackrabbit.spi.Path; import org.apache.jackrabbit.spi.PathFactory; import org.apache.jackrabbit.spi.PrivilegeDefinition; import org.apache.jackrabbit.spi.PropertyId; import org.apache.jackrabbit.spi.PropertyInfo; import org.apache.jackrabbit.spi.QNodeDefinition; import org.apache.jackrabbit.spi.QNodeTypeDefinition; import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.QValue; import org.apache.jackrabbit.spi.QValueFactory; import org.apache.jackrabbit.spi.QueryInfo; import org.apache.jackrabbit.spi.RepositoryService; import org.apache.jackrabbit.spi.RepositoryServiceFactory; import org.apache.jackrabbit.spi.SessionInfo; import org.apache.jackrabbit.spi.Subscription; import org.apache.jackrabbit.spi.Tree; import org.apache.jackrabbit.spi.commons.logging.Slf4jLogWriterProvider; import org.apache.jackrabbit.webdav.DavException; public class RepositoryFactoryImplTest extends TestCase { private final RepositoryFactory factory = new RepositoryFactoryImpl(); public void testGetRepositoryFromServiceFactory() throws RepositoryException { Map<String, RepositoryServiceFactory> parameters = Collections.singletonMap( "org.apache.jackrabbit.spi.RepositoryServiceFactory", RepositoryServiceFactoryImpl.INSTANCE); Repository repo = factory.getRepository(parameters); assertNotNull(repo); } public void testGetRepositoryFromRepositoryConfig() throws RepositoryException { Map<String, RepositoryConfig> parameters = Collections.singletonMap( "org.apache.jackrabbit.jcr2spi.RepositoryConfig", RepositoryConfigImpl.INSTANCE); Repository repo = factory.getRepository(parameters); assertNotNull(repo); } public void testGetRepositoryWithLogger() throws RepositoryException { List<Object> lwprovider = new ArrayList<Object>(); lwprovider.add(null); lwprovider.add(true); lwprovider.add(new Slf4jLogWriterProvider()); Map<String, Object> params = new HashMap<String, Object>(); params.put("org.apache.jackrabbit.jcr2spi.RepositoryConfig", RepositoryConfigImpl.INSTANCE); for (Object aLwprovider : lwprovider) { params.put("org.apache.jackrabbit.spi.commons.logging.LogWriterProvider", aLwprovider); Repository repo = factory.getRepository(params); assertNotNull(repo); } } public void testGetDefaultRepository() throws RepositoryException { Repository repo = factory.getRepository(null); assertNotNull(repo); assertEquals("Jackrabbit", repo.getDescriptor(Repository.REP_NAME_DESC)); } public void testGetSpi2jcrRepository() throws RepositoryException { Repository coreRepo = factory.getRepository(null); HashMap<String, Object> parameters = new HashMap<String, Object>(); parameters.put("org.apache.jackrabbit.spi.RepositoryServiceFactory", "org.apache.jackrabbit.spi2jcr.Spi2jcrRepositoryServiceFactory"); parameters.put("org.apache.jackrabbit.spi2jcr.Repository", coreRepo); Repository jcr2spiRepo = factory.getRepository(parameters); assertNotNull(jcr2spiRepo); assertEquals("Jackrabbit", jcr2spiRepo.getDescriptor(Repository.REP_NAME_DESC)); } public void testGetSpi2davRepository() throws RepositoryException { Map<String, String> parameters = new HashMap<String, String>(); parameters.put("org.apache.jackrabbit.spi.RepositoryServiceFactory", "org.apache.jackrabbit.spi2dav.Spi2davRepositoryServiceFactory"); parameters.put("org.apache.jackrabbit.spi2dav.uri", "http://localhost/"); try { Repository repo = factory.getRepository(parameters); assertNotNull(repo); } catch (RepositoryException e) { // If there is no jcr server on localhost, one of the below // exceptions will be thrown. Since this indicates that the // factory is working correctly, it is safe to ignore them. if (!(ConnectException.class.isInstance(e.getCause()) || DavException.class.isInstance(e.getCause()))) { throw e; } } } public void testGetSpi2davexRepository() throws RepositoryException { Map<String, String> parameters = Collections.singletonMap( "org.apache.jackrabbit.spi.RepositoryServiceFactory", "org.apache.jackrabbit.spi2davex.Spi2davexRepositoryServiceFactory"); try { Repository repo = factory.getRepository(parameters); assertNotNull(repo); } catch (RepositoryException e) { // If there is no jcr server on localhost, one of the below // exceptions will be thrown. Since this indicates that the // factory is working correctly, it is safe to ignore them. if (!(ConnectException.class.isInstance(e.getCause()) || DavException.class.isInstance(e.getCause()))) { throw e; } } } public void testGetRepositoryUnknownParams() throws RepositoryException { Repository repo = factory.getRepository(Collections.emptyMap()); assertNull(repo); } // -----------------------------------------------------< private >--- /** * Dummy RepositoryServiceFactory */ private static final class RepositoryServiceFactoryImpl implements RepositoryServiceFactory { public static final RepositoryServiceFactory INSTANCE = new RepositoryServiceFactoryImpl(); private RepositoryServiceFactoryImpl() { super(); } public RepositoryService createRepositoryService(Map<?, ?> parameters) throws RepositoryException { return RepositoryServiceImpl.INSTANCE; } } /** * Dummy RepositoryConfig */ private static final class RepositoryConfigImpl implements RepositoryConfig { public static final RepositoryConfig INSTANCE = new RepositoryConfigImpl(); private RepositoryConfigImpl() { super(); } public CacheBehaviour getCacheBehaviour() { return CacheBehaviour.INVALIDATE; } public int getItemCacheSize() { return 1234; } public int getPollTimeout() { return 1234; } @Override public <T> T getConfiguration(String name, T defaultValue) { return null; } public RepositoryService getRepositoryService() throws RepositoryException { return RepositoryServiceImpl.INSTANCE; } } /** * Dummy RepositoryService */ private static final class RepositoryServiceImpl implements RepositoryService { public static final RepositoryService INSTANCE = new RepositoryServiceImpl(); private RepositoryServiceImpl() { super(); } public IdFactory getIdFactory() throws RepositoryException { return null; } public NameFactory getNameFactory() throws RepositoryException { return null; } public PathFactory getPathFactory() throws RepositoryException { return null; } public QValueFactory getQValueFactory() throws RepositoryException { return null; } public ItemInfoCache getItemInfoCache(SessionInfo sessionInfo) throws RepositoryException { return null; } public Map<String, QValue[]> getRepositoryDescriptors() throws RepositoryException { return Collections.emptyMap(); } public SessionInfo obtain(Credentials credentials, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException { return null; } public SessionInfo obtain(SessionInfo sessionInfo, String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException { return null; } public SessionInfo impersonate(SessionInfo sessionInfo, Credentials credentials) throws LoginException, RepositoryException { return null; } public void dispose(SessionInfo sessionInfo) throws RepositoryException { // empty } public String[] getWorkspaceNames(SessionInfo sessionInfo) throws RepositoryException { return new String[0]; } public boolean isGranted(SessionInfo sessionInfo, ItemId itemId, String[] actions) throws RepositoryException { return false; } @Override public PrivilegeDefinition[] getPrivilegeDefinitions(SessionInfo sessionInfo) throws RepositoryException { return new PrivilegeDefinition[0]; } @Override public Name[] getPrivilegeNames(SessionInfo sessionInfo, NodeId id) throws RepositoryException { return new Name[0]; } @Override public PrivilegeDefinition[] getSupportedPrivileges(SessionInfo sessionInfo, NodeId nodeId) throws RepositoryException { return new PrivilegeDefinition[0]; } public QNodeDefinition getNodeDefinition(SessionInfo sessionInfo, NodeId nodeId) throws RepositoryException { return null; } public QPropertyDefinition getPropertyDefinition(SessionInfo sessionInfo, PropertyId propertyId) throws RepositoryException { return null; } public NodeInfo getNodeInfo(SessionInfo sessionInfo, NodeId nodeId) throws ItemNotFoundException, RepositoryException { return null; } public Iterator<? extends ItemInfo> getItemInfos(SessionInfo sessionInfo, ItemId itemId) throws ItemNotFoundException, RepositoryException { return null; } public Iterator<ChildInfo> getChildInfos(SessionInfo sessionInfo, NodeId parentId) throws ItemNotFoundException, RepositoryException { return null; } public Iterator<PropertyId> getReferences(SessionInfo sessionInfo, NodeId nodeId, Name propertyName, boolean weakReferences) throws ItemNotFoundException, RepositoryException { return null; } public PropertyInfo getPropertyInfo(SessionInfo sessionInfo, PropertyId propertyId) throws ItemNotFoundException, RepositoryException { return null; } public Batch createBatch(SessionInfo sessionInfo, ItemId itemId) throws RepositoryException { return null; } public void submit(Batch batch) throws PathNotFoundException, ItemNotFoundException, NoSuchNodeTypeException, ValueFormatException, VersionException, LockException, ConstraintViolationException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { // empty } @Override public Tree createTree(SessionInfo sessionInfo, Batch batch, Name nodeName, Name primaryTypeName, String uniqueId) throws RepositoryException { return null; } public void importXml(SessionInfo sessionInfo, NodeId parentId, InputStream xmlStream, int uuidBehaviour) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { // empty } public void move(SessionInfo sessionInfo, NodeId srcNodeId, NodeId destParentNodeId, Name destName) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException { // empty } public void copy(SessionInfo sessionInfo, String srcWorkspaceName, NodeId srcNodeId, NodeId destParentNodeId, Name destName) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException { // empty } public void update(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName) throws NoSuchWorkspaceException, AccessDeniedException, LockException, InvalidItemStateException, RepositoryException { // empty } public void clone(SessionInfo sessionInfo, String srcWorkspaceName, NodeId srcNodeId, NodeId destParentNodeId, Name destName, boolean removeExisting) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException { // empty } public LockInfo getLockInfo(SessionInfo sessionInfo, NodeId nodeId) throws AccessDeniedException, RepositoryException { return null; } public LockInfo lock(SessionInfo sessionInfo, NodeId nodeId, boolean deep, boolean sessionScoped) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { return null; } public LockInfo lock(SessionInfo sessionInfo, NodeId nodeId, boolean deep, boolean sessionScoped, long timeoutHint, String ownerHint) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { return null; } public void refreshLock(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { // empty } public void unlock(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException { // empty } public NodeId checkin(SessionInfo sessionInfo, NodeId nodeId) throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException { return null; } public void checkout(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException { // empty } public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, LockException, RepositoryException { // empty } public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public void removeVersion(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId) throws ReferentialIntegrityException, AccessDeniedException, UnsupportedRepositoryOperationException, VersionException, RepositoryException { // empty } public void restore(SessionInfo sessionInfo, NodeId nodeId, NodeId versionId, boolean removeExisting) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException { // empty } public void restore(SessionInfo sessionInfo, NodeId[] versionIds, boolean removeExisting) throws ItemExistsException, UnsupportedRepositoryOperationException, VersionException, LockException, InvalidItemStateException, RepositoryException { // empty } public Iterator<NodeId> merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException { return null; } public Iterator<NodeId> merge(SessionInfo sessionInfo, NodeId nodeId, String srcWorkspaceName, boolean bestEffort, boolean isShallow) throws NoSuchWorkspaceException, AccessDeniedException, MergeException, LockException, InvalidItemStateException, RepositoryException { return null; } public void resolveMergeConflict(SessionInfo sessionInfo, NodeId nodeId, NodeId[] mergeFailedIds, NodeId[] predecessorIds) throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException { // empty } public void addVersionLabel(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId, Name label, boolean moveLabel) throws VersionException, RepositoryException { // empty } public void removeVersionLabel(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId, Name label) throws VersionException, RepositoryException { // empty } public NodeId createActivity(SessionInfo sessionInfo, String title) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public void removeActivity(SessionInfo sessionInfo, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException { // empty } public Iterator<NodeId> mergeActivity(SessionInfo sessionInfo, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public NodeId createConfiguration(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public String[] getSupportedQueryLanguages(SessionInfo sessionInfo) throws RepositoryException { return new String[0]; } public String[] checkQueryStatement(SessionInfo sessionInfo, String statement, String language, Map<String, String> namespaces) throws InvalidQueryException, RepositoryException { return new String[0]; } public QueryInfo executeQuery(SessionInfo sessionInfo, String statement, String language, Map<String, String> namespaces, long limit, long offset, Map<String, QValue> values) throws RepositoryException { return null; } public EventFilter createEventFilter(SessionInfo sessionInfo, int eventTypes, Path absPath, boolean isDeep, String[] uuid, Name[] nodeTypeName, boolean noLocal) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public Subscription createSubscription(SessionInfo sessionInfo, EventFilter[] filters) throws UnsupportedRepositoryOperationException, RepositoryException { return null; } public void updateEventFilters(Subscription subscription, EventFilter[] filters) throws RepositoryException { // empty } public EventBundle[] getEvents(Subscription subscription, long timeout) throws RepositoryException, InterruptedException { return new EventBundle[0]; } public EventBundle getEvents(SessionInfo sessionInfo, EventFilter filter, long after) throws RepositoryException, UnsupportedRepositoryOperationException { return null; } public void dispose(Subscription subscription) throws RepositoryException { // empty } public Map<String, String> getRegisteredNamespaces(SessionInfo sessionInfo) throws RepositoryException { return null; } public String getNamespaceURI(SessionInfo sessionInfo, String prefix) throws NamespaceException, RepositoryException { return null; } public String getNamespacePrefix(SessionInfo sessionInfo, String uri) throws NamespaceException, RepositoryException { return null; } public void registerNamespace(SessionInfo sessionInfo, String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException { // empty } public void unregisterNamespace(SessionInfo sessionInfo, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException { // empty } public Iterator<QNodeTypeDefinition> getQNodeTypeDefinitions(SessionInfo sessionInfo) throws RepositoryException { return null; } public Iterator<QNodeTypeDefinition> getQNodeTypeDefinitions(SessionInfo sessionInfo, Name[] nodetypeNames) throws RepositoryException { return null; } public void registerNodeTypes(SessionInfo sessionInfo, QNodeTypeDefinition[] nodeTypeDefinitions, boolean allowUpdate) throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException, RepositoryException { // empty } public void unregisterNodeTypes(SessionInfo sessionInfo, Name[] nodeTypeNames) throws UnsupportedRepositoryOperationException, NoSuchNodeTypeException, RepositoryException { // empty } public void createWorkspace(SessionInfo sessionInfo, String name, String srcWorkspaceName) throws AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchWorkspaceException, RepositoryException { // empty } public void deleteWorkspace(SessionInfo sessionInfo, String name) throws AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchWorkspaceException, RepositoryException { // empty } } }