/* * 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.sling.resourceresolver.impl; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.jcr.NamespaceException; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.sling.api.resource.ResourceResolver; import org.slf4j.Logger; public class JcrNamespaceMangler { private static final String MANGLE_NAMESPACE_IN_SUFFIX = "_"; private static final String MANGLE_NAMESPACE_IN_PREFIX = "/_"; private static final Pattern MANGLE_NAMESPACE_IN_PATTERN = Pattern.compile("/_([^_/]+)_"); private static final String MANGLE_NAMESPACE_OUT_SUFFIX = ":"; private static final String MANGLE_NAMESPACE_OUT_PREFIX = "/"; private static final Pattern MANLE_NAMESPACE_OUT_PATTERN = Pattern.compile("/([^:/]+):"); public String mangleNamespaces(ResourceResolver resolver, Logger logger, String absPath) { if (absPath.contains(MANGLE_NAMESPACE_OUT_SUFFIX)) { final Session session = resolver.adaptTo(Session.class); if ( session != null ) { final Matcher m = MANLE_NAMESPACE_OUT_PATTERN.matcher(absPath); final StringBuffer buf = new StringBuffer(); while (m.find()) { final String namespace = m.group(1); try { // throws if "namespace" is not a registered // namespace prefix session.getNamespaceURI(namespace); final String replacement = MANGLE_NAMESPACE_IN_PREFIX + namespace + MANGLE_NAMESPACE_IN_SUFFIX; m.appendReplacement(buf, replacement); } catch (final NamespaceException ne) { // not a valid prefix logger.debug("mangleNamespaces: '{}' is not a prefix, not mangling", namespace); } catch (final RepositoryException re) { logger.warn("mangleNamespaces: Problem checking namespace '{}'", namespace, re); } } m.appendTail(buf); absPath = buf.toString(); } } return absPath; } public String unmangleNamespaces(ResourceResolver resolver, Logger logger, String absPath) { if (absPath.contains(MANGLE_NAMESPACE_IN_PREFIX)) { final Session session = resolver.adaptTo(Session.class); if ( session != null ) { final Matcher m = MANGLE_NAMESPACE_IN_PATTERN.matcher(absPath); final StringBuffer buf = new StringBuffer(); while (m.find()) { final String namespace = m.group(1); try { // throws if "namespace" is not a registered // namespace prefix session.getNamespaceURI(namespace); final String replacement = MANGLE_NAMESPACE_OUT_PREFIX + namespace + MANGLE_NAMESPACE_OUT_SUFFIX; m.appendReplacement(buf, replacement); } catch (final NamespaceException ne) { // not a valid prefix logger.debug("unmangleNamespaces: '{}' is not a prefix, not unmangling", namespace); } catch (final RepositoryException re) { logger.warn("unmangleNamespaces: Problem checking namespace '{}'", namespace, re); } } m.appendTail(buf); absPath = buf.toString(); } } return absPath; } }