Sfoglia il codice sorgente

Added Support To easily customize actions via builders

gremlin 4 anni fa
parent
commit
1d0a003b96
39 ha cambiato i file con 411 aggiunte e 88 eliminazioni
  1. 9 0
      pom.xml
  2. 17 0
      src/main/java/riomhaire/lti/JavaLti13ToolApplication.java
  3. 35 0
      src/main/java/riomhaire/lti/Registry.java
  4. 7 5
      src/main/java/riomhaire/lti/core/adapters/token/JWKBasedJwtToMapAdapter.java
  5. 27 0
      src/main/java/riomhaire/lti/core/adapters/token/JWKBasedJwtToMapAdapterBuilder.java
  6. 10 5
      src/main/java/riomhaire/lti/core/business/actions/LaunchContent.java
  7. 10 0
      src/main/java/riomhaire/lti/core/business/actions/NOPAction.java
  8. 23 16
      src/main/java/riomhaire/lti/core/business/actions/ProcessLtiMessage.java
  9. 17 8
      src/main/java/riomhaire/lti/core/business/actions/ProcessOidcRequest.java
  10. 11 5
      src/main/java/riomhaire/lti/core/business/actions/SelectDeepLinkContent.java
  11. 33 0
      src/main/java/riomhaire/lti/core/business/builder/AbstractActionBuilder.java
  12. 23 0
      src/main/java/riomhaire/lti/core/business/builder/ActionBuilder.java
  13. 6 0
      src/main/java/riomhaire/lti/core/business/builder/ActionBuilderBuilder.java
  14. 32 0
      src/main/java/riomhaire/lti/core/business/builder/ActionBuilderFactory.java
  15. 9 0
      src/main/java/riomhaire/lti/core/business/builder/Builder.java
  16. 12 0
      src/main/java/riomhaire/lti/core/business/builder/LaunchContentBuilder.java
  17. 12 0
      src/main/java/riomhaire/lti/core/business/builder/NopBuilder.java
  18. 11 0
      src/main/java/riomhaire/lti/core/business/builder/ProcessLtiMessageBuilder.java
  19. 12 0
      src/main/java/riomhaire/lti/core/business/builder/ProcessOidcRequestBuilder.java
  20. 13 0
      src/main/java/riomhaire/lti/core/business/builder/SelectDeepLinkContentBuilder.java
  21. 5 4
      src/main/java/riomhaire/lti/core/infrastructure/api/tool/LaunchEndpoint.java
  22. 7 4
      src/main/java/riomhaire/lti/core/infrastructure/api/tool/OIDCEndpoint.java
  23. 1 1
      src/main/java/riomhaire/lti/core/infrastructure/configuration/DecoupledLogicSetup.java
  24. 3 3
      src/main/java/riomhaire/lti/core/infrastructure/facades/clientregistration/ConfigBasedClientRegistrationResolver.java
  25. 3 3
      src/main/java/riomhaire/lti/core/infrastructure/facades/clientregistration/RedisBasedClientRegistrationResolver.java
  26. 1 1
      src/main/java/riomhaire/lti/core/model/ClientConfiguration.java
  27. 1 1
      src/main/java/riomhaire/lti/core/model/interfaces/Action.java
  28. 8 0
      src/main/java/riomhaire/lti/core/model/interfaces/ApplicationRegistry.java
  29. 2 2
      src/main/java/riomhaire/lti/core/model/interfaces/ClientRegistrationResolver.java
  30. 1 1
      src/main/java/riomhaire/lti/core/model/interfaces/DecodeException.java
  31. 1 1
      src/main/java/riomhaire/lti/core/model/interfaces/Decoder.java
  32. 12 0
      src/main/java/riomhaire/lti/demo/RiomhaireApplicationContentLauncher.java
  33. 12 0
      src/main/java/riomhaire/lti/demo/RiomhaireApplicationContentLauncherBuilder.java
  34. 0 21
      src/main/java/riomhaire/lti/infrastructure/Registry.java
  35. 0 5
      src/main/java/riomhaire/lti/model/interfaces/ApplicationRegistry.java
  36. 7 0
      src/main/resources/application.properties
  37. 1 1
      src/main/resources/templates/dump-launch.html
  38. 1 1
      src/main/resources/templates/error.html
  39. 16 0
      src/main/resources/templates/nop.html

+ 9 - 0
pom.xml

