diff --git a/.github/workflows/ga-publication.yml b/.github/workflows/ga-publication.yml index d869c6d91..a1340cb4f 100644 --- a/.github/workflows/ga-publication.yml +++ b/.github/workflows/ga-publication.yml @@ -6,11 +6,12 @@ on: - created env: - ENTANDO_OPT_USE_PPL_TAG: "v1.1.0" + ENTANDO_OPT_USE_PPL_TAG: "v1.2.0" ENTANDO_OPT_FEATURES: "${{ secrets.ENTANDO_OPT_FEATURES }}" ENTANDO_OPT_GLOBAL_FEATURES: "${{ secrets.ENTANDO_OPT_GLOBAL_FEATURES }}" ENTANDO_OPT_LOG_LEVEL: "${{ secrets.ENTANDO_OPT_LOG_LEVEL }}" ENTANDO_OPT_REPO_BOM_URL: "${{ secrets.ENTANDO_OPT_REPO_BOM_URL }}" + ENTANDO_OPT_CUSTOM_ENV: "${{ secrets.ENTANDO_OPT_CUSTOM_ENV }}" PPL_CONTEXT: ${{ toJson(github) }} GIT_USER_NAME: "${{ secrets.GIT_USER_NAME }}" GIT_USER_EMAIL: "${{ secrets.GIT_USER_EMAIL }}" diff --git a/.github/workflows/post-merge.yml b/.github/workflows/post-merge.yml index 78dc34fe0..c2386cee4 100644 --- a/.github/workflows/post-merge.yml +++ b/.github/workflows/post-merge.yml @@ -4,9 +4,11 @@ on: push: branches: - develop + - epic/* + - release/* env: - ENTANDO_OPT_USE_PPL_TAG: "v1.1.0" + ENTANDO_OPT_USE_PPL_TAG: "v1.2.0" ENTANDO_OPT_FEATURES: "${{ secrets.ENTANDO_OPT_FEATURES }}" ENTANDO_OPT_GLOBAL_FEATURES: "${{ secrets.ENTANDO_OPT_GLOBAL_FEATURES }}" ENTANDO_OPT_LOG_LEVEL: "${{ secrets.ENTANDO_OPT_LOG_LEVEL }}" @@ -22,18 +24,18 @@ jobs: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # SNAPSHOT TAG - add-snapshot-tag: + add-version-tag: runs-on: ubuntu-latest steps: - - name: "ADD SNAPSOT TAG" + - name: "ADD SNAPSHOT TAG" run: | ${{ secrets.ENTANDO_OPT_PPL_INSTALL_CMD }} - + ~/ppl-run pr-status-report \ .. checkout-branch base \ --id "CHECKOUT-BASE" \ --lcd "$LOCAL_CLONE_DIR" \ --token "${{ secrets.ENTANDO_BOT_TOKEN }}" \ - .. release tag-snapshot-version \ - --id "TAG-SNAPSHOT" \ + .. publication tag-git-version \ + --id "TAG-VERSION" \ --lcd "$LOCAL_CLONE_DIR" diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 44d152f76..53d913ff9 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,4 +1,3 @@ - name: PR-CYCLE on: @@ -9,13 +8,21 @@ on: - reopened branches: - develop + - epic/* + - release/* env: - ENTANDO_OPT_USE_PPL_TAG: "v1.1.0" + ENTANDO_OPT_USE_PPL_TAG: "v1.2.0" ENTANDO_OPT_FEATURES: "${{ secrets.ENTANDO_OPT_FEATURES }}" ENTANDO_OPT_GLOBAL_FEATURES: "${{ secrets.ENTANDO_OPT_GLOBAL_FEATURES }}" ENTANDO_OPT_LOG_LEVEL: "${{ secrets.ENTANDO_OPT_LOG_LEVEL }}" ENTANDO_OPT_REPO_BOM_URL: "${{ secrets.ENTANDO_OPT_REPO_BOM_URL }}" + ENTANDO_OPT_CUSTOM_ENV: "${{ secrets.ENTANDO_OPT_CUSTOM_ENV }}" + ENTANDO_OPT_OKD_LOGIN: "${{ secrets.ENTANDO_OPT_OKD_LOGIN }}" + ENTANDO_OPT_IMAGE_REGISTRY_OVERRIDE: "${{ secrets.ENTANDO_OPT_IMAGE_REGISTRY_OVERRIDE }}" + ENTANDO_OPT_DOCKER_ORG: "${{ secrets.ENTANDO_OPT_DOCKER_ORG }}" + ENTANDO_OPT_TEST_NAMESPACE: "${{ secrets.ENTANDO_OPT_TEST_NAMESPACE }}" + ENTANDO_OPT_HELM_CLI_URL: "${{ secrets.ENTANDO_OPT_HELM_CLI_URL }}" PPL_CONTEXT: ${{ toJson(github) }} GIT_USER_NAME: "${{ secrets.GIT_USER_NAME }}" GIT_USER_EMAIL: "${{ secrets.GIT_USER_EMAIL }}" @@ -40,9 +47,9 @@ jobs: ${{ secrets.ENTANDO_OPT_PPL_INSTALL_CMD }} ~/ppl-run \ .. status-report \ - .. @checkout-branch pr --lcd "$LOCAL_CLONE_DIR" \ + .. @checkout-branch --lcd "$LOCAL_CLONE_DIR" \ .. @setup-feature-flags "PR_PREFLIGHT_CHECKS" "BOM_CHECK" "BOM" \ - .. @setup-features-list "SCAN_MATRIX" --prefix "SCAN-MVN-" \ + .. @setup-features-list "SCAN_MATRIX" --prefix "MTX-MVN-,MTX-SCAN-" \ ; - name: "PR preflight checks" if: steps.START.outputs.PR_PREFLIGHT_CHECKS != 'false' @@ -57,18 +64,24 @@ jobs: full-build: needs: [ 'prepare' ] runs-on: ubuntu-latest + env: + ENTANDO_BOT_TOKEN: ${{ secrets.ENTANDO_BOT_TOKEN }} + ENTANDO_OPT_OKD_LOGIN_URL: "${{ secrets.ENTANDO_OPT_OKD_LOGIN_URL }}" + ENTANDO_OPT_OKD_LOGIN_TOKEN: "${{ secrets.ENTANDO_OPT_OKD_LOGIN_TOKEN }}" + ENTANDO_OPT_OKD_LOGIN_NAMESPACE: "${{ secrets.ENTANDO_OPT_OKD_LOGIN_NAMESPACE }}" + ENTANDO_OPT_OKD_LOGIN_INSECURE: "${{ secrets.ENTANDO_OPT_OKD_LOGIN_INSECURE }}" + ENTANDO_OPT_OKD_CLI_URL: "${{ secrets.ENTANDO_OPT_OKD_CLI_URL }}" steps: #~ CHECKOUT - name: "CHECKOUT" + id: CHECKOUT run: | ${{ secrets.ENTANDO_OPT_PPL_INSTALL_CMD }} - ~/ppl-run checkout-branch pr \ + ~/ppl-run checkout-branch \ --lcd "$LOCAL_CLONE_DIR" \ - --token "${{ secrets.ENTANDO_BOT_TOKEN }}" \ + --token "$ENTANDO_BOT_TOKEN" \ ; - - # Refines the cache key - echo "BUILD_CACHE_KEY=$( sha256sum "$LOCAL_CLONE_DIR/pom.xml" --zero | cut -d' ' -f1 )" >> $GITHUB_ENV + ~/ppl-run generic GENERATE-BUILD-CACHE-KEY "BUILD_CACHE_KEY" --lcd "$LOCAL_CLONE_DIR" >> $GITHUB_ENV #~ JDK - name: "Set up JDK 11" uses: actions/setup-java@v1 @@ -102,10 +115,7 @@ jobs: SONAR_TOKEN: "${{ secrets.SONAR_TOKEN }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" run: | - ~/ppl-run \ - .. generic FULL-BUILD --lcd "$LOCAL_CLONE_DIR" \ - .. release tag-snapshot-version --lcd "$LOCAL_CLONE_DIR" \ - ; + ~/ppl-run generic FULL-BUILD --lcd "$LOCAL_CLONE_DIR" # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -126,8 +136,7 @@ jobs: run: | ${{ secrets.ENTANDO_OPT_PPL_INSTALL_CMD }} ~/ppl-run checkout-branch pr --lcd "$LOCAL_CLONE_DIR" - - echo "BUILD_CACHE_KEY=$( sha256sum "$LOCAL_CLONE_DIR/pom.xml" --zero | cut -d' ' -f1 )" >> $GITHUB_ENV + ~/ppl-run generic GENERATE-BUILD-CACHE-KEY "BUILD_CACHE_KEY" --lcd "$LOCAL_CLONE_DIR" >> $GITHUB_ENV #~ JDK - name: "Set up JDK 11" uses: actions/setup-java@v1 @@ -139,8 +148,11 @@ jobs: uses: actions/cache@v2 with: path: ~/.m2 - key: ${{ runner.os }}-m2 - restore-keys: ${{ runner.os }}-m2 + key: ${{ runner.os }}-m2-matrix-${{ matrix.scan-type }} + restore-keys: | + ${{ runner.os }}-m2-matrix-${{ matrix.scan-type }} + ${{ runner.os }}-m2-matrix- + ${{ runner.os }}-m2- #~ BUILD CACHE - name: "Cache Build Dir" id: build-cache @@ -149,17 +161,33 @@ jobs: path: "${{ env.LOCAL_CLONE_DIR}}/target/" key: ${{ runner.os }}-build-${{ env.BUILD_CACHE_KEY }} #~ SCAN - - name: "Run the Scan" + - name: "Run the matrix step ${{ matrix.scan-type }}" run: | SCAN_TYPE="${{ matrix.scan-type }}" case "$SCAN_TYPE" in - SCAN-MVN-SONAR) + MTX-MVN-SCAN-SONAR) export GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}" export SONAR_TOKEN="${{ secrets.SONAR_TOKEN }}" export ENTANDO_OPT_SONAR_PROJECT_KEY="${{ secrets.ENTANDO_OPT_SONAR_PROJECT_KEY }}" ;; - SCAN-MVN-SNYK) + MTX-SCAN-SNYK) export SNYK_TOKEN="${{ secrets.SNYK_TOKEN }}" - ;; + ;; + MTX-MVN-POST-DEPLOYMENT-TESTS) + export ENTANDO_OPT_OKD_LOGIN_URL="${{ secrets.ENTANDO_OPT_OKD_LOGIN_URL }}" + export ENTANDO_OPT_OKD_LOGIN_TOKEN="${{ secrets.ENTANDO_OPT_OKD_LOGIN_TOKEN }}" + export ENTANDO_OPT_OKD_LOGIN_NAMESPACE="${{ secrets.ENTANDO_OPT_OKD_LOGIN_NAMESPACE }}" + export ENTANDO_OPT_OKD_LOGIN_INSECURE="${{ secrets.ENTANDO_OPT_OKD_LOGIN_INSECURE }}" + export ENTANDO_OPT_OKD_CLI_URL="${{ secrets.ENTANDO_OPT_OKD_CLI_URL }}" + export ENTANDO_OPT_IMAGE_REGISTRY_CREDENTIALS="${{ secrets.ENTANDO_OPT_IMAGE_REGISTRY_CREDENTIALS }}" + export ENTANDO_OPT_TEST_NAMESPACE="${{ secrets.ENTANDO_OPT_TEST_NAMESPACE }}" + export ENTANDO_OPT_TEST_HOSTNAME_SUFFIX="${{ secrets.ENTANDO_OPT_TEST_HOSTNAME_SUFFIX }}" + export ENTANDO_OPT_DOCKER_BUILDS="${{ secrets.ENTANDO_OPT_DOCKER_BUILDS }}" + export ENTANDO_OPT_DOCKER_ORG="${{ secrets.ENTANDO_OPT_DOCKER_ORG }}" + export ENTANDO_OPT_DOCKER_USERNAME="${{ secrets.ENTANDO_OPT_DOCKER_USERNAME }}" + export ENTANDO_OPT_DOCKER_PASSWORD="${{ secrets.ENTANDO_OPT_DOCKER_PASSWORD }}" + export ENTANDO_OPT_TEST_TLS_CRT="${{ secrets.ENTANDO_OPT_TEST_TLS_CRT }}" + export ENTANDO_OPT_TEST_TLS_KEY="${{ secrets.ENTANDO_OPT_TEST_TLS_KEY }}" + ;; esac ~/ppl-run generic "$SCAN_TYPE" mvn --id "$SCAN_TYPE" --lcd "$LOCAL_CLONE_DIR" diff --git a/.github/workflows/publication.yml b/.github/workflows/publication.yml index 75e62c4e1..12136e705 100644 --- a/.github/workflows/publication.yml +++ b/.github/workflows/publication.yml @@ -6,11 +6,12 @@ on: - 'v*' env: - ENTANDO_OPT_USE_PPL_TAG: "v1.1.0" + ENTANDO_OPT_USE_PPL_TAG: "v1.2.0" ENTANDO_OPT_FEATURES: "${{ secrets.ENTANDO_OPT_FEATURES }}" ENTANDO_OPT_GLOBAL_FEATURES: "${{ secrets.ENTANDO_OPT_GLOBAL_FEATURES }}" ENTANDO_OPT_LOG_LEVEL: "${{ secrets.ENTANDO_OPT_LOG_LEVEL }}" ENTANDO_OPT_REPO_BOM_URL: "${{ secrets.ENTANDO_OPT_REPO_BOM_URL }}" + ENTANDO_OPT_CUSTOM_ENV: "${{ secrets.ENTANDO_OPT_CUSTOM_ENV }}" PPL_CONTEXT: ${{ toJson(github) }} GIT_USER_NAME: "${{ secrets.GIT_USER_NAME }}" GIT_USER_EMAIL: "${{ secrets.GIT_USER_EMAIL }}" @@ -33,21 +34,21 @@ jobs: id: START run: | ${{ secrets.ENTANDO_OPT_PPL_INSTALL_CMD }} - ~/ppl-run status-report \ + ~/ppl-run \ + .. status-report \ .. @setup-feature-flags "PR_FORMAT_CHECK" "BOM_CHECK" "BOM" \ - .. @setup-features-list "SCAN_MATRIX" true SONAR_SCAN OWASP_SCAN SNYK_SCAN \ ; #~ CHECKOUT - - name: "Checkout" + - name: "CHECKOUT" id: CHECKOUT run: | ~/ppl-run \ - .. checkout-branch base --id "CHECKOUT FOR NEXUS PUBLICATION" --lcd "$LOCAL_CLONE_DIR" \ + .. checkout-branch --id "CHECKOUT FOR NEXUS PUBLICATION" \ + --lcd "$LOCAL_CLONE_DIR" \ + --token "$ENTANDO_BOT_TOKEN" \ .. pr-preflight-checks --only flags --lcd "$LOCAL_CLONE_DIR" \ ; - - # Refines the cache key - echo "BUILD_CACHE_KEY=$( sha256sum "$LOCAL_CLONE_DIR/pom.xml" --zero | cut -d' ' -f1 )" >> $GITHUB_ENV + ~/ppl-run generic GENERATE-BUILD-CACHE-KEY "BUILD_CACHE_KEY" --lcd "$LOCAL_CLONE_DIR" >> $GITHUB_ENV #~ JDK - name: "Set up JDK 11" uses: actions/setup-java@v1 @@ -91,7 +92,8 @@ jobs: ~/ppl-run bom update-bom \ --id "UPDATE-BOM" \ --lcd "$LOCAL_CLONE_DIR" \ - --token "$ENTANDO_BOT_TOKEN" + --token "$ENTANDO_BOT_TOKEN" \ + ; #~ PUBLISH TO DOCKER IMAGE - name: "Publish docker" env: diff --git a/src/main/java/com/agiletec/aps/system/SystemConstants.java b/src/main/java/com/agiletec/aps/system/SystemConstants.java index 9d326c021..91cda30f2 100644 --- a/src/main/java/com/agiletec/aps/system/SystemConstants.java +++ b/src/main/java/com/agiletec/aps/system/SystemConstants.java @@ -103,6 +103,10 @@ public interface SystemConstants { public static final String EXTRAPAR_EXECUTOR_BEAN_CONTAINER = "reqCtx_param_ExecutorBeanContainer"; public static final String EXTRAPAR_CSP_NONCE_TOKEN = "reqCtx_param_nonce_token"; + + public static final String WEB_UI_ENABLED = "WEB_UI_ENABLED"; + + public static final String EXTRAPAR_WEB_UI_APPL_BASE_URL = "webui_applicationBaseURL"; /** * Nome parametro di sessione: utente corrente diff --git a/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModel.java b/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModel.java index 8b6050360..f06576096 100644 --- a/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModel.java +++ b/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModel.java @@ -23,14 +23,14 @@ import java.util.*; /** - * Representation of a page template. - * This object contains the description and the definition of "frames" available. - * The definition of the page template is in the form of jsp or freemarker template. + * Representation of a page template. + * This object contains the description and the definition of "frames" available. + * The definition of the page template is in the form of jsp or freemarker template. * In the case of representation on jsp, the file name is equals then the template code. * The "frames" are page sections that can contains a "widget". */ @XmlRootElement(name = "pageModel") -@XmlType(propOrder = {"code", "description", "pluginCode", "template", "configuration"}) +@XmlType(propOrder = {"code", "description", "pluginCode", "template", "configuration", "type", "locked"}) public class PageModel implements Serializable { private String code; @@ -39,6 +39,8 @@ public class PageModel implements Serializable { private int mainFrame = -1; private String pluginCode; private String template; + private PageModelType type; + private boolean locked; /** * Return the code of page template. @@ -243,6 +245,24 @@ public void setTemplate(String template) { this.template = template; } + @XmlElement(name = "type") + public PageModelType getType() { + return type; + } + + public void setType(PageModelType type) { + this.type = type; + } + + @XmlElement(name = "locked") + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + @Override public String toString() { return new ToStringBuilder(this) @@ -252,6 +272,8 @@ public String toString() { .append("mainFrame", mainFrame) .append("pluginCode", pluginCode) .append("template", template) + .append("type", type) + .append("locked", locked) .toString(); } @@ -265,12 +287,14 @@ public boolean equals(Object o) { Objects.equals(description, pageModel.description) && Arrays.equals(configuration, pageModel.configuration) && Objects.equals(pluginCode, pageModel.pluginCode) && - Objects.equals(template, pageModel.template); + Objects.equals(template, pageModel.template) && + Objects.equals(type, pageModel.type) && + Objects.equals(locked, pageModel.locked); } @Override public int hashCode() { - int result = Objects.hash(code, description, mainFrame, pluginCode, template); + int result = Objects.hash(code, description, mainFrame, pluginCode, template, type, locked); result = 31 * result + Arrays.hashCode(configuration); return result; } diff --git a/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelDAO.java b/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelDAO.java index 13474df09..6ec697476 100644 --- a/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelDAO.java +++ b/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelDAO.java @@ -23,6 +23,7 @@ import com.agiletec.aps.system.common.AbstractSearcherDAO; import com.agiletec.aps.system.common.FieldSearchFilter; +import org.apache.commons.lang3.BooleanUtils; import org.entando.entando.ent.exception.EntException; import org.apache.commons.lang3.StringUtils; import org.entando.entando.aps.system.services.widgettype.IWidgetTypeManager; @@ -109,6 +110,9 @@ protected PageModel getPageModelFromResultSet(ResultSet res) throws EntException } pageModel.setPluginCode(res.getString(4)); pageModel.setTemplate(res.getString(5)); + String type = res.getString(6); + pageModel.setType(type == null ? PageModelType.NT : PageModelType.valueOf(type)); + pageModel.setLocked(res.getBoolean(7)); } catch (Throwable t) { logger.error("Error building the page template code '{}'", code, t); throw new RuntimeException("Error building the page template code '" + code + "'", t); @@ -132,6 +136,8 @@ public void addModel(PageModel model) { stat.setString(4, pluginCode); String template = (StringUtils.isBlank(model.getTemplate())) ? null : model.getTemplate(); stat.setString(5, template); + stat.setString(6, model.getType() == null ? null : model.getType().toString()); + stat.setBoolean(7, model.isLocked()); stat.executeUpdate(); conn.commit(); } catch (Throwable t) { @@ -216,10 +222,10 @@ public void setWidgetTypeManager(IWidgetTypeManager widgetTypeManager) { private final String ALL_PAGEMODEL = - "SELECT code, descr, frames, plugincode, templategui FROM pagemodels"; + "SELECT code, descr, frames, plugincode, templategui, type, locked FROM pagemodels"; private static final String ADD_PAGEMODEL = - "INSERT INTO pagemodels (code, descr, frames, plugincode, templategui) VALUES ( ? , ? , ? , ? , ? )"; + "INSERT INTO pagemodels (code, descr, frames, plugincode, templategui, type, locked) VALUES ( ? , ? , ? , ? , ?, ?, ? )"; private static final String UPDATE_PAGEMODEL = "UPDATE pagemodels SET descr = ? , frames = ? , plugincode = ? , templategui = ? WHERE code = ?"; diff --git a/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelType.java b/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelType.java new file mode 100644 index 000000000..3825d9fea --- /dev/null +++ b/src/main/java/com/agiletec/aps/system/services/pagemodel/PageModelType.java @@ -0,0 +1,5 @@ +package com.agiletec.aps.system.services.pagemodel; + +public enum PageModelType { + NX, NT +} diff --git a/src/main/java/com/agiletec/aps/system/services/url/URLManager.java b/src/main/java/com/agiletec/aps/system/services/url/URLManager.java index 4e49cdae1..92424ad20 100644 --- a/src/main/java/com/agiletec/aps/system/services/url/URLManager.java +++ b/src/main/java/com/agiletec/aps/system/services/url/URLManager.java @@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; +import org.apache.commons.lang3.StringUtils; /** * Servizio di gestione degli url; crea un URL completo ad una pagina del @@ -184,6 +185,12 @@ protected void addBaseURL(StringBuilder link, String forcedBaseUrlMode, HttpServ link.append(this.getConfigManager().getParam(SystemConstants.PAR_APPL_BASE_URL)); return; } + RequestContext reqCtx = (RequestContext) request.getAttribute(RequestContext.REQCTX); + String webUiApplicationBaseUrl = (null != reqCtx) ? (String) reqCtx.getExtraParam(SystemConstants.EXTRAPAR_WEB_UI_APPL_BASE_URL) : null; + if (!StringUtils.isBlank(webUiApplicationBaseUrl)) { + link.append(webUiApplicationBaseUrl); + return; + } String baseUrlMode = this.calculateBaseUrlMode(forcedBaseUrlMode, request); if (this.isForceAddSchemeHost(baseUrlMode)) { String reqScheme = request.getHeader("X-Forwarded-Proto"); diff --git a/src/main/java/com/agiletec/aps/system/services/user/UserDetails.java b/src/main/java/com/agiletec/aps/system/services/user/UserDetails.java index 0ec967277..2113eca15 100644 --- a/src/main/java/com/agiletec/aps/system/services/user/UserDetails.java +++ b/src/main/java/com/agiletec/aps/system/services/user/UserDetails.java @@ -15,6 +15,7 @@ import com.agiletec.aps.system.services.authorization.Authorization; +import java.io.Serializable; import java.util.List; /** @@ -22,7 +23,7 @@ * * @author E.Santoboni */ -public interface UserDetails { +public interface UserDetails extends Serializable { /** * Return 'true' if the current user is an Entando user, that is, exists within jAPS local table @@ -30,72 +31,73 @@ public interface UserDetails { * @return 'true' if the current user is an Entando user * @deprecated use isEntandoUser() */ - public boolean isJapsUser(); + @Deprecated + boolean isJapsUser(); - public boolean isEntandoUser(); + boolean isEntandoUser(); /** * Get the authorizations of the current user * * @return The user authorizations */ - public List getAuthorizations(); + List getAuthorizations(); /** * Add an authorization to the current user * * @param auth The authorization to add */ - public void addAuthorization(Authorization auth); + void addAuthorization(Authorization auth); /** * Add a list of authorizations to the current user * * @param auths The authorizations to set */ - public void addAuthorizations(List auths); + void addAuthorizations(List auths); /** * Return the plain password (that is, NOT decrypted) of the current user * * @return the user password */ - public String getPassword(); + String getPassword(); /** * Return the username or, in other words, the ID of the current user * * @return the username */ - public String getUsername(); + String getUsername(); /** * Return the expiration status of the current user * * @return 'true' if the user is not expired, false otherwise */ - public boolean isAccountNotExpired(); + boolean isAccountNotExpired(); /** * Return the credential status of the current user * * @return 'true' when the credentials are not expired, false otherwise */ - public boolean isCredentialsNotExpired(); + boolean isCredentialsNotExpired(); /** * Return the ability of the current user to access the system * * @return 'true' if the current user has been disabled */ - public boolean isDisabled(); + boolean isDisabled(); /** * Return the profile associated to the current user, if any * * @return The profile */ - public Object getProfile(); + Object getProfile(); void setAccessToken(final String accessToken); diff --git a/src/main/java/org/entando/entando/aps/system/services/page/model/PageDto.java b/src/main/java/org/entando/entando/aps/system/services/page/model/PageDto.java index 20373bede..eae35e5aa 100644 --- a/src/main/java/org/entando/entando/aps/system/services/page/model/PageDto.java +++ b/src/main/java/org/entando/entando/aps/system/services/page/model/PageDto.java @@ -16,6 +16,7 @@ import com.agiletec.aps.system.SystemConstants; import com.agiletec.aps.system.services.page.IPage; import com.agiletec.aps.system.services.page.IPageManager; +import com.agiletec.aps.system.services.pagemodel.PageModelType; import com.agiletec.aps.util.ApsProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; @@ -51,6 +52,7 @@ public class PageDto { private String lastModified; private String fullPath; private String token; + private PageModelType type; /** * The references grouped by service name. @@ -70,6 +72,7 @@ public PageDto(IPage page, IPageManager pageManager) { this.setOnlineInstance(page.isOnlineInstance()); this.setDisplayedInMenu(page.isShowable()); this.setPageModel(page.getModel().getCode()); + this.setType(page.getModel().getType()); if (page.getCharset() != null) { this.setCharset(page.getCharset()); } else { @@ -266,6 +269,14 @@ public void setToken(String token) { this.token = token; } + public PageModelType getType() { + return type; + } + + public void setType(PageModelType type) { + this.type = type; + } + public static String getEntityFieldName(String dtoFieldName) { switch (dtoFieldName) { case "code": diff --git a/src/main/java/org/entando/entando/aps/system/services/pagemodel/PageModelService.java b/src/main/java/org/entando/entando/aps/system/services/pagemodel/PageModelService.java index 2878dea7d..b928bf347 100644 --- a/src/main/java/org/entando/entando/aps/system/services/pagemodel/PageModelService.java +++ b/src/main/java/org/entando/entando/aps/system/services/pagemodel/PageModelService.java @@ -15,6 +15,7 @@ import com.agiletec.aps.system.common.FieldSearchFilter; import com.agiletec.aps.system.common.model.dao.SearcherDaoPaginatedResult; +import org.apache.commons.lang3.BooleanUtils; import org.entando.entando.aps.system.services.security.NonceInjector; import org.entando.entando.ent.exception.EntException; import com.agiletec.aps.system.services.page.Widget; @@ -222,6 +223,8 @@ protected void copyProperties(PageModelRequest srcPpageModelRequest, PageModel d descPageModel.setTemplate(NonceInjector.process(srcPpageModelRequest.getTemplate())); descPageModel.setPluginCode(srcPpageModelRequest.getPluginCode()); descPageModel.setConfiguration(this.createPageModelConfiguration(srcPpageModelRequest)); + descPageModel.setType(srcPpageModelRequest.getType()); + descPageModel.setLocked(srcPpageModelRequest.getLocked() != null && srcPpageModelRequest.getLocked()); if (null != srcPpageModelRequest.getConfiguration() && ! CollectionUtils.isEmpty(srcPpageModelRequest.getConfiguration().getFrames()) @@ -294,6 +297,9 @@ protected BeanPropertyBindingResult validateDelete(PageModel pageModel) throws E if (references.size() > 0) { bindingResult.reject(PageModelValidator.ERRCODE_PAGEMODEL_REFERENCES, new Object[]{pageModel.getCode(), references}, "pageModel.cannot.delete.references"); } + if (pageModel.isLocked()) { + bindingResult.reject(PageModelValidator.ERRCODE_PAGEMODEL_LOCKED, new Object[]{pageModel.getCode()}, "pageModel.cannot.delete.locked"); + } return bindingResult; } @@ -329,7 +335,7 @@ public Map> getReferencingObjects(PageModel pageModel) thro try { String[] defNames = applicationContext.getBeanNamesForType(PageModelUtilizer.class); for (String beanName : defNames) { - Object service = null; + Object service; try { service = applicationContext.getBean(beanName); } catch (Throwable t) { diff --git a/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDto.java b/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDto.java index e2248646a..f2ab28ed8 100644 --- a/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDto.java +++ b/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDto.java @@ -13,6 +13,7 @@ */ package org.entando.entando.aps.system.services.pagemodel.model; +import com.agiletec.aps.system.services.pagemodel.PageModelType; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.annotation.JsonInclude.Include; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -31,6 +32,8 @@ public class PageModelDto { private int mainFrame = NO_MAIN_FRAME; private String pluginCode; private String template; + private PageModelType type; + private boolean locked; /** * The references grouped by service name. @@ -102,6 +105,22 @@ public void setReferences(Map references) { this.references = references; } + public PageModelType getType() { + return type; + } + + public void setType(PageModelType type) { + this.type = type; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + public static String getEntityFieldName(String dtoFieldName) { switch (dtoFieldName) { case "description": @@ -134,12 +153,14 @@ public boolean equals(Object o) { Objects.equals(configuration, that.configuration) && Objects.equals(pluginCode, that.pluginCode) && Objects.equals(template, that.template) && - Objects.equals(references, that.references); + Objects.equals(references, that.references) && + Objects.equals(type, that.type) && + Objects.equals(locked, that.locked); } @Override public int hashCode() { - return Objects.hash(code, descr, configuration, mainFrame, pluginCode, template, references); + return Objects.hash(code, descr, configuration, mainFrame, pluginCode, template, references, type, locked); } @Override @@ -152,6 +173,8 @@ public String toString() { .append("pluginCode", pluginCode) .append("template", template) .append("references", references) + .append("type", type) + .append("locked", locked) .toString(); } } diff --git a/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDtoBuilder.java b/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDtoBuilder.java index 996283c25..497a08972 100644 --- a/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDtoBuilder.java +++ b/src/main/java/org/entando/entando/aps/system/services/pagemodel/model/PageModelDtoBuilder.java @@ -38,6 +38,8 @@ protected PageModelDto toDto(PageModel src) { dest.setMainFrame(src.getMainFrame()); dest.setPluginCode(src.getPluginCode()); dest.setTemplate(src.getTemplate()); + dest.setType(src.getType()); + dest.setLocked(src.isLocked()); return dest; } diff --git a/src/main/java/org/entando/entando/web/pagemodel/model/PageModelRequest.java b/src/main/java/org/entando/entando/web/pagemodel/model/PageModelRequest.java index cad88d621..09a412248 100644 --- a/src/main/java/org/entando/entando/web/pagemodel/model/PageModelRequest.java +++ b/src/main/java/org/entando/entando/web/pagemodel/model/PageModelRequest.java @@ -13,6 +13,8 @@ */ package org.entando.entando.web.pagemodel.model; +import com.agiletec.aps.system.services.pagemodel.PageModelType; + import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -30,6 +32,8 @@ public class PageModelRequest { private String template; private String pluginCode; + private PageModelType type; + private Boolean locked; public String getCode() { return code; @@ -71,4 +75,19 @@ public void setPluginCode(String pluginCode) { this.pluginCode = pluginCode; } + public PageModelType getType() { + return type; + } + + public void setType(PageModelType type) { + this.type = type; + } + + public Boolean getLocked() { + return locked; + } + + public void setLocked(Boolean locked) { + this.locked = locked; + } } diff --git a/src/main/java/org/entando/entando/web/pagemodel/validator/PageModelValidator.java b/src/main/java/org/entando/entando/web/pagemodel/validator/PageModelValidator.java index 1e2ec03fe..777ac5003 100644 --- a/src/main/java/org/entando/entando/web/pagemodel/validator/PageModelValidator.java +++ b/src/main/java/org/entando/entando/web/pagemodel/validator/PageModelValidator.java @@ -39,6 +39,7 @@ public class PageModelValidator extends AbstractPaginationValidator { public static final String ERRCODE_SKETCH_XY = "8"; public static final String ERRCODE_OVERLAPPING_FRAMES = "9"; public static final String ERRCODE_SKETCH_NULL = "10"; + public static final String ERRCODE_PAGEMODEL_LOCKED = "11"; private static final String ERR_MSG_FRAMES_POS_MISMATCH = "pageModel.frames.pos.mismatch"; private static final String ERR_MSG_CODE_MISMATCH = "pageModel.code.mismatch"; diff --git a/src/main/resources/liquibase/changeSetPort.xml b/src/main/resources/liquibase/changeSetPort.xml index 7ace77c51..97a5ce3de 100644 --- a/src/main/resources/liquibase/changeSetPort.xml +++ b/src/main/resources/liquibase/changeSetPort.xml @@ -12,5 +12,7 @@ + + diff --git a/src/main/resources/liquibase/port/00000000000002_nx_pagemodels.sql b/src/main/resources/liquibase/port/00000000000002_nx_pagemodels.sql new file mode 100644 index 000000000..c3828861e --- /dev/null +++ b/src/main/resources/liquibase/port/00000000000002_nx_pagemodels.sql @@ -0,0 +1,21 @@ +INSERT INTO pagemodels (code,descr,frames,plugincode,templategui, type, locked) VALUES ('nx-page-template','NxPage Template',' + + + +',NULL,'<#assign wp=JspTaglibs["/aps-core"]> +<@wp.info key="systemParam" paramName="applicationBaseURL" var="appUrl" /> + + + + + + <@wp.currentPage param="title" /> + + + + + + + + +', 'NX', 1); diff --git a/src/main/resources/liquibase/port/00000000000002_nx_pagemodels.xml b/src/main/resources/liquibase/port/00000000000002_nx_pagemodels.xml new file mode 100644 index 000000000..61aafe203 --- /dev/null +++ b/src/main/resources/liquibase/port/00000000000002_nx_pagemodels.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/src/main/resources/rest/messages.properties b/src/main/resources/rest/messages.properties index 2ff18aff2..4b2c5e2f9 100644 --- a/src/main/resources/rest/messages.properties +++ b/src/main/resources/rest/messages.properties @@ -121,6 +121,7 @@ pageModel.code.exists=The page template ''{0}'' already exists pageModel.frames.pos.mismatch=frame position should be zero based and progressive pageModel.code.mismatch=the code specified the URI ''{0}'' does not match with the one provided in the payload ''{1}'' pageModel.cannot.delete.references=The page template ''{0}'' can not be deleted due to references +pageModel.cannot.delete.locked=The page template ''{0}'' cannot be deleted because it is locked pageModel.defaultWidget.notExists=Default widget ''{0}'' specified in frame ''{1}'' does not exists pageModel.defaultWidget.invalidParameter=Parameter ''{0}'' of default Widget ''{1}'' specified in frame ''{2}'' is invalid #pageModel.update.patch.invalid.generic=The provided patch for pageModel ''{0}'' is not valid diff --git a/src/test/java/com/agiletec/aps/system/services/pagemodel/TestJaxbPageModel.java b/src/test/java/com/agiletec/aps/system/services/pagemodel/TestJaxbPageModel.java index 4a15a7a01..178e2a253 100644 --- a/src/test/java/com/agiletec/aps/system/services/pagemodel/TestJaxbPageModel.java +++ b/src/test/java/com/agiletec/aps/system/services/pagemodel/TestJaxbPageModel.java @@ -96,6 +96,7 @@ private PageModel createMockPageModel(String code) { Frame[] configuration = {frame0, frame1, frame2}; model.setConfiguration(configuration); model.setTemplate("Freemarker template content"); + model.setType(PageModelType.NT); return model; } diff --git a/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelDAO.java b/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelDAO.java index 01d6be852..c3ba2848b 100644 --- a/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelDAO.java +++ b/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelDAO.java @@ -55,6 +55,7 @@ void testAddRemoveModel() throws Throwable { PageModel extractedMockModel = models.get(testPageModelCode); assertNotNull(extractedMockModel); assertEquals(testPageModelCode, extractedMockModel.getCode()); + assertEquals(mockModel.getType(), extractedMockModel.getType()); assertTrue(extractedMockModel.getDescription().contains(testPageModelCode)); assertEquals(3, extractedMockModel.getFrames().length); Widget[] defaultWidgets = extractedMockModel.getDefaultWidget(); @@ -169,6 +170,7 @@ private PageModel createMockPageModel(String code) { Frame[] configuration = {frame0, frame1, frame2}; model.setConfiguration(configuration); model.setTemplate("Freemarker template content"); + model.setType(PageModelType.NT); return model; } diff --git a/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelManager.java b/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelManager.java index 7eb7f1c60..cc8be1688 100644 --- a/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelManager.java +++ b/src/test/java/com/agiletec/aps/system/services/pagemodel/TestPageModelManager.java @@ -30,6 +30,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -47,13 +48,13 @@ class TestPageModelManager extends BaseTestCase { void testSearch_with_null_empty_filters() throws EntException { List filters = null; SearcherDaoPaginatedResult result = this._pageModelManager.searchPageModels(filters); - assertThat(result.getCount(), is(3)); - assertThat(result.getList().size(), is(3)); + assertThat(result.getCount(), is(4)); + assertThat(result.getList().size(), is(4)); filters = new ArrayList<>(); result = this._pageModelManager.searchPageModels(filters); - assertThat(result.getCount(), is(3)); - assertThat(result.getList().size(), is(3)); + assertThat(result.getCount(), is(4)); + assertThat(result.getList().size(), is(4)); } @Test @@ -64,7 +65,7 @@ void testSearch_with_page_filter() throws EntException { List filters = restListRequest.buildFieldSearchFilters(); SearcherDaoPaginatedResult result = this._pageModelManager.searchPageModels(filters); - assertThat(result.getCount(), is(3)); + assertThat(result.getCount(), is(4)); assertThat(result.getList().size(), is(2)); restListRequest.addFilter(new Filter("descr", "modello")); @@ -99,7 +100,7 @@ void testGetPageModel() throws EntException { @Test void testGetPageModels() throws EntException { List pageModels = new ArrayList<>(this._pageModelManager.getPageModels()); - assertEquals(3, pageModels.size()); + assertEquals(4, pageModels.size()); for (int i = 0; i < pageModels.size(); i++) { PageModel pageModel = pageModels.get(i); String code = pageModel.getCode(); @@ -148,6 +149,8 @@ void testAddRemoveModel() throws Throwable { assertNotNull(extractedMockModel); assertEquals(testPageModelCode, extractedMockModel.getCode()); assertTrue(extractedMockModel.getDescription().contains(testPageModelCode)); + assertEquals(mockModel.getType(), extractedMockModel.getType()); + assertFalse(extractedMockModel.isLocked()); assertEquals(3, extractedMockModel.getFrames().length); Widget[] defaultWidgets = extractedMockModel.getDefaultWidget(); assertEquals(3, defaultWidgets.length); @@ -250,6 +253,8 @@ private PageModel createMockPageModel(String code) { Frame[] configuration = {frame0, frame1, frame2}; model.setConfiguration(configuration); model.setTemplate("Freemarker template content"); + model.setType(PageModelType.NT); + model.setLocked(Boolean.FALSE); return model; } diff --git a/src/test/java/com/agiletec/aps/system/services/url/URLManagerIntegrationTest.java b/src/test/java/com/agiletec/aps/system/services/url/URLManagerIntegrationTest.java index 161016c13..c16e5d58f 100644 --- a/src/test/java/com/agiletec/aps/system/services/url/URLManagerIntegrationTest.java +++ b/src/test/java/com/agiletec/aps/system/services/url/URLManagerIntegrationTest.java @@ -69,6 +69,28 @@ void testGetURLString_2() throws Throwable { } } + @Test + void testGetWebUiURLString() throws Throwable { + String webUiBaseUrl = "https://webui.entando.org/webui"; + RequestContext reqCtx = this.getRequestContext(); + reqCtx.addExtraParam(SystemConstants.EXTRAPAR_WEB_UI_APPL_BASE_URL, webUiBaseUrl); + PageURL pageURL = urlManager.createURL(reqCtx); + pageURL.setLangCode("en"); + pageURL.setPageCode("pagina_11"); + try { + String url = this.urlManager.getURLString(pageURL, reqCtx); + assertEquals(webUiBaseUrl + "/en/pagina_11.page", url); + this.changeUrlStyle(IPageManager.CONFIG_PARAM_URL_STYLE_BREADCRUMBS); + url = this.urlManager.getURLString(pageURL, reqCtx); + assertEquals(webUiBaseUrl + "/pages/en/homepage/pagina_1/pagina_11/", url); + } catch (Throwable t) { + throw t; + } finally { + this.changeUrlStyle(IPageManager.CONFIG_PARAM_URL_STYLE_CLASSIC); + reqCtx.removeExtraParam(SystemConstants.EXTRAPAR_WEB_UI_APPL_BASE_URL); + } + } + private void changeUrlStyle(String styleType) throws Throwable { try { String xmlParams = this.configManager.getConfigItem(SystemConstants.CONFIG_ITEM_PARAMS); diff --git a/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelServiceTest.java b/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelServiceTest.java index f8ff3ae0e..c9b6d7088 100644 --- a/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelServiceTest.java +++ b/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelServiceTest.java @@ -1,9 +1,10 @@ package org.entando.entando.aps.system.services.pagemodel; import com.agiletec.aps.system.common.model.dao.SearcherDaoPaginatedResult; -import com.agiletec.aps.system.services.pagemodel.Frame; import com.agiletec.aps.system.services.pagemodel.IPageModelManager; import com.agiletec.aps.system.services.pagemodel.PageModel; +import com.agiletec.aps.system.services.pagemodel.PageModelUtilizer; +import org.apache.commons.lang3.BooleanUtils; import org.entando.entando.aps.system.services.assertionhelper.PageModelAssertionHelper; import org.entando.entando.aps.system.services.mockhelper.PageMockHelper; import org.entando.entando.aps.system.services.page.IPageService; @@ -14,12 +15,11 @@ import org.entando.entando.aps.system.services.widgettype.WidgetType; import org.entando.entando.ent.exception.EntException; import org.entando.entando.web.common.assembler.PagedMetadataMapper; +import org.entando.entando.web.common.exceptions.ValidationGenericException; import org.entando.entando.web.common.model.PagedMetadata; import org.entando.entando.web.common.model.RestListRequest; import org.entando.entando.web.component.ComponentUsageEntity; import org.entando.entando.web.page.model.PageSearchRequest; -import org.entando.entando.web.pagemodel.model.PageModelConfigurationRequest; -import org.entando.entando.web.pagemodel.model.PageModelFrameReq; import org.entando.entando.web.pagemodel.model.PageModelRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -33,11 +33,11 @@ import java.lang.reflect.Field; import java.util.*; -import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.entando.entando.aps.system.services.pagemodel.PageModelTestUtil.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -60,7 +60,7 @@ class PageModelServiceTest { @Mock private PageModelServiceUtilizer pageModelServiceUtilizer; - + @Mock private PagedMetadataMapper pagedMetadataMapper; @@ -76,9 +76,10 @@ public void setUp() throws Exception { Field pagedMetadataMapper = ReflectionUtils.findField(pageModelService.getClass(), "pagedMetadataMapper"); pagedMetadataMapper.setAccessible(true); pagedMetadataMapper.set(pageModelService, this.pagedMetadataMapper); + lenient().when(applicationContext.getBeanNamesForType(PageModelUtilizer.class)).thenReturn(new String[]{}); } - @Test + @Test void addPageModelCallsPageModelManager() throws Exception { WidgetType mockType = Mockito.mock(WidgetType.class); when(mockType.hasParameter(Mockito.anyString())).thenReturn(true); @@ -91,9 +92,11 @@ void addPageModelCallsPageModelManager() throws Exception { assertThat(result.getDescr()).isEqualTo(pageModelRequest.getDescr()); assertThat(result.getPluginCode()).isEqualTo(pageModelRequest.getPluginCode()); assertThat(result.getMainFrame()).isEqualTo(DEFAULT_MAIN_FRAME); + assertThat(result.getType()).isEqualTo(pageModelRequest.getType()); + assertThat(result.isLocked()).isFalse(); } - @Test + @Test void get_page_models_returns_page_models() throws EntException { when(pageModelManager.searchPageModels(any())).thenReturn(pageModels()); PagedMetadata result = pageModelService.getPageModels(EMPTY_REQUEST, null); @@ -217,14 +220,24 @@ void shouldNotChangeTemplateWithNonce() throws Exception { verify(pageModelManager, times(1)).updatePageModel(any()); } + @Test + void shouldThrowAnErrorWhenDeletingLockedPage() throws Exception { + PageModel pageModel = validPageModel(); + pageModel.setLocked(true); + when(pageModelManager.getPageModel(pageModel.getCode())).thenReturn(pageModel); + + ValidationGenericException exception = assertThrows(ValidationGenericException.class, + () -> pageModelService.removePageModel(pageModel.getCode())); + assertThat(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()).contains("locked"); + } private PagedMetadata resultPagedMetadata() { RestListRequest request = new RestListRequest(); - return new PagedMetadata<>(request, asList(dtoBuilder.convert(pageModel())), 1); + return new PagedMetadata<>(request, Collections.singletonList(dtoBuilder.convert(pageModel())), 1); } private static SearcherDaoPaginatedResult pageModels() { - return new SearcherDaoPaginatedResult<>(asList(pageModel())); + return new SearcherDaoPaginatedResult<>(Collections.singletonList(pageModel())); } private static PageModel pageModel() { @@ -232,32 +245,4 @@ private static PageModel pageModel() { localPageModel.setCode(PAGE_MODEL_CODE); return localPageModel; } - - private static PageModel pageModelFrom(PageModelRequest pageModelRequest) { - Frame[] frames = framesFrom(pageModelRequest.getConfiguration()); - PageModel pageModel = new PageModel(); - pageModel.setCode(pageModelRequest.getCode()); - pageModel.setDescription(pageModelRequest.getDescr()); - pageModel.setConfiguration(frames); - return pageModel; - } - - private static Frame[] framesFrom(PageModelConfigurationRequest configuration) { - List requestFrames = configuration.getFrames(); - if (requestFrames == null) { - return new Frame[]{}; - } - Frame[] frames = new Frame[requestFrames.size()]; - for (int i = 0; i < requestFrames.size(); i++) { - frames[i] = frameFrom(requestFrames.get(i)); - } - return frames; - } - - private static Frame frameFrom(PageModelFrameReq request) { - Frame frame = new Frame(); - frame.setDescription(request.getDescr()); - return frame; - } - } diff --git a/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelTestUtil.java b/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelTestUtil.java index 9bfb6dcd1..40b2ec7d9 100644 --- a/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelTestUtil.java +++ b/src/test/java/org/entando/entando/aps/system/services/pagemodel/PageModelTestUtil.java @@ -17,6 +17,7 @@ import com.agiletec.aps.system.services.pagemodel.Frame; import com.agiletec.aps.system.services.pagemodel.FrameSketch; import com.agiletec.aps.system.services.pagemodel.PageModel; +import com.agiletec.aps.system.services.pagemodel.PageModelType; import com.fasterxml.jackson.core.JsonProcessingException; import org.entando.entando.aps.system.services.widgettype.WidgetType; import org.entando.entando.aps.system.services.widgettype.WidgetTypeParameter; @@ -45,6 +46,7 @@ public static PageModelRequest validPageModelRequest() { request.setDescr(DESCRIPTION); request.setTemplate(PAGE_MODEL_TEMPLATE); request.setConfiguration(createValidPageModelConfigurationRequest()); + request.setType(PageModelType.NT); return request; } public static PageModelRequest validPageModelRequestDefaultWidgetConfigNull() { diff --git a/src/test/java/org/entando/entando/web/pagemodel/1_POST_valid_frames.json b/src/test/java/org/entando/entando/web/pagemodel/1_POST_valid_frames.json index 27993a8db..0e39c256c 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/1_POST_valid_frames.json +++ b/src/test/java/org/entando/entando/web/pagemodel/1_POST_valid_frames.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/2_POST_valid_frames.json b/src/test/java/org/entando/entando/web/pagemodel/2_POST_valid_frames.json index aff7a053e..172cb6708 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/2_POST_valid_frames.json +++ b/src/test/java/org/entando/entando/web/pagemodel/2_POST_valid_frames.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/PageModelControllerIntegrationTest.java b/src/test/java/org/entando/entando/web/pagemodel/PageModelControllerIntegrationTest.java index 0fc808a3b..425159248 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/PageModelControllerIntegrationTest.java +++ b/src/test/java/org/entando/entando/web/pagemodel/PageModelControllerIntegrationTest.java @@ -25,6 +25,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.agiletec.aps.system.services.pagemodel.FrameSketch; +import com.agiletec.aps.system.services.pagemodel.PageModelType; import com.agiletec.aps.util.FileTextReader; import org.entando.entando.ent.exception.EntException; import com.agiletec.aps.system.services.group.Group; @@ -225,6 +226,7 @@ void deletePageModelReturnOK() throws Exception { PageModel pageModel = new PageModel(); pageModel.setCode(PAGE_MODEL_CODE); pageModel.setDescription(PAGE_MODEL_CODE); + pageModel.setType(PageModelType.NT); this.pageModelManager.addPageModel(pageModel); ResultActions result = mockMvc.perform( delete("/pageModels/{code}", PAGE_MODEL_CODE) @@ -685,7 +687,7 @@ void shouldSortWithoutApplyingFilterToTheSortingAttribute() throws Exception { get("/pageModels?sort=pluginCode") .header("Authorization", "Bearer " + accessToken)); result.andExpect(status().isOk()); - result.andExpect(jsonPath("$.metaData.totalItems", is(3))); + result.andExpect(jsonPath("$.metaData.totalItems", is(4))); } private String getJsonRequest(String filename) throws Exception { diff --git a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_1.json b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_1.json index 0288c5d61..818d44bab 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_1.json +++ b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_1.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_2.json b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_2.json index b08abeae7..2c6ac4711 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_2.json +++ b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_2.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_3.json b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_3.json index 1ed9f9188..bff31956a 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_3.json +++ b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_3.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_4.json b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_4.json index 54f1d5127..a2f51a059 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_4.json +++ b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_4.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_5.json b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_5.json index 11e810ed9..047639574 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_5.json +++ b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_5.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_6.json b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_6.json index 807644255..7489ff98c 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_6.json +++ b/src/test/java/org/entando/entando/web/pagemodel/invalid_Y1Y2_frames_6.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_1.json b/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_1.json index 5b213b174..c9c25f8f8 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_1.json +++ b/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_1.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false }, diff --git a/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_2.json b/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_2.json index 9d1ff8ccf..4e15c3319 100644 --- a/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_2.json +++ b/src/test/java/org/entando/entando/web/pagemodel/overlapping_frames_2.json @@ -4,6 +4,8 @@ "mainFrame": -1, "pluginCode": null, "template": "<#assign wp=JspTaglibs[\"/aps-core\"]>\n\n\n\n\t<@wp.currentPage param=\"title\" />\n\n\n

<@wp.currentPage param=\"title\" />

\n\" >Home
\n
<@wp.show frame=0 />
\n
<@wp.show frame=1 />
\n\n", + "type": "NT", + "locked": false, "references": { "PageManager": false },