in src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigInstallTask.java [80:129]
public void execute(final InstallationContext ctx) {
synchronized ( Coordinator.SHARED ) {
// Get or create configuration, but do not
// update if the new one has the same values.
final Dictionary<String, Object> properties = this.getDictionary();
boolean created = false;
try {
String location = (String)properties.get(ConfigurationConstants.PROPERTY_BUNDLE_LOCATION);
if ( location == null ) {
location = Activator.DEFAULT_LOCATION; // default
} else if ( location.length() == 0 ) {
location = null;
}
Configuration config = ConfigUtil.getConfiguration(this.getConfigurationAdmin(), this.factoryPid, this.configPid);
if (config == null) {
config = ConfigUtil.createConfiguration(this.getConfigurationAdmin(), this.factoryPid, this.configPid, location);
created = true;
} else {
if (ConfigUtil.isSameData(config.getProperties(), properties)) {
this.getLogger().debug("Configuration {} already installed with same data, update request ignored: {}",
config.getPid(), getResource());
config = null;
} else {
config.setBundleLocation(location);
}
}
if (config != null) {
config.update(properties);
ctx.log("Installed configuration {} from resource {}", config.getPid(), getResource());
this.getLogger().debug("Configuration " + config.getPid()
+ " " + (created ? "created" : "updated")
+ " from " + getResource());
final Operation op = new Coordinator.Operation(config.getPid(), config.getFactoryPid(), false);
Coordinator.SHARED.add(op);
}
// in any case set the state to "INSTALLED"
// (it doesn't matter if the configuration hasn't been updated as it has been in the correct state already)
this.setFinishedState(ResourceState.INSTALLED);
} catch (IOException|IllegalStateException e) {
this.getLogger().debug("Temporary exception during installation of config " + this.getResource() + " : " + e.getMessage() + ". Retrying later.", e);
} catch (Exception e) {
String message = MessageFormat.format("Exception during installation of config {0} : {1}", this.getResource(), e.getMessage());
this.getLogger().error(message, e);
this.setFinishedState(ResourceState.IGNORED, null, message);
}
}
}