OSGI config edited in repo not applying during runtime
Hello, I have a servlet that is modifying an osgi config in the repo, which is working as intended and reflecting correctly in crx/de, but the new config is not being reflected in the console until I do a restart, and it isn't taking precedence over the previous config either when I hit the page that it applies to. Is there a way to tell the console to check for this new config? Or something missing in my code? Any help is appreciated!
Servlet code:
@8220494(service= Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Changes the home to maintenance page.",
"sling.servlet.methods=" + HttpConstants.METHOD_GET,
"sling.servlet.resourceTypes="+ "sling/servlet/default",
"sling.servlet.paths=/bin/my/portal-maintenance"
})
public class PortalMaintenanceServlet extends SlingAllMethodsServlet {
@Reference
private ResourceResolverFactory resourceResolverFactory;
@Reference
PortalConfigHelper portalConfigHelper;
@Reference
private ConfigurationAdmin configAdmin;
private static Logger logger = LoggerFactory.getLogger(PortalMaintenanceServlet.class);
/**
* Obtains the necessary parameters
*
* @90521 request the request
* @90521 response the response
* @throws IOException
*/
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException{
logger.info("Starting servlet");
ResourceResolver resolver = null;
try {
Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.USER, MyConstants.MY_SYSTEM_USER);
resolver = resourceResolverFactory.getServiceResourceResolver(param);
Map<String, String> reportParams = new HashMap<>();
reportParams.put("publishInstances", StringUtils.join(portalConfigHelper.getPublishDetails(), ';'));
String[] publishInstances = reportParams.get("publishInstances").split(";");
try {
for(String each : publishInstances) {
Jcr2davRepositoryFactory repoFactory = new Jcr2davRepositoryFactory();
String[] publishDetails = each.split("--");
String userName = publishDetails[1].split(":")[0];
String password = publishDetails[1].split(":")[1];
String urlString = String.format("http://%s/crx/server", publishDetails[0]);
Map<String, String> params = new HashMap<String, String>();
params.put("org.apache.jackrabbit.repository.uri", urlString);
logger.info("trying to connect to repo at: " + publishDetails[0]);
Repository repository = repoFactory.getRepository(params);
logger.info("logging in to repo");
Session session = repository.login(new SimpleCredentials(userName,password.toCharArray()),"crx.default");
Node root = null;
Node contentNode = null;
Properties properties = new Properties();
boolean success = false;
try {
root = session.getRootNode();
contentNode = root.getNode("apps/system/config/com.my.aem.dam.core.configs.PortalConfigHelperImpl.config/jcr:content");
if(contentNode == null){
logger.info("unable to get node");
}
logger.info("getting input stream");
InputStream content = contentNode.getProperty("jcr:data").getBinary().getStream();
logger.info("loading content");
properties.load(content);
logger.info("setting homepage");
properties.setProperty("homePageUrl", "/content/my-portal/maintenance-page.html");
logger.info("Set homepage to " + properties.getProperty("homePageUrl"));
success = true;
if(success) {
logger.info("saving settings");
ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
properties.store(fileOut, "Maintenance Page");
ByteArrayInputStream is = new ByteArrayInputStream(fileOut.toByteArray());
ValueFactory valueFactory = resolver.adaptTo(Session.class).getValueFactory();
Binary contentValue = valueFactory.createBinary(is);
contentNode.setProperty("jcr:data", contentValue);
contentValue.dispose();
is.close();
session.save();
fileOut.close();
content.close();
}
}
catch(Exception e) {
System.out.println("Could not set maintenance page" + e);
}
}
}catch (RepositoryException e){
logger.error("Check the permission and the settings of the service user for this service.\n", e);
response.sendError(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR, MyConstants.MY_SERVER_ERROR
+ "\n" + e.getMessage());
}
} catch (LoginException e) {
logger.error("Error while trying to login.\n", e);
response.sendError(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR, MyConstants.MY_SERVER_ERROR
+ "\n" + e.getMessage());
if(resolver != null)
resolver.close();
}
}
}