package org.apache.helix.filestore;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.jci.listeners.AbstractFilesystemAlterationListener;
import org.apache.commons.jci.monitor.FilesystemAlterationMonitor;
public class FileSystemWatchService
{
enum ChangeType
{
CREATE, DELETE, MODIFY
};
private FilesystemAlterationMonitor fam;
private MyFilesystemAlterationListener listener;
private Thread thread;
public FileSystemWatchService(String root, FileChangeWatcher... watchers)
{
this(root, -1, watchers);
}
public FileSystemWatchService(String root, long startTime,
FileChangeWatcher... watchers)
{
File file = new File(root);
System.out.println("Setting up watch service for path:"
+ file.getAbsolutePath());
fam = new FilesystemAlterationMonitor();
listener = new MyFilesystemAlterationListener(root, startTime, watchers);
fam.addListener(file, listener);
}
public void start()
{
fam.start();
thread = new Thread(listener);
thread.start();
}
static class MyFilesystemAlterationListener extends
AbstractFilesystemAlterationListener implements Runnable
{
private final FileChangeWatcher[] watchers;
private int length;
private final long startTime;
private AtomicBoolean stopRequest;
public MyFilesystemAlterationListener(String root, long startTime,
FileChangeWatcher[] watchers)
{
this.startTime = startTime;
File file = new File(root);
length = root.length() + 1;
this.watchers = watchers;
stopRequest = new AtomicBoolean(false);
}
@SuppressWarnings("unchecked")
public void run()
{
while (!stopRequest.get())
{
try
{
waitForCheck();
process(getCreatedDirectories(), watchers, ChangeType.CREATE);
process(getDeletedDirectories(), watchers, ChangeType.DELETE);
process(getChangedDirectories(), watchers, ChangeType.MODIFY);
process(getCreatedFiles(), watchers, ChangeType.CREATE);
process(getDeletedFiles(), watchers, ChangeType.DELETE);
process(getChangedFiles(), watchers, ChangeType.MODIFY);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
private void process(Collection<File> files, FileChangeWatcher[] watchers,
ChangeType type)
{
if (files.size() > 0)
{
for (File file : files)
{
if (file.lastModified() < startTime)
{
continue;
}
String path = file.getPath();
String relativePath = ".";
if (path.length() > length)
{
relativePath = path.substring(length);
}
for (FileChangeWatcher watcher : watchers)
{
switch (type)
{
case CREATE:
watcher.onEntryAdded(relativePath);
break;
case DELETE:
watcher.onEntryDeleted(relativePath);
break;
case MODIFY:
watcher.onEntryModified(relativePath);
break;
}
}
}
}
}
public void stop()
{
stopRequest.set(true);
}
}
public void stop()
{
listener.stop();
fam.stop();
thread.interrupt();
}
public static void main(String[] args) throws Exception
{
FileChangeWatcher defaultWatcher = new FileChangeWatcher()
{
@Override
public void onEntryModified(String path)
{
System.out
.println("FileSystemWatchService.main(...).new FileChangeWatcher() {...}.onEntryModified():"
+ path);
}
@Override
public void onEntryDeleted(String path)
{
System.out
.println("FileSystemWatchService.main(...).new FileChangeWatcher() {...}.onEntryDeleted():"
+ path);
}
@Override
public void onEntryAdded(String path)
{
System.out
.println("FileSystemWatchService.main(...).new FileChangeWatcher() {...}.onEntryAdded() : "
+ path);
}
};
ChangeLogGenerator ChangeLogGenerator = new ChangeLogGenerator(
"data/localhost_12000/translog", 1, 1);
FileSystemWatchService watchService = new FileSystemWatchService(
"data/localhost_12000/filestore", defaultWatcher);
watchService.start();
Thread.sleep(10000);
watchService.stop();
}
}