You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2007/01/22 09:41:18 UTC
svn commit: r498558 - in /jackrabbit/trunk/contrib/spi:
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/
jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/
spi/src/main/java/org/apache/jackrabbit/spi/
spi2dav/src/main/java/org/apache/jackrab...
Author: mreutegg
Date: Mon Jan 22 00:41:17 2007
New Revision: 498558
URL: http://svn.apache.org/viewvc?view=rev&rev=498558
Log:
SPI
- NamespaceRegistryImpl now only relies on RepositoryService.getRegisteredNamespaces() for methods: getPrefixes() and getURIs().
- Added methods getPrefix() and getURI() to NamespaceStorage.
- Separated nsResolver in RepositoryServiceImpl into namespace cache and session info bound namespace resolver
- Added methods getNamespacePrefix() and getNamespaceURI() to RepositoryService.
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java
jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?view=diff&rev=498558&r1=498557&r2=498558
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Mon Jan 22 00:41:17 2007
@@ -612,6 +612,20 @@
/**
* @inheritDoc
*/
+ public String getPrefix(String uri) throws NamespaceException, RepositoryException {
+ return service.getNamespacePrefix(sessionInfo, uri);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public String getURI(String prefix) throws NamespaceException, RepositoryException {
+ return service.getNamespaceURI(sessionInfo, prefix);
+ }
+
+ /**
+ * @inheritDoc
+ */
public void registerNamespace(String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException {
service.registerNamespace(sessionInfo, prefix, uri);
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java?view=diff&rev=498558&r1=498557&r2=498558
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceRegistryImpl.java Mon Jan 22 00:41:17 2007
@@ -39,6 +39,8 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Iterator;
+import java.util.Set;
+import java.util.Collection;
/**
* <code>NamespaceRegistryImpl</code>...
@@ -48,28 +50,37 @@
private static Logger log = LoggerFactory.getLogger(NamespaceRegistryImpl.class);
- private static final HashSet reservedPrefixes = new HashSet();
- private static final HashSet reservedURIs = new HashSet();
+ private static final Set RESERVED_PREFIXES = new HashSet();
+ private static final Set RESERVED_URIS = new HashSet();
+ private static final Map RESERVED_NAMESPACES = new HashMap();
static {
// reserved prefixes
- reservedPrefixes.add(QName.NS_XML_PREFIX);
- reservedPrefixes.add(QName.NS_XMLNS_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_XML_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_XMLNS_PREFIX);
// predefined (e.g. built-in) prefixes
- reservedPrefixes.add(QName.NS_REP_PREFIX);
- reservedPrefixes.add(QName.NS_JCR_PREFIX);
- reservedPrefixes.add(QName.NS_NT_PREFIX);
- reservedPrefixes.add(QName.NS_MIX_PREFIX);
- reservedPrefixes.add(QName.NS_SV_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_REP_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_JCR_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_NT_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_MIX_PREFIX);
+ RESERVED_PREFIXES.add(QName.NS_SV_PREFIX);
// reserved namespace URI's
- reservedURIs.add(QName.NS_XML_URI);
- reservedURIs.add(QName.NS_XMLNS_URI);
+ RESERVED_URIS.add(QName.NS_XML_URI);
+ RESERVED_URIS.add(QName.NS_XMLNS_URI);
// predefined (e.g. built-in) namespace URI's
- reservedURIs.add(QName.NS_REP_URI);
- reservedURIs.add(QName.NS_JCR_URI);
- reservedURIs.add(QName.NS_NT_URI);
- reservedURIs.add(QName.NS_MIX_URI);
- reservedURIs.add(QName.NS_SV_URI);
+ RESERVED_URIS.add(QName.NS_REP_URI);
+ RESERVED_URIS.add(QName.NS_JCR_URI);
+ RESERVED_URIS.add(QName.NS_NT_URI);
+ RESERVED_URIS.add(QName.NS_MIX_URI);
+ RESERVED_URIS.add(QName.NS_SV_URI);
+ // reserved and predefined namespaces
+ RESERVED_NAMESPACES.put(QName.NS_XML_PREFIX, QName.NS_XML_URI);
+ RESERVED_NAMESPACES.put(QName.NS_XMLNS_PREFIX, QName.NS_XMLNS_URI);
+ RESERVED_NAMESPACES.put(QName.NS_REP_PREFIX, QName.NS_REP_URI);
+ RESERVED_NAMESPACES.put(QName.NS_JCR_PREFIX, QName.NS_JCR_URI);
+ RESERVED_NAMESPACES.put(QName.NS_NT_PREFIX, QName.NS_NT_URI);
+ RESERVED_NAMESPACES.put(QName.NS_MIX_PREFIX, QName.NS_MIX_URI);
+ RESERVED_NAMESPACES.put(QName.NS_SV_PREFIX, QName.NS_SV_URI);
}
private final HashMap prefixToURI = new HashMap();
@@ -85,32 +96,20 @@
*
* @param storage
* @param level2Repository
- * @throws RepositoryException
*/
- public NamespaceRegistryImpl(NamespaceStorage storage, boolean level2Repository)
- throws RepositoryException {
+ public NamespaceRegistryImpl(NamespaceStorage storage,
+ boolean level2Repository) {
super(true); // enable listener support
resolver = new CachingNameResolver(new ParsingNameResolver(this));
this.storage = storage;
this.level2Repository = level2Repository;
- load();
- }
-
- /**
- * Load all mappings from the <code>NamespaceStorage</code> and update this
- * registry.
- *
- * @throws RepositoryException
- */
- private void load() throws RepositoryException {
- Map nsValues = storage.getRegisteredNamespaces();
- Iterator prefixes = nsValues.keySet().iterator();
- while (prefixes.hasNext()) {
- String prefix = (String) prefixes.next();
- String uri = (String) nsValues.get(prefix);
- addMapping(prefix, uri);
+ // prefill with reserved namespaces
+ prefixToURI.putAll(RESERVED_NAMESPACES);
+ for (Iterator it = RESERVED_NAMESPACES.keySet().iterator(); it.hasNext(); ) {
+ String prefix = (String) it.next();
+ uriToPrefix.put(prefixToURI.get(prefix), prefix);
}
}
@@ -141,7 +140,7 @@
* @param uri
*/
private void removeMapping(String prefix, String uri) {
- prefixToURI.remove(prefix).toString();
+ prefixToURI.remove(prefix);
uriToPrefix.remove(uri);
// notify listeners
notifyNamespaceRemoved(uri);
@@ -168,6 +167,22 @@
notifyNamespaceRemapped(oldPrefix, prefix, uri);
}
+ /**
+ * Syncs the cached namespace mappings with the given namespaces map.
+ *
+ * @param namespaces the up-to-date namespace mapping.
+ */
+ private void syncNamespaces(Map namespaces) {
+ prefixToURI.clear();
+ prefixToURI.putAll(namespaces);
+ uriToPrefix.clear();
+ for (Iterator it = namespaces.keySet().iterator(); it.hasNext(); ) {
+ String prefix = (String) it.next();
+ String uri = (String) namespaces.get(prefix);
+ uriToPrefix.put(uri, prefix);
+ }
+ }
+
//--------------------------------------------------< NamespaceRegistry >---
/**
* @see NamespaceRegistry#registerNamespace(String, String)
@@ -183,11 +198,11 @@
if (QName.NS_EMPTY_PREFIX.equals(prefix) || QName.NS_DEFAULT_URI.equals(uri)) {
throw new NamespaceException("default namespace is reserved and can not be changed");
}
- if (reservedURIs.contains(uri)) {
+ if (RESERVED_URIS.contains(uri)) {
throw new NamespaceException("failed to register namespace "
+ prefix + " -> " + uri + ": reserved URI");
}
- if (reservedPrefixes.contains(prefix)) {
+ if (RESERVED_PREFIXES.contains(prefix)) {
throw new NamespaceException("failed to register namespace "
+ prefix + " -> " + uri + ": reserved prefix");
}
@@ -203,12 +218,18 @@
}
// check existing mappings
- String oldPrefix = (String) uriToPrefix.get(uri);
+ String oldPrefix = null;
+ try {
+ oldPrefix = getPrefix(uri);
+ } catch (NamespaceException e) {
+ // does not exist
+ }
if (prefix.equals(oldPrefix)) {
throw new NamespaceException("failed to register namespace "
+ prefix + " -> " + uri + ": mapping already exists");
}
- if (prefixToURI.containsKey(prefix)) {
+ try {
+ getURI(prefix);
/**
* prevent remapping of existing prefixes because this would in effect
* remove the previously assigned namespace;
@@ -218,6 +239,8 @@
throw new NamespaceException("failed to register namespace "
+ prefix + " -> " + uri
+ ": remapping existing prefixes is not supported.");
+ } catch (NamespaceException e) {
+ // ok
}
// inform storage before mappings are added to maps and propagated to listeners
@@ -237,15 +260,12 @@
throw new UnsupportedRepositoryOperationException("Repository is Level1 only.");
}
- if (reservedPrefixes.contains(prefix)) {
+ if (RESERVED_PREFIXES.contains(prefix)) {
throw new NamespaceException("reserved prefix: " + prefix);
}
- if (!prefixToURI.containsKey(prefix)) {
- throw new NamespaceException("unknown prefix: " + prefix);
- }
+ String uri = getURI(prefix);
// inform storage before mappings are added to maps and propagated to listeners
- String uri = prefixToURI.get(prefix).toString();
storage.unregisterNamespace(uri);
// update caches and notify listeners
@@ -256,15 +276,20 @@
* @see javax.jcr.NamespaceRegistry#getPrefixes()
*/
public String[] getPrefixes() throws RepositoryException {
- return (String[]) prefixToURI.keySet().toArray(new String[prefixToURI.keySet().size()]);
-
+ Map namespaces = storage.getRegisteredNamespaces();
+ syncNamespaces(namespaces);
+ Set prefixes = namespaces.keySet();
+ return (String[]) prefixes.toArray(new String[prefixes.size()]);
}
/**
* @see javax.jcr.NamespaceRegistry#getURIs()
*/
public String[] getURIs() throws RepositoryException {
- return (String[]) uriToPrefix.keySet().toArray(new String[uriToPrefix.keySet().size()]);
+ Map namespaces = storage.getRegisteredNamespaces();
+ syncNamespaces(namespaces);
+ Collection uris = namespaces.values();
+ return (String[]) uris.toArray(new String[uris.size()]);
}
/**
@@ -272,17 +297,17 @@
* @see org.apache.jackrabbit.name.NamespaceResolver#getURI(String)
*/
public String getURI(String prefix) throws NamespaceException {
- if (!prefixToURI.containsKey(prefix)) {
- // reload mappings in order to make sure, the NamespaceRegistry is
- // up to date, and try to retrieve the uri again.
+ String uri = (String) prefixToURI.get(prefix);
+ if (uri == null) {
+ // try to load the uri
try {
- load();
+ uri = storage.getURI(prefix);
+ prefixToURI.put(prefix, uri);
} catch (RepositoryException ex) {
log.warn("Internal error while loading registered namespaces.");
}
}
- String uri = (String) prefixToURI.get(prefix);
if (uri == null) {
throw new NamespaceException(prefix + ": is not a registered namespace prefix.");
}
@@ -295,16 +320,17 @@
* @see org.apache.jackrabbit.name.NamespaceResolver#getPrefix(String)
*/
public String getPrefix(String uri) throws NamespaceException {
- if (!uriToPrefix.containsKey(uri)) {
- // reload mappings in order to make sure, the NamespaceRegistry is
- // up to date, and try to retrieve the prefix again.
+ String prefix = (String) uriToPrefix.get(uri);
+ if (prefix == null) {
+ // try to load the prefix
try {
- load();
+ prefix = storage.getPrefix(uri);
+ uriToPrefix.put(uri, prefix);
} catch (RepositoryException ex) {
log.warn("Internal error while loading registered namespaces.");
}
}
- String prefix = (String) uriToPrefix.get(uri);
+
if (prefix == null) {
throw new NamespaceException(uri + ": is not a registered namespace uri.");
}
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java?view=diff&rev=498558&r1=498557&r2=498558
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/name/NamespaceStorage.java Mon Jan 22 00:41:17 2007
@@ -29,8 +29,12 @@
public interface NamespaceStorage {
public Map getRegisteredNamespaces() throws RepositoryException;
-
- public void registerNamespace(String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException;
+
+ public String getPrefix(String uri) throws NamespaceException, RepositoryException;
+
+ public String getURI(String prefix) throws NamespaceException, RepositoryException;
+
+ public void registerNamespace(String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException;
public void unregisterNamespace(String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException;
Modified: jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java?view=diff&rev=498558&r1=498557&r2=498558
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java (original)
+++ jackrabbit/trunk/contrib/spi/spi/src/main/java/org/apache/jackrabbit/spi/RepositoryService.java Mon Jan 22 00:41:17 2007
@@ -649,10 +649,34 @@
* @see javax.jcr.Workspace#getNamespaceRegistry()
* @see javax.jcr.NamespaceRegistry#getPrefixes()
* @see javax.jcr.NamespaceRegistry#getURIs()
- * @see javax.jcr.NamespaceRegistry#getPrefix(String)
- * @see javax.jcr.NamespaceRegistry#getURI(String)
*/
public Map getRegisteredNamespaces(SessionInfo sessionInfo) throws RepositoryException;
+
+ /**
+ * Returns the namespace URI for the given namespace <code>prefix</code>.
+ *
+ * @param sessionInfo the session info.
+ * @param prefix a namespace prefix to resolve.
+ * @return the namespace URI for the given namespace <code>prefix</code>.
+ * @throws NamespaceException if prefix is not mapped to a namespace URI.
+ * @throws RepositoryException if another error occurs.
+ * @see javax.jcr.NamespaceRegistry#getURI(String)
+ */
+ public String getNamespaceURI(SessionInfo sessionInfo, String prefix)
+ throws NamespaceException, RepositoryException;
+
+ /**
+ * Returns the namespace prefix for the given namespace <code>uri</code>.
+ *
+ * @param sessionInfo the session info.
+ * @param uri the namespace URI.
+ * @return the namespace prefix.
+ * @throws NamespaceException if the URI unknown.
+ * @throws RepositoryException if another error occurs.
+ * @see javax.jcr.NamespaceRegistry#getPrefix(String)
+ */
+ public String getNamespacePrefix(SessionInfo sessionInfo, String uri)
+ throws NamespaceException, RepositoryException;
/**
* Register a new namespace with the given prefix and uri
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?view=diff&rev=498558&r1=498557&r2=498558
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Mon Jan 22 00:41:17 2007
@@ -102,6 +102,10 @@
import org.apache.jackrabbit.name.NameFormat;
import org.apache.jackrabbit.name.Path;
import org.apache.jackrabbit.name.NameException;
+import org.apache.jackrabbit.name.NamespaceResolver;
+import org.apache.jackrabbit.name.IllegalNameException;
+import org.apache.jackrabbit.name.UnknownPrefixException;
+import org.apache.jackrabbit.name.AbstractNamespaceResolver;
import org.apache.jackrabbit.spi.Batch;
import org.apache.jackrabbit.spi.RepositoryService;
import org.apache.jackrabbit.spi.SessionInfo;
@@ -193,7 +197,7 @@
private final ValueFactory valueFactory;
private final Document domFactory;
- private final NamespaceResolverImpl nsResolver;
+ private final NamespaceCache nsCache;
private final URIResolverImpl uriResolver;
private final HostConfiguration hostConfig;
@@ -224,8 +228,8 @@
hostConfig = new HostConfiguration();
hostConfig.setHost(repositoryUri);
- nsResolver = new NamespaceResolverImpl();
- uriResolver = new URIResolverImpl(repositoryUri, this, nsResolver, domFactory);
+ nsCache = new NamespaceCache();
+ uriResolver = new URIResolverImpl(repositoryUri, this, nsCache, domFactory);
} catch (URIException e) {
throw new RepositoryException(e);
@@ -307,7 +311,8 @@
private String getItemUri(NodeId parentId, QName childName, SessionInfo sessionInfo) throws RepositoryException {
String parentUri = uriResolver.getItemUri(parentId, sessionInfo.getWorkspaceName(), sessionInfo);
try {
- return parentUri + "/" + Text.escape(NameFormat.format(childName, nsResolver));
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
+ return parentUri + "/" + Text.escape(NameFormat.format(childName, resolver));
} catch (NoPrefixDeclaredException e) {
throw new RepositoryException(e);
}
@@ -334,7 +339,7 @@
}
}
- QName getQName(DavPropertySet propSet) throws RepositoryException {
+ QName getQName(DavPropertySet propSet, NamespaceResolver nsResolver) throws RepositoryException {
DavProperty nameProp = propSet.get(ItemResourceConstants.JCR_NAME);
if (nameProp != null && nameProp.getValue() != null) {
// not root node. Note that 'unespacing' is not required since
@@ -385,7 +390,6 @@
}
}
-
//--------------------------------------------------< RepositoryService >---
/**
* @see RepositoryService#getIdFactory()
@@ -645,6 +649,8 @@
throw new RepositoryException("Internal error: requested node definition and got property definition.");
}
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
+
// build the definition
QItemDefinition definition = null;
if (propertySet.contains(ItemResourceConstants.JCR_DEFINITION)) {
@@ -653,9 +659,9 @@
if (value != null && value instanceof Element) {
Element idfElem = (Element) value;
if (itemId.denotesNode()) {
- definition = new QNodeDefinitionImpl(null, idfElem, nsResolver);
+ definition = new QNodeDefinitionImpl(null, idfElem, resolver);
} else {
- definition = new QPropertyDefinitionImpl(null, idfElem, nsResolver, getQValueFactory());
+ definition = new QPropertyDefinitionImpl(null, idfElem, resolver, getQValueFactory());
}
}
}
@@ -743,7 +749,8 @@
NodeId parentId = getParentId(propSet, sessionInfo);
NodeId id = uriResolver.buildNodeId(parentId, nodeResponse, sessionInfo.getWorkspaceName());
- NodeInfoImpl nInfo = new NodeInfoImpl(id, parentId, propSet, nsResolver);
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
+ NodeInfoImpl nInfo = new NodeInfoImpl(id, parentId, propSet, resolver);
if (propSet.contains(ItemResourceConstants.JCR_REFERENCES)) {
HrefProperty refProp = new HrefProperty(propSet.get(ItemResourceConstants.JCR_REFERENCES));
Iterator hrefIter = refProp.getHrefs().iterator();
@@ -807,6 +814,8 @@
return Collections.EMPTY_LIST.iterator();
}
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
+
List childEntries = new ArrayList();
for (int i = 0; i < responses.length; i++) {
if (!isSameResource(uri, responses[i])) {
@@ -815,7 +824,7 @@
if (childProps.contains(DavPropertyName.RESOURCETYPE) &&
childProps.get(DavPropertyName.RESOURCETYPE).getValue() != null) {
- QName qName = getQName(childProps);
+ QName qName = getQName(childProps, resolver);
int index = getIndex(childProps);
String uuid = getUniqueID(childProps);
@@ -866,7 +875,9 @@
NodeId parentId = getParentId(propSet, sessionInfo);
PropertyId id = uriResolver.buildPropertyId(parentId, responses[0], sessionInfo.getWorkspaceName());
- PropertyInfo pInfo = new PropertyInfoImpl(id, parentId, propSet, nsResolver, valueFactory, getQValueFactory());
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
+ PropertyInfo pInfo = new PropertyInfoImpl(id, parentId, propSet,
+ resolver, valueFactory, getQValueFactory());
return pInfo;
} catch (IOException e) {
throw new RepositoryException(e);
@@ -1194,9 +1205,10 @@
* @see RepositoryService#addVersionLabel(SessionInfo,NodeId,NodeId,QName,boolean)
*/
public void addVersionLabel(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId, QName label, boolean moveLabel) throws VersionException, RepositoryException {
- try {
+ try {
String uri = getItemUri(versionId, sessionInfo);
- LabelMethod method = new LabelMethod(uri, NameFormat.format(label, nsResolver), (moveLabel) ? LabelInfo.TYPE_SET : LabelInfo.TYPE_ADD);
+ String strLabel = NameFormat.format(label, new NamespaceResolverImpl(sessionInfo));
+ LabelMethod method = new LabelMethod(uri, strLabel, (moveLabel) ? LabelInfo.TYPE_SET : LabelInfo.TYPE_ADD);
execute(method, sessionInfo);
} catch (IOException e) {
throw new RepositoryException(e);
@@ -1211,7 +1223,8 @@
public void removeVersionLabel(SessionInfo sessionInfo, NodeId versionHistoryId, NodeId versionId, QName label) throws VersionException, RepositoryException {
try {
String uri = getItemUri(versionId, sessionInfo);
- LabelMethod method = new LabelMethod(uri, NameFormat.format(label, nsResolver), LabelInfo.TYPE_REMOVE);
+ String strLabel = NameFormat.format(label, new NamespaceResolverImpl(sessionInfo));
+ LabelMethod method = new LabelMethod(uri, strLabel, LabelInfo.TYPE_REMOVE);
execute(method, sessionInfo);
} catch (IOException e) {
throw new RepositoryException(e);
@@ -1263,8 +1276,9 @@
method.checkSuccess();
MultiStatus ms = method.getResponseBodyAsMultiStatus();
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
return new QueryInfoImpl(ms, sessionInfo, uriResolver,
- nsResolver, valueFactory, getQValueFactory());
+ resolver, valueFactory, getQValueFactory());
} catch (IOException e) {
throw new RepositoryException(e);
} catch (DavException e) {
@@ -1506,7 +1520,7 @@
if (uri != null) {
namespaces.put(prefix, uri);
// TODO: not correct since nsRegistry is retrieved from each session
- nsResolver.add(prefix, uri);
+ nsCache.add(prefix, uri);
} else {
log.error("Invalid prefix / uri pair: " + prefix + " -> " + uri);
}
@@ -1525,32 +1539,66 @@
}
/**
+ * @see RepositoryService#getNamespaceURI(SessionInfo, String)
+ */
+ public String getNamespaceURI(SessionInfo sessionInfo, String prefix)
+ throws NamespaceException, RepositoryException {
+ try {
+ return nsCache.getURI(prefix);
+ } catch (NamespaceException e) {
+ // refresh namespaces and try again
+ getRegisteredNamespaces(sessionInfo);
+ return nsCache.getURI(prefix);
+ }
+ }
+
+ /**
+ * @see RepositoryService#getNamespacePrefix(SessionInfo, String)
+ */
+ public String getNamespacePrefix(SessionInfo sessionInfo, String uri)
+ throws NamespaceException, RepositoryException {
+ try {
+ return nsCache.getPrefix(uri);
+ } catch (NamespaceException e) {
+ // refresh namespaces and try again
+ getRegisteredNamespaces(sessionInfo);
+ return nsCache.getPrefix(uri);
+ }
+ }
+
+ /**
* @see RepositoryService#registerNamespace(SessionInfo, String, String)
*/
public void registerNamespace(SessionInfo sessionInfo, String prefix, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException {
- Map namespaces = new HashMap(nsResolver.getNamespaces());
+ // make sure we have them all
+ getRegisteredNamespaces(sessionInfo);
+
+ Map namespaces = new HashMap(nsCache.getNamespaces());
// add new pair that needs to be registered.
namespaces.put(prefix, uri);
internalSetNamespaces(sessionInfo, namespaces);
// adjust internal mappings:
// TODO: not correct since nsRegistry is retrieved from each session
- nsResolver.add(prefix, uri);
+ nsCache.add(prefix, uri);
}
/**
* @see RepositoryService#unregisterNamespace(SessionInfo, String)
*/
public void unregisterNamespace(SessionInfo sessionInfo, String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException {
- String prefix = nsResolver.getPrefix(uri);
- Map namespaces = new HashMap(nsResolver.getNamespaces());
+ // make sure we have them all
+ getRegisteredNamespaces(sessionInfo);
+
+ String prefix = nsCache.getPrefix(uri);
+ Map namespaces = new HashMap(nsCache.getNamespaces());
// remove pair that needs to be unregistered
namespaces.remove(prefix);
internalSetNamespaces(sessionInfo, namespaces);
// adjust internal mappings:
// TODO: not correct since nsRegistry is retrieved from each session
- nsResolver.remove(prefix, uri);
+ nsCache.remove(prefix, uri);
}
/**
@@ -1603,8 +1651,9 @@
Document reportDoc = method.getResponseBodyAsDocument();
ElementIterator it = DomUtil.getChildren(reportDoc.getDocumentElement(), NodeTypeConstants.NODETYPE_ELEMENT, null);
List ntDefs = new ArrayList();
+ NamespaceResolver resolver = new NamespaceResolverImpl(sessionInfo);
while (it.hasNext()) {
- ntDefs.add(new QNodeTypeDefinitionImpl(it.nextElement(), nsResolver, getQValueFactory()));
+ ntDefs.add(new QNodeTypeDefinitionImpl(it.nextElement(), resolver, getQValueFactory()));
}
// refresh node type definitions map
synchronized (nodeTypeDefinitions) {
@@ -1642,6 +1691,7 @@
private final SessionInfo sessionInfo;
private final ItemId targetId;
private final List methods = new ArrayList();
+ private final NamespaceResolver nsResolver;
private String batchId;
@@ -1650,6 +1700,7 @@
private BatchImpl(ItemId targetId, SessionInfo sessionInfo) {
this.targetId = targetId;
this.sessionInfo = sessionInfo;
+ this.nsResolver = new NamespaceResolverImpl(sessionInfo);
}
private HttpClient start() throws RepositoryException {
@@ -1946,6 +1997,103 @@
MoveMethod method = new MoveMethod(uri, destUri, true);
methods.add(method);
+ }
+ }
+
+ //----------------------------------------------< NamespaceResolverImpl >---
+
+ /**
+ * Implements a namespace resolver based on a session info.
+ */
+ private class NamespaceResolverImpl implements NamespaceResolver {
+
+ private final SessionInfo sessionInfo;
+
+ /**
+ * Creates a new namespace resolver using the given session info.
+ *
+ * @param sessionInfo the session info to contact the repository.
+ */
+ NamespaceResolverImpl(SessionInfo sessionInfo) {
+ this.sessionInfo = sessionInfo;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public String getURI(String prefix) throws NamespaceException {
+ try {
+ return getNamespaceURI(sessionInfo, prefix);
+ } catch (RepositoryException e) {
+ String msg = "Error retrieving namespace uri";
+ throw new NamespaceException(msg, e);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public String getPrefix(String uri) throws NamespaceException {
+ try {
+ return getNamespacePrefix(sessionInfo, uri);
+ } catch (RepositoryException e) {
+ String msg = "Error retrieving namespace prefix";
+ throw new NamespaceException(msg, e);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public QName getQName(String jcrName) throws IllegalNameException, UnknownPrefixException {
+ return NameFormat.parse(jcrName, this);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public String getJCRName(QName qName) throws NoPrefixDeclaredException {
+ return NameFormat.format(qName, this);
+ }
+ }
+
+ private static class NamespaceCache extends AbstractNamespaceResolver {
+
+ private final HashMap prefixToURI = new HashMap();
+ private final HashMap uriToPrefix = new HashMap();
+
+ public Map getNamespaces() {
+ return new HashMap(prefixToURI);
+ }
+
+ public void add(String prefix, String uri) {
+ prefixToURI.put(prefix, uri);
+ uriToPrefix.put(uri, prefix);
+ }
+
+ public void remove(String prefix, String uri) {
+ prefixToURI.remove(prefix);
+ uriToPrefix.remove(uri);
+ }
+
+ //----------------------------------------------< NamespaceResolver >---
+
+ public String getURI(String prefix) throws NamespaceException {
+ String uri = (String) prefixToURI.get(prefix);
+ if (uri != null) {
+ return uri;
+ } else {
+ throw new NamespaceException(prefix + ": is not a registered namespace prefix.");
+ }
+ }
+
+ public String getPrefix(String uri) throws NamespaceException {
+ String prefix = (String) uriToPrefix.get(uri);
+ if (prefix != null) {
+ return prefix;
+ } else {
+ throw new NamespaceException(uri + ": is not a registered namespace uri.");
+ }
}
}
}
Modified: jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java?view=diff&rev=498558&r1=498557&r2=498558
==============================================================================
--- jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java Mon Jan 22 00:41:17 2007
@@ -187,7 +187,7 @@
if (uniqueID != null) {
nodeId = service.getIdFactory().createNodeId(uniqueID);
} else {
- QName qName = service.getQName(propSet);
+ QName qName = service.getQName(propSet, nsResolver);
if (qName == QName.ROOT) {
nodeId = service.getIdFactory().createNodeId((String) null, Path.ROOT);
} else {