You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/12/21 16:16:43 UTC
svn commit: r1221764 - in
/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl:
InternalResource.java OsgiInstallerImpl.java
Author: cziegeler
Date: Wed Dec 21 15:16:43 2011
New Revision: 1221764
URL: http://svn.apache.org/viewvc?rev=1221764&view=rev
Log:
SLING-2339 : Updates (removes/add) are not correctly handled if no task execution occurs in between
Modified:
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/InternalResource.java
sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/InternalResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/InternalResource.java?rev=1221764&r1=1221763&r2=1221764&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/InternalResource.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/InternalResource.java Wed Dec 21 15:16:43 2011
@@ -168,7 +168,7 @@ public class InternalResource extends In
/**
* Copy the given file and return it.
*/
- public File getPrivateCopyOfFile() throws IOException {
+ public File getPrivateCopyOfFile() {
return this.dataFile;
}
Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java?rev=1221764&r1=1221763&r2=1221764&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java Wed Dec 21 15:16:43 2011
@@ -333,13 +333,38 @@ public class OsgiInstallerImpl
synchronized ( this.resourcesLock ) {
if ( updatedResources != null && updatedResources.size() > 0 ) {
this.newResources.addAll(updatedResources);
+ final Set<String> newUrls = new HashSet<String>();
+ for(final InternalResource rsrc : updatedResources) {
+ newUrls.add(rsrc.getURL());
+ }
+ // now remove this from urlsToRemove
+ final Iterator<String> urlIter = this.urlsToRemove.iterator();
+ while ( urlIter.hasNext() && !newUrls.isEmpty() ) {
+ final String url = urlIter.next();
+ if ( newUrls.remove(url) ) {
+ urlIter.remove();
+ }
+ }
doProcess = true;
}
if ( ids != null && ids.length > 0 ) {
+ final Set<String> removedUrls = new HashSet<String>();
for(final String id : ids) {
final String url = scheme + ':' + id;
// Will mark all resources which have r's URL as uninstallable
this.urlsToRemove.add(url);
+ removedUrls.add(url);
+ }
+ // now update newResources
+ final Iterator<InternalResource> rsrcIter = this.newResources.iterator();
+ while ( rsrcIter.hasNext() && !removedUrls.isEmpty() ) {
+ final InternalResource rsrc = rsrcIter.next();
+ if ( removedUrls.remove(rsrc.getURL()) ) {
+ if ( rsrc.getPrivateCopyOfFile() != null ) {
+ rsrc.getPrivateCopyOfFile().delete();
+ }
+ rsrcIter.remove();
+ }
}
doProcess = true;
}
@@ -365,6 +390,28 @@ public class OsgiInstallerImpl
logger.debug("Registered new resource scheme: {}", scheme);
synchronized (this.resourcesLock) {
this.newResourcesSchemes.put(scheme, registeredResources);
+
+ // now update resources and removed resources and remove all for this scheme!
+ final String prefix = scheme + ':';
+ // added resources
+ final Iterator<InternalResource> rsrcIter = this.newResources.iterator();
+ while ( rsrcIter.hasNext() ) {
+ final InternalResource rsrc = rsrcIter.next();
+ if ( rsrc.getURL().startsWith(prefix) ) {
+ if ( rsrc.getPrivateCopyOfFile() != null ) {
+ rsrc.getPrivateCopyOfFile().delete();
+ }
+ rsrcIter.remove();
+ }
+ }
+ // removed urls
+ final Iterator<String> urlIter = this.urlsToRemove.iterator();
+ while ( urlIter.hasNext() ) {
+ final String url = urlIter.next();
+ if ( url.startsWith(prefix) ) {
+ urlIter.remove();
+ }
+ }
}
this.wakeUp();
} finally {