source: AnnotationManagerN4J/src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java @ 18:aafa3884b2c4

Last change on this file since 18:aafa3884b2c4 was 18:aafa3884b2c4, checked in by casties, 12 years ago

new AnnotationStore? restlet for HTML-UI.
reorganisation of classes.

File size: 11.0 KB
Line 
1package de.mpiwg.itgroup.annotations.restlet;
2
3import java.io.File;
4import java.io.FileInputStream;
5import java.io.FileNotFoundException;
6import java.io.IOException;
7import java.io.InputStream;
8import java.util.Hashtable;
9import java.util.Properties;
10
11import javax.naming.NamingEnumeration;
12import javax.naming.NamingException;
13import javax.naming.directory.Attribute;
14import javax.naming.directory.DirContext;
15import javax.naming.directory.InitialDirContext;
16import javax.naming.directory.SearchControls;
17import javax.naming.directory.SearchResult;
18import javax.servlet.ServletContext;
19
20import org.apache.log4j.BasicConfigurator;
21import org.apache.log4j.Logger;
22import org.neo4j.graphdb.GraphDatabaseService;
23import org.neo4j.graphdb.factory.GraphDatabaseFactory;
24import org.neo4j.kernel.AbstractGraphDatabase;
25import org.neo4j.server.WrappingNeoServerBootstrapper;
26import org.restlet.Application;
27import org.restlet.Context;
28
29import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
30
31public abstract class BaseRestlet extends Application {
32
33    public static Logger logger = Logger.getLogger(BaseRestlet.class);
34
35    /**
36     * Properties holding consumer keys and secrets
37     */
38    protected Properties consumerKeys;
39    public String CONSUMER_KEYS_PATH = "WEB-INF/consumerkeys.property";
40    public static final String CONSUMERKEYS_KEY = "annotationmanager.consumerkeys";
41
42    protected Properties serverConfig;
43    public String CONFIG_PROPS_PATH = "WEB-INF/serverconfig.property";
44    public static final String SERVERCONFIG_KEY = "annotationmanager.serverconfig";
45
46    protected GraphDatabaseService graphDb;
47    public static final String GRAPHDB_KEY = "annotationmanager.graphdb";
48    public static final String GRAPHDB_PATH_KEY = "annotationmanager.graphdb.path";
49    public String graphdbPath = "WEB-INF/neo4j-annotation-db";
50
51    protected WrappingNeoServerBootstrapper srv;
52    public static final String GRAPHDBSRV_KEY = "annotationmanager.graphdb.srv";
53
54    protected AnnotationStore store;
55    public static final String ANNSTORE_KEY = "annotationmanager.store";
56
57    protected String ldapServerUrl;
58    public static final String LDAP_SERVER_KEY = "annotationmanager.ldapserver.url";
59
60    /**
61     * constructor
62     *
63     * @param context
64     */
65    public BaseRestlet(Context context) {
66        super(context);
67        configure();
68    }
69
70    /**
71     * Configures the restlet.
72     * Reads serverConfig, consumerKeys and graphDb config from config files and starts graphDb.
73     * Uses config from webapp context if already initialized.
74     */
75    protected void configure() {
76        ServletContext sc = (ServletContext) getContext().getServerDispatcher().getContext().getAttributes()
77                .get("org.restlet.ext.servlet.ServletContext");
78        if (sc != null) {
79            if (sc.getAttribute("annotationserver.log4j.configured") == null) {
80                // TODO: is this the right place to run the log4j configurator?
81                BasicConfigurator.configure();
82                sc.setAttribute("annotationserver.log4j.configured", "done");
83            }
84            logger.info(getVersion() + " starting...");
85
86            /*
87             * read config from webapp
88             */
89            serverConfig = (Properties) sc.getAttribute(SERVERCONFIG_KEY);
90            if (serverConfig == null) {
91                serverConfig = new Properties();
92                InputStream ps = getResourceAsStream(sc, CONFIG_PROPS_PATH);
93                if (ps != null) {
94                    logger.debug("loading config from " + CONFIG_PROPS_PATH);
95                    try {
96                        serverConfig.load(ps);
97                        /*
98                         * read serverconfig options
99                         */
100                        graphdbPath = serverConfig.getProperty(GRAPHDB_PATH_KEY, graphdbPath);
101                        ldapServerUrl = serverConfig.getProperty(LDAP_SERVER_KEY, null);
102                    } catch (IOException e) {
103                        logger.warn("Error loading server config: ", e);
104                    }
105                    logger.debug("config: " + serverConfig);
106                } else {
107                    logger.error("Unable to get resource " + CONFIG_PROPS_PATH);
108                }
109                // store config
110                sc.setAttribute(SERVERCONFIG_KEY, serverConfig);
111            }
112            // look for database service in context
113            graphDb = (GraphDatabaseService) sc.getAttribute(GRAPHDB_KEY);
114            if (graphDb == null) {
115                /*
116                 * open database
117                 */
118                String dbFn = getResourcePath(sc, graphdbPath);
119                if (dbFn != null) {
120                    logger.debug("opening DB " + dbFn);
121                    graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(dbFn);
122                    registerShutdownHook(graphDb);
123                    // store in context
124                    sc.setAttribute(GRAPHDB_KEY, graphDb);
125                    // AnnotationStore
126                    store = new AnnotationStore(graphDb);
127                    sc.setAttribute(ANNSTORE_KEY, store);
128                    // admin server
129                    srv = new WrappingNeoServerBootstrapper((AbstractGraphDatabase) graphDb);
130                    logger.debug("Starting DB admin server...");
131                    // store in context
132                    sc.setAttribute(GRAPHDBSRV_KEY, srv);
133                    srv.start();
134                } else {
135                    logger.error("Unable to get resource " + dbFn);
136                }
137            }
138            /*
139             * read consumerKeys from webapp
140             */
141            consumerKeys = (Properties) sc.getAttribute(CONSUMERKEYS_KEY);
142            if (consumerKeys == null) {
143                consumerKeys = new Properties();
144                InputStream ps = getResourceAsStream(sc, CONSUMER_KEYS_PATH);
145                if (ps != null) {
146                    logger.debug("loading consumer keys from " + CONSUMER_KEYS_PATH);
147                    try {
148                        consumerKeys.load(ps);
149                    } catch (IOException e) {
150                        // TODO Auto-generated catch block
151                        e.printStackTrace();
152                    }
153                    logger.debug("consumer keys: " + consumerKeys);
154                } else {
155                    logger.error("Unable to get resource " + CONSUMER_KEYS_PATH);
156                }
157                // store config
158                sc.setAttribute(CONSUMERKEYS_KEY, consumerKeys);
159            }
160        } else {
161            logger.error("Unable to get ServletContext!");
162        }
163    }
164
165    public abstract String getVersion();
166
167    /**
168     * returns consumer secret for consumer key. returns null if consumer key
169     * doesn't exist.
170     *
171     * @param consumerKey
172     * @return
173     */
174    public String getConsumerSecret(String consumerKey) {
175        return consumerKeys.getProperty(consumerKey);
176    }
177
178    /**
179     * Hole den vollen Benutzernamen aus dem LDAP
180     *
181     * @param creator
182     * @return
183     */
184    public String getFullNameFromLdap(String creator) {
185        String retString = creator; // falls nichts gefunden wird einfach den
186                                    // creator zurueckgeben
187        if (ldapServerUrl == null) {
188            return retString;
189        }
190        Hashtable<String, String> env = new Hashtable<String, String>();
191        String sp = "com.sun.jndi.ldap.LdapCtxFactory";
192        env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, sp);
193        env.put(javax.naming.Context.PROVIDER_URL, ldapServerUrl);
194
195        DirContext dctx;
196        try {
197            dctx = new InitialDirContext(env);
198        } catch (NamingException e) {
199            logger.error("Error in getFullNameFromLDAP!", e);
200            return retString;
201        }
202
203        String base = "ou=people";
204
205        SearchControls sc = new SearchControls();
206        String[] attributeFilter = { "cn", "mail" };
207        sc.setReturningAttributes(attributeFilter);
208        sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
209
210        String filter = "(uid=" + creator + ")";
211
212        try {
213            NamingEnumeration<SearchResult> results = dctx.search(base, filter, sc);
214            while (results.hasMore()) {
215                SearchResult sr = (SearchResult) results.next();
216                javax.naming.directory.Attributes attrs = sr.getAttributes();
217
218                Attribute attr = attrs.get("cn");
219                retString = (String) attr.get();
220            }
221        } catch (NamingException e) {
222            logger.error("Error in getFullNameFromLDAP!", e);
223        }
224
225        try {
226            dctx.close();
227        } catch (NamingException e) {
228            logger.error("Error in getFullNameFromLDAP!", e);
229        }
230        return retString;
231    }
232
233    /**
234     * returns resource from path (in webapp) as InputStream.
235     *
236     * @param sc
237     * @param path
238     * @return
239     */
240    protected InputStream getResourceAsStream(ServletContext sc, String path) {
241        InputStream ps = sc.getResourceAsStream(path);
242        if (ps == null) {
243            // try as file
244            File pf = new File(sc.getRealPath(path));
245            if (pf != null) {
246                logger.debug("trying file for: " + pf);
247                try {
248                    ps = new FileInputStream(pf);
249                } catch (FileNotFoundException e) {
250                    logger.error(e);
251                }
252            }
253        }
254        return ps;
255    }
256
257    /**
258     * get a real file name for a web app file pathname.
259     *
260     * If filename starts with "/" its treated as absolute else the path is
261     * appended to the base directory of the web-app.
262     *
263     * @param filename
264     * @param sc
265     * @return
266     */
267    public static String getResourcePath(ServletContext sc, String filename) {
268        File f = new File(filename);
269        // is the filename absolute?
270        if (!f.isAbsolute()) {
271            // relative path -> use getRealPath to resolve in webapp
272            filename = sc.getRealPath(filename);
273        }
274        return filename;
275    }
276
277    /*
278     * (non-Javadoc)
279     *
280     * @see org.restlet.Application#stop()
281     */
282    @Override
283    public synchronized void stop() throws Exception {
284        /*
285         * trying to clean up databases, not sure if this is the right way...
286         */
287        if (srv != null) {
288            logger.debug("Stopping DB admin server...");
289            srv.stop();
290            srv = null;
291        }
292        if (graphDb != null) {
293            logger.debug("Stopping DB...");
294            graphDb.shutdown();
295            graphDb = null;
296        }
297        super.stop();
298    }
299
300    private static void registerShutdownHook(final GraphDatabaseService graphDb) {
301        // Registers a shutdown hook for the Neo4j instance so that it
302        // shuts down nicely when the VM exits (even if you "Ctrl-C" the
303        // running example before it's completed)
304        Runtime.getRuntime().addShutdownHook(new Thread() {
305            @Override
306            public void run() {
307                graphDb.shutdown();
308            }
309        });
310    }
311
312}
Note: See TracBrowser for help on using the repository browser.