Let's create an interface to define the configurations
package com.aemquickstart.core.interfaces;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@ObjectClassDefinition(name = "AEM Quickstart Site Configs")
public @interface SiteConfigs {
@AttributeDefinition(name="Site Id", description="Site ID")
String getSiteId() default "aemquickstart";
@AttributeDefinition(name="Site Name", description="Site Name")
String getSiteName() default "AEM Quickstart";
}
Now create an interface
package com.aemquickstart.core.services;
public interface SiteConfigService {
public String getSiteId();
public String getSiteName();
}
Create an implementation class for above interface.
package com.aemquickstart.core.services.impl;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aemquickstart.core.interfaces.SiteConfigs;
import com.aemquickstart.core.services.SiteConfigService;
@Component(service = SiteConfigService.class, immediate = true)
@Designate(ocd = SiteConfigs.class, factory = true)
public class SiteConfigServiceImpl implements SiteConfigService {
private static final Logger log = LoggerFactory.getLogger(SiteConfigService.class);
private SiteConfigs config;
@Activate
protected void activate(SiteConfigs config) {
log.info("In activate");
this.config = config;
}
@Override
public String getSiteId() {
return config.getSiteId();
}
@Override
public String getSiteName() {
return config.getSiteName();
}
}
Now create a service to fetch the properties configured using Configuration Factory Service.
package com.aemquickstart.core.services;
import java.util.List;
public interface SiteConfigServiceConsumer {
public List getConfigurationList() ;
}
Create an implementation class
package com.aemquickstart.core.services.impl;
import java.util.ArrayList;
import java.util.List;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aemquickstart.core.services.SiteConfigService;
import com.aemquickstart.core.services.SiteConfigServiceConsumer;
@Component(immediate = true, service = SiteConfigServiceConsumer.class, enabled = true)
public class SiteConfigServiceConsumerImpl implements SiteConfigServiceConsumer {
private static final Logger LOGGER = LoggerFactory.getLogger(SiteConfigServiceConsumer.class);
private List configurationList;
@Reference(name = "configurationFactory", cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
protected synchronized void bindConfigurationFactory(final SiteConfigService config) {
LOGGER.info("bindConfigurationFactory: {}", config.getSiteId());
if (configurationList == null) {
configurationList = new ArrayList<>();
}
configurationList.add(config);
}
protected synchronized void unbindConfigurationFactory(final SiteConfigService config) {
LOGGER.info("unbindConfigurationFactory: {}", config.getSiteId());
configurationList.remove(config);
}
public List getConfigurationList() {
return configurationList;
}
public void setConfigurationList(List configurationList) {
this.configurationList = configurationList;
}
}
Create a sling model to access this property values
SiteID and SiteName which we configured using Configuration Factory service can be fetched in this Sling model class. Update your business logic as per your requirement.
Create runmode for the OSGi config
package com.aemquickstart.core.models;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.models.annotations.DefaultInjectionStrategy;
import org.apache.sling.models.annotations.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aemquickstart.core.services.SiteConfigService;
import com.aemquickstart.core.services.SiteConfigServiceConsumer;
@Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class Page {
protected final Logger log = LoggerFactory.getLogger(this.getClass());
@Inject
SiteConfigServiceConsumer service;
@PostConstruct
private void initModel() {
log.info("Page is loaded");
List<SiteConfigService> configurationList;
configurationList = service.getConfigurationList();
log.info("Service: {}", configurationList);
for (int i = 0; i < configurationList.size(); i++) {
log.info("Site ID: {}", (configurationList.get(i)).getSiteId());
log.info("Site Name: {}", (configurationList.get(i)).getSiteId());
}
}
}
SiteID and SiteName which we configured using Configuration Factory service can be fetched in this Sling model class. Update your business logic as per your requirement.
Create runmode for the OSGi config
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"
getSiteId="aemquickstart"
getSiteName="AEM Quickstart" />
No comments:
Post a Comment
If you have any doubts or questions, please let us know.