Search code examples
scalaplayframeworksbtplayframework-2.2orientdb

How can I use OrientDB from a Scala / Play 2.2 project?


I'd like to try OrientDB in a Scala / Play 2.2 project, which uses SBT to build. How do I integrate OrientDB into this project? Bear in mind that I'm new to all of these technologies (my background is mainly Python/C#/JavaScript), so I could do with some handholding :)

Preferably, OrientDB should be installed as a managed dependency if that is possible. I'd also like a good Scala API for the database if that is available.

Some example code to connect to OrientDB server from my application would be cool.

EDIT:

I've tried the Play with OrientDB Play plugin, but without success so far. What I did was (as per the plugin's README):

  1. cd ~/local/play-2.2.1/
  2. git clone [email protected]:ratcashdev/play-with-orientdb.git
  3. cd play-with-orientdb/src
  4. Add val orientDBVersion = "1.6.4" to src/build.sbt
  5. Edit project/build.properties as: sbt.version=0.13.0
  6. Change the last line of project/plugins.sbt to: addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
  7. Remove project/Build.scala (as this caused build errors)
  8. play publish-local
  9. Add "ratcash.net" % "play-with-orientdb_2.10" % "1.0-SNAPSHOT" to the libraryDependencies setting of my project's build.sbt file
  10. Add val orientDBVersion = "1.6.4" to my project's build.sbt file
  11. Edit my project's conf/play.plugins file as: 10000:modules.orientdb.ODBPlugin
  12. Add OrientDB configuration to my project's conf/application.conf file.
  13. Run my project via play run
  14. Visit localhost:9000

The last step results in an error page displaying the following exception: java.lang.ClassNotFoundException: modules.orientdb.ODBPlugin.


Solution

  • I realized I had to hack the Play with OrientDB plugin to make it work with Play 2.2 / SBT 0.13, and eventually made it work as far as I can tell. I forked the original project and shared my changes on GitHub. I've pasted below my patch against the original source code that was necessary to use it from Play 2.2:

     diff --git a/src/app/modules/orientdb/actions/ODBTransactionWrapper.java b/src/app/modules/orientdb/actions/ODBTransactionWrapper.java
     index 348276b..753317c 100644
     --- a/src/app/modules/orientdb/actions/ODBTransactionWrapper.java
     +++ b/src/app/modules/orientdb/actions/ODBTransactionWrapper.java
     @@ -6,14 +6,15 @@ import modules.orientdb.ODB.DBTYPE;
      import modules.orientdb.annotation.Transactional;
      import play.mvc.Action;
      import play.mvc.Http;
     -import play.mvc.Result;
     +import play.mvc.SimpleResult;
     +import play.libs.F.Promise;
    
      public class ODBTransactionWrapper extends Action<Transactional>
      {
          @Override
     -    public Result call(Http.Context context) throws Throwable
     +    public Promise<SimpleResult> call(Http.Context context) throws Throwable
          {
     -      Result res = ok("Did nothing");
     +      Promise<SimpleResult> res;
            //internalServerError();
            try {
                beforeInvocation();
     @@ -23,6 +24,7 @@ public class ODBTransactionWrapper extends Action<Transactional>
                System.out.println("exception happened.");
                e.printStackTrace();
                onInvocationException(e);
     +            throw e;
            } finally {
                System.out.println("cleanup");
                invocationFinally();
     @@ -34,7 +36,6 @@ public class ODBTransactionWrapper extends Action<Transactional>
            DBTYPE type = this.getClass().getAnnotation(Transactional.class).db();
            if(type == DBTYPE.DOCUMENT || type == DBTYPE.OBJECT)
                Model.objectDB().begin();
     -
          }
    
          public void invocationFinally() {
     diff --git a/src/project/Build.scala b/src/project/Build.scala
     index f9301ee..c85e2c1 100644
     --- a/src/project/Build.scala
     +++ b/src/project/Build.scala
     @@ -1,17 +1,16 @@
      import sbt._
      import Keys._
     -import PlayProject._
    
      object ApplicationBuild extends Build {
    
     -    val appName         = "Play with OrientDB"
     +    val appName         = "play-with-orientdb"
          val appVersion      = "1.0-SNAPSHOT"
    
          // IMPORTANT. The plugin can't be compiled without this
     -    val orientDBVersion = "1.3.0-SNAPSHOT"
     +    val orientDBVersion = "1.6.4"
    
          val appDependencies = Seq(
     -      javaCore
     +      //javaCore
    
            // disable JDBC and javaEBean
            //javaJdbc,
     diff --git a/src/project/build.properties b/src/project/build.properties
     index 82f1ca3..8cbb522 100644
     --- a/src/project/build.properties
     +++ b/src/project/build.properties
     @@ -1 +1 @@
     -sbt.version=0.12.2-RC2
     \ No newline at end of file
     +sbt.version=0.13.0
     \ No newline at end of file
     diff --git a/src/project/plugins.sbt b/src/project/plugins.sbt
     index 92ccea5..a815558 100644
     --- a/src/project/plugins.sbt
     +++ b/src/project/plugins.sbt
     @@ -5,4 +5,4 @@ logLevel := Level.Warn
      resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
    
      // Use the Play sbt plugin for Play projects
     -addSbtPlugin("play" % "sbt-plugin" % "2.1-RC2")
     \ No newline at end of file
     +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
     \ No newline at end of file
    

    I haven't got as far as to make real use of this plugin, except include it in my application. I can see that the plugin is able to connect to OrientDB upon server startup though, so it should be usable from here on.