This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-factory-configuration.git
The following commit(s) were added to refs/heads/master by this push:
new c38d43d SLING-7786 : Use R7 configuration admin supporting named
factory configurations. Finish code for on the fly conversion
c38d43d is described below
commit c38d43d09e5a36e66a7e800fe10e549015c55192
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Wed Aug 8 14:28:50 2018 +0200
SLING-7786 : Use R7 configuration admin supporting named factory
configurations. Finish code for on the fly conversion
---
.../configuration/impl/ConfigTaskCreator.java | 127 +++++++++++----------
1 file changed, 67 insertions(+), 60 deletions(-)
diff --git
a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
index 8c2a9ac..dd7d796 100644
---
a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
+++
b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigTaskCreator.java
@@ -22,7 +22,8 @@ import java.util.Dictionary;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
import org.apache.sling.installer.api.InstallableResource;
import org.apache.sling.installer.api.OsgiInstaller;
@@ -122,7 +123,10 @@ public class ConfigTaskCreator
if ( event.getType() == ConfigurationEvent.CM_DELETED ) {
final Coordinator.Operation op =
Coordinator.SHARED.get(event.getPid(), event.getFactoryPid(), true);
if ( op == null ) {
-
this.changeListener.resourceRemoved(InstallableResource.TYPE_CONFIG,
event.getPid());
+ updateGroup = this.convertOldInstallerResource(event);
+ if ( updateGroup == null ) {
+
this.changeListener.resourceRemoved(InstallableResource.TYPE_CONFIG,
event.getPid());
+ }
} else {
this.logger.debug("Ignoring configuration event for
{}:{}", event.getPid(), event.getFactoryPid());
}
@@ -151,36 +155,11 @@ public class ConfigTaskCreator
attrs.put(ConfigurationAdmin.SERVICE_FACTORYPID,
event.getFactoryPid());
}
- if ( event.getFactoryPid() != null &&
!event.getPid().contains("~") ) {
- // check if this configuration is processed by the
installer
- final String id = event.getFactoryPid() + '.' +
(event.getPid().startsWith(event.getFactoryPid() + '.') ?
-
event.getPid().substring(event.getFactoryPid().length() + 1) : event.getPid());
- final List<ResourceGroup> groups =
this.infoProvider.getInstallationState().getInstalledResources();
- for(final ResourceGroup grp : groups) {
- if ( grp.getAlias() != null ) {
- final String alias;
- if (
grp.getAlias().startsWith(event.getFactoryPid() + ".") ) {
- alias =
grp.getAlias().substring(event.getFactoryPid().length() + 1);
- } else {
- alias = grp.getAlias();
- }
- for(final Resource rsrc :
grp.getResources()) {
- if (
InstallableResource.TYPE_CONFIG.equals(rsrc.getType()) && id.equals(alias) ) {
- updateGroup = grp;
- break;
- }
- }
- }
- if ( updateGroup != null ) {
- // we need to update the installer state
- updateConfig = config;
- break;
- }
- }
-
- }
- if ( updateConfig == null ) {
+ updateGroup = this.convertOldInstallerResource(event);
+ if ( updateGroup == null ) {
this.changeListener.resourceAddedOrUpdated(InstallableResource.TYPE_CONFIG,
event.getPid(), null, dict, attrs);
+ } else {
+ updateConfig = config;
}
} else {
@@ -191,13 +170,11 @@ public class ConfigTaskCreator
}
}
}
- if ( updateConfig != null ) {
- // TODO - Experimental code for on the fly upgrade from old to new
style for factory configurations
+ if ( updateGroup != null ) {
// update installer state from old config to new config
+ // store config dictionary for update
+ final Dictionary<String, Object> dict = updateConfig == null ?
null : ConfigUtil.cleanConfiguration(updateConfig.getProperties());
try {
- final Dictionary<String, Object> dict =
ConfigUtil.cleanConfiguration(updateConfig.getProperties());
- final String factoryPid = updateConfig.getFactoryPid();
-
String name = null;
for(final Resource r : updateGroup.getResources()) {
if ( name == null ) {
@@ -206,31 +183,63 @@ public class ConfigTaskCreator
final int pos = r.getURL().indexOf(':');
final String rsrcPath = r.getURL().substring(pos +1);
- this.startListener(r.getURL());
+ this.startListener(r.getURL(), 2);
final Dictionary<String, Object> newProps =
ConfigUtil.cleanConfiguration(r.getDictionary());
newProps.put(this.getClass().getName(), "true");
- final InstallableResource ins1 = new
InstallableResource(rsrcPath, r.getInputStream(), newProps, r.getDigest(),
r.getType(), r.getPriority());
+ final InstallableResource ins1 = new
InstallableResource(rsrcPath, null, newProps, r.getDigest(), r.getType(),
r.getPriority());
this.installer.updateResources(r.getScheme(), new
InstallableResource[] {ins1}, null);
this.waitForInstall();
- this.startListener(r.getURL());
+ this.startListener(r.getURL(), 1);
newProps.remove(this.getClass().getName());
- final InstallableResource ins2 = new
InstallableResource(rsrcPath, r.getInputStream(), newProps, r.getDigest(),
r.getType(), r.getPriority());
+ final InstallableResource ins2 = new
InstallableResource(rsrcPath, null, newProps, r.getDigest(), r.getType(),
r.getPriority());
this.installer.updateResources(r.getScheme(), new
InstallableResource[] {ins2}, null);
this.waitForInstall();
}
- // then delete old config
- final Coordinator.Operation op = new
Coordinator.Operation(updateConfig.getPid(), updateConfig.getFactoryPid(),
true);
- Coordinator.SHARED.add(op);
- updateConfig.delete();
-
- // finally re-create new config
- final Configuration newConfig =
this.configAdmin.getFactoryConfiguration(factoryPid, name, null);
- newConfig.update(dict);
+ if ( updateConfig != null ) {
+ // then delete old config
+ final Coordinator.Operation op = new
Coordinator.Operation(event.getPid(), event.getFactoryPid(), true);
+ Coordinator.SHARED.add(op);
+ updateConfig.delete();
+
+ // finally re-create new config
+ final Configuration newConfig =
this.configAdmin.getFactoryConfiguration(event.getFactoryPid(), name, null);
+ newConfig.update(dict);
+ } else {
+ // delete newly created config
+ final Configuration newConfig =
this.configAdmin.getFactoryConfiguration(event.getFactoryPid(), name, null);
+ newConfig.delete();
+ }
} catch ( final Exception ignore) {
- // ignore for now
+ logger.error("An error occured while updating factory
configuration " + event.getFactoryPid() + "-" + event.getPid(), ignore);
+ }
+ }
+ }
+
+ private ResourceGroup convertOldInstallerResource(final ConfigurationEvent
event) {
+ if ( event.getFactoryPid() != null && !event.getPid().contains("~") ) {
+ // check if this configuration is processed by the installer
+ final String id = event.getFactoryPid() + '.' +
(event.getPid().startsWith(event.getFactoryPid() + '.') ?
+ event.getPid().substring(event.getFactoryPid().length() +
1) : event.getPid());
+ final List<ResourceGroup> groups =
this.infoProvider.getInstallationState().getInstalledResources();
+ for(final ResourceGroup grp : groups) {
+ if ( grp.getAlias() != null ) {
+ final String alias;
+ if ( grp.getAlias().startsWith(event.getFactoryPid() +
".") ) {
+ alias =
grp.getAlias().substring(event.getFactoryPid().length() + 1);
+ } else {
+ alias = grp.getAlias();
+ }
+ for(final Resource rsrc : grp.getResources()) {
+ if (
InstallableResource.TYPE_CONFIG.equals(rsrc.getType()) && id.equals(alias) ) {
+ // we need to update the installer state
+ return grp;
+ }
+ }
+ }
}
}
+ return null;
}
/**
@@ -300,7 +309,7 @@ public class ConfigTaskCreator
return new TransformationResult[] {tr};
}
- private final AtomicBoolean doneProcessing = new AtomicBoolean(false);
+ private volatile CountDownLatch latch;
private volatile String waitingForUrl;
@Override
@@ -309,28 +318,26 @@ public class ConfigTaskCreator
if ( event.getType() == InstallationEvent.TYPE.PROCESSED ) {
final TaskResource rsrc = (TaskResource) event.getSource();
if ( rsrc.getURL().equals(waitingForUrl) ) {
- doneProcessing.set(true);
+ latch.countDown();
}
}
}
}
- private void startListener(final String url) {
- this.doneProcessing.set(false);
+ private void startListener(final String url, final int count) {
+ this.latch = new CountDownLatch(count);
this.waitingForUrl = url;
}
public void waitForInstall() {
- final long startTime = System.currentTimeMillis();
- while ( !doneProcessing.get() && startTime + 10000 >
System.currentTimeMillis() ) {
- try {
- Thread.sleep(200);
- } catch (final InterruptedException e) {
- Thread.currentThread().interrupt();
- }
+ try {
+ this.latch.await(50, TimeUnit.SECONDS);
+ } catch (final InterruptedException e) {
+ Thread.currentThread().interrupt();
}
this.waitingForUrl = null;
+ this.latch = null;
}
/**