@@ -107,6 +107,15 @@
 					</excludes>
 				</configuration>
 			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>14</source>
+					<target>14</target>
+<!--					<compilerArgs>&#45;&#45;enable-preview</compilerArgs>-->
+				</configuration>
+			</plugin>
 		</plugins>
 	</build>
 

+ 17 - 0
src/main/java/riomhaire/lti/JavaLti13ToolApplication.java

@@ -2,10 +2,27 @@ package riomhaire.lti;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import riomhaire.lti.core.business.builder.*;
+import riomhaire.lti.demo.RiomhaireApplicationContentLauncherBuilder;
 
 @SpringBootApplication
+@Configuration
 public class JavaLti13ToolApplication {
 
+//	@Bean
+//	public ActionBuilderFactory buildFactory() {
+//		return new ActionBuilderFactory(()-> new LaunchContentBuilder(),
+//				()->new ProcessLtiMessageBuilder(),
+//				()->new ProcessOidcRequestBuilder(),
+//				()->new SelectDeepLinkContentBuilder()) ;
+//	}
+	@Bean
+	public ActionBuilderFactory customBuildFactory() {
+		return new ActionBuilderFactory(()-> new RiomhaireApplicationContentLauncherBuilder()) ;
+	}
+
 	public static void main(String[] args) {
 		SpringApplication.run(JavaLti13ToolApplication.class, args);
 	}

+ 35 - 0
src/main/java/riomhaire/lti/Registry.java

@@ -0,0 +1,35 @@
+package riomhaire.lti;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import riomhaire.lti.core.business.builder.ActionBuilderFactory;
+import riomhaire.lti.core.model.interfaces.ApplicationRegistry;
+import riomhaire.lti.core.model.interfaces.ClientRegistrationResolver;
+
+
+@Service
+public class Registry implements ApplicationRegistry {
+
+  @Autowired
+  @Qualifier("redisBasedClientRegistrationResolver")
+  ClientRegistrationResolver clientRegistrationResolver;
+
+  @Autowired
+  ActionBuilderFactory actionBuilderFactory;
+  
+  @Override
+  public ClientRegistrationResolver clientRegistrationResolver() {
+    return clientRegistrationResolver;
+  }
+
+  /**
+   * This factory returns builders of actions... each launch creates clean builders and objects
+   * @return
+   */
+  @Override
+  public ActionBuilderFactory actionBuilderFactory() {
+    return actionBuilderFactory;
+  }
+}

+ 7 - 5
src/main/java/riomhaire/lti/adapters/token/JWKBasedJwtToMapAdapter.java → src/main/java/riomhaire/lti/core/adapters/token/JWKBasedJwtToMapAdapter.java

@@ -1,8 +1,7 @@
-package riomhaire.lti.adapters.token;
+package riomhaire.lti.core.adapters.token;
 
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.interfaces.DecodedJWT;
-import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
 import org.jose4j.jwk.HttpsJwks;
 import org.jose4j.jwt.JwtClaims;
@@ -10,18 +9,21 @@ import org.jose4j.jwt.consumer.InvalidJwtException;
 import org.jose4j.jwt.consumer.JwtConsumer;
 import org.jose4j.jwt.consumer.JwtConsumerBuilder;
 import org.jose4j.keys.resolvers.HttpsJwksVerificationKeyResolver;
-import riomhaire.lti.model.interfaces.DecodeException;
-import riomhaire.lti.model.interfaces.Decoder;
+import riomhaire.lti.core.model.interfaces.DecodeException;
+import riomhaire.lti.core.model.interfaces.Decoder;
 
 import java.util.Map;
 
 @Slf4j
-@Builder
 public class JWKBasedJwtToMapAdapter implements Decoder<Map<String, Object>,String> {
 
     protected String jwksUrl;
     protected boolean skipVerification;
 
+    public JWKBasedJwtToMapAdapter(String jwksUrl, boolean skipVerification) {
+        this.jwksUrl = jwksUrl;
+        this.skipVerification = skipVerification;
+    }
 
     public Map<String, Object> decode(String token) throws DecodeException {
         DecodedJWT jwt = JWT.decode(token);

+ 27 - 0
src/main/java/riomhaire/lti/core/adapters/token/JWKBasedJwtToMapAdapterBuilder.java

@@ -0,0 +1,27 @@
+package riomhaire.lti.core.adapters.token;
+
+public final class JWKBasedJwtToMapAdapterBuilder {
+    protected String jwksUrl;
+    protected boolean skipVerification;
+
+    private JWKBasedJwtToMapAdapterBuilder() {
+    }
+
+    public static JWKBasedJwtToMapAdapterBuilder context() {
+        return new JWKBasedJwtToMapAdapterBuilder();
+    }
+
+    public JWKBasedJwtToMapAdapterBuilder jwksUrl(String jwksUrl) {
+        this.jwksUrl = jwksUrl;
+        return this;
+    }
+
+    public JWKBasedJwtToMapAdapterBuilder skipVerification(boolean skipVerification) {
+        this.skipVerification = skipVerification;
+        return this;
+    }
+
+    public JWKBasedJwtToMapAdapter build() {
+        return new JWKBasedJwtToMapAdapter(jwksUrl, skipVerification);
+    }
+}

+ 10 - 5
src/main/java/riomhaire/lti/business/actions/LaunchContent.java → src/main/java/riomhaire/lti/core/business/actions/LaunchContent.java

@@ -1,17 +1,16 @@
-package riomhaire.lti.business.actions;
+package riomhaire.lti.core.business.actions;
 
-import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.servlet.ModelAndView;
-import riomhaire.lti.infrastructure.Registry;
-import riomhaire.lti.model.interfaces.Action;
+import riomhaire.lti.Registry;
+import riomhaire.lti.core.model.interfaces.Action;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
 
 @Slf4j
-@Builder
+
 /**
  * LaunchContent is called after we have decoded the ltu1.3 token an ascertained that the message type is 'LtiResourceLinkRequest'
  * This simple example just displays whats in the message after simplifies the main keys
@@ -22,6 +21,12 @@ public class LaunchContent implements Action<ModelAndView> {
     Map<String, Object> metadata;
     Map<String, Object> claims;
 
+    public LaunchContent(Registry registry, Map<String, String> queryParams, Map<String, Object> metadata, Map<String, Object> claims) {
+        this.registry = registry;
+        this.queryParams = queryParams;
+        this.metadata = metadata;
+        this.claims = claims;
+    }
 
     @Override
     public ModelAndView execute() {

+ 10 - 0
src/main/java/riomhaire/lti/core/business/actions/NOPAction.java

@@ -0,0 +1,10 @@
+package riomhaire.lti.core.business.actions;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public class NOPAction implements Action<ModelAndView> {
+    public ModelAndView execute() {
+        return new ModelAndView("nop");
+    }
+}

+ 23 - 16
src/main/java/riomhaire/lti/business/actions/ProcessLtiMessage.java → src/main/java/riomhaire/lti/core/business/actions/ProcessLtiMessage.java

@@ -1,31 +1,38 @@
-package riomhaire.lti.business.actions;
+package riomhaire.lti.core.business.actions;
 
 import com.auth0.jwt.JWT;
-import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.servlet.ModelAndView;
-import riomhaire.lti.adapters.token.JWKBasedJwtToMapAdapter;
-import riomhaire.lti.infrastructure.Registry;
-import riomhaire.lti.model.interfaces.Action;
-import riomhaire.lti.model.interfaces.DecodeException;
+import riomhaire.lti.Registry;
+import riomhaire.lti.core.adapters.token.JWKBasedJwtToMapAdapterBuilder;
+import riomhaire.lti.core.model.interfaces.Action;
+import riomhaire.lti.core.model.interfaces.DecodeException;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import static riomhaire.lti.core.business.builder.Builder.LaunchContentBuilder;
+import static riomhaire.lti.core.business.builder.Builder.SelectDeepLinkContentBuilder;
+
 /**
  * This is the router for lti type messages - lti launch and create deep link .. this action will delegate to the
  * appropriate sub handler
  */
 @Slf4j
-@Builder
 public class ProcessLtiMessage implements Action<ModelAndView> {
     public static final String CLAIM_MESSAGE_TYPE = "https://purl.imsglobal.org/spec/lti/claim/message_type";
     public static final String LTI_RESOURCE_LINK_REQUEST = "LtiResourceLinkRequest";
     public static final String LTI_DEEP_LINKING_REQUEST = "LtiDeepLinkingRequest";
-    Registry registry;
-    Map<String, String> queryParams;
-    Map<String, Object> metadata;
 
+    protected Registry registry;
+    protected Map<String, String> queryParams;
+    protected Map<String, Object> metadata;
+
+    public ProcessLtiMessage(Registry registry, Map<String, String> queryParams, Map<String, Object> metadata) {
+        this.registry = registry;
+        this.queryParams = queryParams;
+        this.metadata = metadata;
+    }
 
     @Override
     public ModelAndView execute() {
@@ -46,7 +53,7 @@ public class ProcessLtiMessage implements Action<ModelAndView> {
         return switch (messageType) {
             case LTI_RESOURCE_LINK_REQUEST:
                 //noinspection unchecked
-                yield LaunchContent.builder()
+                yield registry.actionBuilderFactory().getBuilder(LaunchContentBuilder)
                         .registry(registry)
                         .metadata(metadata)
                         .queryParams(queryParams)
@@ -55,7 +62,7 @@ public class ProcessLtiMessage implements Action<ModelAndView> {
                         .execute();
             case LTI_DEEP_LINKING_REQUEST:
                 //noinspection unchecked
-                yield SelectDeepLinkContent.builder()
+                yield  registry.actionBuilderFactory().getBuilder(SelectDeepLinkContentBuilder)
                         .registry(registry)
                         .metadata(metadata)
                         .queryParams(queryParams)
@@ -73,16 +80,16 @@ public class ProcessLtiMessage implements Action<ModelAndView> {
      * @param token  token to decode
      * @param issuer    who the issuer was
      * @param clientId   the client id
-     * @param toolRegistration  the tool configguration
-     * @return
+     * @param toolRegistration  the tool configuration
+     * @return  Model and View to Return the code
      */
-    private HashMap<Object, Object> decodeToken(String token, String issuer, String clientId, java.util.Optional<riomhaire.lti.model.ClientConfiguration> toolRegistration) {
+    private HashMap<Object, Object> decodeToken(String token, String issuer, String clientId, java.util.Optional<riomhaire.lti.core.model.ClientConfiguration> toolRegistration) {
         var claims = new HashMap<>();
 
         if (toolRegistration.isPresent()) {
             // Validate JWT to verify its by who they say they are
             var clientConfiguration = toolRegistration.get();
-            var adapter = JWKBasedJwtToMapAdapter.builder()
+            var adapter = JWKBasedJwtToMapAdapterBuilder.context()
                     .jwksUrl(clientConfiguration.getJwksUrl())
                     .skipVerification(clientConfiguration.isSkipVerification())
                     .build();

+ 17 - 8
src/main/java/riomhaire/lti/business/actions/ProcessOidcRequest.java → src/main/java/riomhaire/lti/core/business/actions/ProcessOidcRequest.java

@@ -1,19 +1,18 @@
-package riomhaire.lti.business.actions;
+package riomhaire.lti.core.business.actions;
 
-import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.RedirectView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
-import riomhaire.lti.infrastructure.Registry;
-import riomhaire.lti.model.interfaces.Action;
+import riomhaire.lti.Registry;
+import riomhaire.lti.core.model.interfaces.Action;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
 @Slf4j
-@Builder
+
 /***
  *  ProcessOidcRequest handles the oidc initiation step of the oidc flow ...
  *  you should add some checks and generate state value you can check on in later calls.
@@ -26,6 +25,12 @@ public class ProcessOidcRequest implements Action<ModelAndView> {
     Map<String, String> queryParams;
     Map<String, Object> metadata;
 
+    public ProcessOidcRequest(Registry registry, Map<String, String> queryParams, Map<String, Object> metadata) {
+        this.registry = registry;
+        this.queryParams = queryParams;
+        this.metadata = metadata;
+    }
+
     /**
      * Executte
      * @return
@@ -70,9 +75,13 @@ public class ProcessOidcRequest implements Action<ModelAndView> {
             mav = new ModelAndView(new RedirectView(location.toString()));
 
         } else {
-            log.error("unknown issuer ["+iss+"] client ["+clientId+"]");
-            mav = new ModelAndView(new MappingJackson2JsonView());
-            mav.addObject("bean", claims);
+            String msg = "unknown issuer [" + iss + "] client [" + clientId + "]";
+            log.error(msg);
+            MappingJackson2JsonView view = new MappingJackson2JsonView();
+            view.setPrettyPrint(true);
+            mav = new ModelAndView(view);
+            mav.addObject("error", msg);
+            mav.addObject("queryParams", queryParams);
         }
         return mav;
     }

+ 11 - 5
src/main/java/riomhaire/lti/business/actions/SelectDeepLinkContent.java → src/main/java/riomhaire/lti/core/business/actions/SelectDeepLinkContent.java

@@ -1,23 +1,29 @@
-package riomhaire.lti.business.actions;
+package riomhaire.lti.core.business.actions;
 
-import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.servlet.ModelAndView;
-import riomhaire.lti.infrastructure.Registry;
-import riomhaire.lti.model.interfaces.Action;
+import riomhaire.lti.Registry;
+import riomhaire.lti.core.model.interfaces.Action;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
 
 @Slf4j
-@Builder
+
 public class SelectDeepLinkContent implements Action<ModelAndView> {
     Registry registry;
     Map<String, String> queryParams;
     Map<String, Object> metadata;
     Map<String, Object> claims;
 
+    public SelectDeepLinkContent(Registry registry, Map<String, String> queryParams, Map<String, Object> metadata, Map<String, Object> claims) {
+        this.registry = registry;
+        this.queryParams = queryParams;
+        this.metadata = metadata;
+        this.claims = claims;
+    }
+
     @Override
     public ModelAndView execute() {
         final String prefix = "https://purl.imsglobal.org/spec/lti/claim/";

+ 33 - 0
src/main/java/riomhaire/lti/core/business/builder/AbstractActionBuilder.java

@@ -0,0 +1,33 @@
+package riomhaire.lti.core.business.builder;
+
+import riomhaire.lti.Registry;
+
+import java.util.Map;
+
+public abstract class AbstractActionBuilder implements ActionBuilder{
+    protected Registry registry;
+    protected Map<String, String> queryParams;
+    protected Map<String, Object> metadata;
+    protected Map<String, Object> claims;
+
+    public ActionBuilder registry(Registry registry) {
+        this.registry = registry;
+        return this;
+    }
+
+    public ActionBuilder queryParams(Map<String, String> queryParams) {
+        this.queryParams = queryParams;
+        return this;
+    }
+
+    public ActionBuilder metadata(Map<String, Object> metadata) {
+        this.metadata = metadata;
+        return this;
+    }
+
+    public ActionBuilder claims(Map<String, Object> claims) {
+        this.claims = claims;
+        return this;
+    }
+
+}

+ 23 - 0
src/main/java/riomhaire/lti/core/business/builder/ActionBuilder.java

@@ -0,0 +1,23 @@
+package riomhaire.lti.core.business.builder;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.Registry;
+import riomhaire.lti.core.model.interfaces.Action;
+
+import java.util.Map;
+
+public interface ActionBuilder {
+
+    Action<ModelAndView> build();
+
+    default ActionBuilder registry(Registry registry){ return this; };
+
+    default ActionBuilder queryParams(Map<String, String> queryParams){ return this; };
+
+    default ActionBuilder metadata(Map<String, Object> metadata){ return this; };
+
+    default ActionBuilder claims(Map<String, Object> claims){ return this; };
+
+
+
+}

+ 6 - 0
src/main/java/riomhaire/lti/core/business/builder/ActionBuilderBuilder.java

@@ -0,0 +1,6 @@
+package riomhaire.lti.core.business.builder;
+
+@FunctionalInterface
+public interface ActionBuilderBuilder {
+    ActionBuilder build();
+}

+ 32 - 0
src/main/java/riomhaire/lti/core/business/builder/ActionBuilderFactory.java

@@ -0,0 +1,32 @@
+package riomhaire.lti.core.business.builder;
+
+public class ActionBuilderFactory {
+
+    private ActionBuilderBuilder launchContentBuilder = ()->new NopBuilder();
+    private ActionBuilderBuilder processLTIMessageBuilder = ()->new NopBuilder();
+    private ActionBuilderBuilder processOidcRequestBuilder= ()->new NopBuilder();
+    private ActionBuilderBuilder selectDeepLinkContentBuilder = ()->new NopBuilder();
+
+    public ActionBuilderFactory(ActionBuilderBuilder launchContentBuilder, ActionBuilderBuilder processLTIMessageBuilder, ActionBuilderBuilder processOidcRequestBuilder, ActionBuilderBuilder selectDeepLinkContentBuilder) {
+        this.launchContentBuilder = launchContentBuilder;
+        this.processLTIMessageBuilder = processLTIMessageBuilder;
+        this.processOidcRequestBuilder = processOidcRequestBuilder;
+        this.selectDeepLinkContentBuilder = selectDeepLinkContentBuilder;
+    }
+    public ActionBuilderFactory(ActionBuilderBuilder launchContentBuilder){
+        this.launchContentBuilder = launchContentBuilder;
+        this.processLTIMessageBuilder = ()->new ProcessLtiMessageBuilder();
+        this.processOidcRequestBuilder = ()->new ProcessOidcRequestBuilder();
+        this.selectDeepLinkContentBuilder = ()->new NopBuilder();
+
+    }
+
+    public ActionBuilder getBuilder(Builder name)    {
+        return switch (name) {
+            case LaunchContentBuilder : yield launchContentBuilder.build();
+            case ProcessLTIMessageBuilder: yield processLTIMessageBuilder.build();
+            case ProcessOidcRequestBuilder: yield processOidcRequestBuilder.build();
+            case SelectDeepLinkContentBuilder: yield selectDeepLinkContentBuilder.build();
+        } ;
+    }
+}

+ 9 - 0
src/main/java/riomhaire/lti/core/business/builder/Builder.java

@@ -0,0 +1,9 @@
+package riomhaire.lti.core.business.builder;
+
+public enum Builder {
+    LaunchContentBuilder,
+    ProcessLTIMessageBuilder,
+    ProcessOidcRequestBuilder,
+    SelectDeepLinkContentBuilder
+}
+  

+ 12 - 0
src/main/java/riomhaire/lti/core/business/builder/LaunchContentBuilder.java

@@ -0,0 +1,12 @@
+package riomhaire.lti.core.business.builder;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.business.actions.LaunchContent;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public class LaunchContentBuilder extends AbstractActionBuilder {
+    
+    public Action<ModelAndView> build() {
+        return new LaunchContent(registry, queryParams, metadata, claims);
+    }
+}

+ 12 - 0
src/main/java/riomhaire/lti/core/business/builder/NopBuilder.java

@@ -0,0 +1,12 @@
+package riomhaire.lti.core.business.builder;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.business.actions.NOPAction;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public class NopBuilder extends AbstractActionBuilder {
+    @Override
+    public Action<ModelAndView> build() {
+        return new NOPAction();
+    }
+}

+ 11 - 0
src/main/java/riomhaire/lti/core/business/builder/ProcessLtiMessageBuilder.java

@@ -0,0 +1,11 @@
+package riomhaire.lti.core.business.builder;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.business.actions.ProcessLtiMessage;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public final class ProcessLtiMessageBuilder extends AbstractActionBuilder{
+    public Action<ModelAndView> build() {
+        return new ProcessLtiMessage(registry, queryParams, metadata);
+    }
+}

+ 12 - 0
src/main/java/riomhaire/lti/core/business/builder/ProcessOidcRequestBuilder.java

@@ -0,0 +1,12 @@
+package riomhaire.lti.core.business.builder;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.business.actions.ProcessOidcRequest;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public final class ProcessOidcRequestBuilder  extends AbstractActionBuilder{
+
+    public Action<ModelAndView> build() {
+        return new ProcessOidcRequest(registry, queryParams, metadata);
+    }
+}

+ 13 - 0
src/main/java/riomhaire/lti/core/business/builder/SelectDeepLinkContentBuilder.java

@@ -0,0 +1,13 @@
+package riomhaire.lti.core.business.builder;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.business.actions.SelectDeepLinkContent;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public final class SelectDeepLinkContentBuilder extends AbstractActionBuilder {
+
+    @Override
+    public Action<ModelAndView> build() {
+        return new SelectDeepLinkContent(registry, queryParams, metadata, claims);
+    }
+}

+ 5 - 4
src/main/java/riomhaire/lti/infrastructure/api/tool/LaunchEndpoint.java → src/main/java/riomhaire/lti/core/infrastructure/api/tool/LaunchEndpoint.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.infrastructure.api.tool;
+package riomhaire.lti.core.infrastructure.api.tool;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -7,11 +7,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
-import riomhaire.lti.business.actions.ProcessLtiMessage;
-import riomhaire.lti.infrastructure.Registry;
+import riomhaire.lti.Registry;
 
 import java.util.Map;
 
+import static riomhaire.lti.core.business.builder.Builder.ProcessLTIMessageBuilder;
+
 @RestController
 @Slf4j
 public class LaunchEndpoint {
@@ -23,7 +24,7 @@ public class LaunchEndpoint {
     public ModelAndView tool(@RequestParam Map<String,String> queryParams, @RequestHeader Map<String,Object> headers) {
 
         // Take Either of the possible tokens
-        return ProcessLtiMessage.builder()
+        return registry.actionBuilderFactory().getBuilder(ProcessLTIMessageBuilder)
                 .registry(registry)
                 .queryParams(queryParams)
                 .metadata(headers)

+ 7 - 4
src/main/java/riomhaire/lti/infrastructure/api/tool/OIDCEndpoint.java → src/main/java/riomhaire/lti/core/infrastructure/api/tool/OIDCEndpoint.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.infrastructure.api.tool;
+package riomhaire.lti.core.infrastructure.api.tool;
 
 
 import lombok.extern.slf4j.Slf4j;
@@ -8,12 +8,15 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
-import riomhaire.lti.business.actions.ProcessOidcRequest;
-import riomhaire.lti.infrastructure.Registry;
+import riomhaire.lti.Registry;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import static riomhaire.lti.core.business.builder.Builder.ProcessOidcRequestBuilder;
+
+;
+
 @RestController
 @Slf4j
 public class OIDCEndpoint {
@@ -24,7 +27,7 @@ public class OIDCEndpoint {
     @RequestMapping(path = "/oidc")
     public ModelAndView oidc(@RequestParam Map<String, String> queryParams, @RequestHeader HashMap<String, Object> headers) {
 
-        return ProcessOidcRequest.builder()
+        return registry.actionBuilderFactory().getBuilder(ProcessOidcRequestBuilder)
                 .registry(registry)
                 .queryParams(queryParams)
                 .metadata(headers)

+ 1 - 1
src/main/java/riomhaire/lti/infrastructure/configuration/DecoupledLogicSetup.java → src/main/java/riomhaire/lti/core/infrastructure/configuration/DecoupledLogicSetup.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.infrastructure.configuration;
+package riomhaire.lti.core.infrastructure.configuration;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;

+ 3 - 3
src/main/java/riomhaire/lti/infrastructure/facades/clientregistration/ConfigBasedClientRegistrationResolver.java → src/main/java/riomhaire/lti/core/infrastructure/facades/clientregistration/ConfigBasedClientRegistrationResolver.java

@@ -1,10 +1,10 @@
-package riomhaire.lti.infrastructure.facades.clientregistration;
+package riomhaire.lti.core.infrastructure.facades.clientregistration;
 
 
 
 import org.springframework.stereotype.Service;
-import riomhaire.lti.model.ClientConfiguration;
-import riomhaire.lti.model.interfaces.ClientRegistrationResolver;
+import riomhaire.lti.core.model.ClientConfiguration;
+import riomhaire.lti.core.model.interfaces.ClientRegistrationResolver;
 
 import java.util.Optional;
 

+ 3 - 3
src/main/java/riomhaire/lti/infrastructure/facades/clientregistration/RedisBasedClientRegistrationResolver.java → src/main/java/riomhaire/lti/core/infrastructure/facades/clientregistration/RedisBasedClientRegistrationResolver.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.infrastructure.facades.clientregistration;
+package riomhaire.lti.core.infrastructure.facades.clientregistration;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.SneakyThrows;
@@ -6,8 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
-import riomhaire.lti.model.ClientConfiguration;
-import riomhaire.lti.model.interfaces.ClientRegistrationResolver;
+import riomhaire.lti.core.model.ClientConfiguration;
+import riomhaire.lti.core.model.interfaces.ClientRegistrationResolver;
 
 import java.util.Optional;
 

+ 1 - 1
src/main/java/riomhaire/lti/model/ClientConfiguration.java → src/main/java/riomhaire/lti/core/model/ClientConfiguration.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.model;
+package riomhaire.lti.core.model;
 
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

+ 1 - 1
src/main/java/riomhaire/lti/model/interfaces/Action.java → src/main/java/riomhaire/lti/core/model/interfaces/Action.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.model.interfaces;
+package riomhaire.lti.core.model.interfaces;
 
 public interface Action<T> {
     T execute();

+ 8 - 0
src/main/java/riomhaire/lti/core/model/interfaces/ApplicationRegistry.java

@@ -0,0 +1,8 @@
+package riomhaire.lti.core.model.interfaces;
+
+import riomhaire.lti.core.business.builder.ActionBuilderFactory;
+
+public interface ApplicationRegistry {
+  ClientRegistrationResolver clientRegistrationResolver();
+  ActionBuilderFactory actionBuilderFactory();
+}

+ 2 - 2
src/main/java/riomhaire/lti/model/interfaces/ClientRegistrationResolver.java → src/main/java/riomhaire/lti/core/model/interfaces/ClientRegistrationResolver.java

@@ -1,6 +1,6 @@
-package riomhaire.lti.model.interfaces;
+package riomhaire.lti.core.model.interfaces;
 
-import riomhaire.lti.model.ClientConfiguration;
+import riomhaire.lti.core.model.ClientConfiguration;
 
 import java.util.Optional;
 

+ 1 - 1
src/main/java/riomhaire/lti/model/interfaces/DecodeException.java → src/main/java/riomhaire/lti/core/model/interfaces/DecodeException.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.model.interfaces;
+package riomhaire.lti.core.model.interfaces;
 
 public class DecodeException extends Exception{
 }

+ 1 - 1
src/main/java/riomhaire/lti/model/interfaces/Decoder.java → src/main/java/riomhaire/lti/core/model/interfaces/Decoder.java

@@ -1,4 +1,4 @@
-package riomhaire.lti.model.interfaces;
+package riomhaire.lti.core.model.interfaces;
 
 @FunctionalInterface
 public interface Decoder<T,P> {

+ 12 - 0
src/main/java/riomhaire/lti/demo/RiomhaireApplicationContentLauncher.java

@@ -0,0 +1,12 @@
+package riomhaire.lti.demo;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public class RiomhaireApplicationContentLauncher  implements Action<ModelAndView> {
+
+    @Override
+    public ModelAndView execute() {
+        return  new ModelAndView("redirect:https://www.riomhaire.com");
+    }
+}

+ 12 - 0
src/main/java/riomhaire/lti/demo/RiomhaireApplicationContentLauncherBuilder.java

@@ -0,0 +1,12 @@
+package riomhaire.lti.demo;
+
+import org.springframework.web.servlet.ModelAndView;
+import riomhaire.lti.core.business.builder.AbstractActionBuilder;
+import riomhaire.lti.core.model.interfaces.Action;
+
+public class RiomhaireApplicationContentLauncherBuilder extends AbstractActionBuilder {
+    @Override
+    public Action<ModelAndView> build() {
+        return new RiomhaireApplicationContentLauncher();
+    }
+}

+ 0 - 21
src/main/java/riomhaire/lti/infrastructure/Registry.java

@@ -1,21 +0,0 @@
-package riomhaire.lti.infrastructure;
-
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-import riomhaire.lti.model.interfaces.*;
-
-
-@Service
-public class Registry implements ApplicationRegistry {
-
-  @Autowired
-  @Qualifier("redisBasedClientRegistrationResolver")
-  ClientRegistrationResolver clientRegistrationResolver;
-
-  @Override
-  public ClientRegistrationResolver clientRegistrationResolver() {
-    return clientRegistrationResolver;
-  }
-}

+ 0 - 5
src/main/java/riomhaire/lti/model/interfaces/ApplicationRegistry.java

@@ -1,5 +0,0 @@
-package riomhaire.lti.model.interfaces;
-
-public interface ApplicationRegistry {
-  ClientRegistrationResolver clientRegistrationResolver();
-}

+ 7 - 0
src/main/resources/application.properties

@@ -2,4 +2,11 @@ spring.thymeleaf.cache=false
 spring.thymeleaf.suffix=.html
 #spring.thymeleaf.prefix=classpath:/templates/
 
+
+spring.redis.database=0
+spring.redis.host=localhost
+spring.redis.port=6379
+#spring.redis.password=mypass
+spring.redis.timeout=60000
+
       

+ 1 - 1
src/main/resources/templates/dump-launch.html

@@ -3,7 +3,7 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=yes">
-    <title>Spring Boot Thymeleaf Hello World Example</title>
+    <title>Launch Dump/title>
     <style>
         th {
             min-width: 200px;

+ 1 - 1
src/main/resources/templates/error.html

@@ -1,5 +1,5 @@
 <!DOCTYPE HTML>
-<html xmlns:th="https://www.thymeleaf.org">
+<html>
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=yes">

+ 16 - 0
src/main/resources/templates/nop.html

@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<html xmlns:th="https://www.thymeleaf.org">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=yes">
+    <title>NOP Page</title>
+    <style>
+
+    </style>
+</head>
+
+<body>
+<h3>This 'No Operation' page means nothing to be done</h3>
+
+</body>
+</html>