Injecting currentPage using annotations does not return the correct page | Community
Skip to main content
Level 3
October 20, 2022

Injecting currentPage using annotations does not return the correct page

  • October 20, 2022
  • 5 replies
  • 2954 views

https://github.com/adobe/aem-sample-we-retail-journal/issues/53

 

The same issue I was facing Breadcrumb was working fine in my local but UAT was not working I followed the above link and fixed the issue it worked in the UAT server. But once deploy to the Production server it is not working.

 

My code:

Page currentPage = request.getResourceResolver().adaptTo(PageManager.class)
.getContainingPage(request.getResource());

Instead of 

@ScriptVariable
private Page currentPage;

Before this fix: It was showing child pages of the root page. All pages were displayed irrespective of the hideInNavigation property.

 /content/page1/page2/page3/page4/page5

After Fix:

page3/page4/page5

 

It solved the problem, but it is working fine QA/UAT server but in production server not working.

In Production: Displaying all the pages

/content/page1/page2/page3/page4/page5

 

Please can help me with this issue?

 

Details:

AEM-SPA Angular Project

AEM Version: 6.5

 


import javax.annotation.PostConstruct;

import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.models.annotations.Exporter;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import org.apache.sling.models.annotations.injectorspecific.ScriptVariable;
import org.apache.sling.models.annotations.injectorspecific.Self;
import org.apache.sling.settings.SlingSettingsService;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.adobe.cq.export.json.ComponentExporter;
import com.adobe.cq.export.json.ExporterConstants;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.designer.Style;

@Model(adaptables = SlingHttpServletRequest.class, adapters = { BreadcrumbModel.class,
ComponentExporter.class }, resourceType = { BreadcrumbModel.RESOURCE_TYPE })
@3484101(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION)
public class BreadcrumbModel implements ComponentExporter {

protected static final String RESOURCE_TYPE = "projectA/components/breadcrumb";
String PN_SHOW_HIDDEN = "showHidden";
String PN_HIDE_CURRENT = "hideCurrent";
String PN_START_LEVEL = "startLevel";

protected static final boolean PROP_SHOW_HIDDEN_DEFAULT = false;
protected static final boolean PROP_HIDE_CURRENT_DEFAULT = false;
protected static final int PROP_START_LEVEL_DEFAULT = 2;

private final transient Logger logger = LoggerFactory.getLogger(getClass());

@ScriptVariable
private ValueMap properties;

@ScriptVariable
private Style currentStyle;

@OSGiService
private SlingSettingsService settingsService;

@1961677
private SlingHttpServletRequest request;

private boolean showHidden;
private boolean hideCurrent;
private int startLevel;

@PostConstruct
private void initModel() {
startLevel = properties.get(PN_START_LEVEL, currentStyle.get(PN_START_LEVEL, PROP_START_LEVEL_DEFAULT));
showHidden = properties.get(PN_SHOW_HIDDEN, currentStyle.get(PN_SHOW_HIDDEN, PROP_SHOW_HIDDEN_DEFAULT));
hideCurrent = properties.get(PN_HIDE_CURRENT, currentStyle.get(PN_HIDE_CURRENT, PROP_HIDE_CURRENT_DEFAULT));
}

public String getJsonVal() {
String jsonVal = "";
try {
jsonVal = createItems().toString();
} catch (JSONException e) {
e.printStackTrace();
}
return jsonVal;
}

private JSONArray createItems() throws JSONException {
JSONArray items = new JSONArray();
Page currentPage = request.getResourceResolver().adaptTo(PageManager.class)
.getContainingPage(request.getResource());

logger.info("Breadcrumb pagepath= " + currentPage.getPath());
int currentLevel = currentPage.getDepth();
while (startLevel < currentLevel) {
Page page = currentPage.getAbsoluteParent(startLevel);
if (page != null) {
boolean isActivePage = page.equals(currentPage);
if (isActivePage && hideCurrent) {
break;
}
if (checkIfNotHidden(page)) {
JSONObject item = new JSONObject();
item.put("active", isActivePage);
item.put("title", getTitle(page));
if (!isAuthor()) {
item.put("url", getShortURL(getRedirectUrl(page)));
logger.info("short-hand URL path= " + getShortURL(getRedirectUrl(page)));
}else{
item.put("url", getRedirectUrl(page));
}
items.put(item);
}
}
startLevel++;
}
return items;
}

private String getTitle(Page page) {
return StringUtils.isEmpty(page.getNavigationTitle())
? StringUtils.isEmpty(page.getTitle()) ? page.getName() : page.getTitle()
: page.getNavigationTitle();
}

private String getRedirectUrl(Page page) {

String url = page.getProperties().containsKey("redirectTarget")
&& StringUtils.isNotEmpty(page.getProperties().get("redirectTarget").toString())
? page.getProperties().get("redirectTarget").toString()
: page.getPath();
return url.endsWith(".html") ? url : url + ".html";
}

private boolean checkIfNotHidden(Page page) {
return !page.isHideInNav() || showHidden;
}

@9944223
public String getExportedType() {
return RESOURCE_TYPE;
}

private boolean isAuthor() {
return settingsService.getRunModes().contains("author");
}

private String getShortURL(String path) {
// String shorturl = request.getResourceResolver().map(path);
String shorturl = "";

if (path != null) {

String[] patharray = path.split("/");

for (int i = 4; i < patharray.length; i++) {

shorturl = shorturl + "/" + patharray[i];
}

}
logger.info("shortt URL= " + shorturl);

return shorturl;
}

}

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.

