http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/TestZookeeper.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/TestZookeeper.java
 
b/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/TestZookeeper.java
new file mode 100755
index 0000000..9650bd6
--- /dev/null
+++ 
b/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/TestZookeeper.java
@@ -0,0 +1,181 @@
+/**
+ * Licensed 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.
+ */
+package org.apache.atlas.odf.core.store.zookeeper34.test;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.BindException;
+import java.net.DatagramSocket;
+import java.net.ServerSocket;
+import java.rmi.NotBoundException;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.ZooKeeper.States;
+import org.apache.zookeeper.server.ServerConfig;
+import org.apache.zookeeper.server.ZooKeeperServerMain;
+import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
+
+import org.apache.atlas.odf.core.Utils;
+
+public class TestZookeeper {
+
+       public TestZookeeper() {
+       }
+
+       public void start() {
+               try {
+                       startZookeeper();
+               } catch (Exception e) {
+                       e.printStackTrace();
+                       throw new RuntimeException(e);
+               }
+       }
+
+       public static boolean deleteRecursive(File path) throws 
FileNotFoundException {
+               if (!path.exists()) {
+                       throw new FileNotFoundException(path.getAbsolutePath());
+               }
+               boolean ret = true;
+               if (path.isDirectory()) {
+                       for (File f : path.listFiles()) {
+                               ret = ret && deleteRecursive(f);
+                       }
+               }
+               return ret && path.delete();
+       }
+
+       static Thread zookeeperThread = null;
+       static Object lockObject = new Object();
+       static ZooKeeperServerMainWithShutdown zooKeeperServer = null;
+
+       boolean cleanData = true; // all data is cleaned at server start !!
+
+       Logger logger = Logger.getLogger(TestZookeeper.class.getName());
+
+       void log(String s) {
+               logger.info(s);
+       }
+
+       int zookeeperStartupTime = 10000;
+
+       static class ZooKeeperServerMainWithShutdown extends 
ZooKeeperServerMain {
+               public void shutdown() {
+                       super.shutdown();
+               }
+       }
+
+       private void startZookeeper() throws Exception {
+               log("Starting zookeeper");
+
+               final Properties zkProps = 
Utils.readConfigProperties("org/apache/atlas/odf/core/messaging/kafka/test-embedded-zookeeper.properties");
+               log("zookeeper properties: " + zkProps);
+               if (cleanData) {
+                       String dataDir = zkProps.getProperty("dataDir");
+                       log("Removing all data from zookeeper data dir " + 
dataDir);
+                       File dir = new File(dataDir);
+                       if (dir.exists()) {
+                               if (!deleteRecursive(dir)) {
+                                       throw new IOException("Could not delete 
directory " + dataDir);
+                               }
+                       }
+               }
+               final ZooKeeperServerMainWithShutdown zk = new 
ZooKeeperServerMainWithShutdown();
+               final ServerConfig serverConfig = new ServerConfig();
+               log("Loading zookeeper config...");
+               QuorumPeerConfig zkConfig = new QuorumPeerConfig();
+               zkConfig.parseProperties(zkProps);
+               serverConfig.readFrom(zkConfig);
+               final String zkPort = (String) zkProps.get("clientPort");
+
+               Runnable zookeeperStarter = new Runnable() {
+
+                       @Override
+                       public void run() {
+                               try {
+                                       log("Now starting Zookeeper with 
API...");
+                                       zk.runFromConfig(serverConfig);
+                               } catch (BindException ex) {
+                                       log("Embedded zookeeper could not be 
started, port is already in use. Trying to use external zookeeper");
+                                       ZooKeeper zK = null;
+                                       try {
+                                               zK = new ZooKeeper("localhost:" 
+ zkPort, 5000, null);
+                                               if 
(zK.getState().equals(States.CONNECTED)) {
+                                                       log("Using existing 
zookeeper running on port " + zkPort);
+                                                       return;
+                                               } else {
+                                                       throw new 
NotBoundException();
+                                               }
+                                       } catch (Exception zkEx) {
+                                               throw new 
RuntimeException("Could not connect to zookeeper on port " + zkPort + ". Please 
close all applications listening on this port.");
+                                       } finally {
+                                               if (zK != null) {
+                                                       try {
+                                                               zK.close();
+                                                       } catch 
(InterruptedException e) {
+                                                               
logger.log(Level.WARNING, "An error occured closing the zk connection", e);
+                                                       }
+                                               }
+                                       }
+                               } catch (Exception e) {
+                                       e.printStackTrace();
+                                       throw new RuntimeException(e);
+                               }
+
+                       }
+               };
+
+               zookeeperThread = new Thread(zookeeperStarter);
+               zookeeperThread.setDaemon(true);
+               zookeeperThread.start();
+               log("Zookeeper start initiated, waiting 10s...");
+               Thread.sleep(10000);
+               zooKeeperServer = zk;
+               log("Zookeeper started");
+
+       }
+
+       public boolean isRunning() {
+               return zooKeeperServer != null;
+       }
+
+       boolean isPortAvailable(int port) {
+               ServerSocket ss = null;
+               DatagramSocket ds = null;
+               try {
+                       ss = new ServerSocket(port);
+                       ss.setReuseAddress(true);
+                       ds = new DatagramSocket(port);
+                       ds.setReuseAddress(true);
+                       return true;
+               } catch (IOException e) {
+               } finally {
+                       if (ds != null) {
+                               ds.close();
+                       }
+
+                       if (ss != null) {
+                               try {
+                                       ss.close();
+                               } catch (IOException e) {
+                               }
+                       }
+               }
+
+               return false;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/ZookeeperConfigurationStorageTest.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/ZookeeperConfigurationStorageTest.java
 
b/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/ZookeeperConfigurationStorageTest.java
new file mode 100755
index 0000000..1db55f2
--- /dev/null
+++ 
b/odf/odf-store/src/test/java/org/apache/atlas/odf/core/store/zookeeper34/test/ZookeeperConfigurationStorageTest.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed 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.
+ */
+package org.apache.atlas.odf.core.store.zookeeper34.test;
+
+import org.apache.atlas.odf.api.settings.ODFSettings;
+import org.apache.atlas.odf.core.configuration.ConfigContainer;
+import 
org.apache.atlas.odf.core.store.zookeeper34.ZookeeperConfigurationStorage;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * this test uses the real storage implementation therefore a zookeeper is 
required
+ */
+public class ZookeeperConfigurationStorageTest {
+       @BeforeClass
+       public static void setup() {
+               new TestZookeeper().start();
+       }
+
+       @Test
+       public void testStoreInZookeeper() {
+               ZookeeperConfigurationStorage store = new 
ZookeeperConfigurationStorage() {
+
+                       @Override
+                       public String getZookeeperConfigPath() {
+                               return "/odf/testconfig";
+                       }
+                       
+               };
+               ConfigContainer container = new ConfigContainer();
+               ODFSettings odfConfig = new ODFSettings();
+               String instanceId = "my_test_id";
+               odfConfig.setInstanceId(instanceId);
+               container.setOdf(odfConfig);
+               store.storeConfig(container);
+
+               ConfigContainer updatedContainer = store.getConfig(null);
+               Assert.assertEquals(instanceId, 
updatedContainer.getOdf().getInstanceId());
+               store.clearCache();
+               
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-store/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
----------------------------------------------------------------------
diff --git 
a/odf/odf-store/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
 
b/odf/odf-store/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
new file mode 100755
index 0000000..2a5f331
--- /dev/null
+++ 
b/odf/odf-store/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
@@ -0,0 +1,16 @@
+#
+# Licensed 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.
+#
+## USE for TESTs only
+
+DiscoveryServiceQueueManager=MockQueueManager

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/.gitignore
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/.gitignore b/odf/odf-test-env/.gitignore
new file mode 100755
index 0000000..2045ff3
--- /dev/null
+++ b/odf/odf-test-env/.gitignore
@@ -0,0 +1,5 @@
+target
+.settings
+.classpath
+.project
+.DS_Store

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/pom.xml
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/pom.xml b/odf/odf-test-env/pom.xml
new file mode 100755
index 0000000..a37ed22
--- /dev/null
+++ b/odf/odf-test-env/pom.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0"?>
+<!--
+~
+~ Licensed 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.
+-->
+<project
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";
+       xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.apache.atlas.odf</groupId>
+               <artifactId>odf</artifactId>
+               <version>1.2.0-SNAPSHOT</version>
+       </parent>
+       <artifactId>odf-test-env</artifactId>
+       <name>odf-test-env</name>
+       <url>http://maven.apache.org</url>
+       <properties>
+               <!-- specify versions of components to be downloaded -->
+               <jetty.version>9.2.10.v20150310</jetty.version>
+               <kafka.version>0.10.0.0</kafka.version>
+               <scala.version>2.11</scala.version>
+               <spark.version>2.1.0</spark.version>
+               <jetty.port>58081</jetty.port>
+       </properties>
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-web</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <type>war</type>
+               </dependency>
+       </dependencies>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-compiler-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>default-compile</id>
+                                               <phase>compile</phase>
+                                               <goals>
+                                                       <goal>compile</goal>
+                                               </goals>
+                                               <configuration>
+                                                       
<skipMain>true</skipMain>
+                                                       <!-- do not compile 
anything -->
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <version>2.19</version>
+                               <configuration>
+                                       <skipTests>true</skipTests>
+                                       <!-- do not run tests -->
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-antrun-plugin</artifactId>
+                               <version>1.8</version>
+                               <executions>
+                                       <execution>
+                                               <id>prepare-atlas</id>
+                                               <phase>validate</phase>
+                                               <goals>
+                                                       <goal>run</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <target>
+                                                               <property 
name="atlas-unpack-dir" value="${project.build.directory}/downloads" />
+                                                               <property 
name="atlas.version" value="${atlas.version}" />
+                                                               <ant 
antfile="../odf-atlas/build_atlas.xml" target="prepare-atlas"></ant>
+                                                       </target>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>prepare-components</id>
+                                               <phase>validate</phase>
+                                               <goals>
+                                                       <goal>run</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <target>
+                                                               <property 
name="unpack-dir" value="${project.build.directory}/downloads" />
+                                                               <property 
name="jetty.version" value="${jetty.version}" />
+                                                               <property 
name="jetty.port" value="${jetty.port}" />
+                                                               <property 
name="kafka.version" value="${kafka.version}" />
+                                                               <property 
name="scala.version" value="${scala.version}" />
+                                                               <property 
name="project.basedir" value="${project.basedir}"/>
+                                                               <ant 
antfile="prepare_components.xml" target="default"></ant>
+                                                       </target>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-assembly-plugin</artifactId>
+                               <configuration>
+                                       
<descriptor>src/assembly/bin.xml</descriptor>
+                                       
<finalName>odf-test-env-${project.version}</finalName>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <id>create-distribution</id>
+                                               <phase>package</phase>
+                                               <goals>
+                                                       <goal>single</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <artifactId>maven-jar-plugin</artifactId>
+                               <version>2.3.1</version>
+                               <executions>
+                                       <execution>
+                                               <id>default-jar</id>
+                                               <!-- do not create default-jar 
-->
+                                               <phase>none</phase>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/prepare_components.xml
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/prepare_components.xml 
b/odf/odf-test-env/prepare_components.xml
new file mode 100755
index 0000000..a6a733b
--- /dev/null
+++ b/odf/odf-test-env/prepare_components.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+~
+~ Licensed 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.
+-->
+<project name="prepare_components">
+
+       <!-- Property is provided by pom.xml -->
+       <!-- <property name="jetty.version" value="" /> -->
+       <!-- <property name="kafka.version" value="" /> -->
+       <!-- <property name="scala.version" value="" /> -->
+
+       <dirname property="script.basedir" 
file="${ant.file.prepare_components}" />
+
+       <property name="jetty-dir" value="jetty-distribution-${jetty.version}" 
/>
+       <property name="kafka-dir" 
value="kafka_${scala.version}-${kafka.version}" />
+       <property name="spark-dir" value="spark_${spark.version}" />
+
+       <property name="jetty-archive" value="/tmp/${jetty-dir}.zip" />
+       <property name="kafka-archive" value="/tmp/${kafka-dir}.tar.gz" />
+       <property name="spark-archive" value="/tmp/${spark-dir}.tar.gz" />
+
+       <condition property="jetty-zip-not-found">
+               <not>
+                       <available file="${jetty-archive}">
+                       </available>
+               </not>
+       </condition>
+
+       <condition property="kafka-zip-not-found">
+               <not>
+                       <available file="${kafka-archive}">
+                       </available>
+               </not>
+       </condition>
+
+       <condition property="spark-zip-not-found">
+               <not>
+                       <available file="${spark-archive}">
+                       </available>
+               </not>
+       </condition>
+
+       <condition property="jetty-unpacked">
+          <available file="${unpack-dir}/${jetty-dir}/bin/jetty.sh"/>
+    </condition>
+
+       <condition property="kafka-unpacked">
+          <available 
file="${unpack-dir}/${kafka-dir}/bin/kafka-server-start.sh"/>
+    </condition>
+
+       <condition property="spark-unpacked">
+          <available file="${unpack-dir}/${spark-dir}/sbin/start-master.sh"/>
+    </condition>
+
+       <!-- 
******************************************************************************************
 -->
+
+       <target name="download-jetty" if="jetty-zip-not-found">
+               <echo message="Downloading Jetty. Depending on your network 
this can last up to 20 (yes, twenty) minutes." />
+               <get verbose="true" 
src="https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/${jetty.version}/jetty-distribution-${jetty.version}.zip";
 dest="${jetty-archive}" />
+               <echo message="Jetty downloaded" />
+       </target>
+
+       <target name="download-kafka" if="kafka-zip-not-found">
+               <echo message="Downloading Kafka. Depending on your network 
this can last up to 20 (yes, twenty) minutes." />
+               <get verbose="true" 
src="http://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/kafka/${kafka.version}/kafka_${scala.version}-${kafka.version}.tgz";
 dest="${kafka-archive}" />
+               <echo message="Kafka downloaded" />
+       </target>
+
+       <target name="download-spark" if="spark-zip-not-found">
+               <echo message="Downloading Spark. Depending on your network 
this can last up to 20 (yes, twenty) minutes." />
+               <get verbose="true" 
src="http://d3kbcqa49mib13.cloudfront.net/spark-${spark.version}-bin-hadoop2.7.tgz";
 dest="${spark-archive}" />
+               <echo message="Spark downloaded" />
+       </target>
+
+       <target name="unzip-jetty" unless="jetty-unpacked">
+               <antcall target="download-jetty"/>
+               <echo message="Installing Jetty test instance" />
+               <echo message="Deleting ${unpack-dir}/${jetty-dir}" />
+               <delete dir="${unpack-dir}/${jetty-dir}" />
+               <echo message="deleted" />
+               <unzip src="${jetty-archive}" dest="${unpack-dir}" />
+               <!-- Create Jetty base folder -->
+               <mkdir dir="${unpack-dir}/odfjettybase"/>
+               <!-- Generate Jetty base configuration files -->
+               <java dir="${unpack-dir}/odfjettybase" 
classname="org.eclipse.jetty.start.Main" fork="true">
+                       <arg value="--add-to-startd=https,ssl,deploy,plus"/>
+                       <classpath>
+                               <pathelement 
location="${unpack-dir}/${jetty-dir}/start.jar"/>
+                               <pathelement path="${unpack-dir}/${jetty-dir}"/>
+                               <pathelement path="${java.class.path}"/>
+                       </classpath>
+                       <jvmarg 
value="-Djetty.home=${unpack-dir}/${jetty-dir}"/>
+                       <jvmarg 
value="-Djetty.base=${unpack-dir}/odfjettybase"/>
+               </java>
+               <!-- Update Jetty port number -->
+               <replace file="${unpack-dir}/odfjettybase/start.d/https.ini" 
token="https.port=8443" value="https.port=${jetty.port}"/>
+       </target>
+
+       <target name="unzip-kafka" unless="kafka-unpacked">
+               <antcall target="download-kafka"/>
+               <echo message="Installing Kafka test instance" />
+               <echo message="Deleting ${unpack-dir}/${kafka-dir}" />
+               <delete dir="${unpack-dir}/${kafka-dir}" />
+               <echo message="deleted" />
+           <untar src="${kafka-archive}" dest="${unpack-dir}" 
compression="gzip" />
+
+               <!-- remove -loggc command line argument in scripts because 
they don't exist in the IBM JVM -->
+               <replace 
file="${unpack-dir}/kafka_${scala.version}-${kafka.version}/bin/kafka-server-start.sh"
 token="-loggc" value=""/>
+               <replace 
file="${unpack-dir}/kafka_${scala.version}-${kafka.version}/bin/zookeeper-server-start.sh"
 token="-loggc" value=""/>
+       </target>
+
+       <target name="unzip-spark" unless="spark-unpacked">
+               <antcall target="download-spark"/>
+               <echo message="Installing Spark test instance" />
+               <echo message="Deleting ${unpack-dir}/${spark-dir}" />
+               <delete dir="${unpack-dir}/${spark-dir}" />
+               <echo message="deleted" />
+           <untar src="${spark-archive}" dest="${unpack-dir}" 
compression="gzip" />
+       </target>
+
+       <!-- 
******************************************************************************************
 -->
+
+       <target name="enable-jetty-basic-authentication">
+               <echo message="Enabling jetty basic authentication..." />
+               <echo message="Updating jetty.xml file..." />
+               <replace file="${unpack-dir}/${jetty-dir}/etc/jetty.xml">
+                       <!-- See corresponding config in web.xml file of SDP 
webapp -->
+                       <replacetoken><![CDATA[</Configure>]]></replacetoken>
+                       <replacevalue>
+                               <![CDATA[
+       <Call name="addBean">
+               <Arg>
+                       <New 
class="org.eclipse.jetty.security.HashLoginService">
+                               <Set name="name">ODF Realm</Set>
+                               <Set name="config"><SystemProperty 
name="jetty.home" default="."/>/etc/realm.properties</Set>
+                       </New>
+               </Arg>
+       </Call>
+</Configure>
+                               ]]>
+                       </replacevalue>
+               </replace>
+               <echo message="Copying credentials file..." />
+               <copy file="${script.basedir}/../jettyconfig/realm.properties" 
tofile="${unpack-dir}/${jetty-dir}/etc/realm.properties" overwrite="true"/>
+               <echo message="Jetty basic authentication has been enabled." />
+       </target>
+
+       <!-- 
******************************************************************************************
 -->
+
+       <target name="default">
+               <mkdir dir="${unpack-dir}"/>
+               <antcall target="unzip-jetty"/>
+               <antcall target="enable-jetty-basic-authentication"/>
+               <antcall target="unzip-kafka"/>
+               <antcall target="unzip-spark"/>
+       </target>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/assembly/bin.xml
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/assembly/bin.xml 
b/odf/odf-test-env/src/assembly/bin.xml
new file mode 100755
index 0000000..b5731a7
--- /dev/null
+++ b/odf/odf-test-env/src/assembly/bin.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+~ Licensed 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.
+-->
+<assembly
+       
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3";
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3
 http://maven.apache.org/xsd/assembly-1.1.3.xsd";>
+       <id>bin</id>
+       <formats>
+               <format>zip</format>
+       </formats>
+       <fileSets>
+               <fileSet>
+                       <outputDirectory>/</outputDirectory>
+                       <directory>target/downloads</directory>
+                       <excludes>
+                               <exclude>*.zip</exclude>
+                               <exclude>*.gz</exclude>
+                               <exclude>**/zookeeper.properties</exclude>
+                               <exclude>**/server.properties</exclude>
+                       </excludes>
+                       <fileMode>0755</fileMode>
+               </fileSet>
+               <fileSet>
+                       <outputDirectory>/</outputDirectory>
+                       <directory>src/main/scripts</directory>
+                       <fileMode>0755</fileMode>
+                       <excludes>
+                          <exclude>**/jenkins-*.sh</exclude>
+                       </excludes>
+               </fileSet>
+               <fileSet>
+                       
<outputDirectory>/kafka_${scala.version}-${kafka.version}/config</outputDirectory>
+                       <directory>src/main/config</directory>
+                       <includes>
+                               <include>*.properties</include>
+                       </includes>
+               </fileSet>
+               <fileSet>
+                       <directory>../odf-doc/target/site</directory>
+                       <outputDirectory>/odf-documentation</outputDirectory>
+               </fileSet>
+       </fileSets>
+       <files>
+               <file>
+                       
<source>../odf-doc/src/site/markdown/test-env.md</source>
+                       <outputDirectory>/</outputDirectory>
+                       <destName>README.md</destName>
+               </file>
+       </files>
+       <dependencySets>
+               <dependencySet>
+                       <outputDirectory>/odfjettybase/webapps</outputDirectory>
+                       <includes>
+                               <include>*:war:*</include>
+                       </includes>
+                       <excludes>
+                               <exclude>*:jar:*</exclude>
+                       </excludes>
+               </dependencySet>
+       </dependencySets>
+</assembly>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/config/server.properties
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/config/server.properties 
b/odf/odf-test-env/src/main/config/server.properties
new file mode 100755
index 0000000..1f2a406
--- /dev/null
+++ b/odf/odf-test-env/src/main/config/server.properties
@@ -0,0 +1,134 @@
+#
+# Licensed 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.
+#
+# 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.
+# see kafka.server.KafkaConfig for additional details and defaults
+
+############################# Server Basics #############################
+
+# The id of the broker. This must be set to a unique integer for each broker.
+broker.id=0
+
+############################# Socket Server Settings 
#############################
+
+# The port the socket server listens on
+port=59092
+
+# Hostname the broker will bind to. If not set, the server will bind to all 
interfaces
+#host.name=localhost
+
+# Hostname the broker will advertise to producers and consumers. If not set, 
it uses the
+# value for "host.name" if configured.  Otherwise, it will use the value 
returned from
+# java.net.InetAddress.getCanonicalHostName().
+#advertised.host.name=<hostname routable by clients>
+
+# The port to publish to ZooKeeper for clients to use. If this is not set,
+# it will publish the same port that the broker binds to.
+#advertised.port=<port accessible by clients>
+
+# The number of threads handling network requests
+num.network.threads=3
+ 
+# The number of threads doing disk I/O
+num.io.threads=8
+
+# The send buffer (SO_SNDBUF) used by the socket server
+socket.send.buffer.bytes=102400
+
+# The receive buffer (SO_RCVBUF) used by the socket server
+socket.receive.buffer.bytes=102400
+
+# The maximum size of a request that the socket server will accept (protection 
against OOM)
+socket.request.max.bytes=104857600
+
+
+############################# Log Basics #############################
+
+# A comma seperated list of directories under which to store log files
+log.dirs=/tmp/odftestenv-kafka-logs
+
+# The default number of log partitions per topic. More partitions allow greater
+# parallelism for consumption, but this will also result in more files across
+# the brokers.
+num.partitions=1
+
+# The number of threads per data directory to be used for log recovery at 
startup and flushing at shutdown.
+# This value is recommended to be increased for installations with data dirs 
located in RAID array.
+num.recovery.threads.per.data.dir=1
+
+############################# Log Flush Policy #############################
+
+# Messages are immediately written to the filesystem but by default we only 
fsync() to sync
+# the OS cache lazily. The following configurations control the flush of data 
to disk. 
+# There are a few important trade-offs here:
+#    1. Durability: Unflushed data may be lost if you are not using 
replication.
+#    2. Latency: Very large flush intervals may lead to latency spikes when 
the flush does occur as there will be a lot of data to flush.
+#    3. Throughput: The flush is generally the most expensive operation, and a 
small flush interval may lead to exceessive seeks. 
+# The settings below allow one to configure the flush policy to flush data 
after a period of time or
+# every N messages (or both). This can be done globally and overridden on a 
per-topic basis.
+
+# The number of messages to accept before forcing a flush of data to disk
+#log.flush.interval.messages=10000
+
+# The maximum amount of time a message can sit in a log before we force a flush
+#log.flush.interval.ms=1000
+
+############################# Log Retention Policy 
#############################
+
+# The following configurations control the disposal of log segments. The 
policy can
+# be set to delete segments after a period of time, or after a given size has 
accumulated.
+# A segment will be deleted whenever *either* of these criteria are met. 
Deletion always happens
+# from the end of the log.
+
+# The minimum age of a log file to be eligible for deletion
+log.retention.hours=168
+
+# A size-based retention policy for logs. Segments are pruned from the log as 
long as the remaining
+# segments don't drop below log.retention.bytes.
+#log.retention.bytes=1073741824
+
+# The maximum size of a log segment file. When this size is reached a new log 
segment will be created.
+log.segment.bytes=1073741824
+
+# The interval at which log segments are checked to see if they can be deleted 
according 
+# to the retention policies
+log.retention.check.interval.ms=300000
+
+# By default the log cleaner is disabled and the log retention policy will 
default to just delete segments after their retention expires.
+# If log.cleaner.enable=true is set the cleaner will be enabled and individual 
logs can then be marked for log compaction.
+log.cleaner.enable=false
+
+############################# Zookeeper #############################
+
+# Zookeeper connection string (see zookeeper docs for details).
+# This is a comma separated host:port pairs, each corresponding to a zk
+# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
+# You can also append an optional chroot string to the urls to specify the
+# root directory for all kafka znodes.
+zookeeper.connect=localhost:52181
+
+# Timeout in ms for connecting to zookeeper
+zookeeper.connection.timeout.ms=6000

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/config/zookeeper.properties
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/config/zookeeper.properties 
b/odf/odf-test-env/src/main/config/zookeeper.properties
new file mode 100755
index 0000000..5f4d7e0
--- /dev/null
+++ b/odf/odf-test-env/src/main/config/zookeeper.properties
@@ -0,0 +1,33 @@
+#
+# Licensed 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.
+#
+# 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.
+# the directory where the snapshot is stored.
+dataDir=/tmp/odftestenv-zookeeper
+# the port at which the clients will connect
+clientPort=52181
+# disable the per-ip limit on the number of connections since this is a 
non-production config
+maxClientCnxns=0

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/clean_atlas.bat
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/clean_atlas.bat 
b/odf/odf-test-env/src/main/scripts/clean_atlas.bat
new file mode 100755
index 0000000..84c2449
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/clean_atlas.bat
@@ -0,0 +1,22 @@
+REM
+REM Licensed under the Apache License, Version 2.0 (the "License");
+REM you may not use this file except in compliance with the License.
+REM You may obtain a copy of the License at
+REM
+REM   http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM Unless required by applicable law or agreed to in writing, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+
+setlocal
+
+REM you should not have to change anything below this line ;-)
+
+set TESTENVDIR=%~dp0
+set ATLAS_HOME=%TESTENVDIR%apache-atlas-0.7-incubating-release
+
+echo Delete atlas data
+del /F /S /Q "%ATLAS_HOME%\data"

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/clean_atlas.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/clean_atlas.sh 
b/odf/odf-test-env/src/main/scripts/clean_atlas.sh
new file mode 100755
index 0000000..4eb3b1d
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/clean_atlas.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+
+# You should not have to change anything below this line ;-)
+export BASEDIR="$( cd "$(dirname "$0")" ; pwd -P )"
+
+export ATLAS_HOME=$BASEDIR/apache-atlas-0.7-incubating-release
+
+echo Delete atlas data
+rm -rf $ATLAS_HOME/data

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/deploy-odf-war.bat
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/deploy-odf-war.bat 
b/odf/odf-test-env/src/main/scripts/deploy-odf-war.bat
new file mode 100755
index 0000000..92561ad
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/deploy-odf-war.bat
@@ -0,0 +1,24 @@
+REM 
+REM Licensed under the Apache License, Version 2.0 (the "License");
+REM you may not use this file except in compliance with the License.
+REM You may obtain a copy of the License at
+REM
+REM   http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM Unless required by applicable law or agreed to in writing, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+
+setlocal
+
+REM set ODF_GIT_DIR to the root project of your ODF Git project (i.e. where 
the top pom.xml resides)
+set ODF_GIT_DIR=c:\git\open-discovery-framework
+
+
+REM you should not have to change anything below this line ;-)
+
+set TESTENVDIR=%~dp0
+
+copy /Y %ODF_GIT_DIR%\odf-web\target\odf-web-1.2.0-SNAPSHOT.war 
%TESTENVDIR%\odfjettybase\webapps

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/deploy-odf-war.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/deploy-odf-war.sh 
b/odf/odf-test-env/src/main/scripts/deploy-odf-war.sh
new file mode 100755
index 0000000..732515a
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/deploy-odf-war.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+
+# Set ODF_GIT_DIR to the root project of your ODF Git project (i.e. where the 
top pom.xml resides)
+export ODF_GIT_DIR=~/git/open-discovery-framework
+
+# You should not have to change anything below this line ;-)
+export BASEDIR="$( cd "$(dirname "$0")" ; pwd -P )"
+cp $ODF_GIT_DIR/odf-web/target/odf-web-1.2.0-SNAPSHOT.war 
$BASEDIR/odfjettybase/webapps

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/download-install-odf-testenv.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/download-install-odf-testenv.sh 
b/odf/odf-test-env/src/main/scripts/download-install-odf-testenv.sh
new file mode 100755
index 0000000..e3f6c52
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/download-install-odf-testenv.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+
+#
+# Script to download, start, and configure the ODF test environment.
+# JenkinsBuildNumber refers to the build number of the job 
Open-Discovery-Framework, see here:
+# 
https://shared-discovery-platform-jenkins.swg-devops.com:8443/job/Open-Discovery-Framework
+#
+# Usage: download-install-odf-testenv.sh [<JenkinsBuildNumber> <Directory> ]
+#        Default values:
+#             <JenkinsBuildNumber>: lastSuccessfulBuild
+#             <Directory>: ~/odf-test-env
+#
+
+JENKINSBUILDNUMBER=$1
+if [ -z "$JENKINSBUILDNUMBER" ]; then
+   JENKINSBUILDNUMBER=lastSuccessfulBuild
+   echo Jenkins build number not provided, using default $JENKINSBUILDNUMBER
+fi
+
+TESTENVDIR=$2
+if [ -z "$TESTENVDIR" ]; then
+   TESTENVDIR=~/odf-test-env
+   echo Target directory not provided, using default $TESTENVDIR
+fi
+
+# hidden third parameter taking the jenkins job name
+JENKINSJOB=$3
+if [ -z "$JENKINSJOB" ]; then
+   JENKINSJOB=Open-Discovery-Framework
+   echo Jenkins job not provided, using default $JENKINSJOB
+fi
+
+echo Downloading test env to directory $TESTENVDIR, Jenkins build number: 
$JENKINSBUILDNUMBER
+
+
+TESTENVVERSION=1.2.0-SNAPSHOT
+TESTENVZIP=/tmp/odf-test-env.zip
+FULLHOSTNAME=`hostname -f`
+
+
+echo Downloading ODF test env
+curl 
https://shared-discovery-platform-jenkins.swg-devops.com:8443/job/$JENKINSJOB/$JENKINSBUILDNUMBER/artifact/odf-test-env/target/odf-test-env-$TESTENVVERSION-bin.zip
 --output $TESTENVZIP
+
+echo Stopping test env if it exists...
+$TESTENVDIR/odf-test-env-$TESTENVVERSION/odftestenv.sh stop
+sleep 1
+echo Test env stopped
+
+echo Removing existing test env directory...
+rm -rf $TESTENVDIR/odf-test-env-$TESTENVVERSION
+echo Existing test env directory removed
+
+echo Unpacking $TESTENVZIP to $TESTENVDIR
+mkdir -p $TESTENVDIR
+unzip -q $TESTENVZIP -d $TESTENVDIR
+
+$TESTENVDIR/odf-test-env-$TESTENVVERSION/odftestenv.sh cleanall
+
+echo ODF test env installed and started
+echo "Point your browser to https://$FULLHOSTNAME:58081/odf-web-1.2.0-SNAPSHOT 
to check it out"

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/jenkins-manage-testenv.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/jenkins-manage-testenv.sh 
b/odf/odf-test-env/src/main/scripts/jenkins-manage-testenv.sh
new file mode 100755
index 0000000..bdb1428
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/jenkins-manage-testenv.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+
+# This is the script used in the job definition of our Jenkins job 
Manage-Install-ODF-Testenv
+# The original can be foudn in get: 
odf-test-env/src/main/scripts/jenkins-manage-testenv.sh
+#
+# The Jenkins job should have the following parameters:
+#
+# 1. nodelabel: Label parameter. Default: odftestenv
+#
+# 2. action: Choice parameter with these choices: start, stop, cleanall, 
cleanconfig, cleanmetadata, install
+# Action description:
+#Available actions are:
+#<ul>
+#  <li>install: Remove the existing and install a new test environment build.
+#    Installs the most recent successful build by default. To change which 
build is used
+#    set the parameters <em>buildnumber</em> and <em>job</em> accordingly.</li>
+#  <li>start: (re)start the test environment</li>
+#  <li>stop:  stop the test environment</li>
+#  <li>cleanall: (re)starts with clean configuration and clean metadata</li>
+#  <li>cleanconfig   (re)starts with clean configuration</li>
+#  <li>cleanmetadata (re)starts with clean metadata</li>
+#</ul>
+#
+# 3. jenkinsjob: Choice parameter with choices: Shared-Discovery-Platform, 
Shared-Discovery-Platform-Parameters
+#
+# 4. buildnumber: String parmeter with default: lastSuccessfulBuild
+#
+
+echo Managing ODF test environment with parameters: action = $action, 
buildnumber = $buildnumber, jenkinsjob = $jenkinsjob
+
+if [ "$action" = "install" ]; then
+  ODFTESTENVTARGETDIR=/home/atlasadmin/odf-test-env
+  OUTPUTFILE=/tmp/download-install-odf-testenv.sh
+
+  if [ "$buildnumber" = "" ]; then
+    buildnumber=lastSuccessfulBuild
+  fi
+
+  if [ "$jenkinsjob" = "" ]; then
+    jenkinsjob=Shared-Discovery-Platform
+  fi
+
+  echo Downloading build number $buildnumber
+  curl 
https://shared-discovery-platform-jenkins.swg-devops.com:8443/job/$jenkinsjob/$buildnumber/artifact/odf-test-env/src/main/scripts/download-install-odf-testenv.sh
 --output $OUTPUTFILE
+
+  echo Running installer script on directory $ODFTESTENVTARGETDIR with build 
number $buildnumber
+  chmod 755 $OUTPUTFILE
+  export BUILD_ID=dontletjenkinskillme
+  echo Running command $OUTPUTFILE $buildnumber $ODFTESTENVTARGETDIR 
$jenkinsjob
+  $OUTPUTFILE $buildnumber $ODFTESTENVTARGETDIR $jenkinsjob
+else
+  TESTENVDIR=~/odf-test-env/odf-test-env-1.2.0-SNAPSHOT
+  export BUILD_ID=dontletjenkinskillme
+
+  $TESTENVDIR/odftestenv.sh $action
+fi

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/odftestenv.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/odftestenv.sh 
b/odf/odf-test-env/src/main/scripts/odftestenv.sh
new file mode 100755
index 0000000..94d08f3
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/odftestenv.sh
@@ -0,0 +1,232 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+
+# You should not have to change anything below this line ;-)
+###############################################################
+
+#############################################
+## Check that java and python are available
+
+
+if [ "x$JAVA_HOME" == "x" ]; then
+  echo "JAVA_HOME is not set, using standard java on path"
+  JAVAEXE=$(which java)
+else
+  echo "JAVA_HOME is set to $JAVA_HOME"
+  JAVAEXE=$JAVA_HOME/bin/java
+fi
+
+if [ ! -x $JAVAEXE ]; then
+   echo "Java executable $JAVAEXE could not be found. Set JAVA_HOME 
accordingly or make sure that java is in your path".
+   exit 1
+fi
+
+echo "Using java: $JAVAEXE"
+
+
+PYTHON27EXE=python
+PYTHONVERSION=`$PYTHON27EXE --version 2>&1`
+if [[ ! $PYTHONVERSION == *2.7.* ]]; then
+   echo "Warning: Python command is not version 2.7. Starting / stopping Atlas 
might not work properly"
+fi
+
+
+###############################################
+## Set some variables
+
+BASEDIR="$( cd "$(dirname "$0")" ; pwd -P )"
+FULLHOSTNAME=`hostname -f`
+
+ATLAS_HOME=$BASEDIR/apache-atlas-0.7-incubating-release
+ATLAS_PORT=21453
+ATLAS_URL=https://localhost:$ATLAS_PORT
+ATLAS_USER=admin
+ATLAS_PASSWORD=UR0+HOiApXG9B8SNpKN5ww==
+
+ZK_DATADIR=/tmp/odftestenv-zookeeper
+KAFKA_DATADIR=/tmp/odftestenv-kafka-logs
+
+# export KAFKA_OPTS so that is picked up by the kafka and zookeeper start 
scripts. This can be used as a marker to search for those processes
+KILLMARKER=thisisanodftestenvprocess
+export KAFKA_OPTS="-D$KILLMARKER=true"
+KAFKA_HOME=$BASEDIR/kafka_2.11-0.10.0.0
+SPARK_HOME=$BASEDIR/spark-2.1.0-bin-hadoop2.7
+
+JETTY_BASE=$BASEDIR/odfjettybase
+JETTY_HOME=$BASEDIR/jetty-distribution-9.2.10.v20150310
+
+##########################################
+## Copy required files
+
+if [ "$(uname)" == "Darwin" ]; then
+       cp $ATLAS_HOME/conf/atlas-application.properties_mac 
$ATLAS_HOME/conf/atlas-application.properties
+else
+       cp $ATLAS_HOME/conf/atlas-application.properties_linux 
$ATLAS_HOME/conf/atlas-application.properties
+fi
+
+##########################################
+## Functions
+
+function waitSeconds {
+   echo "     Waiting for $1 seconds..."
+   sleep $1
+}
+
+function cleanMetadata {
+       echo Removing Atlas data...
+       rm -rf $ATLAS_HOME/data
+       rm -rf $ATLAS_HOME/logs
+       echo Atlas data removed
+}
+
+function cleanConfig {
+       echo Removing Zookeeper and Kafka data...
+       rm -rf $KAFKA_DATADIR
+    rm -rf $ZK_DATADIR
+       echo Zookeeper and Kafka data removed.
+}
+
+function reconfigureODF {
+       echo Configuring ODF...
+    JSON='{ "sparkConfig": { "clusterMasterUrl": "'$SPARK_MASTER'" } }'
+    echo Updating config to $JSON
+    curl -H "Content-Type: application/json" -X PUT -d "$JSON" -k -u 
sdp:admin4sdp 
https://$FULLHOSTNAME:58081/odf-web-1.2.0-SNAPSHOT/odf/api/v1/settings
+    echo ODF configured.
+}
+
+function healthCheck {
+    echo Running ODF health check
+    curl -X GET -k -u sdp:admin4sdp 
https://$FULLHOSTNAME:58081/odf-web-1.2.0-SNAPSHOT/odf/api/v1/engine/health
+    echo Health check finished
+}
+
+function startTestEnv {
+   echo Starting ODF test env
+   if [ -f "$ZKDATADIR" ]; then
+      echo zookeeper data exists
+   fi
+
+   echo "Starting Zookeeper"
+   nohup $KAFKA_HOME/bin/zookeeper-server-start.sh 
$KAFKA_HOME/config/zookeeper.properties &> $BASEDIR/nohupzookeeper.out &
+   waitSeconds 5
+   echo "Starting Kafka"
+   nohup $KAFKA_HOME/bin/kafka-server-start.sh 
$KAFKA_HOME/config/server.properties &> $BASEDIR/nohupkafka.out &
+   waitSeconds 5
+   if [[ $(unzip -v $JETTY_BASE/webapps/odf-web-1.2.0-SNAPSHOT.war | grep 
odf-atlas-) ]]; then
+     echo "Starting Atlas"
+     nohup $PYTHON27EXE $ATLAS_HOME/bin/atlas_start.py -port $ATLAS_PORT &> 
$BASEDIR/nohupatlas.out &
+     waitSeconds 30
+   else
+       echo "Do not start Atlas because ODF was built without it."
+   fi
+   echo "Starting Spark master"
+   cd $SPARK_HOME
+   nohup sbin/start-master.sh &> $BASEDIR/nohupspark.out &
+   waitSeconds 5
+   SPARK_MASTER=$(curl http://localhost:8080 | awk '/ Spark Master at/{print 
$NF}')
+   echo "Spark master URL: $SPARK_MASTER"
+   echo "Starting Spark slave"
+   nohup sbin/start-slave.sh $SPARK_MASTER &> $BASEDIR/nohupspark.out &
+   waitSeconds 5
+   echo "Starting ODF on Jetty"
+   cd $JETTY_BASE
+   nohup $JAVAEXE -Dodf.zookeeper.connect=localhost:52181 
-Datlas.url=$ATLAS_URL -Datlas.user=$ATLAS_USER 
-Datlas.password=$ATLAS_PASSWORD -Dorg.eclipse.jetty.servlet.LEVEL=ALL -jar 
$JETTY_HOME/start.jar STOP.PORT=53000 STOP.KEY=STOP &> $BASEDIR/nohupjetty.out &
+   waitSeconds 10
+
+   healthCheck
+   reconfigureODF
+
+   echo "ODF test env started on 
https://$FULLHOSTNAME:58081/odf-web-1.2.0-SNAPSHOT";
+}
+
+function stopTestEnv {
+   echo Stopping ODF test env ...
+   echo Stopping kafka and zookeeper...
+   PROCESSNUM=`ps aux | grep $KILLMARKER | grep -v grep | wc | awk '{print 
$1}'`
+   if [ $PROCESSNUM -gt 0 ]; then
+      echo Killing $PROCESSNUM Kafka / ZK processes
+      kill -9 $(ps aux | grep $KILLMARKER | grep -v grep | awk '{print $2}')
+   else
+      echo No Kafka / Zookeeper processes found
+   fi
+   waitSeconds 3
+   echo Kafka and Zookeeper stopped
+   echo Stopping Atlas...
+   $PYTHON27EXE $ATLAS_HOME/bin/atlas_stop.py
+   waitSeconds 5
+   echo Atlas stopped
+   echo Stopping Spark...
+   cd $SPARK_HOME
+   SPARK_MASTER=$(curl http://localhost:8080 | awk '/ Spark Master at/{print 
$NF}')
+   sbin/stop-slave.sh $SPARK_MASTER
+   sbin/stop-master.sh
+   waitSeconds 5
+   echo Spark stopped
+   echo Stopping Jetty...
+   cd $JETTY_BASE
+   $JAVAEXE -jar $JETTY_HOME/start.jar STOP.PORT=53000 STOP.KEY=STOP --stop
+   waitSeconds 5
+   echo Jetty stopped
+   echo ODF test env stopped
+}
+
+
+function usageAndExit {
+  echo "Usage: $0 start|stop|cleanconfig|cleanmetadata|cleanall"
+  echo "Manage the ODF test environment"
+  echo "Options:"
+  echo "         start         (re)start"
+  echo "         stop          stop"
+  echo "         cleanall      (re)starts with clean configuration and clean 
metadata"
+  echo "         cleanconfig   (re)starts with clean configuration"
+  echo "         cleanmetadata (re)starts with clean metadata"
+  exit 1;
+}
+
+###############################################
+## main script
+
+if [ -z "$1" ]; then
+   usageAndExit
+elif [ "$1" = "start" ]; then
+   echo "(Re) starting test env..."
+   stopTestEnv
+   echo "-------------------------------------"
+   startTestEnv
+   echo "Test env restarted"
+elif [ "$1" = "stop" ]; then
+   stopTestEnv
+elif [ "$1" = "cleanconfig" ]; then
+   echo "(Re) starting test env with clean configuration..."
+   stopTestEnv
+   cleanConfig
+   startTestEnv
+   echo "(Re)started test env with clean configuration"
+elif [ "$1" = "cleanmetadata" ]; then
+   echo "(Re) starting test env with clean metadata..."
+   stopTestEnv
+   cleanMetadata
+   startTestEnv
+   echo "(Re)started test env with clean metadata"
+elif [ "$1" = "cleanall" ]; then
+   echo "(Re) starting test env with clean configuration and metadata..."
+   stopTestEnv
+   cleanConfig
+   cleanMetadata
+   startTestEnv
+   echo "(Re)started test env with clean configuration and metadata"
+else
+   usageAndExit
+fi

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/start-odf-testenv.bat
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/start-odf-testenv.bat 
b/odf/odf-test-env/src/main/scripts/start-odf-testenv.bat
new file mode 100755
index 0000000..db442e0
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/start-odf-testenv.bat
@@ -0,0 +1,57 @@
+REM
+REM Licensed under the Apache License, Version 2.0 (the "License");
+REM you may not use this file except in compliance with the License.
+REM You may obtain a copy of the License at
+REM
+REM   http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM Unless required by applicable law or agreed to in writing, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+
+setlocal
+
+set JAVAEXE=%JAVA_HOME%\bin\java.exe
+set PYTHON27EXE=python
+
+
+REM you should not have to change anything below this line ;-)
+
+set TESTENVDIR=%~dp0
+set JETTY_HOME=%TESTENVDIR%jetty-distribution-9.2.10.v20150310
+set KAFKA_PACKAGE_DIR=%TESTENVDIR%kafka_2.11-0.10.0.0
+set ATLAS_HOME=%TESTENVDIR%apache-atlas-0.7-incubating-release
+
+echo Delete logs
+del /F /S /Q "C:\tmp\odftestenv-kafka-logs"
+del /F /S /Q "C:\tmp\odftestenv-zookeeper"
+
+echo Copy required files
+xcopy %ATLAS_HOME%\conf\atlas-application.properties_windows 
%ATLAS_HOME%\conf\atlas-application.properties /Y
+
+REM Workaround for issue #94 (Location of keystore files is hardcoded in Atlas 
config)
+if not exist "C:\tmp\apache-atlas-0.7-incubating-release\conf" (mkdir 
"C:\tmp\apache-atlas-0.7-incubating-release\conf")
+xcopy %ATLAS_HOME%\conf\keystore_ibmjdk.jceks 
C:\tmp\apache-atlas-0.7-incubating-release\conf /Y
+xcopy %ATLAS_HOME%\conf\keystore_ibmjdk.jks 
C:\tmp\apache-atlas-0.7-incubating-release\conf /Y 
+
+echo Start zookeeper:
+start "Zookeeper" %KAFKA_PACKAGE_DIR%\bin\windows\zookeeper-server-start.bat 
%KAFKA_PACKAGE_DIR%\config\zookeeper.properties
+
+timeout 5 /NOBREAK
+
+echo Start kafka:
+start "Kafka" %KAFKA_PACKAGE_DIR%\bin\windows\kafka-server-start.bat 
%KAFKA_PACKAGE_DIR%\config\server.properties
+
+timeout 5 /NOBREAK
+
+echo Start Atlas
+start "Stop Atlas" %PYTHON27EXE% %ATLAS_HOME%\bin\atlas_stop.py
+start "Start Atlas" %PYTHON27EXE% %ATLAS_HOME%\bin\atlas_start.py -port 21443
+
+echo Start jetty
+set JETTY_BASE=%TESTENVDIR%odfjettybase
+rem set JETTY_BASE=%TESTENVDIR%base2
+cd %JETTY_BASE%
+start "Jetty" %JAVAEXE% -Dodf.zookeeper.connect=localhost:52181 
-Datlas.url=https://localhost:21443 -Datlas.user=admin 
-Datlas.password=UR0+HOiApXG9B8SNpKN5ww== 
-Dodf.logspec=ALL,/tmp/odf-test-env-trace.log -jar %JETTY_HOME%\start.jar

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/start-odf-testenv.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/start-odf-testenv.sh 
b/odf/odf-test-env/src/main/scripts/start-odf-testenv.sh
new file mode 100755
index 0000000..664b5a9
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/start-odf-testenv.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+export JAVAEXE=java
+export PYTHON27EXE=python
+
+# You should not have to change anything below this line ;-)
+export BASEDIR="$( cd "$(dirname "$0")" ; pwd -P )"
+
+export JETTY_HOME=$BASEDIR/jetty-distribution-9.2.10.v20150310
+export KAFKA_PACKAGE_DIR=$BASEDIR/kafka_2.11-0.10.0.0
+export ATLAS_HOME=$BASEDIR/apache-atlas-0.7-incubating-release
+
+echo Delete logs
+rm -rf /tmp/odftestenv-kafka-logs
+rm -rf /tmp/odftestenv-zookeeper
+
+echo Copy required files
+if [ "$(uname)" == "Darwin" ]; then
+       cp $ATLAS_HOME/conf/atlas-application.properties_mac 
$ATLAS_HOME/conf/atlas-application.properties
+else
+       cp $ATLAS_HOME/conf/atlas-application.properties_linux 
$ATLAS_HOME/conf/atlas-application.properties
+fi
+
+echo Start zookeeper:
+$KAFKA_PACKAGE_DIR/bin/zookeeper-server-start.sh 
$KAFKA_PACKAGE_DIR/config/zookeeper.properties &
+
+sleep 5
+
+echo Start kafka:
+$KAFKA_PACKAGE_DIR/bin/kafka-server-start.sh 
$KAFKA_PACKAGE_DIR/config/server.properties &
+
+sleep 5
+
+echo Stop and restart Atlas
+$PYTHON27EXE $ATLAS_HOME/bin/atlas_stop.py
+$PYTHON27EXE $ATLAS_HOME/bin/atlas_start.py -port 21443
+
+echo Start jetty
+export JETTY_BASE=$BASEDIR/odfjettybase
+cd $JETTY_BASE
+$JAVAEXE -Dodf.zookeeper.connect=localhost:52181 
-Dorg.eclipse.jetty.servlet.LEVEL=ALL -jar $JETTY_HOME/start.jar &

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-test-env/src/main/scripts/stop-odf-testenv.sh
----------------------------------------------------------------------
diff --git a/odf/odf-test-env/src/main/scripts/stop-odf-testenv.sh 
b/odf/odf-test-env/src/main/scripts/stop-odf-testenv.sh
new file mode 100755
index 0000000..6f974b9
--- /dev/null
+++ b/odf/odf-test-env/src/main/scripts/stop-odf-testenv.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+#
+# Licensed 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.
+#
+echo Stopping all processes of the odf-test-env...
+kill -9 $(ps aux | grep 'odf-test-env' | grep -v 'download-install' | grep -v 
'stop-odf-testenv' | awk '{print $2}')

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/.gitignore
----------------------------------------------------------------------
diff --git a/odf/odf-web/.gitignore b/odf/odf-web/.gitignore
new file mode 100755
index 0000000..7322e4f
--- /dev/null
+++ b/odf/odf-web/.gitignore
@@ -0,0 +1,24 @@
+#
+#  Licensed 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.
+#
+.settings
+target
+.classpath
+.project
+.factorypath
+.externalToolBuilders
+build
+build/**
+node_modules
+node_modules/**
+.DS_Store

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/download_swagger-ui.xml
----------------------------------------------------------------------
diff --git a/odf/odf-web/download_swagger-ui.xml 
b/odf/odf-web/download_swagger-ui.xml
new file mode 100755
index 0000000..74ef82d
--- /dev/null
+++ b/odf/odf-web/download_swagger-ui.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+~
+~ Licensed 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.
+-->
+<project name="odf-download-swagger-ui">
+
+       <property name="swagger-dir" value="swagger-ui-${swagger.version}" />
+       <!-- download swagger ui directly from the web:
+       <property name="swagger-download" 
value="https://github.com/swagger-api/swagger-ui/archive/v${swagger.version}.tar.gz";
 />
+       <property name="swagger-archive" 
value="${unpack-dir}/${swagger-dir}.tar.gz" />
+       -->
+       <!-- download swagger ui from box: -->
+       <property name="swagger-download" 
value="https://ibm.box.com/shared/static/13cb0nobufykaxvrnezjf2fbtf0hpfn7.gz"; />
+       <property name="swagger-archive" 
value="${unpack-dir}/swagger-ui-2.1.4.tar.gz" />
+
+       <condition property="swagger-zip-not-found">
+               <not>
+                       <available file="${swagger-archive}">
+                       </available>
+               </not>
+       </condition>
+
+       <condition property="swagger-unpacked">
+          <available file="${unpack-dir}/${swagger-dir}/dist" type="dir" />
+    </condition>
+
+       <!-- 
******************************************************************************************
 -->
+
+       <target name="download-swagger-ui" if="swagger-zip-not-found">
+               <echo message="Downloading Swagger..." />
+               <get verbose="true" src="${swagger-download}" 
dest="${swagger-archive}" />
+               <echo message="Swagger downloaded" />
+       </target>
+
+       <target name="unzip-swagger" unless="swagger-unpacked">
+               <antcall target="download-swagger-ui"/>
+               <echo message="Installing Swagger" />
+               <echo message="Deleting ${unpack-dir}/${swagger-dir}" />
+               <delete dir="${unpack-dir}/${swagger-dir}" />
+               <echo message="Deleted" />
+           <untar src="${swagger-archive}" dest="${unpack-dir}" 
compression="gzip" />
+           <!-- <unzip src="${swagger-archive}" dest="${unpack-dir}" /> -->
+       </target>
+
+       <!-- 
******************************************************************************************
 -->
+
+       <target name="default">
+               <mkdir dir="${unpack-dir}"/>
+               <antcall target="unzip-swagger"/>
+       </target>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/package.json
----------------------------------------------------------------------
diff --git a/odf/odf-web/package.json b/odf/odf-web/package.json
new file mode 100755
index 0000000..1fe599b
--- /dev/null
+++ b/odf/odf-web/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "odf-web",
+  "version": "1.2.0-SNAPSHOT",
+  "main": "index.html",
+  "dependencies": {
+    "bootstrap": "^3.3.6",
+    "d3": "^3.5.12",
+    "react": "^0.14.6",
+    "jquery": "^2.2.0",
+    "react-addons-linked-state-mixin": "^0.14.6",
+    "react-bootstrap": "^0.28.2",
+    "react-dom": "^0.14.6",
+    "react-d3-components": "^0.6.1",
+    "bootstrap-material-design" : "^0.5.7",
+    "roboto-font": "^0.1.0"
+  },
+  "devDependencies": {    
+       "webpack": "^1.12.11",
+       "imports-loader": "^0.6.5",
+    "babel-core": "^6.4.0",
+    "babel-preset-es2015": "^6.3.13",
+    "babel-loader": "^6.2.1",
+    "babel-preset-react": "^6.3.13",
+    "url-loader": "^0.5.7",
+    "css-loader": "^0.23.1",
+    "style-loader": "^0.13.0"
+  },
+  "author": "IBM",
+  "license": "ISC"
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/pom.xml
----------------------------------------------------------------------
diff --git a/odf/odf-web/pom.xml b/odf/odf-web/pom.xml
new file mode 100755
index 0000000..df0b702
--- /dev/null
+++ b/odf/odf-web/pom.xml
@@ -0,0 +1,441 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+~
+~ Licensed 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.
+-->
+<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";>
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.apache.atlas.odf</groupId>
+               <artifactId>odf</artifactId>
+               <version>1.2.0-SNAPSHOT</version>
+       </parent>
+       <artifactId>odf-web</artifactId>
+       <packaging>war</packaging>
+       <properties>
+               <!-- specify versions of components to be downloaded -->
+               <swagger.version>2.1.4</swagger.version>
+               
<swagger.base.path>/${project.artifactId}-${project.version}/odf/api/v1</swagger.base.path>
+       </properties>
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-api</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-core</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <scope>runtime</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.glassfish.jersey.core</groupId>
+                       <artifactId>jersey-server</artifactId>
+                       <version>2.22.2</version>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>javax.ws.rs</groupId>
+                       <artifactId>jsr311-api</artifactId>
+                       <version>1.1.1</version>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>javax.servlet</groupId>
+                       <artifactId>servlet-api</artifactId>
+                       <version>2.5</version>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <artifactId>swagger-jaxrs</artifactId>
+                       <version>1.5.9</version>
+                       <groupId>io.swagger</groupId>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-doc</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <type>war</type>
+                       <scope>runtime</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-spark</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <scope>runtime</scope>
+                       <exclusions>
+                               <!-- Exclude this dependency to avoid the 
following error when running the jetty-maven-plugin:
+                                "A required class was missing while executing 
org.eclipse.jetty:jetty-maven-plugin:9.2.14.v20151106:start: 
com/sun/jersey/spi/inject/InjectableProvider" -->
+                               <exclusion>
+                                       <groupId>org.apache.hadoop</groupId>
+                                       <artifactId>hadoop-hdfs</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+               <!-- Required for compatibility with Spark cluster (must use 
same version) -->
+               <dependency>
+                       <groupId>org.apache.commons</groupId>
+                       <artifactId>commons-lang3</artifactId>
+                       <version>3.5</version>
+                       <scope>runtime</scope>
+               </dependency>
+               <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <version>4.12</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-core</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <type>test-jar</type>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-messaging</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <scope>runtime</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-messaging</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <type>test-jar</type>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-store</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <scope>runtime</scope>
+               </dependency>
+       </dependencies>
+
+       <repositories>
+               <repository>
+                       <id>iis-central</id>
+                       <name>Archiva Managed Maven Repository</name>
+                       
<url>http://iis-repo.swg.usma.ibm.com:8080/archiva/repository/all/</url>
+               </repository>
+       </repositories>
+
+       <profiles>
+               <profile>
+                       <id>atlas</id>
+                       <dependencies>
+                               <dependency>
+                                       <groupId>org.apache.atlas.odf</groupId>
+                                       <artifactId>odf-atlas</artifactId>
+                                       <version>1.2.0-SNAPSHOT</version>
+                                       <scope>runtime</scope>
+                               </dependency>
+                       </dependencies>
+               </profile>
+               <profile>
+                       <id>jenkinsbuild</id>
+                       <properties>
+                               <cf.password>${env.CFPASSWORD}</cf.password> 
<!-- Take cf.password from environment variable when running in Jenkins so that 
the password doesn't appear in the log -->
+                       </properties>
+               </profile>
+               <profile>
+                       <id>integration-tests</id>
+                       <activation>
+                               <property>
+                                       <name>reduced-tests</name>
+                                       <value>!true</value>
+                               </property>
+                       </activation>
+                       <build>
+                               <plugins>
+                                       <plugin>
+                                               
<groupId>org.apache.maven.plugins</groupId>
+                                               
<artifactId>maven-failsafe-plugin</artifactId>
+                                               <version>2.19</version>
+                                               <configuration>
+                                                       
<systemPropertyVariables>
+                                                               <!-- we always 
use the embedded Kafka in our integration tests -->
+                                                               
<odf.zookeeper.connect>${testZookeepeConnectionString}</odf.zookeeper.connect>
+                                                               
<odf.test.base.url>${odf.test.base.url}</odf.test.base.url>
+                                                               
<odf.test.webapp.url>${odf.test.webapp.url}</odf.test.webapp.url>
+                                                               
<odf.test.user>${odf.test.user}</odf.test.user>
+                                                               
<odf.test.password>${odf.test.password}</odf.test.password>
+                                                               
<odf.logspec>${odf.integrationtest.logspec}.client</odf.logspec>
+                                                               <!-- The atlas 
configuration properties are only required when the "atlas" profile is 
activated -->
+                                                               
<atlas.url>${atlas.url}</atlas.url>
+                                                               
<atlas.user>${atlas.user}</atlas.user>
+                                                               
<atlas.password>${atlas.password}</atlas.password>
+                                                       
</systemPropertyVariables>
+                                                       <includes>
+                                                               
<include>**/integrationtest/**</include>
+                                                       </includes>
+                                               </configuration>
+                                               <executions>
+                                                       <execution>
+                                                               
<id>integration-test</id>
+                                                               <goals>
+                                                                       
<goal>integration-test</goal>
+                                                               </goals>
+                                                       </execution>
+                                                       <execution>
+                                                               <id>verify</id>
+                                                               <goals>
+                                                                       
<goal>verify</goal>
+                                                               </goals>
+                                                       </execution>
+                                               </executions>
+                                       </plugin>
+                               </plugins>
+                       </build>
+               </profile>
+       </profiles>
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <version>2.19</version>
+                               <configuration>
+                                       <systemPropertyVariables>
+                                               
<odf.logspec>${odf.unittest.logspec}</odf.logspec>
+                                               
<odf.build.project.name>${project.name}</odf.build.project.name>
+                                       </systemPropertyVariables>
+                                       <excludes>
+                                               
<exclude>**/integrationtest/**</exclude>
+                                       </excludes>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.eclipse.jetty</groupId>
+                               <artifactId>jetty-maven-plugin</artifactId>
+                               <version>9.2.14.v20151106</version>
+                               <configuration>
+                                       
<jettyXml>${project.parent.basedir}/jettyconfig/jetty.xml,${project.parent.basedir}/jettyconfig/jetty-ssl.xml,${project.parent.basedir}/jettyconfig/jetty-https.xml</jettyXml>
+                                       
<scanIntervalSeconds>10</scanIntervalSeconds>
+                                       <stopPort>8005</stopPort>
+                                       <stopKey>STOP</stopKey>
+                                       <systemProperties>
+                                               <systemProperty>
+                                                       
<name>odf.zookeeper.connect</name>
+                                                       
<value>${testZookeepeConnectionString}</value>
+                                               </systemProperty>
+                                               <systemProperty>
+                                                       <name>odf.logspec</name>
+                                                       
<value>${odf.integrationtest.logspec}.jettyserver</value>
+                                               </systemProperty>
+                                               <systemProperty>
+                                                       
<name>jetty.config.dir</name>
+                                                       
<value>${project.parent.basedir}/target/jettyconfig</value>
+                                               </systemProperty>
+                                               <systemProperty>
+                                                       <name>atlas.url</name>
+                                                       
<value>${atlas.url}</value>
+                                               </systemProperty>
+                                               <systemProperty>
+                                                       <name>atlas.user</name>
+                                                       
<value>${atlas.user}</value>
+                                               </systemProperty>
+                                               <systemProperty>
+                                                       
<name>atlas.password</name>
+                                                       
<value>${atlas.password}</value>
+                                               </systemProperty>
+                                       </systemProperties>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <id>start-jetty</id>
+                                               
<phase>pre-integration-test</phase>
+                                               <goals>
+                                                       <goal>start</goal>
+                                               </goals>
+                                               <configuration>
+                                                       
<scanIntervalSeconds>0</scanIntervalSeconds>
+                                                       <daemon>true</daemon>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>stop-jetty</id>
+                                               
<phase>post-integration-test</phase>
+                                               <goals>
+                                                       <goal>stop</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>com.github.eirslett</groupId>
+                               <artifactId>frontend-maven-plugin</artifactId>
+                               <version>0.0.27</version>
+                               <configuration>
+                                       
<installDirectory>build</installDirectory>
+                               </configuration>
+
+                               <executions>
+                                       <execution>
+                                               <id>install node and npm</id>
+                                               <goals>
+                                                       
<goal>install-node-and-npm</goal>
+                                               </goals>
+                                               <configuration>
+                                                       
<nodeVersion>v0.12.2</nodeVersion>
+                                                       
<npmVersion>2.7.6</npmVersion>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>npm install</id>
+                                               <goals>
+                                                       <goal>npm</goal>
+                                               </goals>
+                                               <configuration>
+                                                       
<arguments>install</arguments>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>webpack build</id>
+                                               <goals>
+                                                       <goal>webpack</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <!-- change to -p for 
production mode -->
+                                                       
<arguments>-d</arguments>
+                                               </configuration>
+                                       </execution>
+                                       <!-- <execution> 
<id>npm-list-packages</id> <goals> <goal>npm</goal>
+                                               </goals> 
<phase>validate</phase> <configuration> <arguments>ls depth=0</arguments>
+                                               </configuration> </execution> 
-->
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-war-plugin</artifactId>
+                               <version>2.4</version>
+                               <configuration>
+                                       
<failOnMissingWebXml>false</failOnMissingWebXml>
+                                       
<packagingExcludes>**/scripts/**</packagingExcludes>
+                                       <overlays>
+                                               <overlay>
+                                                       <!-- define here which 
files you want to take over from the odf-doc
+                                                               war. -->
+                                                       
<groupId>org.apache.atlas.odf</groupId>
+                                                       
<artifactId>odf-doc</artifactId>
+                                                       <excludes>
+                                                               
<exclude>WEB-INF/web.xml</exclude>
+                                                       </excludes>
+                                                       <includes>
+                                                               
<include>doc/**</include>
+                                                       </includes>
+                                               </overlay>
+                                       </overlays>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-antrun-plugin</artifactId>
+                               <version>1.8</version>
+                               <executions>
+                                       <execution>
+                                               <inherited>false</inherited>
+                                               <id>prepare-embedded-jetty</id>
+                                               <phase>validate</phase>
+                                               <goals>
+                                                       <goal>run</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <target>
+                                                               <ant 
antfile="../prepare_embedded_jetty.xml" target="prepare-jetty-config" />
+                                                       </target>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>prepare-components</id>
+                                               <phase>validate</phase>
+                                               <goals>
+                                                       <goal>run</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <target>
+                                                               <property 
name="unpack-dir" value="${project.build.directory}/downloads" />
+                                                               <property 
name="swagger.version" value="${swagger.version}" />
+                                                               <ant 
antfile="download_swagger-ui.xml" target="default"></ant>
+                                                       </target>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <version>2.6</version>
+                               <executions>
+                                       <execution>
+                                               <id>copy-resources</id>
+                                               <phase>process-resources</phase>
+                                               <goals>
+                                                       
<goal>copy-resources</goal>
+                                               </goals>
+                                               <configuration>
+                                                       
<outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/swagger</outputDirectory>
+                                                       <resources>
+                                                               <resource>
+                                                                       
<directory>${project.build.directory}/downloads/swagger-ui-${swagger.version}/dist</directory>
+                                                                       
<filtering>false</filtering>
+                                                                       
<excludes>
+                                                                               
<exclude>index.html</exclude>
+                                                                       
</excludes>
+                                                               </resource>
+                                                       </resources>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>com.github.kongchen</groupId>
+                               <artifactId>swagger-maven-plugin</artifactId>
+                               <version>3.1.1</version>
+                               <configuration>
+                                       <apiSources>
+                                               <apiSource>
+                                                       
<springmvc>false</springmvc>
+                                                       
<locations>org.apache.atlas.odf.admin.rest.resources</locations>
+                                                       <schemes>https</schemes>
+                                                       
<basePath>${swagger.base.path}</basePath>
+                                                       <info>
+                                                               <title>Open 
Discovery Framework</title>
+                                                               
<version>v1</version>
+                                                               <description>
+                                                                       API 
reference
+                                                               </description>
+                                                       </info>
+                                                       
<swaggerDirectory>${project.build.directory}/${project.artifactId}-${project.version}/swagger</swaggerDirectory>
+                                                       
<swaggerApiReader>com.wordnik.swagger.jaxrs.reader.DefaultJaxrsApiReader</swaggerApiReader>
+                                               </apiSource>
+                                       </apiSources>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <phase>compile</phase>
+                                               <goals>
+                                                       <goal>generate</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/log/LoggingHandler.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/log/LoggingHandler.java 
b/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/log/LoggingHandler.java
new file mode 100755
index 0000000..89756cc
--- /dev/null
+++ 
b/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/log/LoggingHandler.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed 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.
+ */
+package org.apache.atlas.odf.admin.log;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+public class LoggingHandler extends Handler {
+
+       private int LOG_CACHE_SIZE = 1000;
+       private static List<LogRecord> cachedLogs = 
Collections.synchronizedList(new ArrayList<LogRecord>());
+
+       @Override
+       public void publish(LogRecord record) {
+               cachedLogs.add(record);
+               if (cachedLogs.size() >= LOG_CACHE_SIZE) {
+                       cachedLogs.remove(0);
+               }
+       }
+
+       @Override
+       public void flush() {
+               cachedLogs.clear();
+       }
+
+       @Override
+       public void close() throws SecurityException {
+               cachedLogs.clear();
+       }
+
+       public List<LogRecord> getCachedLog() {
+               return new ArrayList<LogRecord>(cachedLogs);
+       }
+
+       public String getFormattedCachedLog(Integer numberOfLogs, Level 
logLevel) {
+               final List<LogRecord> cachedLog = getCachedLog();
+               StringBuilder lg = new StringBuilder();
+               final SimpleFormatter simpleFormatter = new SimpleFormatter();
+               if (numberOfLogs != null) {
+                       for (int no = numberOfLogs; no > 0; no--) {
+                               if (no > -1 && no < cachedLog.size() - 1) {
+                                       final LogRecord record = 
cachedLog.get(cachedLog.size() - no);
+                                       if (record.getLevel().intValue() >= 
logLevel.intValue()) {
+                                               
lg.append(simpleFormatter.format(record));
+                                       }
+                               }
+                       }
+               } else {
+                       for (LogRecord record : cachedLog) {
+                               lg.append(simpleFormatter.format(record));
+                       }
+               }
+               return lg.toString();
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/ODFAdminApp.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/ODFAdminApp.java 
b/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/ODFAdminApp.java
new file mode 100755
index 0000000..b51da36
--- /dev/null
+++ b/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/ODFAdminApp.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed 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.
+ */
+package org.apache.atlas.odf.admin.rest;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.ws.rs.core.Application;
+
+import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import org.apache.atlas.odf.admin.rest.resources.AnalysesResource;
+import org.apache.atlas.odf.admin.rest.resources.AnnotationsResource;
+import org.apache.atlas.odf.admin.rest.resources.DiscoveryServicesResource;
+import org.apache.atlas.odf.admin.rest.resources.EngineResource;
+import org.apache.atlas.odf.admin.rest.resources.ImportResource;
+import org.apache.atlas.odf.admin.rest.resources.MetadataResource;
+import org.apache.atlas.odf.admin.rest.resources.SettingsResource;
+
+public class ODFAdminApp extends Application {
+       @Override
+       public Set<Class<?>> getClasses() {
+               Set<Class<?>> classes = new HashSet<Class<?>>();
+               classes.add(AnalysesResource.class);
+               classes.add(SettingsResource.class);
+               classes.add(EngineResource.class);
+               classes.add(MetadataResource.class);
+               classes.add(AnnotationsResource.class);
+               classes.add(DiscoveryServicesResource.class);
+               classes.add(ImportResource.class);
+               return classes;
+       }
+
+       @Override
+       public Set<Object> getSingletons() {
+               Set<Object> set = new HashSet<Object>();
+               set.add(new JacksonJsonProvider());
+               return set;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/RestUtils.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/RestUtils.java 
b/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/RestUtils.java
new file mode 100755
index 0000000..ed9010d
--- /dev/null
+++ b/odf/odf-web/src/main/java/org/apache/atlas/odf/admin/rest/RestUtils.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed 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.
+ */
+package org.apache.atlas.odf.admin.rest;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.wink.json4j.JSONException;
+import org.apache.wink.json4j.JSONObject;
+
+public class RestUtils {
+       public static Response createErrorResponse(Throwable t) {
+               StringWriter sw = new StringWriter();
+               PrintWriter pw = new PrintWriter(sw);
+               t.printStackTrace(pw);
+               return createErrorResponse(sw.toString());
+       }
+
+       public static Response createErrorResponse(String msg) {
+               Logger logger = Logger.getLogger(RestUtils.class.getName());
+               logger.log(Level.WARNING, "An unknown exception was thrown: 
''{0}''", msg);
+               String errorMsg = "{ \"error\": \"An unknown exception 
occurred\"}";
+               try {
+                       JSONObject errorJSON = new JSONObject();
+                       errorJSON.put("error", msg);
+                       errorMsg = errorJSON.write();
+               } catch (JSONException e) {
+                       // do nothing, should never happen
+               }
+               return 
Response.status(Status.BAD_REQUEST).entity(errorMsg).build();
+       }
+}

Reply via email to