Package org.apache.helix.filestore

Source Code of org.apache.helix.filestore.FileSystemWatchService$MyFilesystemAlterationListener

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();
  }
}
TOP

Related Classes of org.apache.helix.filestore.FileSystemWatchService$MyFilesystemAlterationListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.