You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2017/10/26 07:34:49 UTC

[19/33] polygene-java git commit: Working on new Envisage over http.

Working on new Envisage over http.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/2bef7120
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/2bef7120
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/2bef7120

Branch: refs/heads/develop
Commit: 2bef7120f17475e547234f35f6aae2a7f9e6a24b
Parents: 96f0713
Author: niclas <ni...@hedhman.org>
Authored: Mon Sep 4 13:06:16 2017 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Mon Sep 4 13:06:16 2017 +0800

----------------------------------------------------------------------
 .../runtime/activation/ActivationDelegate.java  |   4 +-
 .../serialization/JsonRepresentation.java       |   5 +
 .../HttpServerModule/bootstrap.tmpl             |   7 +-
 .../RestAPIApplication/Launcher.java.tmpl       |  24 +++-
 .../RestAPIApplication/bootstrap-test.tmpl      |  22 +---
 tools/model-detail/build.gradle                 |   1 +
 .../polygene/tools/model/EnvisageServlet.java   | 113 +++++++++++++++++++
 .../descriptor/ApplicationDetailDescriptor.java |  52 ++++++++-
 .../model/descriptor/LayerDetailDescriptor.java |  23 ++++
 .../model-detail/src/main/resources/index.html  |  11 ++
 10 files changed, 233 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/core/runtime/src/main/java/org/apache/polygene/runtime/activation/ActivationDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/activation/ActivationDelegate.java b/core/runtime/src/main/java/org/apache/polygene/runtime/activation/ActivationDelegate.java
index af3a812..662b1c2 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/activation/ActivationDelegate.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/activation/ActivationDelegate.java
@@ -157,7 +157,7 @@ public final class ActivationDelegate
             {
                 throw ( (ActivationException) e );
             }
-            throw new ActivationException( "Unable to Activate application.", e );
+            throw new ActivationException( "Unable to Activate application: " + target, e );
         }
     }
 
@@ -308,7 +308,7 @@ public final class ActivationDelegate
         public Object get()
         {
             throw new IllegalStateException( "Service is passive, either activating and"
-                                             + " cannot be used yet or passivating and cannot be used anymore." );
+                                             + " cannot be used yet or passivating and cannot be used anymore: " + reference );
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/libraries/restlet/src/main/java/org/apache/polygene/library/restlet/serialization/JsonRepresentation.java
----------------------------------------------------------------------
diff --git a/libraries/restlet/src/main/java/org/apache/polygene/library/restlet/serialization/JsonRepresentation.java b/libraries/restlet/src/main/java/org/apache/polygene/library/restlet/serialization/JsonRepresentation.java
index fafabe4..01947cf 100644
--- a/libraries/restlet/src/main/java/org/apache/polygene/library/restlet/serialization/JsonRepresentation.java
+++ b/libraries/restlet/src/main/java/org/apache/polygene/library/restlet/serialization/JsonRepresentation.java
@@ -32,6 +32,7 @@ import org.apache.polygene.api.serialization.Serializer;
 import org.apache.polygene.api.structure.ModuleDescriptor;
 import org.apache.polygene.spi.PolygeneSPI;
 import org.restlet.data.MediaType;
+import org.restlet.engine.application.StatusInfo;
 import org.restlet.representation.OutputRepresentation;
 import org.restlet.representation.Representation;
 
@@ -121,6 +122,10 @@ public class JsonRepresentation<T> extends OutputRepresentation
         {
             representation.write( outputStream );
         }
