Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@
public interface PageStructureRewriteRule extends StructureRewriteRule{

String getStaticTemplate();

/**
* Gets the editable template for this structure rewrite rule
* @return
*/
String getEditableTemplate();
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,9 @@

package com.adobe.aem.modernize.structure;

import java.util.Set;

import org.apache.sling.api.resource.ResourceResolver;

import com.adobe.aem.modernize.RewriteException;
import com.adobe.aem.modernize.RewriteRuleService;
import com.adobe.aem.modernize.component.ComponentRewriteRule;

import java.util.Set;

/**
* Provides a mechanism for listing all of the configured rules either via Nodes or custom implementations.
Expand All @@ -37,4 +33,11 @@ public interface StructureRewriteRuleService extends RewriteRuleService<Structur
* @return
*/
Set<String> getTemplates();

/**
* List all the editable templates for the given static template
* @param staticTemplate
* @return
*/
Set<String> getEditableTemplates(String staticTemplate);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@
package com.adobe.aem.modernize.structure.datasources;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
Expand All @@ -37,7 +33,6 @@
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.jackrabbit.util.ISO9075;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
Expand Down Expand Up @@ -124,14 +119,21 @@ private List<Resource> buildResources(String searchPath, SlingHttpServletRequest
if (pageContent.hasProperty(NameConstants.PN_TITLE)) {
title = pageContent.getProperty(NameConstants.PN_TITLE).getString();
}
Map<String, Object> map = new HashMap<>();
map.put("title", title);
map.put("pagePath", pagePath);
map.put("templateType", pageContent.getProperty(NameConstants.NN_TEMPLATE).getString());
map.put("href", href);
map.put("crxHref", crxHref);
resources.add(new ValueMapResource(request.getResourceResolver(), request.getResource() + "/page" + index, itemResourceType, new ValueMapDecorator(map)));
index++;

String staticTemplate = pageContent.getProperty(NameConstants.NN_TEMPLATE).getString();
Set<String> editableTemplates = structureRewriteRuleService.getEditableTemplates(staticTemplate);

for(String editableTmpl : editableTemplates) {
Map<String, Object> map = new HashMap<>();
map.put("title", title);
map.put("pagePath", pagePath);
map.put("templateType", staticTemplate);
map.put("editableTemplate", editableTmpl);
map.put("href", href);
map.put("crxHref", crxHref);
resources.add(new ValueMapResource(request.getResourceResolver(), request.getResource() + "/page" + index, itemResourceType, new ValueMapDecorator(map)));
index++;
}
}
return resources;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,26 @@
*/
package com.adobe.aem.modernize.structure.impl;

import java.io.IOException;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import com.adobe.aem.modernize.RewriteException;
import com.adobe.aem.modernize.structure.StructureRewriteRule;
import com.adobe.aem.modernize.structure.StructureRewriteRuleService;
import com.adobe.aem.modernize.structure.impl.rules.PageRewriteRule;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONObject;

import com.adobe.aem.modernize.RewriteException;
import com.adobe.aem.modernize.structure.StructureRewriteRule;
import com.adobe.aem.modernize.structure.StructureRewriteRuleService;
import com.adobe.aem.modernize.structure.impl.StructureTreeRewriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.Node;
import javax.jcr.Session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@SlingServlet(
methods = "POST",
paths = "/libs/cq/modernize/templatestructure/content/convert",
Expand All @@ -58,30 +56,46 @@ public class StructureConversionServlet extends SlingAllMethodsServlet {

@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
// validate 'paths' parameter
RequestParameter[] paths = request.getRequestParameters(PARAM_PATHS);
if (paths == null) {
logger.warn("Missing parameter '" + PARAM_PATHS + "'");
response.setContentType("text/html");
response.getWriter().println("Missing parameter '" + PARAM_PATHS + "'");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}

throws ServletException {
// validate request data
try {
// get structure rewrite rules
List<StructureRewriteRule> rules = structureRewriteRuleService.getRules(request.getResourceResolver());
// FIXME: need to send json content type and not handle this like a form post
String requestData = request.getRequestParameterList().get(0).getName();
JSONObject jsonRequest = new JSONObject(requestData);

if (!jsonRequest.has("pages")) {
logger.warn("Missing pages");
response.setContentType("text/html");
response.getWriter().println("Missing parameter");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}

long tick = System.currentTimeMillis();
Session session = request.getResourceResolver().adaptTo(Session.class);
StructureTreeRewriter rewriter = new StructureTreeRewriter(rules);
JSONObject results = new JSONObject();
logger.debug("Converting {} structures", paths.length);
JSONArray pages = jsonRequest.getJSONArray("pages");
logger.debug("Converting {} structures", pages.length());

// iterate over all paths
for (RequestParameter parameter : paths) {
String path = parameter.getString();
for (int i = 0; i < pages.length(); i++) {
// get rules for the structure
String path = pages.getJSONObject(i).getString("path");
String template = pages.getJSONObject(i).getString("template");
List<StructureRewriteRule> rules = structureRewriteRuleService.getRules(request.getResourceResolver());

// remove rule not pertaining to chosen editable template
for (int i1 = 0; i1 < rules.size(); i1++) {
StructureRewriteRule rule = rules.get(i1);
if (rule instanceof PageRewriteRule) {
String editableTemplate = ((PageRewriteRule) rule).getEditableTemplate();
if (!editableTemplate.equals(template)) {
rules.remove(rule);
}
}
}
StructureTreeRewriter rewriter = new StructureTreeRewriter(rules);

JSONObject json = new JSONObject();
results.put(path, json);

Expand All @@ -102,11 +116,12 @@ protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse
logger.warn("Converting structure {} failed", path, e);
}
}

response.setContentType("application/json");
response.getWriter().write(results.toString());

long tack = System.currentTimeMillis();
logger.debug("Rewrote {} structures in {} ms", paths.length, tack - tick);
logger.debug("Rewrote {} structures in {} ms", pages.length(), tack - tick);
} catch (Exception e) {
throw new ServletException("Caught exception while rewriting structures", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,8 @@

package com.adobe.aem.modernize.structure.impl;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
Expand All @@ -33,7 +29,6 @@
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.ResourceResolver;

import com.adobe.aem.modernize.RewriteException;
import com.adobe.aem.modernize.structure.PageStructureRewriteRule;
import com.adobe.aem.modernize.structure.StructureRewriteRule;
import com.adobe.aem.modernize.structure.StructureRewriteRuleService;
Expand Down Expand Up @@ -101,6 +96,14 @@ public Set<String> getTemplates() {
return templates;
}

@Override
public Set<String> getEditableTemplates(String staticTemplate) {
return pageRules.stream()
.filter(rule -> rule.getStaticTemplate().equals(staticTemplate))
.map(PageStructureRewriteRule::getEditableTemplate)
.collect(Collectors.toSet());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did you consider orderable set to present results always in the same order?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think the order is particularly sensitive in this context. Users can always change the ordering of rows using the table controls in the UI.

}

@Override
public List<StructureRewriteRule> getRules(ResourceResolver resolver) {
List<StructureRewriteRule> rulesCopy = new LinkedList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,11 @@ public String getStaticTemplate() {
return staticTemplate;
}

@Override
public String getEditableTemplate() {
return editableTemplate;
}

@Override
public int getRanking() {
return this.ranking;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@
import org.mockito.runners.MockitoJUnitRunner;
import org.osgi.framework.BundleContext;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;

@RunWith(MockitoJUnitRunner.class)
public class PageDataSourceTest {
Expand All @@ -67,8 +69,9 @@ public class PageDataSourceTest {

private static final String STATIC_HOME_TEMPLATE = "/apps/geometrixx/templates/homepage";
private static final String STATIC_PRODUCT_TEMPLATE = "/apps/geometrixx/templates/productpage";
private static final String EDITABLE_TEMPLATE = "/conf/geodemo/settings/wcm/templates/geometrixx-demo-home-page";
private static final String SLING_RESOURCE_TYPE = "geodemo/components/structure/page";
private static final String EDITABLE_HOME_TEMPLATE = "/conf/geodemo/settings/wcm/templates/geometrixx-demo-home-page";
private static final String EDITABLE_PRODUCT_TEMPLATE = "/conf/geodemo/settings/wcm/templates/geometrixx-demo-product-page";
private static final String SLING_RESOURCE_TYPE = "geodemo/components/structure/page";

private PageDataSource pageDataSource;

Expand Down Expand Up @@ -118,7 +121,6 @@ public void setUp() throws Exception {
// register data source
pageDataSource = context.registerService(PageDataSource.class, new PageDataSource());


// mock request
Mockito.stub(request.getLocale()).toReturn(Locale.US);
Mockito.stub(request.getResource()).toReturn(requestResource);
Expand All @@ -128,15 +130,23 @@ public void setUp() throws Exception {
StructureRewriteRule rule = new PageRewriteRule();
Dictionary<String, Object> props = new Hashtable<>();
props.put("static.template", STATIC_HOME_TEMPLATE);
props.put("editable.template", EDITABLE_TEMPLATE);
props.put("editable.template", EDITABLE_HOME_TEMPLATE);
props.put("sling.resourceType", SLING_RESOURCE_TYPE);
MockOsgi.activate(rule, bundleContext, props);
rules.add(rule);

rule = new PageRewriteRule();
props = new Hashtable<>();
props.put("static.template", STATIC_PRODUCT_TEMPLATE);
props.put("editable.template", "/conf/geodemo/settings/wcm/templates/geometrixx-demo-product-page");
props.put("editable.template", EDITABLE_PRODUCT_TEMPLATE);
props.put("sling.resourceType", SLING_RESOURCE_TYPE);
MockOsgi.activate(rule, bundleContext, props);
rules.add(rule);

rule = new PageRewriteRule();
props = new Hashtable<>();
props.put("static.template", STATIC_PRODUCT_TEMPLATE);
props.put("editable.template", EDITABLE_HOME_TEMPLATE);
props.put("sling.resourceType", SLING_RESOURCE_TYPE);
MockOsgi.activate(rule, bundleContext, props);
rules.add(rule);
Expand All @@ -149,19 +159,24 @@ public void setUp() throws Exception {

Mockito.stub(structureRewriteRuleService.getTemplates()).toReturn(templates);
Mockito.stub(structureRewriteRuleService.getRules(resolver)).toReturn(rules);
Mockito.stub(structureRewriteRuleService.getEditableTemplates(eq(STATIC_HOME_TEMPLATE))).toReturn(new HashSet<String>(){{
add(EDITABLE_HOME_TEMPLATE);
}});
Mockito.stub(structureRewriteRuleService.getEditableTemplates(eq(STATIC_PRODUCT_TEMPLATE))).toReturn(new HashSet<String>(){{
add(EDITABLE_PRODUCT_TEMPLATE);
}});

// inject dependencies
MockOsgi.injectServices(pageDataSource, bundleContext);

// prepare request resource
HashMap<String, Object> properties = new HashMap<String, Object>();
HashMap<String, Object> properties = new HashMap<>();
properties.put("path", PAGE_ROOT);
properties.put("itemResourceType", ITEM_RESOURCE_TYPE);
Mockito.stub(requestResource.getValueMap()).toReturn(new ValueMapDecorator(properties));

// prepare expression resolver
Mockito.stub(expressionResolver.resolve(PAGE_ROOT, Locale.US, String.class, request)).toReturn(PAGE_ROOT);

}

@Test
Expand All @@ -173,7 +188,7 @@ public void testDoGet() throws Exception {
pageDataSource.doGet(request, response);

ArgumentCaptor<DataSource> dataSourceArgumentCaptor = ArgumentCaptor.forClass(DataSource.class);
Mockito.verify(request).setAttribute(Mockito.anyString(), dataSourceArgumentCaptor.capture());
Mockito.verify(request).setAttribute(anyString(), dataSourceArgumentCaptor.capture());

DataSource pageDataSource = dataSourceArgumentCaptor.getValue();

Expand All @@ -189,6 +204,7 @@ public void testDoGet() throws Exception {
assertNotNull(valueMap.get("title"));
assertNotNull(valueMap.get("pagePath"));
assertNotNull(valueMap.get("templateType"));
assertNotNull(valueMap.get("editableTemplate"));
assertNotNull(valueMap.get("href"));
assertNotNull(valueMap.get("crxHref"));

Expand Down
Loading