Hi All,
I have a requirement where i am generating a report in the AEM cloud and storing the file under /var/dam/reports/../filename.csv after a successful generation of report i want to send the report link with the AEM environment link via mail. I am not using any servlet to generate a report, using schedulers and services. so i dont have the SlingHttpServletRequest to get it. Can anyone please let me is there any way to get the instance url directly in service. Thanks in advance.
Regards,
Bhavani Bharanidharan
Solved! Go to Solution.
Topics help categorize Community content and increase your ability to discover relevant content.
Views
Replies
Total Likes
Yes, we have to create a separate config for every run mode. It will decide host name depending on run mode. Externalizer will provide hostname depending on the run mode. You can validate same in local also.
externalizer.publishLink(resourceResolver,"/var/dam/reports/../filename.csv");
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"
externalizer.contextpath=""
externalizer.host=""
externalizer.encodedpath="{Boolean}false"
externalizer.domains="[author\ https://author-practice.adobecqms.net, publish\ practice.abc]"/>
@OSGiService
Externalizer externalizer;
3. below code will give complete URL -> domain + uri
externalizer.publishLink(resourceResolver,link);
@BhavaniBharani We can user sxternalizer to append hostname depending on the environment. Visit below link for more info.
https://medium.com/@toimrank/aem-externalizer-and-multisiteexternalizer-e3afad105b8
Before: /var/dam/reports/../filename.csv
Post Externalizer Implementation: https://www<hostname>.com/var/dam/filename.csv%20After
Follow below steps to implement Externalizer for single site heirarchy as part of current implementation:
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"
externalizer.contextpath=""
externalizer.host=""
externalizer.encodedpath="{Boolean}false"
externalizer.domains="[author\ https://author-practice.adobecqms.net, publish\ practice.abc]"/>
2. Create Sling Model Java Class to generate end User URL for both author and publish Link:
package com.javadoubts.core.models;
import com.day.cq.commons.Externalizer;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.Optional;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import org.apache.sling.models.annotations.injectorspecific.SlingObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
@Model(adaptables = Resource.class)
public class ButtonModel {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Inject
@Optional
protected String link;
@SlingObject
ResourceResolver resourceResolver;
@OSGiService
Externalizer externalizer;
private String publishLink;
private String authorLink;
@PostConstruct
protected void init() {
publishLink = externalizer.publishLink(resourceResolver,link);
authorLink = externalizer.authorLink(resourceResolver,link);
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getPublishLink() {
return publishLink;
}
public void setPublishLink(String publishLink) {
this.publishLink = publishLink;
}
public String getAuthorLink() {
return authorLink;
}
public void setAuthorLink(String authorLink) {
this.authorLink = authorLink;
}
}
3. Create a component to author link having below sightly code within it as shown below:
<div data-sly-use.button="com.javadoubts.core.models.ButtonModel">
<div>Link - ${button.link}</div>
<div>Author Link - ${button.authorLink}</div>
<div>Publish Link - ${button.publishLink}</div>
</div>
4. Below is the output of the link component:
Link → This is authorable path browser link field.
Author Link → This is showing externalized Author URL having author domian.
Publish Link → This is showing externalized Publish URL having publish domain.
Hi @Imran__Khan ,
Thanks for your suggestion. can you please help to give a clarifications for the below
is it like getting the hostname and serviceuri from OSGI configuration for all the author and publish environments? do i need to create a separate config for all the environments under ui.config?
Regards,
Bhavani Bharanidharan
Yes, we have to create a separate config for every run mode. It will decide host name depending on run mode. Externalizer will provide hostname depending on the run mode. You can validate same in local also.
externalizer.publishLink(resourceResolver,"/var/dam/reports/../filename.csv");
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"
externalizer.contextpath=""
externalizer.host=""
externalizer.encodedpath="{Boolean}false"
externalizer.domains="[author\ https://author-practice.adobecqms.net, publish\ practice.abc]"/>
@OSGiService
Externalizer externalizer;
3. below code will give complete URL -> domain + uri
externalizer.publishLink(resourceResolver,link);
In AEM, you can get the instance URL directly in a service by using the `SlingSettingsService`. Here's an example of how you can retrieve the instance URL in your service:
import org.apache.sling.settings.SlingSettingsService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(service = YourService.class)
public class YourService {
@Reference
private SlingSettingsService slingSettingsService;
public void sendReportEmail() {
String instanceUrl = slingSettingsService.getSlingId().getScheme() + "://" + slingSettingsService.getSlingId().getServerId();
// Use the instanceUrl to construct the report link and send it via email
}
}
the above example, the SlingSettingsService is injected into the service using the @Reference annotation. The getSlingId() method returns a SlingId object, which contains information about the current AEM instance, including the scheme (http or https) and the server ID.
Hi RajaReddy, I tried to use the SlingSettingsService but i am getting this error. Any idea why this is coming up?
Thanks,
Bhavani Bharanidharan
@BhavaniBharani I do have a similar ask and was able to achive it. Follow below article on virus scan that generates a report of history from var. If this is helpful let me know. So that I can help you with the coding part.
https://technolearning-jags.blogspot.com/2023/08/aem-virus-scan-part-1.html
@BhavaniBharani Did you find the suggestions from users helpful? Please let us know if more information is required. Otherwise, please mark the answer as correct for posterity. If you have found out solution yourself, please share it with the community.
Views
Replies
Total Likes