+        else if( object instanceof StatusInfo )
+        {
+            outputStream.write(((StatusInfo) object).getReasonPhrase().getBytes());
+        }
         else if( object != null )
         {
             stateSerialization.serialize( Serializer.Options.NO_TYPE_INFO, outputStream, object );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/generator-polygene/app/templates/ConnectivityLayer/HttpServerModule/bootstrap.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/ConnectivityLayer/HttpServerModule/bootstrap.tmpl b/tools/generator-polygene/app/templates/ConnectivityLayer/HttpServerModule/bootstrap.tmpl
index addab42..2018bfa 100644
--- a/tools/generator-polygene/app/templates/ConnectivityLayer/HttpServerModule/bootstrap.tmpl
+++ b/tools/generator-polygene/app/templates/ConnectivityLayer/HttpServerModule/bootstrap.tmpl
@@ -37,7 +37,9 @@ import org.apache.polygene.bootstrap.LayerAssembly;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.bootstrap.layered.ModuleAssembler;
 import org.apache.polygene.library.restlet.PolygeneServerServlet;
-
+<% if( hasFeature( 'envisage' ) ) {
+%>import org.apache.polygene.tools.model.EnvisageServlet;
+<% } %>
 import <%= polygene.packageName %>.rest.<%= polygene.name %>RestApplication;
 
 import static org.apache.polygene.library.http.Servlets.addServlets;
@@ -97,6 +99,9 @@ public class HttpServerModule
         defaults.port().set( DEFAULT_PORT );
         HashMap<String, String> initParams = new HashMap<>();
         initParams.put("org.restlet.application", <%= polygene.name %>RestApplication.class.getName() );
+<% if( hasFeature( 'envisage' ) ) {
+%>        addServlets( serve( "/envisage/*" ).with( EnvisageServlet.class ) ).to( module );
+<% } %>
         addServlets( serve( "/*" ).with(PolygeneServerServlet.class ).withInitParams( initParams ) ).to( module );
         return module;
     }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl b/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
index ad03b15..ad1909f 100644
--- a/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
+++ b/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
@@ -23,29 +23,45 @@ import <%= polygene.packageName %>.bootstrap.<%= polygene.name %>ApplicationAsse
 import <%= polygene.packageName %>.bootstrap.connectivity.ConnectivityLayer;
 import <%= polygene.packageName %>.bootstrap.connectivity.RestApiModule;
 
+import java.util.function.Consumer;
+
 import org.apache.polygene.api.structure.Application;
+import org.apache.polygene.bootstrap.ApplicationAssembly;
 import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.layered.LayeredApplicationAssembler;
 import org.apache.polygene.library.restlet.PolygeneRestApplicationLauncher;
+<% if( hasFeature( 'envisage' ) ) {
+%>import org.apache.polygene.tools.model.descriptor.ApplicationDetailDescriptor;
+<% } %>
 
 public class <%= polygene.name %>Launcher extends PolygeneRestApplicationLauncher
 {
     private static final String name = "<%= polygene.name %>";
     private static final String version = "0.1";
-    private Application.Mode mode = getApplicationMode();
+    private Application.Mode mode;
+    private Consumer<ApplicationAssembly> customize;
+<% if( hasFeature( 'envisage' ) ) {
+%>    private ApplicationDetailDescriptor detailedModel;
+<% } %>
 
     public static void main( String[] args )
         throws Exception
     {
-        <%= polygene.name %>Launcher app = new <%= polygene.name %>Launcher();
+        <%= polygene.name %>Launcher app = new <%= polygene.name %>Launcher(getApplicationMode(), none -> {} );
         app.installShutdownHook();
         app.initialize();
     }
 
+    public <%= polygene.name %>Launcher(Application.Mode mode, Consumer<ApplicationAssembly> customize)
+    {
+        this.mode = mode;
+        this.customize = customize;
+    }
+
     protected LayeredApplicationAssembler createApplicationAssembler()
         throws AssemblyException
     {
-        return new <%= polygene.name %>ApplicationAssembler( name, version, mode, none -> {} );
+        return new <%= polygene.name %>ApplicationAssembler( name, version, mode, customize );
     }
 
     @Override
@@ -64,7 +80,7 @@ public class <%= polygene.name %>Launcher extends PolygeneRestApplicationLaunche
         return RestApiModule.NAME;
     }
 
