Mercurial > hg > AnnotationManagerN4J
annotate src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java @ 89:247cbbb385de
improved logging.
author | casties |
---|---|
date | Wed, 04 Feb 2015 19:37:02 +0100 |
parents | e3f0613b2f2d |
children | fcb6fe10e08c |
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 /** |
58 | 117 * prefix to create uris for tags in store. |
118 */ | |
119 public static String TAGS_URI_PREFIX = ""; | |
120 public static final String TAGS_URI_KEY = "annotationmanager.uris.tags"; | |
121 | |
122 /** | |
123 * prefix to create uris for persons in store. | |
124 */ | |
125 public static String PERSONS_URI_PREFIX = ""; | |
126 public static final String PERSONS_URI_KEY = "annotationmanager.uris.persons"; | |
127 | |
128 /** | |
129 * prefix to create uris for groups in store. | |
130 */ | |
131 public static String GROUPS_URI_PREFIX = ""; | |
132 public static final String GROUPS_URI_KEY = "annotationmanager.uris.groups"; | |
133 | |
59
e2f86ef9b871
make annotation uri in store configurable. fix npe with no tags.
casties
parents:
58
diff
changeset
|
134 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
|
135 |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
136 |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
137 /* (non-Javadoc) |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
138 * @see org.restlet.Application#start() |
18 | 139 */ |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
140 @Override |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
141 public synchronized void start() throws Exception { |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
142 configure(getContext()); |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
143 super.start(); |
18 | 144 } |
145 | |
146 /** | |
147 * Configures the restlet. | |
148 * Reads serverConfig, consumerKeys and graphDb config from config files and starts graphDb. | |
149 * Uses config from webapp context if already initialized. | |
71 | 150 * @param context |
18 | 151 */ |
71 | 152 protected void configure(Context context) { |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
153 ConcurrentMap<String, Object> attrs = context.getAttributes(); |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
154 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
|
155 if (sc != null) { |
89 | 156 logger.info(getVersion() + " starting..."); |
18 | 157 |
158 /* | |
159 * read config from webapp | |
160 */ | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
161 serverConfig = (Properties) sc.getAttribute(SERVERCONFIG_KEY); |
18 | 162 if (serverConfig == null) { |
163 serverConfig = new Properties(); | |
164 InputStream ps = getResourceAsStream(sc, CONFIG_PROPS_PATH); | |
165 if (ps != null) { | |
75 | 166 logger.fine("loading config from " + CONFIG_PROPS_PATH); |
18 | 167 try { |
168 serverConfig.load(ps); | |
169 /* | |
170 * read serverconfig options | |
171 */ | |
172 graphdbPath = serverConfig.getProperty(GRAPHDB_PATH_KEY, graphdbPath); | |
173 ldapServerUrl = serverConfig.getProperty(LDAP_SERVER_KEY, null); | |
60
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
174 /* |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
175 * uri prefixes |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
176 */ |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
177 if (serverConfig.containsKey(PERSONS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
178 BaseRestlet.PERSONS_URI_PREFIX = serverConfig.getProperty(PERSONS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
179 } |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
180 if (serverConfig.containsKey(GROUPS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
181 BaseRestlet.GROUPS_URI_PREFIX = serverConfig.getProperty(GROUPS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
182 } |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
183 if (serverConfig.containsKey(TAGS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
184 BaseRestlet.TAGS_URI_PREFIX = serverConfig.getProperty(TAGS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
185 } |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
186 if (serverConfig.containsKey(ANNOTATIONS_URI_KEY)) { |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
187 AnnotationStore.ANNOTATION_URI_PREFIX = serverConfig.getProperty(ANNOTATIONS_URI_KEY); |
99d9afcfd04d
configuration of uri prefixes was completely broken.
casties
parents:
59
diff
changeset
|
188 } |
18 | 189 } catch (IOException e) { |
75 | 190 logger.warning("Error loading server config: "+e.toString()); |
18 | 191 } |
75 | 192 logger.fine("config: " + serverConfig); |
18 | 193 } else { |
75 | 194 logger.severe("Unable to get resource " + CONFIG_PROPS_PATH); |
18 | 195 } |
196 // store config | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
197 sc.setAttribute(SERVERCONFIG_KEY, serverConfig); |
18 | 198 } |
199 // look for database service in context | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
200 graphDb = (GraphDatabaseService) sc.getAttribute(GRAPHDB_KEY); |
18 | 201 if (graphDb == null) { |
202 /* | |
203 * open database | |
204 */ | |
205 String dbFn = getResourcePath(sc, graphdbPath); | |
206 if (dbFn != null) { | |
75 | 207 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
|
208 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
|
209 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
|
210 graphDb = graphDbBuilder.newGraphDatabase(); |
18 | 211 registerShutdownHook(graphDb); |
212 // store in context | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
213 sc.setAttribute(GRAPHDB_KEY, graphDb); |
18 | 214 // AnnotationStore |
215 store = new AnnotationStore(graphDb); | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
216 sc.setAttribute(ANNSTORE_KEY, store); |
18 | 217 // 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
|
218 srv = new WrappingNeoServerBootstrapper((GraphDatabaseAPI) graphDb); |
75 | 219 logger.fine("Starting DB admin server..."); |
18 | 220 // store in context |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
221 sc.setAttribute(GRAPHDBSRV_KEY, srv); |
18 | 222 srv.start(); |
223 } else { | |
75 | 224 logger.severe("Unable to get resource " + dbFn); |
18 | 225 } |
22 | 226 } else { |
227 // get existing AnnotationStore | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
228 store = (AnnotationStore) sc.getAttribute(ANNSTORE_KEY); |
18 | 229 } |
230 /* | |
231 * read consumerKeys from webapp | |
232 */ | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
233 consumerKeys = (Properties) sc.getAttribute(CONSUMERKEYS_KEY); |
18 | 234 if (consumerKeys == null) { |
235 consumerKeys = new Properties(); | |
236 InputStream ps = getResourceAsStream(sc, CONSUMER_KEYS_PATH); | |
237 if (ps != null) { | |
75 | 238 logger.fine("loading consumer keys from " + CONSUMER_KEYS_PATH); |
18 | 239 try { |
240 consumerKeys.load(ps); | |
241 } catch (IOException e) { | |
89 | 242 logger.fine("Error loading consumer keys: "+e); |
18 | 243 } |
75 | 244 logger.fine("consumer keys: " + consumerKeys); |
18 | 245 } else { |
75 | 246 logger.severe("Unable to get resource " + CONSUMER_KEYS_PATH); |
18 | 247 } |
248 // store config | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
249 sc.setAttribute(CONSUMERKEYS_KEY, consumerKeys); |
18 | 250 } |
251 } else { | |
75 | 252 logger.severe("Unable to get ServletContext!"); |
18 | 253 } |
254 } | |
255 | |
256 public abstract String getVersion(); | |
257 | |
258 /** | |
57
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
259 * @return the authorizationMode |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
260 */ |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
261 public boolean isAuthorizationMode() { |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
262 return authorizationMode; |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
263 } |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
264 |
4efb21cf0ce0
new non-authorized mode without tokens. enabled by default. configured with annotationmanager.authorization=false property.
casties
parents:
50
diff
changeset
|
265 /** |
19 | 266 * @return the store |
267 */ | |
268 public AnnotationStore getAnnotationStore() { | |
269 return store; | |
270 } | |
271 | |
272 /** | |
18 | 273 * returns consumer secret for consumer key. returns null if consumer key |
274 * doesn't exist. | |
275 * | |
276 * @param consumerKey | |
277 * @return | |
278 */ | |
279 public String getConsumerSecret(String consumerKey) { | |
280 return consumerKeys.getProperty(consumerKey); | |
281 } | |
282 | |
283 /** | |
86 | 284 * Return the full name (String) of the person with the given user-id. |
285 * | |
286 * Contacts a naming service (currently LDAP). | |
287 * | |
288 * @param userId | |
289 * @return full-name | |
290 */ | |
291 public String getFullNameForId(String userId) { | |
292 return getFullNameFromLdap(userId); | |
293 } | |
294 | |
295 /** | |
18 | 296 * Hole den vollen Benutzernamen aus dem LDAP |
297 * | |
298 * @param creator | |
299 * @return | |
300 */ | |
301 public String getFullNameFromLdap(String creator) { | |
302 String retString = creator; // falls nichts gefunden wird einfach den | |
303 // creator zurueckgeben | |
304 if (ldapServerUrl == null) { | |
305 return retString; | |
306 } | |
307 Hashtable<String, String> env = new Hashtable<String, String>(); | |
308 String sp = "com.sun.jndi.ldap.LdapCtxFactory"; | |
309 env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, sp); | |
310 env.put(javax.naming.Context.PROVIDER_URL, ldapServerUrl); | |
311 | |
312 DirContext dctx; | |
313 try { | |
314 dctx = new InitialDirContext(env); | |
315 } catch (NamingException e) { | |
75 | 316 logger.warning("Error in getFullNameFromLDAP! "+e); |
18 | 317 return retString; |
318 } | |
319 | |
320 String base = "ou=people"; | |
321 | |
322 SearchControls sc = new SearchControls(); | |
323 String[] attributeFilter = { "cn", "mail" }; | |
324 sc.setReturningAttributes(attributeFilter); | |
325 sc.setSearchScope(SearchControls.SUBTREE_SCOPE); | |
326 | |
327 String filter = "(uid=" + creator + ")"; | |
328 | |
329 try { | |
330 NamingEnumeration<SearchResult> results = dctx.search(base, filter, sc); | |
331 while (results.hasMore()) { | |
332 SearchResult sr = (SearchResult) results.next(); | |
333 javax.naming.directory.Attributes attrs = sr.getAttributes(); | |
334 | |
335 Attribute attr = attrs.get("cn"); | |
336 retString = (String) attr.get(); | |
337 } | |
338 } catch (NamingException e) { | |
75 | 339 logger.warning("Error in getFullNameFromLDAP!"+e); |
18 | 340 } |
341 | |
342 try { | |
343 dctx.close(); | |
344 } catch (NamingException e) { | |
75 | 345 logger.warning("Error in getFullNameFromLDAP!"+e); |
18 | 346 } |
347 return retString; | |
348 } | |
349 | |
350 /** | |
74 | 351 * returns resource from path as InputStream. |
352 * | |
353 * Tries path in webapp first, then uses classpath loader. | |
354 * Relative paths in webapp start in /WEB-INF/. | |
18 | 355 * |
356 * @param sc | |
357 * @param path | |
358 * @return | |
359 */ | |
360 protected InputStream getResourceAsStream(ServletContext sc, String path) { | |
71 | 361 InputStream ps = null; |
362 if (sc == null) { | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
363 // no servlet context -> use class loader |
71 | 364 ps = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); |
365 } else { | |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
366 // try path in webapp first |
74 | 367 String webPath = path; |
368 if (!webPath.startsWith("/")) { | |
369 // 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
|
370 webPath = "/WEB-INF/" + webPath; |
74 | 371 } |
372 ps = sc.getResourceAsStream(webPath); | |
71 | 373 if (ps == null) { |
374 // try as file | |
74 | 375 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
|
376 if (pf.canRead()) { |
75 | 377 logger.fine("trying file for: " + pf); |
71 | 378 try { |
379 ps = new FileInputStream(pf); | |
380 } catch (FileNotFoundException e) { | |
75 | 381 logger.severe(e.toString()); |
71 | 382 } |
72
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
383 } else { |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
384 // use class loader |
4c2cea836bc0
restlet 2.1 works now. (it's the start() method, stupid!)
casties
parents:
71
diff
changeset
|
385 ps = Thread.currentThread().getContextClassLoader().getResourceAsStream(path); |
18 | 386 } |
387 } | |
388 } | |
389 return ps; | |
390 } | |
391 | |
392 /** | |
393 * get a real file name for a web app file pathname. | |
394 * | |
395 * If filename starts with "/" its treated as absolute else the path is | |
74 | 396 * appended to the /WEB-INF/ directory in the web-app. |
18 | 397 * |
398 * @param filename | |
399 * @param sc | |
400 * @return | |
401 */ | |
402 public static String getResourcePath(ServletContext sc, String filename) { | |
403 File f = new File(filename); | |
404 // is the filename absolute? | |
71 | 405 if (!f.isAbsolute() && sc != null) { |
18 | 406 // 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
|
407 filename = sc.getRealPath("/WEB-INF/" + filename); |
18 | 408 } |
409 return filename; | |
410 } | |
411 | |
412 /* | |
413 * (non-Javadoc) | |
414 * | |
415 * @see org.restlet.Application#stop() | |
416 */ | |
417 @Override | |
418 public synchronized void stop() throws Exception { | |
419 /* | |
420 * trying to clean up databases, not sure if this is the right way... | |
421 */ | |
422 if (srv != null) { | |
75 | 423 logger.info("Stopping DB admin server..."); |
18 | 424 srv.stop(); |
425 srv = null; | |
426 } | |
427 if (graphDb != null) { | |
75 | 428 logger.info("Stopping DB..."); |
18 | 429 graphDb.shutdown(); |
430 graphDb = null; | |
431 } | |
432 super.stop(); | |
433 } | |
434 | |
435 private static void registerShutdownHook(final GraphDatabaseService graphDb) { | |
436 // Registers a shutdown hook for the Neo4j instance so that it | |
437 // shuts down nicely when the VM exits (even if you "Ctrl-C" the | |
438 // running example before it's completed) | |
439 Runtime.getRuntime().addShutdownHook(new Thread() { | |
440 @Override | |
441 public void run() { | |
442 graphDb.shutdown(); | |
443 } | |
444 }); | |
445 } | |
446 | |
447 } |