changeset 71:326369d4bc4d

trying restlet 2.1. doesn't work yet.
author casties
date Fri, 07 Mar 2014 13:48:50 +0100
parents 2b1e6df5e21a
children 4c2cea836bc0
files LICENSE.txt pom.xml src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java
diffstat 3 files changed, 214 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE.txt	Fri Mar 07 13:48:50 2014 +0100
@@ -0,0 +1,166 @@
+		   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions. 
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version. 
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
--- a/pom.xml	Thu Mar 06 15:09:04 2014 +0100
+++ b/pom.xml	Fri Mar 07 13:48:50 2014 +0100
@@ -7,8 +7,8 @@
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <neo4j-version>2.0.1</neo4j-version>
-    <restlet-version>2.0.15</restlet-version>
-    <!-- <restlet-version>2.1.7</restlet-version> -->
+    <!-- <restlet-version>2.0.15</restlet-version> -->
+    <restlet-version>2.1.7</restlet-version>
   </properties>
   <repositories>
     <repository>
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java	Thu Mar 06 15:09:04 2014 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java	Fri Mar 07 13:48:50 2014 +0100
@@ -30,6 +30,7 @@
 import java.io.InputStream;
 import java.util.Hashtable;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
@@ -50,6 +51,8 @@
 import org.neo4j.server.WrappingNeoServerBootstrapper;
 import org.restlet.Application;
 import org.restlet.Context;
+import org.restlet.Restlet;
+import org.restlet.data.LocalReference;
 
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 
@@ -61,14 +64,14 @@
      * Properties holding consumer keys and secrets.
      */
     protected Properties consumerKeys;
-    public String CONSUMER_KEYS_PATH = "WEB-INF/consumerkeys.property";
+    public String CONSUMER_KEYS_PATH = "consumerkeys.property";
     public static final String CONSUMERKEYS_KEY = "annotationmanager.consumerkeys";
 
     /**
      * Properties holding server config.
      */
     protected Properties serverConfig;
-    public String CONFIG_PROPS_PATH = "WEB-INF/serverconfig.property";
+    public String CONFIG_PROPS_PATH = "serverconfig.property";
     public static final String SERVERCONFIG_KEY = "annotationmanager.serverconfig";
 
     /** 
@@ -77,7 +80,7 @@
     protected GraphDatabaseService graphDb;
     public static final String GRAPHDB_KEY = "annotationmanager.graphdb";
     public static final String GRAPHDB_PATH_KEY = "annotationmanager.graphdb.path";
-    public String graphdbPath = "WEB-INF/neo4j-annotation-db";
+    public String graphdbPath = "neo4j-annotation-db";
 
     /**
      * database interface server instance.
@@ -133,29 +136,38 @@
      */
     public BaseRestlet(Context context) {
         super(context);
-        configure();
+        configure(context);
     }
 
     /**
      * Configures the restlet.
      * Reads serverConfig, consumerKeys and graphDb config from config files and starts graphDb.
      * Uses config from webapp context if already initialized. 
+     * @param context 
      */