-    private Application.Mode getApplicationMode()
+    private static Application.Mode getApplicationMode()
     {
         String mode = System.getenv( "APP_MODE" );
         if( mode == null )

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl b/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
index a0cad7a..1e50b00 100644
--- a/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
+++ b/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
@@ -85,27 +85,7 @@ public class BootstrapTest
     public void applicationBootstrapSucceeds()
         throws Exception
     {
-        <%= polygene.name %>Launcher launcher = new <%= polygene.name %>Launcher()
-        {
-            @Override
-            protected LayeredApplicationAssembler createApplicationAssembler()
-                throws AssemblyException
-            {
-                return new <%= polygene.name %>ApplicationAssembler( "LaunchTest", "0", Application.Mode.development, BootstrapTest.this::setupTest )
-                {
-                    @Override
-                    protected void onModelCreated( ApplicationDescriptor model )
-                    {
-                        ApplicationDetailDescriptor modelDescription = ApplicationDetailDescriptorBuilder.createApplicationDetailDescriptor( model );
-                        System.out.println( "Application Model" );
-                        JsonWriter writer = Json.createWriter( System.out );
-                        System.out.println();
-                        writer.writeObject( modelDescription.toJson() );
-                        super.onModelCreated( model );
-                    }
-                };
-            }
-        };
+        <%= polygene.name %>Launcher launcher = new <%= polygene.name %>Launcher(Application.Mode.development, this::setupTest);
         launcher.initialize();
         System.out.println("Application Launched...");
         // Thread.sleep( 3600000L );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/model-detail/build.gradle
----------------------------------------------------------------------
diff --git a/tools/model-detail/build.gradle b/tools/model-detail/build.gradle
index c6cd684..20dbc15 100644
--- a/tools/model-detail/build.gradle
+++ b/tools/model-detail/build.gradle
@@ -26,6 +26,7 @@ jar { manifest { name = "Apache Polygeneâ„¢ Model Detail" }}
 
 dependencies {
   api polygene.core.bootstrap
+  implementation libraries.servlet_api
 
   runtimeOnly polygene.core.runtime
 

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/model-detail/src/main/java/org/apache/polygene/tools/model/EnvisageServlet.java
----------------------------------------------------------------------
diff --git a/tools/model-detail/src/main/java/org/apache/polygene/tools/model/EnvisageServlet.java b/tools/model-detail/src/main/java/org/apache/polygene/tools/model/EnvisageServlet.java
new file mode 100644
index 0000000..a72d2b2
--- /dev/null
+++ b/tools/model-detail/src/main/java/org/apache/polygene/tools/model/EnvisageServlet.java
@@ -0,0 +1,113 @@
+package org.apache.polygene.tools.model;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.JsonWriter;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.polygene.api.activation.Activation;
+import org.apache.polygene.api.activation.ActivationException;
+import org.apache.polygene.api.activation.PassivationException;
+import org.apache.polygene.api.injection.scope.Structure;
+import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.structure.ApplicationDescriptor;
+
+import static org.apache.polygene.tools.model.descriptor.ApplicationDetailDescriptorBuilder.createApplicationDetailDescriptor;
+
+@Mixins( EnvisageServlet.Mixin.class )
+public interface EnvisageServlet extends Servlet
+{
+    class Mixin extends HttpServlet
+        implements EnvisageServlet
+    {
+        private JsonObject model;
+
+        public Mixin( @Structure ApplicationDescriptor descriptor )
+        {
+            model = createApplicationDetailDescriptor( descriptor ).toJson();
+        }
+
+        @Override
+        protected void doGet( HttpServletRequest req, HttpServletResponse resp )
+            throws ServletException, IOException
+        {
+            String pathInfo = req.getPathInfo();
+            log( "Fetch " + pathInfo );
+            if( isStatic( pathInfo ) )
+            {
+                serviceStatic( pathInfo, resp );
+            }
+            if( isJson( pathInfo ) )
+            {
+                serviceJson( resp );
+            }
+        }
+
+        private boolean isStatic( String pathInfo )
+        {
+            return (pathInfo.equals( "/index.html" )
+                   || pathInfo.startsWith( "/js/" )
+                   || pathInfo.startsWith( "/css/" )
+                   || pathInfo.startsWith( "/images/" ) )
+                   && !pathInfo.contains( ".." )
+                ;
+        }
+
+        private boolean isJson( String pathInfo )
+        {
+            return pathInfo.equals( "/model/" );
+        }
+
+        private void serviceStatic( String pathInfo, HttpServletResponse resp )
+            throws IOException
+        {
+            ServletOutputStream out = resp.getOutputStream();
+            try( InputStream resource = getClass().getClassLoader().getResourceAsStream( pathInfo ) )
+            {
+                if( resource == null )
+                {
+                    resp.setStatus( HttpServletResponse.SC_NOT_FOUND );
+                }
+                else
+                {
+                    copy( resource, out );
+                }
+            }
+        }
+
+        private void serviceJson( HttpServletResponse resp )
+            throws IOException
+        {
+            if( model == null )
+            {
+                resp.setStatus( HttpServletResponse.SC_NO_CONTENT );
+            }
+            else
+            {
+                PrintWriter out = resp.getWriter();
+                JsonWriter writer = Json.createWriter( out );
+                writer.writeObject( model );
+                writer.close();
+                out.flush();
+            }
+        }
+
+        private void copy( InputStream resource, ServletOutputStream out )
+            throws IOException
+        {
+            int b;
+            while( ( b = resource.read() ) >= 0 )
+            {
+                out.write( b );
+            }
+            out.flush();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/ApplicationDetailDescriptor.java
----------------------------------------------------------------------
diff --git a/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/ApplicationDetailDescriptor.java b/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/ApplicationDetailDescriptor.java
index e23247f..d6c18fd 100644
--- a/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/ApplicationDetailDescriptor.java
+++ b/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/ApplicationDetailDescriptor.java
@@ -19,9 +19,12 @@
  */
 package org.apache.polygene.tools.model.descriptor;
 
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import javax.json.Json;
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonObject;
@@ -41,13 +44,14 @@ public final class ApplicationDetailDescriptor
 {
     private final ApplicationDescriptor descriptor;
     private final List<ActivatorDetailDescriptor> activators = new LinkedList<>();
-    private final List<LayerDetailDescriptor> layers = new LinkedList<>();
+    private final SortedSet<LayerDetailDescriptor> layers;
 
     ApplicationDetailDescriptor( ApplicationDescriptor descriptor )
         throws IllegalArgumentException
     {
         Objects.requireNonNull( descriptor, "ApplicationDescriptor" );
         this.descriptor = descriptor;
+        layers = new TreeSet<>( new UsedLayerComparator() );
     }
 
     /**
@@ -81,6 +85,7 @@ public final class ApplicationDetailDescriptor
 
     final void addLayer( LayerDetailDescriptor descriptor )
     {
+        System.out.println("NICLAS!!!! Layer:" + descriptor.toString());
         Objects.requireNonNull( descriptor, "LayerDetailDescriptor" );
         descriptor.setApplication( this );
         layers.add( descriptor );
@@ -136,4 +141,49 @@ public final class ApplicationDetailDescriptor
 
         return appBuilder.build();
     }
+
+    private static class UsedLayerComparator
+        implements Comparator<LayerDetailDescriptor>
+    {
+
+        @Override
+        public int compare( LayerDetailDescriptor d1, LayerDetailDescriptor d2 )
+        {
+            if( d1.equals( d2 ))
+            {
+                return 0;
+            }
+            if( uses( d1, d2 ) )
+            {
+                return -1;
+            }
+            if( uses(d2, d1) )
+            {
+                return 1;
+            }
+            return 0;
+        }
+
+        // 0 = same layer
+        // 1 = user uses used
+        // 2 = not determination
+        private boolean uses( LayerDetailDescriptor user, LayerDetailDescriptor used )
+        {
+            System.out.println("Compare " + user.usedLayers() + " : " + used.usedLayers());
+            System.out.println("Compare " + user.usedBy() + " : " + used.usedBy());
+            System.out.println("---");
+            if( user.equals( used ))
+            {
+                return true;
+            }
+            for( LayerDetailDescriptor usedLayer : user.usedLayers() )
+            {
+                if( uses( usedLayer, used ) )
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/LayerDetailDescriptor.java
----------------------------------------------------------------------
diff --git a/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/LayerDetailDescriptor.java b/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/LayerDetailDescriptor.java
index d96f12d..ac4d4b5 100644
--- a/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/LayerDetailDescriptor.java
+++ b/tools/model-detail/src/main/java/org/apache/polygene/tools/model/descriptor/LayerDetailDescriptor.java
@@ -160,6 +160,29 @@ public final class LayerDetailDescriptor
     }
 
     @Override
+    public boolean equals( Object o )
+    {
+        if( this == o )
+        {
+            return true;
+        }
+        if( o == null || getClass() != o.getClass() )
+        {
+            return false;
+        }
+
+        LayerDetailDescriptor that = (LayerDetailDescriptor) o;
+
+        return descriptor.equals( that.descriptor );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return descriptor.hashCode();
+    }
+
+    @Override
     public final String toString()
     {
         return descriptor.name();

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/2bef7120/tools/model-detail/src/main/resources/index.html
----------------------------------------------------------------------
diff --git a/tools/model-detail/src/main/resources/index.html b/tools/model-detail/src/main/resources/index.html
new file mode 100644
index 0000000..486feab
--- /dev/null
+++ b/tools/model-detail/src/main/resources/index.html
@@ -0,0 +1,11 @@
+<html>
+<body>
+<h1>Envisage</h1>
+<div class="header"></div>
+<div class="menu"></div>
+<div class="type-tree"></div>
+<div class="app-structure"></div>
+<div class="details"></div>
+<div class="footer"></div>
+</body>
+</html>
\ No newline at end of file