diff --git a/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ModelHelper.java b/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ModelHelper.java index f998bed..63da693 100644 --- a/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ModelHelper.java +++ b/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ModelHelper.java @@ -24,17 +24,25 @@ import hu.blackbelt.judo.generator.commons.annotations.TemplateHelper; import hu.blackbelt.judo.meta.psm.accesspoint.AbstractActorType; import hu.blackbelt.judo.meta.psm.derived.ReferenceAccessor; -import hu.blackbelt.judo.meta.psm.namespace.*; -import hu.blackbelt.judo.meta.psm.service.*; +import hu.blackbelt.judo.meta.psm.namespace.Model; +import hu.blackbelt.judo.meta.psm.namespace.NamedElement; +import hu.blackbelt.judo.meta.psm.service.MappedTransferObjectType; +import hu.blackbelt.judo.meta.psm.service.TransferObjectRelation; +import hu.blackbelt.judo.meta.psm.service.TransferObjectType; +import hu.blackbelt.judo.meta.psm.service.TransferOperation; import hu.blackbelt.judo.meta.psm.support.PsmModelResourceSupport; -import hu.blackbelt.judo.meta.psm.type.*; +import hu.blackbelt.judo.meta.psm.type.EnumerationType; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; -import java.util.*; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; -import static hu.blackbelt.judo.psm.generator.jaxrs.api.ObjectTypeHelper.*; +import static hu.blackbelt.judo.psm.generator.jaxrs.api.ObjectTypeHelper.getRealm; +import static hu.blackbelt.judo.psm.generator.jaxrs.api.ObjectTypeHelper.isRangeInputType; @TemplateHelper public class ModelHelper extends StaticMethodValueResolver { @@ -81,8 +89,7 @@ public static boolean isMapped(TransferObjectType transferObjectType) { return (transferObjectType instanceof MappedTransferObjectType); } - public static Set getAllExposedTransferObjectTypesFromAccessPoint( - final TransferObjectType accessPoint) { + public static Set getAllExposedTransferObjectTypesFromAccessPoint(final TransferObjectType accessPoint) { final Set foundTransferObjectTypes = new HashSet<>(); if (!accessPoint.getOperations().isEmpty()) { diff --git a/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ObjectTypeHelper.java b/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ObjectTypeHelper.java index feae776..0071041 100644 --- a/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ObjectTypeHelper.java +++ b/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/ObjectTypeHelper.java @@ -63,6 +63,10 @@ public static String getRealm(AbstractActorType actorType) { return actorType.getRealm(); } + public static String getRealmLowerCase(AbstractActorType actorType) { + return getRealm(actorType).toLowerCase(); + } + private static CacheLoader getEntityCacheLoader = new CacheLoader<>() { @Override diff --git a/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/OperationHelper.java b/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/OperationHelper.java index fcdf5b2..a51ae4e 100644 --- a/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/OperationHelper.java +++ b/judo-psm-generator-jaxrs-api/src/main/java/hu/blackbelt/judo/psm/generator/jaxrs/api/OperationHelper.java @@ -21,23 +21,21 @@ */ -import com.github.jknack.handlebars.internal.lang3.StringUtils; import hu.blackbelt.judo.generator.commons.StaticMethodValueResolver; import hu.blackbelt.judo.generator.commons.annotations.TemplateHelper; - -import hu.blackbelt.judo.meta.psm.data.AssociationEnd; -import hu.blackbelt.judo.meta.psm.data.EntityType; -import hu.blackbelt.judo.meta.psm.data.Relation; +import hu.blackbelt.judo.meta.psm.accesspoint.AbstractActorType; import hu.blackbelt.judo.meta.psm.namespace.Model; import hu.blackbelt.judo.meta.psm.namespace.NamedElement; import hu.blackbelt.judo.meta.psm.namespace.Namespace; import hu.blackbelt.judo.meta.psm.service.*; -import java.util.Arrays; -import java.util.stream.Collectors; +import java.util.List; -import static hu.blackbelt.judo.psm.generator.jaxrs.api.JavaApiHelper.*; +import static hu.blackbelt.judo.psm.generator.jaxrs.api.JavaApiHelper.className; +import static hu.blackbelt.judo.psm.generator.jaxrs.api.JavaApiHelper.namedElementApiParentPath; import static hu.blackbelt.judo.psm.generator.jaxrs.api.JavaNamespaceHelper.*; +import static hu.blackbelt.judo.psm.generator.jaxrs.api.ModelHelper.getAllExposedTransferObjectTypesFromAccessPoint; +import static hu.blackbelt.judo.psm.generator.jaxrs.api.ModelHelper.modelWrapper; import static hu.blackbelt.judo.psm.generator.jaxrs.api.ObjectTypeHelper.*; @TemplateHelper @@ -242,4 +240,22 @@ public static String getOperationTagName(TransferOperation transferOperation) { return logicalFullName(transferObjectType); } + public static List getActorsOfOperation(Model model, TransferOperation transferOperation) { + return modelWrapper(model) + .getStreamOfPsmAccesspointAbstractActorType() + .filter(actor -> actor.getRealm() != null) + .filter(actor -> getAllExposedTransferObjectTypesFromAccessPoint(actor) + .stream() + .flatMap(to -> to.getOperations().stream()) + .anyMatch(operation -> operation.equals(transferOperation))) + .toList(); + } + + public static List getRealmsOfOperationLowerCase(Model model, TransferOperation transferOperation) { + return getActorsOfOperation(model, transferOperation) + .stream() + .map(actor -> actor.getRealm().toLowerCase()) + .toList(); + } + } diff --git a/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/application.config.java.hbs b/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/application.config.java.hbs index cbe8f45..6f0ee38 100644 --- a/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/application.config.java.hbs +++ b/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/application.config.java.hbs @@ -2,6 +2,33 @@ package {{ namedElementApiPackageName self }}; +@io.swagger.v3.oas.annotations.OpenAPIDefinition( + info = @io.swagger.v3.oas.annotations.info.Info( + title = "{{ model.name }} API", + version = "1.0.0" + ), + servers = { + {{# each (allAccessPointActor model) as |actor| }} + @io.swagger.v3.oas.annotations.servers.Server( + description = "{{ actor.name }}", + url = "https://tatami-tests.judo.technology/api/{{ namedElementRestPath actor }}/{{ className actor }}" + ), + {{/ each }} + } +) +{{# if (isActorType self) }} + {{# if (getRealm self) }} + @io.swagger.v3.oas.annotations.security.SecuritySchemes( + value = { + @io.swagger.v3.oas.annotations.security.SecurityScheme( + type = io.swagger.v3.oas.annotations.enums.SecuritySchemeType.OPENIDCONNECT, + name = "{{ getRealmLowerCase self }}", + openIdConnectUrl = "https://auth.tatami-tests.judo.technology/auth/realms/{{ getRealm self }}/.well-known/openid-configuration" + ), + } + ) + {{/ if }} +{{/ if }} public interface {{ self.applicationClassName }} { public java.util.Map getProperties(); diff --git a/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/rest.service.operation.fragment.hbs b/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/rest.service.operation.fragment.hbs index d12caf2..bd66ef3 100644 --- a/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/rest.service.operation.fragment.hbs +++ b/judo-psm-generator-jaxrs-api/src/main/resources/rest/api/rest.service.operation.fragment.hbs @@ -8,7 +8,12 @@ @javax.ws.rs.Path("/{{ toJAXRSPath operation model }}") @hu.blackbelt.judo.dispatcher.api.JudoOperation("{{ operation.operationAsmFqName }}") {{# if generateOpenApiAnnotations }} -@io.swagger.v3.oas.annotations.Operation(operationId = "{{ operation.operationAsmFqName }}", tags = {"{{ operation.getOperationTagName }}"}) +@io.swagger.v3.oas.annotations.Operation(operationId = "{{ operation.operationAsmFqName }}", + tags = {"{{ operation.getOperationTagName }}"}, security = { + {{# each (getRealmsOfOperationLowerCase model operation) as |realm| }} + @io.swagger.v3.oas.annotations.security.SecurityRequirement(name = "{{ realm }}"), + {{/ each }} +}) {{# if operation.output }} {{# if operation.output.isMany }} @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "Successful operation", diff --git a/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/application.config.impl.java.hbs b/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/application.config.impl.java.hbs index dadc248..15a9dca 100644 --- a/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/application.config.impl.java.hbs +++ b/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/application.config.impl.java.hbs @@ -3,44 +3,6 @@ package {{ namedElementImplPackageName self }}; @javax.ws.rs.ApplicationPath("{{ namedElementRestPath self }}/{{ className self }}") -@io.swagger.v3.oas.annotations.OpenAPIDefinition( - info = @io.swagger.v3.oas.annotations.info.Info( - title = "{{ model.name }} API", - version = "1.0.0" - ), - servers = { - {{# each (allAccessPointActor model) as |actor| }} - @io.swagger.v3.oas.annotations.servers.Server( - description = "{{ actor.name }}", - url = "https://tatami-tests.judo.technology/api/{{ namedElementRestPath actor }}/{{ className actor }}" - ), - {{/ each }} - } -{{# if (isActorType self) }} - {{# if (getRealm self) }}, - security = { - {{# each (allAccessPointActorWithRealm model) as |actor| }} - @io.swagger.v3.oas.annotations.security.SecurityRequirement(name = "{{ actor.name }}", scopes = {"openid", "email", "profile"}), - {{/ each }} - } - {{/ if }} -{{/ if }} -) -{{# if (isActorType self) }} - {{# if (getRealm self) }} - @io.swagger.v3.oas.annotations.security.SecuritySchemes( - value = { - {{# each (allAccessPointActorWithRealm model) as |actor| }} - @io.swagger.v3.oas.annotations.security.SecurityScheme( - type = io.swagger.v3.oas.annotations.enums.SecuritySchemeType.OPENIDCONNECT, - name = "{{ actor.name }}", - openIdConnectUrl = "https://auth.tatami-tests.judo.technology/auth/realms/{{ getRealm actor }}/.well-known/openid-configuration" - ), - {{/ each }} - } - ) - {{/ if }} -{{/ if }} public class {{ applicationImplClassName self }} extends javax.ws.rs.core.Application implements {{ applicationFqName self }} { private final java.util.Map properties = new java.util.TreeMap(); diff --git a/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/rest.service.impl.java.hbs b/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/rest.service.impl.java.hbs index 36907b0..9a82264 100644 --- a/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/rest.service.impl.java.hbs +++ b/judo-psm-generator-jaxrs-impl/src/main/resources/rest/impl/rest.service.impl.java.hbs @@ -3,8 +3,6 @@ package {{ namedElementImplRestPackageName self }}; public class {{ implClassName self }} implements {{ namedElementApiRestFqName self }} { - {{> rest/api/rest.service.constants.fragment.hbs }}; - java.util.Optional __dispatcher = java.util.Optional.empty(); diff --git a/judo-psm-generator-jaxrs-test/pom.xml b/judo-psm-generator-jaxrs-test/pom.xml index 7b5d90e..b0376e3 100644 --- a/judo-psm-generator-jaxrs-test/pom.xml +++ b/judo-psm-generator-jaxrs-test/pom.xml @@ -223,6 +223,20 @@ + + execute-psm-test-model-from-artifact-ApplicationSelectionTest + generate-sources + + generate + + + + ${basedir}/src/test/resources/model/ApplicationSelectionTest-psm.model + + ${basedir}/target/generated-sources/psm/jaxrs/ApplicationSelectionTest + + + execute-psm-test-model-from-artifact-CRUDActionsTest generate-sources @@ -321,6 +335,7 @@ ${basedir}/target/generated-sources/psm/jaxrs/DebateTest ${basedir}/target/generated-sources/psm/jaxrs/OperationParametersTest ${basedir}/target/generated-sources/psm/jaxrs/RelationTest + ${basedir}/target/generated-sources/psm/jaxrs/ApplicationSelectionTest diff --git a/judo-psm-generator-jaxrs-test/src/test/resources/model/ApplicationSelectionTest-psm.model b/judo-psm-generator-jaxrs-test/src/test/resources/model/ApplicationSelectionTest-psm.model new file mode 100644 index 0000000..d2885eb --- /dev/null +++ b/judo-psm-generator-jaxrs-test/src/test/resources/model/ApplicationSelectionTest-psm.model @@ -0,0 +1,1052 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +