You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:43:19 UTC
[sling-org-apache-sling-installer-provider-file] 05/19: Collect
changes before submitting them to the installer
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.installer.provider.file-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-installer-provider-file.git
commit 6b38c95de9fd045d8609fe76a392a9ee1e381658
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Tue Sep 14 15:36:26 2010 +0000
Collect changes before submitting them to the installer
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/installer/fileinstall@996957 13f79535-47bb-0310-9956-ffa450edef68
---
.../installer/file/impl/FileChangesListener.java | 6 +-
.../sling/installer/file/impl/FileMonitor.java | 22 ++++--
.../sling/installer/file/impl/Installer.java | 84 ++++++++++++++--------
3 files changed, 70 insertions(+), 42 deletions(-)
diff --git a/src/main/java/org/apache/sling/installer/file/impl/FileChangesListener.java b/src/main/java/org/apache/sling/installer/file/impl/FileChangesListener.java
index b9d7485..ded285c 100644
--- a/src/main/java/org/apache/sling/installer/file/impl/FileChangesListener.java
+++ b/src/main/java/org/apache/sling/installer/file/impl/FileChangesListener.java
@@ -25,9 +25,5 @@ public interface FileChangesListener {
void initialSet(List<File> files);
- void removed(File file);
-
- void added(File file);
-
- void changed(File file);
+ void updated(List<File> added, List<File> changed, List<File> removed);
}
diff --git a/src/main/java/org/apache/sling/installer/file/impl/FileMonitor.java b/src/main/java/org/apache/sling/installer/file/impl/FileMonitor.java
index a80a0ba..875a256 100644
--- a/src/main/java/org/apache/sling/installer/file/impl/FileMonitor.java
+++ b/src/main/java/org/apache/sling/installer/file/impl/FileMonitor.java
@@ -81,6 +81,12 @@ public class FileMonitor extends TimerTask {
}
}
+ private final static class Collector {
+ public final List<File> added = new ArrayList<File>();
+ public final List<File> removed = new ArrayList<File>();
+ public final List<File> changed = new ArrayList<File>();
+ }
+
/**
* Stop periodically executing this task. If the task is currently executing it
* will never be run again after the current execution, otherwise it will simply
@@ -124,7 +130,9 @@ public class FileMonitor extends TimerTask {
}
synchronized ( this ) {
try {
- this.check(this.root);
+ final Collector c = new Collector();
+ this.check(this.root, c);
+ this.listener.updated(c.added, c.changed, c.removed);
} catch (Exception e) {
// ignore this
}
@@ -140,7 +148,7 @@ public class FileMonitor extends TimerTask {
* @param monitorable The monitorable to check
* @param localEA The event admin
*/
- private void check(final Monitorable monitorable) {
+ private void check(final Monitorable monitorable, final Collector collector) {
logger.debug("Checking {}", monitorable.file);
// if the file is non existing, check if it has been readded
if ( monitorable.status instanceof NonExistingStatus ) {
@@ -150,7 +158,7 @@ public class FileMonitor extends TimerTask {
final List<File> files = new ArrayList<File>();
collect(monitorable.file, files);
for(final File file : files ) {
- this.listener.added(file);
+ collector.added.add(file);
}
}
} else {
@@ -160,7 +168,7 @@ public class FileMonitor extends TimerTask {
final List<File> files = new ArrayList<File>();
collectDeleted(monitorable, files);
for(final File file : files ) {
- this.listener.removed(file);
+ collector.removed.add(file);
}
monitorable.status = NonExistingStatus.SINGLETON;
} else {
@@ -171,7 +179,7 @@ public class FileMonitor extends TimerTask {
fs.lastModified = monitorable.file.lastModified();
// changed
if ( monitorable.file.isFile() ) {
- this.listener.changed(monitorable.file);
+ collector.changed.add(monitorable.file);
}
changed = true;
}
@@ -179,7 +187,7 @@ public class FileMonitor extends TimerTask {
// directory
final DirStatus ds = (DirStatus)fs;
for(int i=0; i<ds.children.length; i++) {
- check(ds.children[i]);
+ check(ds.children[i], collector);
}
// if the dir changed we have to update
if ( changed ) {
@@ -198,7 +206,7 @@ public class FileMonitor extends TimerTask {
if (children[i] == null) {
children[i] = new Monitorable(files[i]);
children[i].status = NonExistingStatus.SINGLETON;
- check(children[i]);
+ check(children[i], collector);
}
}
ds.children = children;
diff --git a/src/main/java/org/apache/sling/installer/file/impl/Installer.java b/src/main/java/org/apache/sling/installer/file/impl/Installer.java
index 6798152..7bc3e98 100644
--- a/src/main/java/org/apache/sling/installer/file/impl/Installer.java
+++ b/src/main/java/org/apache/sling/installer/file/impl/Installer.java
@@ -29,19 +29,22 @@ import java.util.List;
import org.apache.sling.osgi.installer.InstallableResource;
import org.apache.sling.osgi.installer.OsgiInstaller;
+import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The <code>Installer</code> is the service calling the
* OSGi installer
*
- * TODO - We should collect all changes from a scan and send
- * them to the installer in a batch
*/
public class Installer implements FileChangesListener {
+ /** The scheme we use to register our resources. */
private static final String SCHEME_PREFIX = "fileinstall";
+ /** Logger. */
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
/** The OSGi installer service. */
private final OsgiInstaller installer;
@@ -55,31 +58,13 @@ public class Installer implements FileChangesListener {
}
/**
- * @see org.apache.sling.installer.file.impl.FileChangesListener#added(java.io.File)
- */
- public void added(final File file) {
- LoggerFactory.getLogger(this.getClass()).info("Added file {}", file);
- final InstallableResource resource = this.createResource(file);
- this.installer.updateResources(this.scheme, new InstallableResource[] {resource}, null);
- }
-
- /**
- * @see org.apache.sling.installer.file.impl.FileChangesListener#changed(java.io.File)
- */
- public void changed(final File file) {
- LoggerFactory.getLogger(this.getClass()).info("Changed file {}", file);
- final InstallableResource resource = this.createResource(file);
- this.installer.updateResources(this.scheme, new InstallableResource[] {resource}, null);
- }
-
- /**
* @see org.apache.sling.installer.file.impl.FileChangesListener#initialSet(java.util.List)
*/
public void initialSet(final List<File> files) {
- LoggerFactory.getLogger(this.getClass()).info("Initial set for {}", this.scheme);
+ logger.debug("Initial set for {}", this.scheme);
final List<InstallableResource> resources = new ArrayList<InstallableResource>();
for(final File f : files) {
- LoggerFactory.getLogger(this.getClass()).info("File {}", f);
+ logger.debug("Initial file {}", f);
final InstallableResource resource = this.createResource(f);
if ( resource != null ) {
resources.add(resource);
@@ -88,6 +73,52 @@ public class Installer implements FileChangesListener {
this.installer.registerResources(this.scheme, resources.toArray(new InstallableResource[resources.size()]));
}
+ /**
+ * @see org.apache.sling.installer.file.impl.FileChangesListener#updated(java.util.List, java.util.List, java.util.List)
+ */
+ public void updated(List<File> added, List<File> changed, List<File> removed) {
+ final List<InstallableResource> updated;
+ if ( (added != null && added.size() > 0) || (changed != null && changed.size() > 0) ) {
+ updated = new ArrayList<InstallableResource>();
+ if ( added != null ) {
+ for(final File f : added) {
+ logger.debug("Added file {}", f);
+ final InstallableResource resource = this.createResource(f);
+ if ( resource != null ) {
+ updated.add(resource);
+ }
+ }
+ }
+ if ( changed != null ) {
+ for(final File f : changed) {
+ logger.debug("Changed file {}", f);
+ final InstallableResource resource = this.createResource(f);
+ if ( resource != null ) {
+ updated.add(resource);
+ }
+ }
+ }
+ } else {
+ updated = null;
+ }
+ final String[] removedUrls;
+ if ( removed != null && removed.size() > 0 ) {
+ removedUrls = new String[removed.size()];
+ int index = 0;
+ for(final File f : removed) {
+ removedUrls[index] = f.getAbsolutePath();
+ logger.debug("Removed file {}", removedUrls[index]);
+ index++;
+ }
+ } else {
+ removedUrls = null;
+ }
+ if ( updated != null || removedUrls != null ) {
+ this.installer.updateResources(this.scheme,
+ updated == null ? null : updated.toArray(new InstallableResource[updated.size()]), removedUrls);
+ }
+ }
+
private InstallableResource createResource(final File file) {
try {
final InputStream is = new FileInputStream(file);
@@ -109,15 +140,8 @@ public class Installer implements FileChangesListener {
return new InstallableResource(file.getAbsolutePath(), is, dict, digest,
null, null);
} catch (IOException io) {
- // ignore this for now (TODO)
+ logger.error("Unable to read file " + file, io);
}
return null;
}
- /**
- * @see org.apache.sling.installer.file.impl.FileChangesListener#removed(java.io.File)
- */
- public void removed(final File file) {
- LoggerFactory.getLogger(this.getClass()).info("Removed file {}", file);
- this.installer.updateResources(this.scheme, null, new String[] {file.getAbsolutePath()});
- }
}
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.