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 import org.jboss.dna.graph.properties.basic.BasicNamespace; 033 034 /** 035 * @author Randall Hauch 036 */ 037 public class JcrNamespaceRegistry implements NamespaceRegistry { 038 039 private final String repositoryWorkspaceName; 040 private final SessionFactory sessionFactory; 041 042 public JcrNamespaceRegistry( SessionFactory sessionFactory, 043 String repositoryWorkspaceName ) { 044 CheckArg.isNotNull(sessionFactory, "sessionFactory"); 045 CheckArg.isNotNull(repositoryWorkspaceName, "repositoryWorkspaceName"); 046 this.repositoryWorkspaceName = repositoryWorkspaceName; 047 this.sessionFactory = sessionFactory; 048 } 049 050 /** 051 * {@inheritDoc} 052 */ 053 public String getDefaultNamespaceUri() { 054 Session session = null; 055 try { 056 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 057 return session.getNamespaceURI(""); 058 } catch (RepositoryException e) { 059 throw new NamespaceException(e); 060 } finally { 061 if (session != null) { 062 session.logout(); 063 } 064 } 065 } 066 067 /** 068 * {@inheritDoc} 069 */ 070 public String getNamespaceForPrefix( String prefix ) { 071 Session session = null; 072 try { 073 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 074 return session.getNamespaceURI(prefix); 075 } catch (RepositoryException e) { 076 throw new NamespaceException(e); 077 } finally { 078 if (session != null) { 079 session.logout(); 080 } 081 } 082 } 083 084 /** 085 * {@inheritDoc} 086 */ 087 public String getPrefixForNamespaceUri( String namespaceUri, 088 boolean generateIfMissing ) { 089 Session session = null; 090 try { 091 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 092 return session.getNamespacePrefix(namespaceUri); 093 } catch (RepositoryException e) { 094 throw new NamespaceException(e); 095 } finally { 096 if (session != null) { 097 session.logout(); 098 } 099 } 100 } 101 102 /** 103 * {@inheritDoc} 104 */ 105 public boolean isRegisteredNamespaceUri( String namespaceUri ) { 106 Session session = null; 107 try { 108 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 109 session.getNamespacePrefix(namespaceUri); 110 return true; 111 } catch (javax.jcr.NamespaceException e) { 112 return false; 113 } catch (RepositoryException e) { 114 throw new NamespaceException(e); 115 } finally { 116 if (session != null) { 117 session.logout(); 118 } 119 } 120 } 121 122 /** 123 * {@inheritDoc} 124 */ 125 public String register( String prefix, 126 String namespaceUri ) { 127 String previousNamespaceUriForPrefix = null; 128 Session session = null; 129 try { 130 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 131 previousNamespaceUriForPrefix = session.getNamespacePrefix(namespaceUri); 132 javax.jcr.NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry(); 133 registry.registerNamespace(prefix, namespaceUri); 134 } catch (RepositoryException e) { 135 throw new NamespaceException(e); 136 } finally { 137 if (session != null) { 138 session.logout(); 139 } 140 } 141 return previousNamespaceUriForPrefix; 142 } 143 144 /** 145 * {@inheritDoc} 146 * 147 * @see org.jboss.dna.graph.properties.NamespaceRegistry#unregister(java.lang.String) 148 */ 149 public boolean unregister( String namespaceUri ) { 150 Session session = null; 151 try { 152 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 153 String prefix = session.getNamespacePrefix(namespaceUri); 154 javax.jcr.NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry(); 155 registry.unregisterNamespace(prefix); 156 } catch (javax.jcr.NamespaceException e) { 157 return false; 158 } catch (RepositoryException e) { 159 throw new NamespaceException(e); 160 } finally { 161 if (session != null) { 162 session.logout(); 163 } 164 } 165 return true; 166 } 167 168 /** 169 * {@inheritDoc} 170 */ 171 public Set<String> getRegisteredNamespaceUris() { 172 Session session = null; 173 try { 174 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 175 javax.jcr.NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry(); 176 Set<String> result = new HashSet<String>(); 177 for (String uri : registry.getURIs()) { 178 result.add(uri); 179 } 180 return Collections.unmodifiableSet(result); 181 } catch (RepositoryException e) { 182 throw new NamespaceException(e); 183 } finally { 184 if (session != null) { 185 session.logout(); 186 } 187 } 188 } 189 190 /** 191 * {@inheritDoc} 192 * 193 * @see org.jboss.dna.graph.properties.NamespaceRegistry#getNamespaces() 194 */ 195 public Set<Namespace> getNamespaces() { 196 Session session = null; 197 try { 198 session = this.sessionFactory.createSession(this.repositoryWorkspaceName); 199 javax.jcr.NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry(); 200 Set<Namespace> result = new HashSet<Namespace>(); 201 for (String uri : registry.getURIs()) { 202 String prefix = registry.getPrefix(uri); 203 result.add(new BasicNamespace(prefix, uri)); 204 } 205 return Collections.unmodifiableSet(result); 206 } catch (RepositoryException e) { 207 throw new NamespaceException(e); 208 } finally { 209 if (session != null) { 210 session.logout(); 211 } 212 } 213 } 214 215 }