001 /*
002 * JBoss, Home of Professional Open Source.
003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004 * as indicated by the @author tags. See the copyright.txt file in the
005 * distribution for a full listing of individual contributors.
006 *
007 * This is free software; you can redistribute it and/or modify it
008 * under the terms of the GNU Lesser General Public License as
009 * published by the Free Software Foundation; either version 2.1 of
010 * the License, or (at your option) any later version.
011 *
012 * This software is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this software; if not, write to the Free
019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021 */
022 package org.jboss.dna.repository.util;
023
024 import java.util.Collections;
025 import java.util.HashSet;
026 import java.util.Set;
027 import javax.jcr.RepositoryException;
028 import javax.jcr.Session;
029 import org.jboss.dna.common.util.CheckArg;
030 import org.jboss.dna.graph.properties.NamespaceException;
031 import org.jboss.dna.graph.properties.NamespaceRegistry;
032
033 /**
034 * @author Randall Hauch
035 */
036 public class JcrNamespaceRegistry implements NamespaceRegistry {
037
038 private final String repositoryWorkspaceName;
039 private final SessionFactory sessionFactory;
040
041 public JcrNamespaceRegistry( SessionFactory sessionFactory, String repositoryWorkspaceName ) {
042 CheckArg.isNotNull(sessionFactory, "sessionFactory");
043 CheckArg.isNotNull(repositoryWorkspaceName, "repositoryWorkspaceName");
044 this.repositoryWorkspaceName = repositoryWorkspaceName;
045 this.sessionFactory = sessionFactory;
046 }
047
048 /**
049 * {@inheritDoc}
050 */
051 public String getDefaultNamespaceUri() {
052 Session session = null;
053 try {
054 session = this.sessionFactory.createSession(this.repositoryWorkspaceName);
055 return session.getNamespaceURI("");
056 } catch (RepositoryException e) {
057 throw new NamespaceException(e);
058 } finally {
059 if (session != null) {
060 session.logout();
061 }
062 }
063 }
064
065 /**
066 * {@inheritDoc}
067 */
068 public String getNamespaceForPrefix( String prefix ) {
069 Session session = null;
070 try {
071 session = this.sessionFactory.createSession(this.repositoryWorkspaceName);
072 return session.getNamespaceURI(prefix);
073 } catch (RepositoryException e) {
074 throw new NamespaceException(e);
075 } finally {
076 if (session != null) {
077 session.logout();
078 }
079 }
080 }
081
082 /**
083 * {@inheritDoc}
084 */
085 public String getPrefixForNamespaceUri( String namespaceUri, boolean generateIfMissing ) {
086 Session session = null;
087 try {
088 session = this.sessionFactory.createSession(this.repositoryWorkspaceName);
089 return session.getNamespacePrefix(namespaceUri);
090 } catch (RepositoryException e) {
091 throw new NamespaceException(e);
092 } finally {
093 if (session != null) {
094 session.logout();
095 }
096 }
097 }
098
099 /**
100 * {@inheritDoc}
101 */
102 public boolean isRegisteredNamespaceUri( String namespaceUri ) {
103 Session session = null;
104 try {
105 session = this.sessionFactory.createSession(this.repositoryWorkspaceName);
106 session.getNamespacePrefix(namespaceUri);
107 return true;
108 } catch (javax.jcr.NamespaceException e) {
109 return false;
110 } catch (RepositoryException e) {
111 throw new NamespaceException(e);
112 } finally {
113 if (session != null) {
114 session.logout();
115 }
116 }
117 }
118
119 /**
120 * {@inheritDoc}
121 */
122 public String register( String prefix, String namespaceUri ) {
123 String previousNamespaceUriForPrefix = null;
124 Session session = null;
125 try {
126 session = this.sessionFactory.createSession(this.repositoryWorkspaceName);
127 previousNamespaceUriForPrefix = session.getNamespacePrefix(namespaceUri);
128 javax.jcr.NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry();
129 registry.registerNamespace(prefix, namespaceUri);
130 } catch (RepositoryException e) {
131 throw new NamespaceException(e);
132 } finally {
133 if (session != null) {
134 session.logout();
135 }
136 }
137 return previousNamespaceUriForPrefix;
138 }
139
140 /**
141 * {@inheritDoc}
142 */
143 public Set<String> getRegisteredNamespaceUris() {
144 Session session = null;
145 try {
146 session = this.sessionFactory.createSession(this.repositoryWorkspaceName);
147 javax.jcr.NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry();
148 Set<String> result = new HashSet<String>();
149 for (String uri : registry.getURIs()) {
150 result.add(uri);
151 }
152 return Collections.unmodifiableSet(result);
153 } catch (RepositoryException e) {
154 throw new NamespaceException(e);
155 } finally {
156 if (session != null) {
157 session.logout();
158 }
159 }
160 }
161
162 }