1 /****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19
20 package org.apache.james.jcr;
21
22 import javax.jcr.Credentials;
23 import javax.jcr.LoginException;
24 import javax.jcr.NoSuchWorkspaceException;
25 import javax.jcr.NodeIterator;
26 import javax.jcr.Repository;
27 import javax.jcr.RepositoryException;
28 import javax.jcr.Session;
29 import javax.jcr.SimpleCredentials;
30 import javax.jcr.query.InvalidQueryException;
31 import javax.jcr.query.Query;
32 import javax.jcr.query.QueryManager;
33
34 import org.apache.commons.logging.Log;
35 import org.apache.jackrabbit.util.ISO9075;
36 import org.apache.jackrabbit.util.Text;
37
38 /**
39 * Framework for JCR repositories used by James.
40 */
41 class AbstractJCRRepository {
42
43 protected Log logger;
44
45 /**
46 * JCR content repository used as the mail repository.
47 * Must be set before the any mail operations are performed.
48 */
49 protected Repository repository;
50
51 /**
52 * Login credentials for accessing the repository.
53 * Set to <code>null</code> (the default) to use default credentials.
54 */
55 protected Credentials credentials;
56
57 /**
58 * Name of the workspace used as the mail repository.
59 * Set to <code>null</code> (the default) to use the default workspace.
60 */
61 protected String workspace;
62
63 /**
64 * Path (relative to root) of the mail repository within the workspace.
65 */
66 protected String path = "james";
67
68 /**
69 * For setter injection.
70 */
71 public AbstractJCRRepository(Log logger) {
72 super();
73 this.logger = logger;
74 }
75
76 /**
77 * Minimal constructor for injection.
78 * @param repository not null
79 */
80 public AbstractJCRRepository(Repository repository, Log logger) {
81 super();
82 this.repository = repository;
83 credentials = new SimpleCredentials("userid", "".toCharArray());
84 this.logger = logger;
85 }
86
87 /**
88 * Maximal constructor for injection.
89 * @param repository not null
90 * @param credentials login credentials for accessing the repository
91 * or null to use default credentials
92 * @param workspace name of the workspace used as the mail repository.
93 * or null to use default workspace
94 * @param path path (relative to root) of the user node within the workspace,
95 * or null to use default.
96 */
97 public AbstractJCRRepository(Repository repository, Credentials credentials, String workspace, String path,
98 Log logger) {
99 super();
100 this.repository = repository;
101 this.credentials = credentials;
102 this.workspace = workspace;
103 this.path = path;
104 this.logger = logger;
105 }
106
107
108 /**
109 * Gets the current logger.
110 * @return the logger, not null
111 */
112 public final Log getLogger() {
113 return logger;
114 }
115
116 /**
117 * Sets the current logger.
118 * @param logger the logger to set, not null
119 */
120 public final void setLogger(Log logger) {
121 this.logger = logger;
122 }
123
124 /**
125 * Retuns the JCR content repository used as the mail repository.
126 *
127 * @return JCR content repository
128 */
129 public Repository getRepository() {
130 return repository;
131 }
132
133 /**
134 * Sets the JCR content repository to be used as the mail repository.
135 *
136 * @param repository JCR content repository
137 */
138 public void setRepository(Repository repository) {
139 this.repository = repository;
140 }
141
142 /**
143 * Returns the login credentials for accessing the repository.
144 *
145 * @return login credentials,
146 * or <code>null</code> if using the default credentials
147 */
148 public Credentials getCredentials() {
149 return credentials;
150 }
151
152 /**
153 * Sets the login credentials for accessing the repository.
154 *
155 * @param credentials login credentials,
156 * or <code>null</code> to use the default credentials
157 */
158 public void setCredentials(Credentials credentials) {
159 this.credentials = credentials;
160 }
161
162 /**
163 * Returns the name of the workspace used as the mail repository.
164 *
165 * @return workspace name,
166 * or <code>null</code> if using the default workspace
167 */
168 public String getWorkspace() {
169 return workspace;
170 }
171
172 /**
173 * Sets the name of the workspace used as the mail repository.
174 *
175 * @param workspace workspace name,
176 * or <code>null</code> to use the default workspace
177 */
178 public void setWorkspace(String workspace) {
179 this.workspace = workspace;
180 }
181
182 /**
183 * Returns the path of the mail repository within the workspace.
184 *
185 * @return repository path
186 */
187 public String getPath() {
188 return path;
189 }
190
191 /**
192 * Sets the path of the mail repository within the workspace.
193 *
194 * @param path repository path
195 */
196 public void setPath(String path) {
197 this.path = path;
198 }
199
200 /**
201 * Logs into a new session.
202 * @return new session, not null
203 * @throws LoginException when login fails
204 * @throws NoSuchWorkspaceException when workspace does not exist
205 * @throws RepositoryException when access fails
206 */
207 protected Session login() throws LoginException, NoSuchWorkspaceException, RepositoryException {
208 Session session = repository.login(credentials, workspace);
209 return session;
210 }
211
212 protected String toSafeName(String key) {
213 String name = ISO9075.encode(Text.escapeIllegalJcrChars(key));
214 return name;
215 }
216
217 protected NodeIterator query(Session session, final String xpath) throws RepositoryException, InvalidQueryException {
218 QueryManager manager = session.getWorkspace().getQueryManager();
219 Query query = manager.createQuery(xpath, Query.XPATH);
220 NodeIterator iterator = query.execute().getNodes();
221 return iterator;
222 }
223
224 }