You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by is...@apache.org on 2021/06/01 17:59:14 UTC

[airavata-data-lake] 31/46: data orchestrator clients, file listener

This is an automated email from the ASF dual-hosted git repository.

isjarana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-data-lake.git

commit a4252a953390b731f9e67699599635a900da8ed4
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Thu May 13 23:01:05 2021 -0400

    data orchestrator clients, file listener
---
 .../data-orchestrator-clients-core/pom.xml         |  32 ++++
 .../dataorchestrator/clients/core/Utils.java       |   4 +
 .../clients/core/listener/AbstractListener.java    |  38 +++++
 .../clients/core/model/NotificationEvent.java      |  72 +++++++++
 .../clients/core/processor/EventProcessor.java     |  25 +++
 .../core/publisher/ClientEventsPublisher.java      |  23 +++
 .../clients/core/publisher/PublisherCallback.java  |  16 ++
 .../data-orchestrator-file-event-listener/pom.xml  |  71 ++++++++
 .../file/client/FileClientInitializer.java         |  32 ++++
 .../file/client/adaptor/FileAdaptor.java           |  27 ++++
 .../file/client/model/FileEvent.java               |  24 +++
 .../file/client/watcher/FileWatcher.java           | 178 +++++++++++++++++++++
 .../src/main/resources/logback.xml                 |  45 ++++++
 .../data-orchestrator-clients/pom.xml              |  24 +++
 .../data-orchestrator-messaging/pom.xml            |  18 +++
 .../messaging/MessagingEvents.java                 |   9 ++
 .../messaging/model/NotificationMessage.java       |   4 +
 17 files changed, 642 insertions(+)

diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/pom.xml b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/pom.xml
new file mode 100644
index 0000000..6178750
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-orchestrator-clients</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-orchestrator-clients-core</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.airavata.data.lake</groupId>
+            <artifactId>data-orchestrator-messaging</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+            <version>${kafka-clients.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/Utils.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/Utils.java
new file mode 100644
index 0000000..42cacf2
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/Utils.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.dataorchestrator.clients.core;
+
+public class Utils {
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/listener/AbstractListener.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/listener/AbstractListener.java
new file mode 100644
index 0000000..b226b5b
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/listener/AbstractListener.java
@@ -0,0 +1,38 @@
+package org.apache.airavata.dataorchestrator.clients.core.listener;
+
+import org.apache.airavata.dataorchestrator.clients.core.model.NotificationEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.EventListener;
+
+/**
+ * Abstract class for data orchestrator clients event listeners.
+ */
+public abstract class AbstractListener implements EventListener {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractListener.class);
+
+
+    public void onRegistered(NotificationEvent event) {
+        LOGGER.info("Calling register method ");
+
+    }
+
+    public void onCreated(NotificationEvent event) {
+        LOGGER.info("Calling onCreated method ");
+
+    }
+
+    public void onModified(NotificationEvent event) {
+        LOGGER.info("Calling onModified method ");
+
+    }
+
+    public void onDeleted(NotificationEvent event) {
+        LOGGER.info("Calling onDeleted method ");
+
+    }
+
+
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/model/NotificationEvent.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/model/NotificationEvent.java
new file mode 100644
index 0000000..4808431
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/model/NotificationEvent.java
@@ -0,0 +1,72 @@
+package org.apache.airavata.dataorchestrator.clients.core.model;
+
+import java.util.EventObject;
+
+public abstract class NotificationEvent extends EventObject {
+
+    private String host;
+    private String port;
+    private String protocol;
+    private String resourcePath;
+    private String resourceName;
+    private String resourceType;
+
+
+    /**
+     * Constructs a prototypical Event.
+     *
+     * @param source the object on which the Event initially occurred
+     * @throws IllegalArgumentException if source is null
+     */
+    public NotificationEvent(Object source) {
+        super(source);
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    public void setPort(String port) {
+        this.port = port;
+    }
+
+    public String getProtocol() {
+        return protocol;
+    }
+
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
+    }
+
+    public String getResourcePath() {
+        return resourcePath;
+    }
+
+    public void setResourcePath(String resourcePath) {
+        this.resourcePath = resourcePath;
+    }
+
+    public String getResourceName() {
+        return resourceName;
+    }
+
+    public void setResourceName(String resourceName) {
+        this.resourceName = resourceName;
+    }
+
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(String resourceType) {
+        this.resourceType = resourceType;
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/processor/EventProcessor.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/processor/EventProcessor.java
new file mode 100644
index 0000000..abd6747
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/processor/EventProcessor.java
@@ -0,0 +1,25 @@
+package org.apache.airavata.dataorchestrator.clients.core.processor;
+
+import org.apache.airavata.dataorchestrator.clients.core.model.NotificationEvent;
+import org.apache.airavata.dataorchestrator.messaging.MessagingEvents;
+
+/**
+ * A class responsible for process incoming notification events, callbacks from kafka producer, message replays
+ */
+public class EventProcessor {
+
+    public static EventProcessor eventProcessor = new EventProcessor();
+
+    private EventProcessor() {
+    }
+
+    public void publish(NotificationEvent notificationEvent, MessagingEvents event){
+
+    }
+
+
+    public static EventProcessor getEventProcessor() {
+        return eventProcessor;
+    }
+
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/publisher/ClientEventsPublisher.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/publisher/ClientEventsPublisher.java
new file mode 100644
index 0000000..28ab00e
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/publisher/ClientEventsPublisher.java
@@ -0,0 +1,23 @@
+package org.apache.airavata.dataorchestrator.clients.core.publisher;
+
+import org.apache.airavata.dataorchestrator.messaging.model.NotificationMessage;
+
+/**
+ * Publish events to kafka queue that is listened by Kafka receiver
+ */
+public class ClientEventsPublisher {
+
+    private static ClientEventsPublisher clientEventsPublisher = new ClientEventsPublisher();
+
+    private ClientEventsPublisher() {
+
+    }
+
+    public void publish(NotificationMessage notificationMessage, PublisherCallback callback) {
+
+    }
+
+    public static ClientEventsPublisher getClientEventsPublisher() {
+        return clientEventsPublisher;
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/publisher/PublisherCallback.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/publisher/PublisherCallback.java
new file mode 100644
index 0000000..1113c66
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-clients-core/src/main/java/org/apache/airavata/dataorchestrator/clients/core/publisher/PublisherCallback.java
@@ -0,0 +1,16 @@
+package org.apache.airavata.dataorchestrator.clients.core.publisher;
+
+import org.apache.kafka.clients.producer.RecordMetadata;
+
+@FunctionalInterface
+public interface PublisherCallback {
+
+    /**
+     * Handle response from Kafka producer
+     * @param recordMetadata
+     * @param exception
+     */
+    public void handleResponse(RecordMetadata recordMetadata, Exception exception);
+
+
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/pom.xml b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/pom.xml
new file mode 100644
index 0000000..2a613c7
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-orchestrator-clients</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>data-orchestrator-file-event-listener</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.github.lognet</groupId>
+            <artifactId>grpc-spring-boot-starter</artifactId>
+            <version>${grpc.spring.boot}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <version>${spring.boot.data.jpa}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata.data.lake</groupId>
+            <artifactId>data-orchestrator-clients-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <mainClass>org.apache.airavata.dataorchestrator.file.client.FileClientInitializer</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/FileClientInitializer.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/FileClientInitializer.java
new file mode 100644
index 0000000..6b10964
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/FileClientInitializer.java
@@ -0,0 +1,32 @@
+package org.apache.airavata.dataorchestrator.file.client;
+
+import org.apache.airavata.dataorchestrator.file.client.adaptor.FileAdaptor;
+import org.apache.airavata.dataorchestrator.file.client.watcher.FileWatcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.io.File;
+
+@SpringBootApplication
+public class FileClientInitializer implements CommandLineRunner {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(FileClientInitializer.class);
+
+    public static void main(String[] args) {
+        SpringApplication.run(FileClientInitializer.class, args);
+    }
+
+
+    @Override
+    public void run(String... args) throws Exception {
+        LOGGER.info("Initializing File watcher service ...");
+        LOGGER.info("Listening to file path " + args[0]);
+        String path = args[0];
+        File folder = new File(path);
+        FileWatcher watcher = new FileWatcher(folder);
+        watcher.addListener(new FileAdaptor()).watch();
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/adaptor/FileAdaptor.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/adaptor/FileAdaptor.java
new file mode 100644
index 0000000..4b27a29
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/adaptor/FileAdaptor.java
@@ -0,0 +1,27 @@
+package org.apache.airavata.dataorchestrator.file.client.adaptor;
+
+import org.apache.airavata.dataorchestrator.clients.core.listener.AbstractListener;
+import org.apache.airavata.dataorchestrator.clients.core.model.NotificationEvent;
+
+public class FileAdaptor extends AbstractListener {
+
+    @Override
+    public void onRegistered(NotificationEvent event) {
+        super.onRegistered(event);
+    }
+
+    @Override
+    public void onCreated(NotificationEvent event) {
+        super.onCreated(event);
+    }
+
+    @Override
+    public void onModified(NotificationEvent event) {
+        super.onModified(event);
+    }
+
+    @Override
+    public void onDeleted(NotificationEvent event) {
+        super.onDeleted(event);
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/model/FileEvent.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/model/FileEvent.java
new file mode 100644
index 0000000..b03f92d
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/model/FileEvent.java
@@ -0,0 +1,24 @@
+package org.apache.airavata.dataorchestrator.file.client.model;
+
+import org.apache.airavata.dataorchestrator.clients.core.model.NotificationEvent;
+
+import java.io.File;
+
+/**
+ * A class representing a file
+ */
+public class FileEvent extends NotificationEvent {
+    /**
+     * Constructs a prototypical Event.
+     *
+     * @param source the object on which the Event initially occurred
+     * @throws IllegalArgumentException if source is null
+     */
+    public FileEvent(File file) {
+        super(file);
+    }
+
+    public File getFile() {
+        return (File) getSource();
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/watcher/FileWatcher.java b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/watcher/FileWatcher.java
new file mode 100644
index 0000000..8b2e09f
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/java/org/apache/airavata/dataorchestrator/file/client/watcher/FileWatcher.java
@@ -0,0 +1,178 @@
+package org.apache.airavata.dataorchestrator.file.client.watcher;
+
+import org.apache.airavata.dataorchestrator.clients.core.listener.AbstractListener;
+import org.apache.airavata.dataorchestrator.file.client.model.FileEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static java.nio.file.StandardWatchEventKinds.*;
+
+/**
+ * Watch for given folder path and notify changes
+ */
+public class FileWatcher implements Runnable {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FileWatcher.class);
+    protected List<AbstractListener> listeners = new ArrayList<>();
+
+    protected final File folder;
+
+    protected static final List<WatchService> watchServices = new ArrayList<>();
+
+
+    public FileWatcher(File folder) {
+
+        this.folder = folder;
+
+    }
+
+    public void watch() {
+
+        if (folder.exists()) {
+            LOGGER.info("Starting watcher thread ...");
+            for (AbstractListener listener : listeners) {
+                listener.onRegistered(new FileEvent(folder));
+            }
+
+            Thread thread = new Thread(this);
+
+//            thread.setDaemon(true);
+
+            thread.start();
+
+        }
+    }
+
+    @Override
+
+    public void run() {
+
+        LOGGER.info("FileWatcher started at " + folder.getAbsolutePath());
+        try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
+
+            Path path = Paths.get(folder.getAbsolutePath());
+
+            path.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
+
+            watchServices.add(watchService);
+
+            boolean poll = true;
+            while (poll) {
+
+                poll = pollEvents(watchService);
+
+            }
+
+        } catch (IOException | InterruptedException | ClosedWatchServiceException e) {
+            LOGGER.error("Error occurred while watching  folders ", e);
+            Thread.currentThread().interrupt();
+
+        }
+
+    }
+
+
+    protected boolean pollEvents(WatchService watchService) throws InterruptedException {
+
+        WatchKey key = watchService.take();
+
+        Path path = (Path) key.watchable();
+
+        for (WatchEvent<?> event : key.pollEvents()) {
+
+            notifyListeners(event.kind(), path.resolve((Path) event.context()).toFile());
+
+        }
+
+        return key.reset();
+
+    }
+
+
+    protected void notifyListeners(WatchEvent.Kind<?> kind, File file) {
+
+        FileEvent event = new FileEvent(file);
+
+        if (kind == ENTRY_CREATE) {
+
+            for (AbstractListener listener : listeners) {
+
+                listener.onCreated(event);
+
+            }
+
+            if (file.isDirectory()) {
+
+                new FileWatcher(file).setListeners(listeners).watch();
+
+            }
+
+        } else if (kind == ENTRY_MODIFY) {
+
+            for (AbstractListener listener : listeners) {
+
+                listener.onModified(event);
+
+            }
+
+        } else if (kind == ENTRY_DELETE) {
+
+            for (AbstractListener listener : listeners) {
+
+                listener.onDeleted(event);
+
+            }
+
+        }
+
+    }
+
+
+    public FileWatcher addListener(AbstractListener listener) {
+
+        listeners.add(listener);
+
+        return this;
+
+    }
+
+
+    public FileWatcher removeListener(AbstractListener listener) {
+
+        listeners.remove(listener);
+
+        return this;
+
+    }
+
+
+    public List<AbstractListener> getListeners() {
+
+        return listeners;
+
+    }
+
+
+    public FileWatcher setListeners(List<AbstractListener> listeners) {
+
+        this.listeners = listeners;
+
+        return this;
+
+    }
+
+
+    public static List<WatchService> getWatchServices() {
+
+        return Collections.unmodifiableList(watchServices);
+
+    }
+
+
+}
diff --git a/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/resources/logback.xml b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/resources/logback.xml
new file mode 100644
index 0000000..05f7681
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/data-orchestrator-file-event-listener/src/main/resources/logback.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<configuration>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d [%t] %-5p %c{30} %m [%X]%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>../logs/airavata.log</File>
+        <Append>true</Append>
+        <encoder>
+            <pattern>%d [%t] %-5p %c{30} %m [%X]%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>logs/filewatcher.log.%d{yyyy-MM-dd}</fileNamePattern>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+    </appender>
+
+    <logger name="ch.qos.logback" level="WARN"/>
+    <logger name="org.apache.airavata" level="INFO"/>
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="LOGFILE"/>
+    </root>
+</configuration>
\ No newline at end of file
diff --git a/data-orchestrator/data-orchestrator-clients/pom.xml b/data-orchestrator/data-orchestrator-clients/pom.xml
new file mode 100644
index 0000000..b33a879
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-clients/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-orchestrator</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+    </parent>
+    <artifactId>data-orchestrator-clients</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>data-orchestrator-clients-core</module>
+        <module>data-orchestrator-file-event-listener</module>
+    </modules>
+    <modelVersion>4.0.0</modelVersion>
+
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/data-orchestrator/data-orchestrator-messaging/pom.xml b/data-orchestrator/data-orchestrator-messaging/pom.xml
new file mode 100644
index 0000000..d86d1b2
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-messaging/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>data-orchestrator</artifactId>
+        <groupId>org.apache.airavata.data.lake</groupId>
+        <version>0.01-SNAPSHOT</version>
+    </parent>
+    <artifactId>data-orchestrator-messaging</artifactId>
+    <modelVersion>4.0.0</modelVersion>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/data-orchestrator/data-orchestrator-messaging/src/main/java/org/apache/airavata/dataorchestrator/messaging/MessagingEvents.java b/data-orchestrator/data-orchestrator-messaging/src/main/java/org/apache/airavata/dataorchestrator/messaging/MessagingEvents.java
new file mode 100644
index 0000000..5f7d226
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-messaging/src/main/java/org/apache/airavata/dataorchestrator/messaging/MessagingEvents.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.dataorchestrator.messaging;
+
+public enum MessagingEvents {
+    
+    REGISTER,
+    CREATE,
+    MODIFIED,
+    DELETE
+}
diff --git a/data-orchestrator/data-orchestrator-messaging/src/main/java/org/apache/airavata/dataorchestrator/messaging/model/NotificationMessage.java b/data-orchestrator/data-orchestrator-messaging/src/main/java/org/apache/airavata/dataorchestrator/messaging/model/NotificationMessage.java
new file mode 100644
index 0000000..6aeac4d
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-messaging/src/main/java/org/apache/airavata/dataorchestrator/messaging/model/NotificationMessage.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.dataorchestrator.messaging.model;
+
+public class NotificationMessage {
+}