-    protected void configure() {
-        ServletContext sc = (ServletContext) getContext().getServerDispatcher().getContext().getAttributes()
+    protected void configure(Context context) {
+        Context ctx = Context.getCurrent();
+        ConcurrentMap<String, Object> attrs = ctx.getAttributes();
+        ServletContext sc = null;
+        if (context != null) {
+            Restlet a = context.getServerDispatcher();
+            Context b = a.getContext();
+            ConcurrentMap<String, Object> c = b.getAttributes();
+            sc = (ServletContext) context.getServerDispatcher().getContext().getAttributes()
                 .get("org.restlet.ext.servlet.ServletContext");
-        if (sc != null) {
-            if (sc.getAttribute("annotationserver.log4j.configured") == null) {
+        }
+        if (attrs != null) {
+            if (attrs.get("annotationserver.log4j.configured") == null) {
                 // TODO: is this the right place to run the log4j configurator?
                 BasicConfigurator.configure();
-                sc.setAttribute("annotationserver.log4j.configured", "done");
+                attrs.put("annotationserver.log4j.configured", "done");
             }
             logger.info(getVersion() + " starting...");
 
             /*
              * read config from webapp
              */
-            serverConfig = (Properties) sc.getAttribute(SERVERCONFIG_KEY);
+            serverConfig = (Properties) attrs.get(SERVERCONFIG_KEY);
             if (serverConfig == null) {
                 serverConfig = new Properties();
                 InputStream ps = getResourceAsStream(sc, CONFIG_PROPS_PATH);
@@ -191,10 +203,10 @@
                     logger.error("Unable to get resource " + CONFIG_PROPS_PATH);
                 }
                 // store config
-                sc.setAttribute(SERVERCONFIG_KEY, serverConfig);
+                attrs.put(SERVERCONFIG_KEY, serverConfig);
             }
             // look for database service in context
-            graphDb = (GraphDatabaseService) sc.getAttribute(GRAPHDB_KEY);
+            graphDb = (GraphDatabaseService) attrs.get(GRAPHDB_KEY);
             if (graphDb == null) {
                 /*
                  * open database
@@ -207,27 +219,27 @@
                     graphDb = graphDbBuilder.newGraphDatabase();
                     registerShutdownHook(graphDb);
                     // store in context
-                    sc.setAttribute(GRAPHDB_KEY, graphDb);
+                    attrs.put(GRAPHDB_KEY, graphDb);
                     // AnnotationStore
                     store = new AnnotationStore(graphDb);
-                    sc.setAttribute(ANNSTORE_KEY, store);
+                    attrs.put(ANNSTORE_KEY, store);
                     // admin server
                     srv = new WrappingNeoServerBootstrapper((GraphDatabaseAPI) graphDb);
                     logger.debug("Starting DB admin server...");
                     // store in context
-                    sc.setAttribute(GRAPHDBSRV_KEY, srv);
+                    attrs.put(GRAPHDBSRV_KEY, srv);
                     srv.start();
                 } else {
                     logger.error("Unable to get resource " + dbFn);
                 }
             } else {
                 // get existing AnnotationStore
-                store = (AnnotationStore) sc.getAttribute(ANNSTORE_KEY);
+                store = (AnnotationStore) attrs.get(ANNSTORE_KEY);
             }
             /*
              * read consumerKeys from webapp
              */
-            consumerKeys = (Properties) sc.getAttribute(CONSUMERKEYS_KEY);
+            consumerKeys = (Properties) attrs.get(CONSUMERKEYS_KEY);
             if (consumerKeys == null) {
                 consumerKeys = new Properties();
                 InputStream ps = getResourceAsStream(sc, CONSUMER_KEYS_PATH);
@@ -244,7 +256,7 @@
                     logger.error("Unable to get resource " + CONSUMER_KEYS_PATH);
                 }
                 // store config
-                sc.setAttribute(CONSUMERKEYS_KEY, consumerKeys);
+                attrs.put(CONSUMERKEYS_KEY, consumerKeys);
             }
         } else {
             logger.error("Unable to get ServletContext!");
@@ -341,16 +353,21 @@
      * @return
      */
     protected InputStream getResourceAsStream(ServletContext sc, String path) {
-        InputStream ps = sc.getResourceAsStream(path);
-        if (ps == null) {
-            // try as file
-            File pf = new File(sc.getRealPath(path));
-            if (pf != null) {
-                logger.debug("trying file for: " + pf);
-                try {
-                    ps = new FileInputStream(pf);
-                } catch (FileNotFoundException e) {
-                    logger.error(e);
+        InputStream ps = null;
+        if (sc == null) {
+            ps = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
+        } else {
+            ps = sc.getResourceAsStream(path);
+            if (ps == null) {
+                // try as file
+                File pf = new File(sc.getRealPath(path));
+                if (pf != null) {
+                    logger.debug("trying file for: " + pf);
+                    try {
+                        ps = new FileInputStream(pf);
+                    } catch (FileNotFoundException e) {
+                        logger.error(e);
+                    }
                 }
             }
         }
@@ -370,7 +387,7 @@
     public static String getResourcePath(ServletContext sc, String filename) {
         File f = new File(filename);
         // is the filename absolute?
-        if (!f.isAbsolute()) {
+        if (!f.isAbsolute() && sc != null) {
             // relative path -> use getRealPath to resolve in webapp
             filename = sc.getRealPath(filename);
         }