From 41cc4e41c1174c0b3ccc8fa5955709878cd9216f Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 22 Jul 2019 10:19:51 -0600 Subject: [PATCH] Issue 16767 fixes onpersonaendpoint (#16854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #16252 format source. Introduce format checker on build. Alter style … (#16288) * #16252 format source. Introduce format checker on build. Alter style files * #16252 remove unwanted file * #16252 remove unwanted file * Updating commit reference for src/main/enterprise * try different location for checkstyle.xml * Revert "#16252 format source. Introduce format checker on build. Alter style … (#16288)" (#16291) This reverts commit 05f908214ad9ddf6a1580e56d12d9f7bec8a16cb. * Updating commit reference for src/main/enterprise * #16767 changes requested from fox * #16767 Formatting the page persona * #16767 implementing the filter on the pagination for personas per page * #16767 now the persona contentlet is being retrive as hydrated * language key * #16767 fixing the persona output on the page render * #16767 removing merge stuff --- .../rest/api/v1/page/PageResourceTest.java | 4 +-- .../dotcms/rest/api/v1/page/PageResource.java | 9 ++++++- .../PersonalizationPersonaPageView.java | 6 +++-- ...rsonalizationPersonaPageViewPaginator.java | 27 ++++++++++++------- ...sonalizationPersonaPageViewSerializer.java | 19 +++++++++++++ .../page/ViewAsPageStatusSerializer.java | 19 +++++++++---- .../WEB-INF/messages/Language.properties | 1 + 7 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewSerializer.java diff --git a/dotCMS/src/integration-test/java/com/dotcms/rest/api/v1/page/PageResourceTest.java b/dotCMS/src/integration-test/java/com/dotcms/rest/api/v1/page/PageResourceTest.java index d805cd22a1fa..7d61967c69a9 100644 --- a/dotCMS/src/integration-test/java/com/dotcms/rest/api/v1/page/PageResourceTest.java +++ b/dotCMS/src/integration-test/java/com/dotcms/rest/api/v1/page/PageResourceTest.java @@ -152,7 +152,7 @@ public void init() throws DotSecurityException, DotDataException { */ @Test public void testGetPersonalizedPersonasOnPage() - throws DotSecurityException, DotDataException { + throws Exception { final MultiTreeAPI multiTreeAPI = APILocator.getMultiTreeAPI(); final String htmlPage = UUIDGenerator.generateUuid(); @@ -169,7 +169,7 @@ public void testGetPersonalizedPersonasOnPage() when(request.getRequestURI()).thenReturn("/index"); final Response response = pageResource.getPersonalizedPersonasOnPage(request, new EmptyHttpResponse(), - null, 0, 10, "title", "ASC", htmlPage); + null, 0, 10, "title", "ASC", null, htmlPage); final ResponseEntityView entityView = (ResponseEntityView)response.getEntity(); assertNotNull(entityView); diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/page/PageResource.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/page/PageResource.java index 650d90072082..b423efd4585c 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/page/PageResource.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/page/PageResource.java @@ -11,7 +11,11 @@ import com.dotcms.rest.api.v1.personalization.PersonalizationPersonaPageViewPaginator; import com.dotcms.util.PaginationUtil; import com.dotcms.util.pagination.OrderDirection; +import com.dotmarketing.business.web.WebAPILocator; +import com.dotmarketing.util.UtilMethods; import com.google.common.collect.ImmutableMap; +import com.liferay.portal.PortalException; +import com.liferay.portal.SystemException; import org.glassfish.jersey.server.JSONP; import com.dotcms.rest.InitDataObject; import com.dotcms.rest.ResponseEntityView; @@ -547,7 +551,8 @@ public Response getPersonalizedPersonasOnPage (@Context final HttpServletRequest @QueryParam(PaginationUtil.PER_PAGE) final int perPage, @DefaultValue("title") @QueryParam(PaginationUtil.ORDER_BY) final String orderbyParam, @DefaultValue("ASC") @QueryParam(PaginationUtil.DIRECTION) final String direction, - @PathParam("pageId") final String pageId) { + @QueryParam("hostId") final String hostId, + @PathParam("pageId") final String pageId) throws SystemException, PortalException, DotDataException, DotSecurityException { final User user = this.webResource.init(request, response, true).getUser(); final boolean respectFrontEndRoles = PageMode.get(request).respectAnonPerms; @@ -557,8 +562,10 @@ public Response getPersonalizedPersonasOnPage (@Context final HttpServletRequest final Map extraParams = ImmutableMap.builder() .put(PersonalizationPersonaPageViewPaginator.PAGE_ID, pageId) + .put("hostId", UtilMethods.isSet(hostId)?hostId: WebAPILocator.getHostWebAPI().getCurrentHost(request).getIdentifier()) .put("respectFrontEndRoles",respectFrontEndRoles).build(); + final PaginationUtil paginationUtil = new PaginationUtil(new PersonalizationPersonaPageViewPaginator()); return paginationUtil.getPage(request, user, filter, page, perPage, orderbyParam, diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageView.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageView.java index f8c1113abb12..9506c9cdd37d 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageView.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageView.java @@ -1,6 +1,8 @@ package com.dotcms.rest.api.v1.personalization; -import com.dotmarketing.portlets.personas.model.Persona; +import com.dotmarketing.portlets.htmlpageasset.business.render.page.PageViewSerializer; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.io.Serializable; import java.util.Map; @@ -9,6 +11,7 @@ * Encapsulates the personalization for personas per page, if the persona * @author jsanca */ +@JsonSerialize(using = PersonalizationPersonaPageViewSerializer.class) public class PersonalizationPersonaPageView implements Serializable { private final String pageId; @@ -20,7 +23,6 @@ public PersonalizationPersonaPageView(final String pageId, this.persona = persona; } - public String getPageId() { return pageId; } diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewPaginator.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewPaginator.java index 731bfb1ab1f0..40b906267ef7 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewPaginator.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewPaginator.java @@ -2,7 +2,6 @@ import com.dotcms.util.pagination.OrderDirection; import com.dotcms.util.pagination.PaginatorOrdered; -import com.dotmarketing.beans.MultiTree; import com.dotmarketing.business.APILocator; import com.dotmarketing.exception.DotDataException; import com.dotmarketing.exception.DotRuntimeException; @@ -11,6 +10,7 @@ import com.dotmarketing.portlets.contentlet.business.ContentletAPI; import com.dotmarketing.portlets.contentlet.model.Contentlet; import com.dotmarketing.portlets.contentlet.transform.ContentletToMapTransformer; +import com.dotmarketing.portlets.contentlet.util.ContentletUtil; import com.dotmarketing.portlets.personas.business.PersonaAPI; import com.dotmarketing.portlets.personas.model.Persona; import com.dotmarketing.util.Logger; @@ -19,14 +19,14 @@ import com.liferay.portal.model.User; import com.liferay.util.StringPool; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.*; -import java.util.stream.Collectors; public class PersonalizationPersonaPageViewPaginator implements PaginatorOrdered { public static final String PAGE_ID = "pageId"; - private static final String PERSONAS_QUERY = "+contentType:persona +live:true +deleted:false +working:true"; + private static final String PERSONAS_QUERY = "+contentType:persona +live:true +deleted:false +working:true +conhost:"; private final PersonaAPI personaAPI; private final MultiTreeAPI multiTreeAPI; @@ -53,6 +53,13 @@ public PaginatedArrayList getItems(final User us final boolean respectFrontendRoles = (Boolean)extraParams.get("respectFrontEndRoles"); final String pageId = extraParams.get(PAGE_ID).toString(); String orderByString = UtilMethods.isSet(orderBy) ? orderBy : "title desc"; + final String hostId = extraParams.get("hostId").toString(); + final StringBuilder query = new StringBuilder(PERSONAS_QUERY).append(hostId); + + if (UtilMethods.isSet(filter)) { + + query.append(" +persona.name:").append(filter).append("*"); + } orderByString = orderByString.trim().toLowerCase().endsWith(" asc") || orderByString.trim().toLowerCase().endsWith(" desc")? orderByString: @@ -61,27 +68,27 @@ public PaginatedArrayList getItems(final User us try { final List contentlets = this.contentletAPI.search - (PERSONAS_QUERY, limit, offset, orderByString, user,respectFrontendRoles); + (query.toString(), limit, offset, orderByString, user,respectFrontendRoles); final Set personaTagPerPage = this.multiTreeAPI.getPersonalizationsForPage (pageId); final List personalizationPersonaPageViews = new ArrayList<>(); for (final Contentlet contentlet : contentlets) { - final Persona persona = this.personaAPI.fromContentlet(contentlet); - final ContentletToMapTransformer transformer = new ContentletToMapTransformer(persona); - final Map contentletMap = transformer.toMaps().stream().findFirst().orElse(Collections.EMPTY_MAP); + final Map contentletMap = ContentletUtil.getContentPrintableMap(user, contentlet); contentletMap.put("personalized", - personaTagPerPage.contains(Persona.DOT_PERSONA_PREFIX_SCHEME + StringPool.COLON + persona.getKeyTag())); + personaTagPerPage.contains(Persona.DOT_PERSONA_PREFIX_SCHEME + StringPool.COLON + + contentlet.getStringProperty(PersonaAPI.KEY_TAG_FIELD))); personalizationPersonaPageViews.add(new PersonalizationPersonaPageView(pageId, contentletMap)); } final PaginatedArrayList result = new PaginatedArrayList<>(); result.addAll(personalizationPersonaPageViews); - result.setTotalResults(this.contentletAPI.indexCount(PERSONAS_QUERY, user, respectFrontendRoles)); + result.setTotalResults(this.contentletAPI.indexCount(query.toString(), user, respectFrontendRoles)); return result; - } catch (DotDataException | IllegalAccessException | InvocationTargetException| DotSecurityException e) { + } catch (Exception e) { + Logger.error(this, e.getMessage(), e); throw new DotRuntimeException(e); } diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewSerializer.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewSerializer.java new file mode 100644 index 000000000000..a9b4ffbfa5a7 --- /dev/null +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/personalization/PersonalizationPersonaPageViewSerializer.java @@ -0,0 +1,19 @@ +package com.dotcms.rest.api.v1.personalization; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +public class PersonalizationPersonaPageViewSerializer extends JsonSerializer { + @Override + public void serialize(final PersonalizationPersonaPageView personaPageView, + final JsonGenerator jsonGenerator, + final SerializerProvider serializers) throws IOException { + + jsonGenerator.writeRawValue(new ObjectMapper().writer().withDefaultPrettyPrinter() + .writeValueAsString(personaPageView.getPersona())); + } +} diff --git a/dotCMS/src/main/java/com/dotmarketing/portlets/htmlpageasset/business/render/page/ViewAsPageStatusSerializer.java b/dotCMS/src/main/java/com/dotmarketing/portlets/htmlpageasset/business/render/page/ViewAsPageStatusSerializer.java index a44136d3647b..df747c00e266 100644 --- a/dotCMS/src/main/java/com/dotmarketing/portlets/htmlpageasset/business/render/page/ViewAsPageStatusSerializer.java +++ b/dotCMS/src/main/java/com/dotmarketing/portlets/htmlpageasset/business/render/page/ViewAsPageStatusSerializer.java @@ -1,14 +1,16 @@ package com.dotmarketing.portlets.htmlpageasset.business.render.page; +import com.dotmarketing.business.APILocator; +import com.dotmarketing.exception.DotDataException; +import com.dotmarketing.portlets.contentlet.model.Contentlet; +import com.dotmarketing.portlets.contentlet.util.ContentletUtil; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; -import com.dotmarketing.portlets.personas.model.Persona; import com.google.common.collect.ImmutableMap; import java.io.IOException; -import java.util.HashMap; import java.util.Map; /** @@ -23,9 +25,16 @@ public void serialize(ViewAsPageStatus viewAsPageStatus, JsonGenerator jsonGener if (viewAsPageStatus.getPersona() != null) { - final Map personaMap = new HashMap(Persona.class.cast(viewAsPageStatus.getPersona()).getMap()); - personaMap.put("personalized", viewAsPageStatus.isPersonalized()); - viewAsMapBuilder.put("persona", personaMap); + try { + + final Map personaMap = ContentletUtil.getContentPrintableMap(APILocator.systemUser(), + (Contentlet)viewAsPageStatus.getPersona()); + personaMap.put("personalized", viewAsPageStatus.isPersonalized()); + viewAsMapBuilder.put("persona", personaMap); + } catch (DotDataException e) { + + throw new IOException(e); + } } viewAsMapBuilder.put("language", viewAsPageStatus.getLanguage()); diff --git a/dotCMS/src/main/webapp/WEB-INF/messages/Language.properties b/dotCMS/src/main/webapp/WEB-INF/messages/Language.properties index 4b696fe0a1f3..3773d2680717 100644 --- a/dotCMS/src/main/webapp/WEB-INF/messages/Language.properties +++ b/dotCMS/src/main/webapp/WEB-INF/messages/Language.properties @@ -2572,6 +2572,7 @@ modes.Page = Page modes.persona.no.persona = Default Visitor modes.persona.select.persona = Viewing as modes.persona.personalized = Personalized +modes.persona.selector.title = Personalize As modes.Preview = Preview modes.Previous = Previous modes.Publish-Page = Publish Page