5 replies

arunpatidar
Community Advisor
Community Advisor
October 20, 2022

I think, you should check the core component version. In case you have different version of core component or AEM in local.

Arun Patidar
Level 3
October 20, 2022

@arunpatidar : I verified in all the environments, Local/QA/UAT/PRD: It's having 

core.wcm.components.content-2.7.0.zip

JSON response in PRD is different. It is giving root-page and its children for all the pages.

For example:

In Production: Displaying all the pages

/content/page1/page2/page3/page4/page5

Should display only 

page3/page4/page5

because all are hideinNavigation property is enabled true won't display.

Same issue I am facing as stated in this link

https://github.com/adobe/aem-sample-we-retail-journal/issues/53

 

 It looks like the breadcrumb items are being generated only for the last page in :children property from root model.json. I believe this is the 'last created page'.

Anything about this post, need to connect with the Adobe team? but I don't have the evidence of what is wrong with PRD ?

 

milind_bachani
Adobe Employee
Adobe Employee
October 20, 2022

Do you see any exception in logs regarding this ?

Level 3
October 20, 2022

No Exception but giving the wrong JSON response in PRD.

https://github.com/adobe/aem-sample-we-retail-journal/issues/53

 It looks like the breadcrumb items are being generated only for the last page in :children property from root model.json. I believe this is the 'last created page'.

 

HeenaMadan
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
October 20, 2022

If it works fine on UAT then check version of core components in prod.

Level 3
October 20, 2022

 I verified in all the environments, Local/QA/UAT/PRD: It's having 

core.wcm.components.content-2.7.0.zip

Anudeep_Garnepudi
Community Advisor
Community Advisor
October 21, 2022

@shyamasundar-ks 

I see you are getting startLevel property from component properties. Can you check the value, if it is configured as 0.

AG
Level 3
October 21, 2022

@anudeep_garnepudi: Yes it is configured to 0 on all the pages but it will display pages based on the hideInNavigation property, so starting 3 pages won't display only displays correct behavior. It is working fine in a lower environment.

joerghoh
Adobe Employee
Adobe Employee
October 21, 2022

The problem is the definition of "currentPage" and how it is calculated.

 

As far I understood, it is always relative to the current resource which this SlingModel is adapted from; that can be the page which is requested, but it could also be any other page; this depends solely on the rendering process and which resources are rendered.