Mercurial > hg > AnnotationManagerN4J
annotate src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java @ 94:fcb6fe10e08c
added config option for webapp URL prefix.
author | casties |
---|---|
date | Tue, 10 Feb 2015 17:45:56 +0100 |
parents | 247cbbb385de |
children |
rev | line source |
---|---|
18 | 1 package de.mpiwg.itgroup.annotations.restlet; |
2 | |
70 | 3 /* |
4 * #%L | |
5 * AnnotationManager | |
6 * %% | |
7 * Copyright (C) 2012 - 2014 MPIWG Berlin | |
8 * %% | |
9 * This program is free software: you can redistribute it and/or modify | |
10 * it under the terms of the GNU Lesser General Public License as | |
11 * published by the Free Software Foundation, either version 3 of the | |
12 * License, or (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Lesser Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU General Lesser Public | |
20 * License along with this program. If not, see | |
21 * <http://www.gnu.org/licenses/lgpl-3.0.html>. | |
22 * #L% | |
86 | 23 * Author: Robert Casties (casties@mpiwg-berlin.mpg.de), |
24 * Dirk Wintergruen (dwinter@mpiwg-berlin.mpg.de) | |
70 | 25 */ |
26 | |
18 | 27 import java.io.File; |
28 import java.io.FileInputStream; | |
29 import java.io.FileNotFoundException; | |
30 import java.io.IOException; | |
31 import java.io.InputStream; | |
32 import java.util.Hashtable; | |
33 import java.util.Properties; | |
71 | 34 import java.util.concurrent.ConcurrentMap; |
75 | 35 import java.util.logging.Logger; |
18 | 36 |
37 import javax.naming.NamingEnumeration; | |
38 import javax.naming.NamingException; | |
39 import javax.naming.directory.Attribute; | |
40 import javax.naming.directory.DirContext; | |
41 import javax.naming.directory.InitialDirContext; | |
42 import javax.naming.directory.SearchControls; | |
43 import javax.naming.directory.SearchResult; | |
44 import javax.servlet.ServletContext; | |
45 | |
46 import org.neo4j.graphdb.GraphDatabaseService; | |
66
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
47 import org.neo4j.graphdb.factory.GraphDatabaseBuilder; |
18 | 48 import org.neo4j.graphdb.factory.GraphDatabaseFactory; |
66
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
49 import org.neo4j.graphdb.factory.GraphDatabaseSettings; |
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
50 import org.neo4j.kernel.GraphDatabaseAPI; |
18 | 51 import org.neo4j.server.WrappingNeoServerBootstrapper; |
52 import org.restlet.Application; | |
53 import org.restlet.Context; | |
54 | |
55 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; | |
56 | |
57 public abstract class BaseRestlet extends Application { | |
58 | |
89 | 59 public static Logger logger = Logger.getLogger(BaseRestlet.class.getCanonicalName()); |
18 | 60 |
61 /** | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
62 * Properties holding consumer keys and secrets. |
18 | 63 */ |
64 protected Properties consumerKeys; | |
71 | 65 public String CONSUMER_KEYS_PATH = "consumerkeys.property"; |
18 | 66 public static final String CONSUMERKEYS_KEY = "annotationmanager.consumerkeys"; |
67 | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
68 /** |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
69 * Properties holding server config. |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
70 */ |
18 | 71 protected Properties serverConfig; |
71 | 72 public String CONFIG_PROPS_PATH = "serverconfig.property"; |
18 | 73 public static final String SERVERCONFIG_KEY = "annotationmanager.serverconfig"; |
74 | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
75 /** |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
76 * database instance; |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
77 */ |
18 | 78 protected GraphDatabaseService graphDb; |
79 public static final String GRAPHDB_KEY = "annotationmanager.graphdb"; | |
80 public static final String GRAPHDB_PATH_KEY = "annotationmanager.graphdb.path"; | |
71 | 81 public String graphdbPath = "neo4j-annotation-db"; |
18 | 82 |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
83 /** |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
84 * database interface server instance. |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
85 */ |
18 | 86 protected WrappingNeoServerBootstrapper srv; |
87 public static final String GRAPHDBSRV_KEY = "annotationmanager.graphdb.srv"; | |
88 | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
89 /** |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
90 * annotation store instance. |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
91 */ |
18 | 92 protected AnnotationStore store; |
93 public static final String ANNSTORE_KEY = "annotationmanager.store"; | |
94 | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
95 /** |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
96 * LDAP server URI (for looking up full user names). |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
97 */ |
18 | 98 protected String ldapServerUrl; |
99 public static final String LDAP_SERVER_KEY = "annotationmanager.ldapserver.url"; | |
100 | |
86 | 101 /** |
102 * web frontend admin user name | |
103 */ | |
50 | 104 public static final String ADMIN_USER_KEY = "annotationmanager.admin.user"; |
86 | 105 /** |
106 * web frontend admin user password | |
107 */ | |
50 | 108 public static final String ADMIN_PASSWORD_KEY = "annotationmanager.admin.password"; |
109 | |
18 | 110 /** |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
111 * run in authorization mode i.e. with tokens. |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
112 */ |
58 | 113 protected boolean authorizationMode = false; |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
114 public static final String AUTHORIZATION_MODE_KEY = "annotationmanager.authorization"; |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
115 |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
116 /** |
94 | 117 * prefix for webapp URLs (if needed by proxying). |
118 */ | |
119 protected String webappUriPrefix = null; | |
120 public static final String WEBAPP_PREFIX = "annotationmanager.webapp.prefix"; | |
121 | |
122 /** | |
58 | 123 * prefix to create uris for tags in store. |
124 */ | |
125 public static String TAGS_URI_PREFIX = ""; | |
126 public static final String TAGS_URI_KEY = "annotationmanager.uris.tags"; | |
127 | |
128 /** | |
129 * prefix to create uris for persons in store. | |
130 */ | |
131 public static String PERSONS_URI_PREFIX = ""; | |
132 public static final String PERSONS_URI_KEY = "annotationmanager.uris.persons"; | |
133 | |
134 /** | |
135 * prefix to create uris for groups in store. | |
136 */ | |
137 public static String GROUPS_URI_PREFIX = ""; | |
138 public static final String GROUPS_URI_KEY = "annotationmanager.uris.groups"; | |
139 | |
59
e2f86ef9b871
make annotation uri in store configurable. fix npe with no tags.
casties
parents:
58
diff
changeset
|
140 public static final String ANNOTATIONS_URI_KEY = "annotationmanager.uris.annotations"; |
e2f86ef9b871
make annotation uri in store configurable. fix npe with no tags.
casties
parents:
58
diff
changeset
|
141 |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
142 |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
143 /* (non-Javadoc) |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
144 * @see org.restlet.Application#start() |
18 | 145 */ |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
146 @Override |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
147 public synchronized void start() throws Exception { |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
148 configure(getContext()); |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
149 super.start(); |
18 | 150 } |
151 | |
152 /** | |
153 * Configures the restlet. | |
154 * Reads serverConfig, consumerKeys and graphDb config from config files and starts graphDb. | |
155 * Uses config from webapp context if already initialized. | |
71 | 156 * @param context |
18 | 157 */ |
71 | 158 protected void configure(Context context) { |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
159 ConcurrentMap<String, Object> attrs = context.getAttributes(); |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
160 ServletContext sc = (ServletContext) attrs.get("org.restlet.ext.servlet.ServletContext"); |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
161 if (sc != null) { |
89 | 162 logger.info(getVersion() + " starting..."); |
18 | 163 |
164 /* | |
165 * read config from webapp | |
166 */ | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
167 serverConfig = (Properties) sc.getAttribute(SERVERCONFIG_KEY); |
18 | 168 if (serverConfig == null) { |
169 serverConfig = new Properties(); | |
170 InputStream ps = getResourceAsStream(sc, CONFIG_PROPS_PATH); | |
171 if (ps != null) { | |
75 | 172 logger.fine("loading config from " + CONFIG_PROPS_PATH); |
18 | 173 try { |
174 serverConfig.load(ps); | |
175 /* | |
176 * read serverconfig options | |
177 */ | |
178 graphdbPath = serverConfig.getProperty(GRAPHDB_PATH_KEY, graphdbPath); | |
179 ldapServerUrl = serverConfig.getProperty(LDAP_SERVER_KEY, null); | |
94 | 180 webappUriPrefix = serverConfig.getProperty(WEBAPP_PREFIX, null); |
60
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
181 /* |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
182 * uri prefixes |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
183 */ |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
184 if (serverConfig.containsKey(PERSONS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
185 BaseRestlet.PERSONS_URI_PREFIX = serverConfig.getProperty(PERSONS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
186 } |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
187 if (serverConfig.containsKey(GROUPS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
188 BaseRestlet.GROUPS_URI_PREFIX = serverConfig.getProperty(GROUPS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
189 } |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
190 if (serverConfig.containsKey(TAGS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
191 BaseRestlet.TAGS_URI_PREFIX = serverConfig.getProperty(TAGS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
192 } |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
193 if (serverConfig.containsKey(ANNOTATIONS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
194 AnnotationStore.ANNOTATION_URI_PREFIX = serverConfig.getProperty(ANNOTATIONS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
195 } |
18 | 196 } catch (IOException e) { |
75 | 197 logger.warning("Error loading server config: "+e.toString()); |
18 | 198 } |
75 | 199 logger.fine("config: " + serverConfig); |
18 | 200 } else { |
75 | 201 logger.severe("Unable to get resource " + CONFIG_PROPS_PATH); |
18 | 202 } |
203 // store config | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
204 sc.setAttribute(SERVERCONFIG_KEY, serverConfig); |
18 | 205 } |
206 // look for database service in context | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
207 graphDb = (GraphDatabaseService) sc.getAttribute(GRAPHDB_KEY); |
18 | 208 if (graphDb == null) { |
209 /* | |
210 * open database | |
211 */ | |
212 String dbFn = getResourcePath(sc, graphdbPath); | |
213 if (dbFn != null) { | |
75 | 214 logger.fine("opening DB " + dbFn); |
66
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
215 GraphDatabaseBuilder graphDbBuilder = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(dbFn); |
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
216 graphDbBuilder.setConfig(GraphDatabaseSettings.allow_store_upgrade, "true"); |
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
217 graphDb = graphDbBuilder.newGraphDatabase(); |
18 | 218 registerShutdownHook(graphDb); |
219 // store in context | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
220 sc.setAttribute(GRAPHDB_KEY, graphDb); |
18 | 221 // AnnotationStore |
222 store = new AnnotationStore(graphDb); | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
223 sc.setAttribute(ANNSTORE_KEY, store); |
18 | 224 // admin server |
66
5b568de5ee0d
updated to new Neo4J version 2.0. doesn't use new features. problems with neo4j admin web ui.
casties
parents:
60
diff
changeset
|
225 srv = new WrappingNeoServerBootstrapper((GraphDatabaseAPI) graphDb); |
75 | 226 logger.fine("Starting DB admin server..."); |
18 | 227 // store in context |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
228 sc.setAttribute(GRAPHDBSRV_KEY, srv); |
18 | 229 srv.start(); |
230 } else { | |
75 | 231 logger.severe("Unable to get resource " + dbFn); |
18 | 232 } |
22 | 233 } else { |
234 // get existing AnnotationStore | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
235 store = (AnnotationStore) sc.getAttribute(ANNSTORE_KEY); |
18 | 236 } |
237 /* | |
238 * read consumerKeys from webapp | |
239 */ | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
240 consumerKeys = (Properties) sc.getAttribute(CONSUMERKEYS_KEY); |
18 | 241 if (consumerKeys == null) { |
242 consumerKeys = new Properties(); | |
243 InputStream ps = getResourceAsStream(sc, CONSUMER_KEYS_PATH); | |
244 if (ps != null) { | |
75 | 245 logger.fine("loading consumer keys from " + CONSUMER_KEYS_PATH); |
18 | 246 try { |
247 consumerKeys.load(ps); | |
248 } catch (IOException e) { | |
89 | 249 logger.fine("Error loading consumer keys: "+e); |
18 | 250 } |
75 | 251 logger.fine("consumer keys: " + consumerKeys); |
18 | 252 } else { |
75 | 253 logger.severe("Unable to get resource " + CONSUMER_KEYS_PATH); |
18 | 254 } |
255 // store config | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
256 sc.setAttribute(CONSUMERKEYS_KEY, consumerKeys); |
18 | 257 } |
258 } else { | |
75 | 259 logger.severe("Unable to get ServletContext!"); |
18 | 260 } |
261 } | |
262 | |
263 public abstract String getVersion(); | |
264 | |
265 /** | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
266 * @return the authorizationMode |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
267 */ |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
268 public boolean isAuthorizationMode() { |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
269 return authorizationMode; |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
270 } |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
271 |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
272 /** |
19 | 273 * @return the store |
274 */ | |
275 public AnnotationStore getAnnotationStore() { | |
276 return store; | |
277 } | |
278 | |
279 /** | |
18 | 280 * returns consumer secret for consumer key. returns null if consumer key |
281 * doesn't exist. | |
282 * | |
283 * @param consumerKey | |
284 * @return | |
285 */ | |
286 public String getConsumerSecret(String consumerKey) { | |
287 return consumerKeys.getProperty(consumerKey); | |
288 } | |
289 | |
290 /** | |
86 | 291 * Return the full name (String) of the person with the given user-id. |
292 * | |
293 * Contacts a naming service (currently LDAP). | |
294 * | |
295 * @param userId | |
296 * @return full-name | |
297 */ | |
298 public String getFullNameForId(String userId) { | |
299 return getFullNameFromLdap(userId); | |
300 } | |
301 | |
302 /** | |
18 | 303 * Hole den vollen Benutzernamen aus dem LDAP |
304 * | |
305 * @param creator | |
306 * @return | |
307 */ | |
308 public String getFullNameFromLdap(String creator) { | |
309 String retString = creator; // falls nichts gefunden wird einfach den | |
310 // creator zurueckgeben | |
311 if (ldapServerUrl == null) { | |
312 return retString; | |
313 } | |
314 Hashtable<String, String> env = new Hashtable<String, String>(); | |
315 String sp = "com.sun.jndi.ldap.LdapCtxFactory"; | |
316 env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, sp); | |
317 env.put(javax.naming.Context.PROVIDER_URL, ldapServerUrl); | |
318 | |
319 DirContext dctx; | |
320 try { | |
321 dctx = new InitialDirContext(env); | |
322 } catch (NamingException e) { | |
75 | 323 logger.warning("Error in getFullNameFromLDAP! "+e); |
18 | 324 return retString; |
325 } | |
326 | |
327 String base = "ou=people"; | |
328 | |
329 SearchControls sc = new SearchControls(); | |
330 String[] attributeFilter = { "cn", "mail" }; | |
331 sc.setReturningAttributes(attributeFilter); | |
332 sc.setSearchScope(SearchControls.SUBTREE_SCOPE); | |
333 | |
334 String filter = "(uid=" + creator + ")"; | |
335 | |
336 try { | |
337 NamingEnumeration<SearchResult> results = dctx.search(base, filter, sc); | |
338 while (results.hasMore()) { | |
339 SearchResult sr = (SearchResult) results.next(); | |
340 javax.naming.directory.Attributes attrs = sr.getAttributes(); | |
341 | |
342 Attribute attr = attrs.get("cn"); | |
343 retString = (String) attr.get(); | |
344 } | |
345 } catch (NamingException e) { | |
75 | 346 logger.warning("Error in getFullNameFromLDAP!"+e); |
18 | 347 } |
348 | |
349 try { | |
350 dctx.close(); | |
351 } catch (NamingException e) { | |
75 | 352 logger.warning("Error in getFullNameFromLDAP!"+e); |
18 | 353 } |
354 return retString; | |
355 } | |
356 | |
357 /** | |
74 | 358 * returns resource from path as InputStream. |
359 * | |
360 * Tries path in webapp first, then uses classpath loader. | |
361 * Relative paths in webapp start in /WEB-INF/. | |
18 | 362 * |
363 * @param sc | |
364 * @param path | |
365 * @return | |
366 */ | |
367 protected InputStream getResourceAsStream(ServletContext sc, String path) { | |
71 | 368 InputStream ps = null; |
369 if (sc == null) { | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
370 // no servlet context -> use class loader |
71 | 371 ps = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); |
372 } else { | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
373 // try path in webapp first |
74 | 374 String webPath = path; |
375 if (!webPath.startsWith("/")) { | |
376 // relative path in webapp starts in WEB-INF | |
80
4724fc7b4733
add slashes to paths for getRealPath to work with Tomcat 8.
casties
parents:
75
diff
changeset
|
377 webPath = "/WEB-INF/" + webPath; |
74 | 378 } |
379 ps = sc.getResourceAsStream(webPath); | |
71 | 380 if (ps == null) { |
381 // try as file | |
74 | 382 File pf = new File(sc.getRealPath(webPath)); |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
383 if (pf.canRead()) { |
75 | 384 logger.fine("trying file for: " + pf); |
71 | 385 try { |
386 ps = new FileInputStream(pf); | |
387 } catch (FileNotFoundException e) { | |
75 | 388 logger.severe(e.toString()); |
71 | 389 } |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
390 } else { |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
391 // use class loader |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
392 ps = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); |
18 | 393 } |
394 } | |
395 } | |
396 return ps; | |
397 } | |
398 | |
399 /** | |
400 * get a real file name for a web app file pathname. | |
401 * | |
402 * If filename starts with "/" its treated as absolute else the path is | |
74 | 403 * appended to the /WEB-INF/ directory in the web-app. |
18 | 404 * |
405 * @param filename | |
406 * @param sc | |
407 * @return | |
408 */ | |
409 public static String getResourcePath(ServletContext sc, String filename) { | |
410 File f = new File(filename); | |
411 // is the filename absolute? | |
71 | 412 if (!f.isAbsolute() && sc != null) { |
18 | 413 // relative path -> use getRealPath to resolve in webapp |
80
4724fc7b4733
add slashes to paths for getRealPath to work with Tomcat 8.
casties
parents:
75
diff
changeset
|
414 filename = sc.getRealPath("/WEB-INF/" + filename); |
18 | 415 } |
416 return filename; | |
417 } | |
418 | |
419 /* | |
420 * (non-Javadoc) | |
421 * | |
422 * @see org.restlet.Application#stop() | |
423 */ | |
424 @Override | |
425 public synchronized void stop() throws Exception { | |
426 /* | |
427 * trying to clean up databases, not sure if this is the right way... | |
428 */ | |
429 if (srv != null) { | |
75 | 430 logger.info("Stopping DB admin server..."); |
18 | 431 srv.stop(); |
432 srv = null; | |
433 } | |
434 if (graphDb != null) { | |
75 | 435 logger.info("Stopping DB..."); |
18 | 436 graphDb.shutdown(); |
437 graphDb = null; | |
438 } | |
439 super.stop(); | |
440 } | |
441 | |
442 private static void registerShutdownHook(final GraphDatabaseService graphDb) { | |
443 // Registers a shutdown hook for the Neo4j instance so that it | |
444 // shuts down nicely when the VM exits (even if you "Ctrl-C" the | |
445 // running example before it's completed) | |
446 Runtime.getRuntime().addShutdownHook(new Thread() { | |
447 @Override | |
448 public void run() { | |
449 graphDb.shutdown(); | |
450 } | |
451 }); | |
452 } | |
453 | |
454 } |