http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/MockSparkServiceExecutor.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/MockSparkServiceExecutor.java
 
b/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/MockSparkServiceExecutor.java
new file mode 100755
index 0000000..30848bd
--- /dev/null
+++ 
b/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/MockSparkServiceExecutor.java
@@ -0,0 +1,59 @@
+/**
+ * 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.test.spark;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.atlas.odf.api.discoveryservice.DataSetCheckResult;
+import org.apache.atlas.odf.api.discoveryservice.DiscoveryServiceRequest;
+import org.apache.atlas.odf.api.discoveryservice.DiscoveryServiceResponse;
+import org.apache.atlas.odf.api.spark.SparkServiceExecutor;
+import org.apache.atlas.odf.json.JSONUtils;
+import org.apache.wink.json4j.JSONException;
+
+import org.apache.atlas.odf.api.discoveryservice.DiscoveryServiceProperties;
+import org.apache.atlas.odf.api.discoveryservice.DiscoveryServiceSparkEndpoint;
+import org.apache.atlas.odf.api.discoveryservice.datasets.DataSetContainer;
+import 
org.apache.atlas.odf.api.discoveryservice.sync.DiscoveryServiceSyncResponse;
+
+public class MockSparkServiceExecutor implements SparkServiceExecutor {
+       Logger logger = 
Logger.getLogger(MockSparkServiceExecutor.class.getName());
+
+       public DataSetCheckResult checkDataSet(DiscoveryServiceProperties dsri, 
DataSetContainer dataSetContainer) {
+               DataSetCheckResult checkResult = new DataSetCheckResult();
+               
checkResult.setDataAccess(DataSetCheckResult.DataAccess.Possible);
+               return checkResult;
+       }
+
+       @Override
+       public DiscoveryServiceSyncResponse 
runAnalysis(DiscoveryServiceProperties dsri, DiscoveryServiceRequest request) {
+               logger.log(Level.INFO, "Starting Spark mock application.");
+               DiscoveryServiceSparkEndpoint sparkEndpoint;
+               try {
+                       sparkEndpoint = JSONUtils.convert(dsri.getEndpoint(), 
DiscoveryServiceSparkEndpoint.class);
+               } catch (JSONException e) {
+                       throw new RuntimeException(e);
+               }
+               if (sparkEndpoint.getJar() == null) {
+                       throw new RuntimeException("Spark application is not 
set in Spark endpoint.");
+               }
+               logger.log(Level.INFO, "Application name is {0}.", 
sparkEndpoint.getJar());
+               logger.log(Level.INFO, "Spark application finished.");
+               DiscoveryServiceSyncResponse response = new 
DiscoveryServiceSyncResponse();
+               response.setCode(DiscoveryServiceResponse.ResponseCode.OK);
+               response.setDetails("Discovery service completed 
successfully.");
+               return  response;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/SimpleSparkDiscoveryServiceTest.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/SimpleSparkDiscoveryServiceTest.java
 
b/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/SimpleSparkDiscoveryServiceTest.java
new file mode 100755
index 0000000..661cfe2
--- /dev/null
+++ 
b/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/spark/SimpleSparkDiscoveryServiceTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.test.spark;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.apache.atlas.odf.api.analysis.AnalysisRequest;
+import org.apache.atlas.odf.api.analysis.AnalysisRequestStatus;
+import org.apache.atlas.odf.api.analysis.AnalysisResponse;
+import org.apache.atlas.odf.api.metadata.MetadataStore;
+import org.apache.atlas.odf.api.metadata.models.DataFile;
+import org.apache.atlas.odf.api.metadata.models.RelationalDataSet;
+import org.apache.atlas.odf.core.metadata.DefaultMetadataStore;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.atlas.odf.api.metadata.MetaDataObjectReference;
+import org.apache.atlas.odf.api.ODFFactory;
+import org.apache.atlas.odf.api.analysis.AnalysisManager;
+import org.apache.atlas.odf.core.test.ODFTestBase;
+
+public class SimpleSparkDiscoveryServiceTest extends ODFTestBase {
+
+       public static int WAIT_MS_BETWEEN_POLLING = 500;
+       public static int MAX_NUMBER_OF_POLLS = 500;
+       
+       @Test
+       public void testSparkService() throws Exception{
+               log.info("Running request ");
+               AnalysisManager analysisManager = new 
ODFFactory().create().getAnalysisManager();
+               AnalysisRequest request = new AnalysisRequest();
+               List<MetaDataObjectReference> dataSetRefs = new ArrayList<>();
+               MetadataStore mds = new 
ODFFactory().create().getMetadataStore();
+               if (!(mds instanceof DefaultMetadataStore)) {
+                       throw new RuntimeException(MessageFormat.format("This 
tests does not work with metadata store implementation \"{0}\" but only with 
the DefaultMetadataStore.", mds.getClass().getName()));
+               }
+               DefaultMetadataStore defaultMds = (DefaultMetadataStore) mds;
+               defaultMds.resetAllData();
+               RelationalDataSet dataSet = new DataFile();
+               MetaDataObjectReference ref = new MetaDataObjectReference();
+               ref.setId("datafile-mock");
+               dataSet.setReference(ref);
+               defaultMds.createObject(dataSet);
+               defaultMds.commit();
+               dataSetRefs.add(dataSet.getReference());
+               request.setDataSets(dataSetRefs);
+               List<String> serviceIds = Arrays.asList(new 
String[]{"spark-service-test"});
+               request.setDiscoveryServiceSequence(serviceIds);
+
+               log.info("Starting analyis");
+               AnalysisResponse response = 
analysisManager.runAnalysis(request);
+               Assert.assertNotNull(response);
+               String requestId = response.getId();
+               Assert.assertNotNull(requestId);
+               log.info("Request id is " + requestId + ".");
+
+               log.info("Waiting for request to finish");
+               AnalysisRequestStatus status = null;
+               int maxPolls = MAX_NUMBER_OF_POLLS;
+               do {
+                       status = 
analysisManager.getAnalysisRequestStatus(requestId);
+                       log.log(Level.INFO, "Poll request for request ID 
''{0}'', state: ''{1}'', details: ''{2}''", new Object[] { requestId, 
status.getState(), status.getDetails() });
+                       maxPolls--;
+                       try {
+                               Thread.sleep(WAIT_MS_BETWEEN_POLLING);
+                       } catch (InterruptedException e) {
+                               log.log(Level.INFO, "Exception thrown: ", e);
+                       }
+               } while (maxPolls > 0 && (status.getState() == 
AnalysisRequestStatus.State.ACTIVE || status.getState() == 
AnalysisRequestStatus.State.QUEUED || status.getState() == 
AnalysisRequestStatus.State.NOT_FOUND));
+               if (maxPolls == 0) {
+                       log.log(Level.INFO, "Request ''{0}'' is not finished 
yet, don't wait for it", requestId);
+               }
+               Assert.assertEquals(AnalysisRequestStatus.State.FINISHED, 
status.getState());
+               log.log(Level.INFO, "Request ''{0}'' is finished.", requestId);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/store/MockConfigurationStorage.java
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/store/MockConfigurationStorage.java
 
b/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/store/MockConfigurationStorage.java
new file mode 100755
index 0000000..191d337
--- /dev/null
+++ 
b/odf/odf-core/src/test/java/org/apache/atlas/odf/core/test/store/MockConfigurationStorage.java
@@ -0,0 +1,80 @@
+/**
+ * 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.test.store;
+
+import org.apache.wink.json4j.JSONException;
+import org.apache.wink.json4j.JSONObject;
+
+import org.apache.atlas.odf.core.configuration.ConfigContainer;
+import org.apache.atlas.odf.core.store.ODFConfigurationStorage;
+import org.apache.atlas.odf.json.JSONUtils;
+
+public class MockConfigurationStorage implements ODFConfigurationStorage {
+
+       static JSONObject config;
+
+       static {
+               try {
+                       config = new 
JSONObject(MockConfigurationStorage.class.getClassLoader().getResourceAsStream("org/apache/atlas/odf/core/test/internal/odf-initial-configuration.json"));
+               } catch (JSONException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+                       throw new RuntimeException(e);
+               }
+       }
+
+       @Override
+       public void storeConfig(ConfigContainer container) {
+               try {
+                       config = JSONUtils.toJSONObject(container);
+               } catch (Exception e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+                       throw new RuntimeException(e);
+               }
+       }
+
+       @Override
+       public ConfigContainer getConfig(ConfigContainer defaultConfig) {
+               try {
+                       return JSONUtils.fromJSON(config.write(), 
ConfigContainer.class);
+               } catch (Exception e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+                       throw new RuntimeException(e);
+               }
+       }
+
+       @Override
+       public void onConfigChange(ConfigContainer container) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void addPendingConfigChange(String changeId) {
+               // do nothing
+       }
+
+       @Override
+       public void removePendingConfigChange(String changeId) {
+               // do nothing
+       }
+
+       @Override
+       public boolean isConfigChangePending(String changeId) {
+               return false;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/resources/META-INF/odf/odf-runtimes.txt
----------------------------------------------------------------------
diff --git a/odf/odf-core/src/test/resources/META-INF/odf/odf-runtimes.txt 
b/odf/odf-core/src/test/resources/META-INF/odf/odf-runtimes.txt
new file mode 100755
index 0000000..d421138
--- /dev/null
+++ b/odf/odf-core/src/test/resources/META-INF/odf/odf-runtimes.txt
@@ -0,0 +1,14 @@
+#
+#  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.
+#
+TestServiceRuntime

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/integrationtest/metadata/internal/atlas/nested_annotation_example.json
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/integrationtest/metadata/internal/atlas/nested_annotation_example.json
 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/integrationtest/metadata/internal/atlas/nested_annotation_example.json
new file mode 100755
index 0000000..34dbf78
--- /dev/null
+++ 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/integrationtest/metadata/internal/atlas/nested_annotation_example.json
@@ -0,0 +1,111 @@
+{  
+   "prop1":"mystring",
+   "prop2":999,
+   "prop3":999.999,
+   "obj1":{  
+      "prop1":"mystring",
+      "prop2":999,
+      "prop3":999.999
+   },
+   "arr1":[  
+      {  
+         "prop1":"mystring",
+         "prop2":999,
+         "prop3":999.999
+      }
+   ],
+   "obj2":{  
+      "prop1":"mystring",
+      "prop2":999,
+      "prop3":999.999,
+      "nobj21":{  
+         "prop1":"mystring",
+         "prop2":999,
+         "prop3":999.999,
+         "nnarr211":[  
+            {  
+               "prop1":"mystring",
+               "prop2":999,
+               "prop3":999.999
+            }
+         ]
+      },
+      "narr21":[  
+         {  
+            "prop1":"mystring",
+            "prop2":999,
+            "prop3":999.999,
+            "nnarr211":[  
+               {  
+                  "prop1":"mystring",
+                  "prop2":999,
+                  "prop3":999.999
+               }
+            ]
+         }
+      ]
+   },
+   "obj3":{  
+      "prop1":"mystring",
+      "prop2":999,
+      "prop3":999.999,
+      "nobj31":{  
+         "prop1":"mystring",
+         "prop2":999,
+         "prop3":999.999,
+         "nnobj31":{  
+            "prop1":"mystring",
+            "prop2":999,
+            "prop3":999.999
+         }
+      },
+      "narr31":[  
+         {  
+            "prop1":"mystring",
+            "prop2":999,
+            "prop3":999.999,
+            "nnarr311":[  
+               {  
+                  "prop1":"mystring",
+                  "prop2":999,
+                  "prop3":999.999,
+                  "nnnarr3111":[  
+                     {  
+                        "prop1":"mystring",
+                        "prop2":999,
+                        "prop3":999.999
+                     }
+                  ]
+               }
+            ]
+         }
+      ]
+   },
+   "obj4":{  
+      "prop1":"mystring",
+      "prop2":999,
+      "prop3":999.999,
+      "nobj41":{  
+         "prop1":"mystring",
+         "prop2":999,
+         "prop3":999.999,
+         "nobj411":{  
+            "prop1":"mystring",
+            "prop2":999,
+            "prop3":999.999,
+            "nnnarr4111":[  
+               {  
+                  "prop1":"mystring",
+                  "prop2":999,
+                  "prop3":999.999,
+                  "nnobj41111":{  
+                     "prop1":"mystring",
+                     "prop2":999,
+                     "prop3":999.999
+                  }
+               }
+            ]
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/annotation/annotexttest1.json
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/annotation/annotexttest1.json
 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/annotation/annotexttest1.json
new file mode 100755
index 0000000..146748d
--- /dev/null
+++ 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/annotation/annotexttest1.json
@@ -0,0 +1,8 @@
+{
+    "javaClass": "aHopefullyUnknownClass",
+       "profiledObject": null,
+       "annotationType": "MySubType",
+       "analysisRun": "bla",
+       "newProp1": "newProp1Value",
+       "newProp2": 4237
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/internal/odf-initial-configuration.json
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/internal/odf-initial-configuration.json
 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/internal/odf-initial-configuration.json
new file mode 100755
index 0000000..9757e51
--- /dev/null
+++ 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/internal/odf-initial-configuration.json
@@ -0,0 +1,114 @@
+{
+       "odf" : {
+               "instanceId" : "odf-default-id-CHANGEME",
+               "odfUrl" : "https://localhost:58081/odf-web-1.2.0-SNAPSHOT";,
+               "odfUser" : "odf",
+               "odfPassword" : "ZzTeX3hKtVORgks+2TaLPWxerucPBoxK",
+               "runNewServicesOnRegistration": false,
+               "runAnalysisOnImport": false,
+               "reuseRequests": true,
+               "discoveryServiceWatcherWaitMs": 2000,
+               "enableAnnotationPropagation": true,
+               "messagingConfiguration": {
+                       "type": 
"com.ibm.iis.odf.api.settings.KafkaMessagingConfiguration",
+                       "analysisRequestRetentionMs": 86400000,
+                       "queueConsumerWaitMs": 2000,
+                       "kafkaBrokerTopicReplication": 1,
+                       "kafkaConsumerConfig": {
+                               "offsetsStorage": "kafka",
+                               "zookeeperSessionTimeoutMs": 400,
+                               "zookeeperConnectionTimeoutMs": 6000
+                       }
+               },
+               "userDefined": {
+               }
+       },
+       "registeredServices": [{
+                       "id": "asynctestservice",
+                       "name": "Async test",
+                       "description": "The async test service",
+                       "resultingAnnotationTypes": [
+                               "AsyncTestDummyAnnotation"
+                       ],
+                       "endpoint": {
+                               "runtimeName": "Java",
+                               "className": 
"com.ibm.iis.odf.core.test.discoveryservice.TestAsyncDiscoveryService1"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "asynctestservice-with-annotations",
+                       "name": "Async test including metadata access",
+                       "description": "The async test service writing 
annotations",
+                       "endpoint": {
+                               "runtimeName": "Java",
+                               "className": 
"com.ibm.iis.odf.core.test.discoveryservice.TestAsyncDiscoveryServiceWritingAnnotations1"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "synctestservice",
+                       "name": "Sync test",
+                       "description": "The Sync test service",
+                       "resultingAnnotationTypes": [
+                               "SyncTestDummyAnnotation"
+                       ],
+                       "endpoint": {
+                               "runtimeName": "Java",
+                               "className": 
"com.ibm.iis.odf.core.test.discoveryservice.TestSyncDiscoveryService1"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "synctestservice-with-annotations",
+                       "name": "Sync test with annotations",
+                       "description": "The Sync test service writing 
annotations",
+                       "endpoint": {
+                               "runtimeName": "Java",
+                               "className": 
"com.ibm.iis.odf.core.test.discoveryservice.TestSyncDiscoveryServiceWritingAnnotations1"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "synctestservice-with-extendedannotations",
+                       "name": "Sync test with extended annotations",
+                       "description": "The Sync test service writing 
annotations with extension mechanism",
+                       "endpoint": {
+                               "runtimeName": "Java",
+                               "className": 
"com.ibm.iis.odf.core.test.annotation.TestSyncDiscoveryServiceWritingExtendedAnnotations"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "synctestservice-with-json-annotations",
+                       "name": "Sync test with json annotations",
+                       "description": "The Sync test service writing 
annotations returned from a json file",
+                       "endpoint": {
+                               "runtimeName": "Java",
+                               "className": 
"com.ibm.iis.odf.core.test.annotation.TestSyncDiscoveryServiceWritingJsonAnnotations"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "spark-service-test",
+                       "name": "Simple Spark mock test",
+                       "description": "The Spark test is calling a mock 
version of the SparkAppExecutor",
+                       "endpoint": {
+                               "runtimeName": "Spark",
+                               "inputMethod": "DataFrame",
+                               "jar": "my-example-application-jar",
+                               "className": "my-example-class-name"
+                       },
+                       "parallelismCount" : 2
+               },
+               {
+                       "id": "testruntimeservice",
+                       "name": "Runtime test service",
+                       "description": "Runtime test service description",
+                       "endpoint": {
+                               "runtimeName": "TestServiceRuntime"
+                       }
+               }
+               
+       ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/messaging/kafka/tracker1.json
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/messaging/kafka/tracker1.json
 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/messaging/kafka/tracker1.json
new file mode 100755
index 0000000..b884aca
--- /dev/null
+++ 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/core/test/messaging/kafka/tracker1.json
@@ -0,0 +1,31 @@
+{
+       "user": "isadmin",
+       "lastModified": "1443795291000",
+       "discoveryServiceRequests": [{
+               "dataSetContainer": {
+                       "dataSet": {
+                               "javaClass": 
"com.ibm.iis.odf.core.metadata.models.Document",
+                               "name": "someDocument",
+                               "reference": {
+                                       "id": "testdataset"
+                               }
+                       }
+               },
+               "discoveryServiceId": "testservice"
+       }],
+       "nextDiscoveryServiceRequest": 1,
+       "request": {
+               "dataSets": [{
+                       "id": "testdataset"
+               }],
+               "id": "testid"
+       },
+       "status": "FINISHED",
+       "statusDetails": "All discovery services run successfully",
+       "discoveryServiceResponses": [{
+               "type": "async",
+               "runId": "IARUNID6f49fdfd-89ce-4d46-9067-b3a4db4698ba",
+               "details": "IA has run successfully",
+               "code": "OK"
+       }]
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-core/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
----------------------------------------------------------------------
diff --git 
a/odf/odf-core/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
new file mode 100755
index 0000000..18109c4
--- /dev/null
+++ 
b/odf/odf-core/src/test/resources/org/apache/atlas/odf/odf-implementation.properties
@@ -0,0 +1,20 @@
+#
+# 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
+
+
+ODFConfigurationStorage=MockConfigurationStorage
+DiscoveryServiceQueueManager=MockQueueManager
+SparkServiceExecutor=MockSparkServiceExecutor
+NotificationManager=TestNotificationManager

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/.gitignore
----------------------------------------------------------------------
diff --git a/odf/odf-doc/.gitignore b/odf/odf-doc/.gitignore
new file mode 100755
index 0000000..8b22f9d
--- /dev/null
+++ b/odf/odf-doc/.gitignore
@@ -0,0 +1,19 @@
+#
+#  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.
+#
+target
+.settings
+.classpath
+.project
+.factorypath
+.DS_Store

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/README.txt
----------------------------------------------------------------------
diff --git a/odf/odf-doc/README.txt b/odf/odf-doc/README.txt
new file mode 100755
index 0000000..80dbb61
--- /dev/null
+++ b/odf/odf-doc/README.txt
@@ -0,0 +1,3 @@
+The documentation project is based on the Maven Site Plugin and Maven Doxia. 
The resulting war file is merged into the war file of the sdp-web project using 
the overlay mechanism of the Maven War Plugin. The resulting documentation is 
available through the getting started page of the SDP web console. 
+
+Edit the src/site/markdown/*.md files in order to update the documentation. 
The structure of the web site can be changed in file src/site/site.xml.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/pom.xml
----------------------------------------------------------------------
diff --git a/odf/odf-doc/pom.xml b/odf/odf-doc/pom.xml
new file mode 100755
index 0000000..6ebffcf
--- /dev/null
+++ b/odf/odf-doc/pom.xml
@@ -0,0 +1,163 @@
+<?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-doc</artifactId>
+       <packaging>war</packaging>
+       <dependencies>
+               <dependency>
+                       <groupId>javax.ws.rs</groupId>
+                       <artifactId>jsr311-api</artifactId>
+                       <version>1.1.1</version>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.atlas.odf</groupId>
+                       <artifactId>odf-api</artifactId>
+                       <version>1.2.0-SNAPSHOT</version>
+                       <scope>compile</scope>
+               </dependency>
+               <!-- The following dependencies are required by Spark Discovery 
Services only and are provided by the Spark cluster -->
+               <dependency>
+                       <groupId>org.apache.spark</groupId>
+                       <artifactId>spark-core_2.11</artifactId>
+                       <version>2.1.0</version>
+                       <scope>provided</scope>
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>commons-codec</groupId>
+                                       <artifactId>commons-codec</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.spark</groupId>
+                       <artifactId>spark-sql_2.11</artifactId>
+                       <version>2.1.0</version>
+                       <scope>provided</scope>
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>commons-codec</groupId>
+                                       <artifactId>commons-codec</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+       </dependencies>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-war-plugin</artifactId>
+                               <version>2.6</version>
+                               <configuration>
+                                       <webResources>
+                                               <resource>
+                                                       
<directory>${project.build.directory}/site</directory>
+                                                       
<targetPath>/doc</targetPath>
+                                               </resource>
+                                       </webResources>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-javadoc-plugin</artifactId>
+                               <version>2.10.3</version>
+                               <configuration>
+                                       
<sourcepath>${basedir}/../odf-api/src/main/java</sourcepath>
+                                       
<outputDirectory>${project.build.directory}/doc</outputDirectory>
+                                       
<excludePackageNames>org.apache.atlas.odf.core.metadata.atlas:org.apache.atlas.odf.core.metadata.importer:org.apache.atlas.odf.core.metadata.internal:org.apache.atlas.odf.json</excludePackageNames>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <id>generate-javadocs</id>
+                                               <phase>validate</phase>
+                                               <goals>
+                                                       <goal>javadoc</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-site-plugin</artifactId>
+                               <version>3.3</version>
+                               <configuration>
+                                       <port>9000</port>
+                                       
<tempWebappDirectory>${basedir}/target/site/tempdir</tempWebappDirectory>
+                                       
<generateProjectInfo>false</generateProjectInfo>
+                                       <generateReports>false</generateReports>
+                                       <inputEncoding>UTF-8</inputEncoding>
+                                       <outputEncoding>UTF-8</outputEncoding>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <id>generate-html</id>
+                                               <phase>validate</phase>
+                                               <goals>
+                                                       <goal>site</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                               <dependencies>
+                                       <dependency>
+                                               
<groupId>org.apache.maven.doxia</groupId>
+                                               
<artifactId>doxia-module-markdown</artifactId>
+                                               <version>1.3</version>
+                                       </dependency>
+                               </dependencies>
+                       </plugin>
+                       <!--  this section compiles the tutorial project to 
check if the code is valid.
+                        -->
+                        <!--
+                       <plugin>
+                               <artifactId>maven-invoker-plugin</artifactId>
+                               <version>2.0.0</version>
+                               <configuration>
+                                       
<projectsDirectory>src/site/resources/tutorial-projects</projectsDirectory>
+                                       
<cloneProjectsTo>${project.build.directory}/tutorial-projects-build</cloneProjectsTo>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               
<id>compile-tutorial-projects</id>
+                                               <goals>
+                                                       <goal>run</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                        -->
+               </plugins>
+       </build>
+       <profiles>
+               <profile>
+                       <!--  Turn off additional checks for 
maven-javadoc-plugin that will cause build errors when using Java 8 -->
+                       <!--  See 
http://stackoverflow.com/questions/22528767/how-to-work-around-the-stricter-java-8-javadoc-when-using-maven
 -->
+                       <id>disable-java8-doclint</id>
+                       <activation>
+                               <jdk>[1.8,)</jdk>
+                       </activation>
+                       <properties>
+                               
<additionalparam>-Xdoclint:none</additionalparam>
+                       </properties>
+               </profile>
+       </profiles>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/main/webapp/WEB-INF/web.xml 
b/odf/odf-doc/src/main/webapp/WEB-INF/web.xml
new file mode 100755
index 0000000..104b5e4
--- /dev/null
+++ b/odf/odf-doc/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,19 @@
+<!--
+~ 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.
+-->
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd"; >
+<web-app>
+  <display-name>odf-doc</display-name>
+</web-app>

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/api-reference.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/api-reference.md 
b/odf/odf-doc/src/site/markdown/api-reference.md
new file mode 100755
index 0000000..f0bb24f
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/api-reference.md
@@ -0,0 +1,19 @@
+#
+#  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.
+#
+
+# API reference
+
+[General ODF API reference](../swagger).
+
+[Java Docs for ODF services](./apidocs/index.html)

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/build.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/build.md 
b/odf/odf-doc/src/site/markdown/build.md
new file mode 100755
index 0000000..4a6d7ac
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/build.md
@@ -0,0 +1,113 @@
+#
+#  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.
+#
+
+# Build
+
+This page describes how to build ODF.  
+
+## Prerequisites
+
+You need git, Maven, and Python (2.7 (not 3!)) available on the command line.
+If you run these commands and you see similar output you should be all set:
+
+       $ mvn -v
+       Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 
2015-11-10T17:41:47+01:00)
+       ...
+
+       $ python -V
+       Python 2.7.10
+
+       $ git --version
+       git version 2.7.4
+
+The build currently depends on the [IA data quality project][3] 
(https://github.com/YSAILLET/dataquality) to be available. This can be achieved 
in two ways:
+1. Make sure that you can reach the [IIS Maven Repository][1]. If this doesn't 
work, try to authenticate against the Littleton firewall, e.g., by opening the 
[RTC dashboard][2].
+2. Build the [IA data quality project][3] on your local machine, typically 
with these commands
+
+       git clone https://github.com/dataquality
+       cd dataquality
+       mvn clean install
+
+
+### Additional Prerequisites on Windows
+
+- For the build: The directory C:\tmp needs to exist
+- For the tests and the test environment to run properly: The `HADOOP_HOME` 
environment variable must be set to a location where the Hadoop 
[winutils.exe](http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe) 
file is available in a the bin folder. For example, if the environment variable 
is set to `HADOOP_HOME=c:\hadoop`, the file needs to be available at 
`c:\hadoop\bin\winutils.exe`.
+- In your Maven install directory go to bin and copy mvn.cmd to mvn.bat
+
+## Building
+
+To build, clone the repository and perform a maven build in the toplevel 
directory. These commands should do the trick:
+
+       git clone https://github.com/Analytics/open-discovery-framework.git
+       cd open-discovery-framework
+       mvn clean install
+
+Add the `-Dreduced-build` option to build and test only the core components 
and services of ODF:
+
+       mvn clean install -Dreduced-build
+
+## Fast build without tests or with reduced tests
+
+To build without running tests run maven with the following options (The 
second one prevents the test Atlas instance from being started and stopped):
+
+       mvn clean install -DskipTests -Duse.running.atlas
+
+Use the `-Dreduced-tests` option to run only a reduced set of tests:
+
+       mvn clean install -Dreduced-tests
+
+This will skip all integration tests (i.e. all tests that involve Atlas) and 
also some of the long running tests. The option may be combined with the 
`-Dreduced-build` option introduced above.
+
+## Building the test environment
+
+You can build a test environment that contains Atlas and
+Kafka, and Jetty by running these commands:
+
+       cd odf-test-env
+       mvn package
+
+This will create a zip file with the standalone test environment under
+``odf-test-env/target/odf-test-env-0.1.0-SNAPSHOT-bin.zip``.
+See the contents of this zip file or the [documentation section on the test 
environment](test-env.html)
+for details.
+
+Congrats! You have just built ODF.
+This should be enough to get you going. See below for additional information
+on different aspects of the build.
+
+## Additional Information
+
+### Working with Eclipse
+
+To build with Eclipse you must have the maven m2e plugin and EGit installed 
(e.g., search for "m2e maven integration for eclipse" and "egit", respectively, 
on the Eclipse marketplace).
+
+- Clone the repository into some directory as above, e.g., /home/code/odf.
+- Open Eclipse with a workspace in a different directory.
+- Go to File -> Import -> Maven -> Existing Maven projects.
+- Enter /home/code/odf as the root directory.
+- Select all projects and click Finish.
+- Internally, Eclipse will now perform Maven builds but you can work with the 
code as usual.
+
+If you want to build via Run configurations be aware that this will not work 
with the embedded
+maven provided by the m2e plugin. Instead you will have to do this:
+
+- Open Windows -> Preferences -> Maven -> Installations
+- Add a new installation pointing to your external Maven installation
+- For each run configuration you use, select the new installation in the Maven 
runtime dropdown
+(you might also have to set JAVA_HOME in the environment tab).
+
+  [1]: http://iis-repo.swg.usma.ibm.com:8080/archiva/repository/all/
+  [2]: https://ips-rtc.swg.usma.ibm.com/jazz/web/projects
+  [3]: https://github.ibm.com/YSAILLET/dataquality

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/configuration.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/configuration.md 
b/odf/odf-doc/src/site/markdown/configuration.md
new file mode 100755
index 0000000..c4d0c72
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/configuration.md
@@ -0,0 +1,15 @@
+#
+#  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.
+#
+
+# Configuration

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/data-model.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/data-model.md 
b/odf/odf-doc/src/site/markdown/data-model.md
new file mode 100755
index 0000000..5905799
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/data-model.md
@@ -0,0 +1,120 @@
+#
+#  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.
+#
+
+# Data Model
+
+This section describes the basic data model of how results of discovery 
services are
+stored and how new discovery services can extend and enrich this model.
+
+See the section [ODF Metadata API](odf-metadata-api.html) for general 
information
+on how to retrieve metadata.
+
+You can find the current Atlas data model in the file
+
+       
odf-core/src/main/resources/org/apache/atlas/odf/core/metadata/internal/atlas/atlas-odf-model.json
+
+which contains JSON that can be POSTed to the Atlas `types` REST resource to 
create those types.
+
+## Annotations
+
+All discovery services results are called "annotations". An annotation is an 
object
+that annotates another object with a certain piece of information.
+For instance, you could have a `DataClassAnnotation` which has a reference 
attribute `classifiedObject` linking it to
+a column `NAME` of a table `CUSTREC`, a list of reference attributes 
`classifyingObjects` linking it to business terms.
+An additional attribute `confidences` might provide a list of numeric 
confidence values indicating the "strength" of the
+relationship between the classifiedObject and the respective classifyingObject 
(business term).
+ For column `NAME` the list of classifying objects may have a single entry 
`Customer Name` the list of confidence values
+ may have a single value `0.7`.
+This annotation expresses the fact that the term classification services 
registered and active in ODF have come up with a
+70% confidence of CUSTREC.NAME representing a customer name.
+
+Technically, an annotation is a subtype of one of the three *base types* which 
are subtyes of the (abstract)
+Atlas type `Annotation`:
+
+- `ProfilingAnnotation`
+- `ClassificationAnnotation`
+- `RelationshipAnnotation`
+
+
+A `ProfilingAnnotation` assigns non-reference attributes to an object. It has 
the following non-reference attributes:
+
+- `annotationType`: The type of annotation. A Json string of the form
+   `{"stdType": "DataQualityAnnotation",`
+   ` "runtime": "JRE",`
+   ` "spec" : “org.apache.atlas.myservice.MyAnnotation"`
+   `}`
+   where `stdType` is a base or standardized type name (see below for 
standardized types), `runtime` names the runtime,
+   and `spec` is a runtime-specific string which helps the runtime to deal 
with instances of this type. In case of a Java
+   runtime the `spec` is the name of the implementing class which may be a 
subclass of the `stdType`.
+- `analysisRun`: A string that is set to the request Id of the analysis that 
created it.
+(Compare the swagger documentation of the REST resource `analyses`, e.g. 
[here](https://sdp1.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT/swagger/#/analyses).
+*Internal Note*: will be replaced with RID
+- `summary`: A human-readable string that presents a short summary of the 
annotation.
+Might be used in generic UIs for displaying unknown annotations.
+*Internal note*: deprecated
+- `jsonProperties`: A string attributes where you can store arbitrary JSON as 
a string.
+Can be used to 'extend' standard annotations.
+
+...and a single referencing attribute:
+
+- `profiledObject`: The object that is annotated by this annotation. In the 
example above,
+this would point to the Column object.
+
+
+A `ClassificationAnnotation` assigns any number (including 0) of meta data 
objects to an object.
+It has the same non-reference attributes as `ProfilingAnnotation` plus the 
following reference attributes:
+
+- `classifiedObject`: The object that is annotated by this annotation.
+- `classifyingObjects`: List of references to meta data objects classifying 
the classifiedObject.
+
+A `RelationshipAnnotation`  expresses a relationship between meta data objects.
+It has the same non-reference attributes as `ProfilingAnnotation` plus a 
single reference attribute:
+
+- `relatedObjects`: List of references to related meta data objects.
+
+
+Note that annotations are implemented as proper Atlas object types and not 
traits (labels) for these reasons:
+
+- Annotations of the same type but of different discovery service should be 
able co-exist, for instance,
+to be able to compare results of different services downstream.
+This is only partly possible with traits.
+- Relationships between objects can not easily be modeled with traits.
+
+A discovery service can deliver its results in a base, standardized, or 
*custom annotation type*. Depending on the type of the
+underlying relationship a custom annotation type might be a subtype of 
`ProfilingAnnotation` (asymmetric, single reference attribute),
+`ClassificationAnnotation` (asymmetric, any number of reference attributes), 
or `RelationshipAnnotation` (symmetric, any number
+of reference attributes). A custom annotation type can have additional 
non-reference attributes that are stored in its `jsonProperties`.
+
+When implemented in Java, the class defining a custom annotation has private 
fields and corresponding getter/setter methods
+representing the additional information.
+
+
+##Example
+
+
+For instance, creating a new annotation of type 
`org.apache.atlas.oli.MyAnnotation` could look like this.
+
+       public class MyAnnotation extends ClassificationAnnotation {
+          String myNewAttribute;
+
+          public String getMyNewAttribute() {
+             return myNewAttribute;
+          }
+
+          public void setMyNewAttribute(String myNewAttribute) {
+             this.myNewAttribute = myNewAttribute;
+          }
+       }
+
+Annotations can be mapped into standardized meta data objects by a 
*propagator* which implements the `AnnotationPropagator` interface.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/discovery-service-tutorial.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/discovery-service-tutorial.md 
b/odf/odf-doc/src/site/markdown/discovery-service-tutorial.md
new file mode 100755
index 0000000..2ab8775
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/discovery-service-tutorial.md
@@ -0,0 +1,157 @@
+#
+#  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.
+#
+
+# Tutorial: Build and run your first Discovery Service
+This tutorial shows how you can create your first discovery service in Java 
that analyzes a data set and creates a single annotation of a new type.
+This tutorial requires that you have [Maven](http://maven.apache.org/) 
installed.
+
+
+## Create a discovery service
+Follow these steps to create and package a Java implementation of the simplest 
discovery service.
+
+#### Step 1: Create ODF discovery service maven project
+Create a new Java Maven project from the ODF provided archetype 
``odf-archetype-discoveryservice`` (group ID ``org.apache.atlas.odf``).
+Choose the following values for the respective parameters:
+
+| Parameter | Value                    |
+|-----------|--------------------------|
+|groupId    | odftutorials             |
+|artifactId | discoveryservicetutorial |
+|version    | 0.1                      |
+
+
+From the command line, your command may look like this:
+
+       mvn archetype:generate -DarchetypeGroupId=org.apache.atlas.odf 
-DarchetypeArtifactId=odf-archetype-discoveryservice 
-DarchetypeVersion=0.1.0-SNAPSHOT -DgroupId=odftutorials 
-DartifactId=discoveryservicetutorial -Dversion=0.1
+
+This will create a new Maven project with a pom that has dependencies on ODF.
+It will also create two Java classes ``MyDiscoveryService`` and 
``MyAnnotation``
+that you may want to use as a basis for the following steps.
+
+If you use Eclipse to create your project, be sure to enable the checkbox 
"Include snapshot archetypes" in the
+archetype selection page of the New Maven Project wizard.
+
+If you are not interested in the actual code at this point, you may skip Steps 
2 through 4 and go directly
+to step 5.
+
+#### Step 2 (optional): Check the discovery service implementation class
+Create a new Java class named ``odftutorials.MyDiscoveryService`` that 
inherits from 
`org.apache.atlas.odf.core.discoveryservice.SyncDiscoveryServiceBase`.
+As the interface name indicates, our service will be synchronous, i.e., it 
will have a simple method ``runAnalysis()`` that returns
+the analysis result. For the implementation of long-running, asynchronous 
services, see TODO.
+The archetype creation has already filled in some code here that we will use. 
Your class
+should look something like this:
+
+       public class MyDiscoveryService extends SyncDiscoveryServiceBase {
+
+               @Override
+               public DiscoveryServiceSyncResponse 
runAnalysis(DiscoveryServiceRequest request) {
+                       // 1. create an annotation that annotates the data set 
object passed in the request
+                       MyAnnotation annotation = new MyAnnotation();
+                       
annotation.setAnnotatedObject(request.getDataSetContainer().getDataSet().getReference());
+                       // set a new property called "tutorialProperty" to some 
string
+                       annotation.setMyProperty("My property was created on " 
+ new Date());
+
+                       // 2. create a response with our annotation created 
above
+                       return createSyncResponse( //
+                                               ResponseCode.OK, // Everything 
works OK
+                                               "Everything worked", // 
human-readable message
+                                               
Collections.singletonList(annotation) // new annotations
+                       );
+               }
+       }
+
+What does the code do?
+The code basically consists of two parts:
+
+1. Create a new ``MyAnnotation`` object and annotate the data set that is 
passed into
+the discovery service with it.
+2. Create the discovery service response with the new annotation and return it.
+
+
+#### Step 3 (optional): Check the new annotation class
+The project also contains a new Java class called ``odftutorials.MyAnnotation``
+which extends the class 
``org.apache.atlas.odf.core.metadata.ProfilingAnnotation``.
+It is a new annotation type that contains a property called ``myProperty`` of 
type ``String``.
+In the code you can see that there is a Java-Bean style getter and a setter 
method, i.e., ``getTutorialProperty()`` and
+``setTutorialProperty(String value)``.
+
+       public class MyAnnotation extends ProfilingAnnotation {
+
+               private String myProperty;
+
+               public String getMyProperty() {
+                       return myProperty;
+               }
+
+               public void setMyProperty(String myValue) {
+                       this.myProperty = myValue;
+               }
+       }
+
+When we return these annotations, ODF will take care that these annotations 
are stored
+appropriately in the metadata store.
+
+
+#### Step 4 (optional): Check the discovery service descriptor
+Lastly, the project contains a file called ``META-INF/odf/odf-services.json``
+in the ``main/resources`` folder. This file which always have to have the same
+name contains a JSON list of the the descriptions of all services defined in 
our project.
+The descriptions contain an ID, a name, a short human-readable description, 
together
+with the Java class name implementing the service. Here is how it looks like:
+
+       [
+         {
+               "id": 
"odftutorials.discoveryservicetutorial.MyDiscoveryService",
+               "name": "My service",
+               "description": "My service creates my annotation for a data 
set",
+               "type": "Java",
+               "endpoint": "odftutorials.MyDiscoveryService"
+         }
+       ]
+
+Note that most of this information can be changed but ``type`` (this is a Java 
implementation)
+and ``endpoint`` (the Java class is called ``odftutorials.MyDiscoveryService``)
+should remain as the are.
+
+#### Step 5: Build the service JAR
+The service jar is a standard jar file so you can build it with a standard 
Maven command like
+
+       mvn clean install
+
+You can find the output jar as per the Maven convention in
+``target/discoveryservicetutorial-0.1.jar``
+
+
+## Deploy the discovery service
+Once you've built your service JAR as described in the previous section, there 
are two ways
+how you can deploy it.
+
+### Classpath deployment
+The simplest way to make an ODF instance pickup your new service is add the 
service JAR (and
+any dependent JARs) to the ODF classpath. A simple way to do this is to 
package the JARs into
+ODF war file. Once you (re-)start ODF, your new service should be available.
+
+## Run the discovery service
+
+Perform these steps to run your new service and inspect the results.
+
+1. Go to the Analysis tab in the ODF console
+2. Select the Data Sets tab and click on Start Analysis next to any data set
+3. Select "My Service" as the discovery service and click Submit.
+4. Select the Requests tab and click Refresh
+5. You should see a new entry showing the data set and the "My Service" 
discovery service.
+6. Click on Annotations. A new page will open that opens the Atlas UI with a 
list of the new
+annotation that was created.
+7. Click on the annotation and check the value of the "myProperty" property. 
It should contain
+a value like ``My property was created on  Mon Feb 01 18:31:51 CET 2016``.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/discovery-services.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/discovery-services.md 
b/odf/odf-doc/src/site/markdown/discovery-services.md
new file mode 100755
index 0000000..1afa36c
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/discovery-services.md
@@ -0,0 +1,15 @@
+#
+#  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.
+#
+
+# Discovery services

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/examples.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/examples.md 
b/odf/odf-doc/src/site/markdown/examples.md
new file mode 100755
index 0000000..084af75
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/examples.md
@@ -0,0 +1,15 @@
+#
+#  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.
+#
+
+# Examples

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/first-analysis-tutorial.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/first-analysis-tutorial.md 
b/odf/odf-doc/src/site/markdown/first-analysis-tutorial.md
new file mode 100755
index 0000000..b299bfa
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/first-analysis-tutorial.md
@@ -0,0 +1,17 @@
+#
+#  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.
+#
+
+# Run your first ODF analysis
+
+See the [First steps](first-steps.html) section for details on how to run the 
analysis from the ODF console UI.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/first-steps.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/first-steps.md 
b/odf/odf-doc/src/site/markdown/first-steps.md
new file mode 100755
index 0000000..00ced52
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/first-steps.md
@@ -0,0 +1,77 @@
+#
+#  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.
+#
+
+# First Steps
+
+This section assumes that you have ODF installed, either the
+[test environment](test-env.html) or [manually](install.html).
+
+
+### ODF Console UI
+
+To open the ODF console point your browser to the ODF web application.
+In the [test environment](test-env.html), this is typically
+[https://localhost:58081/odf-web-0.1.0-SNAPSHOT](https://localhost:58081/odf-web-0.1.0-SNAPSHOT).
+
+*Note*: The links to the ODF Console in the instructions below only work if 
you view this documentation
+from the ODF web application.
+
+The default user of the ODF Console is odf / admin4odf.
+
+
+#### Check System health
+Go to the [System monitor](/odf-web-0.1.0-SNAPSHOT/#monitor) tab and
+click "Check health". After a while you should see a message
+that the health check was successful. If this check fails it might be the case 
that the dependent services
+are not fully up and running yet (typically happens after start of the test 
environment), so wait a short while
+and try again.
+
+#### Discovery Services
+Take a look at all available discovery services on the tab [Discovery 
Services](/odf-web-0.1.0-SNAPSHOT/#discoveryServices).
+
+#### Configure Atlas repository and create sample metadata
+
+To change the URL of your Atlas installation and to create some sample data, go
+to the [Configuration](/odf-web-0.1.0-SNAPSHOT/#configuration) tab.
+In general, it is a good idea change the default URL to Atlas from "localhost" 
to a hostname that is accessible
+from your network. If you don't do this, you might experience some strange 
effects when viewing
+Atlas annotations from the web app.
+If you changed the name, click Save.
+
+Create a set of simple sample data by clicking on Create Atlas Sample Data.
+
+To explore the sample data go to the [Data 
Sets](/odf-web-0.1.0-SNAPSHOT/#data) tab.
+
+#### Run analysis
+
+The easiest way to start an analysis is from the [Data 
Sets](/odf-web-0.1.0-SNAPSHOT/#data) tab.
+In the "Data Files" section look for the sample table "BankClientsShort".
+To view the details of the table click on it anywhere in the row. The Details 
dialog
+shows you information about this data set. Click Close to close the dialog.
+
+To start an analysis on the "BankClientsShort" table click "Start Analysis" on 
the right.
+In the "New Analysis Request" dialog click on "&lt;Select a Service&gt;" to 
add a service to
+the sequence of discovery service to run on the data set. Then click "Submit" 
to start the analysis.
+
+To check the status of your request go to the
+[Analysis](/odf-web-0.1.0-SNAPSHOT/#analysis) tab and click Refresh.
+If all went well the status is "Finished".
+Click on "View Results" to view all annotations created for this analysis 
request.
+
+
+### REST API
+See the [REST API documentation](/odf-web-0.1.0-SNAPSHOT/swagger) for more 
details on how to
+perform the actions explained above with the REST API.
+In particular, have a look at the ``analysis`` REST resource for APIs how to 
start and
+monitor analyis requests.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/index.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/index.md 
b/odf/odf-doc/src/site/markdown/index.md
new file mode 100755
index 0000000..4c7656c
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/index.md
@@ -0,0 +1,23 @@
+#
+#  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.
+#
+# Overview
+
+The "Open Discovery Framework" is an open metadata-based framework that 
strives to be a common home for different analytics technologies that discover 
characteristics of data sets and relationships between them (think "AppStore 
for discovery algorithms"). Using ODF, applications can leverage new discovery 
algorithms and their results with minimal integration effort.
+
+Automated characterization of information and automated discovery of 
relationships is key to several Analytics Platform initiatives, e.g. enable and 
improve self service for knowledge workers.
+The Open Discovery Platform provides infrastructure based on open source 
technology to easily execute, manage and integrate diverse metadata discovery 
algorithms provided by internal
+or external (open source) contributors in a single point of access. These 
discovery algorithms store their analysis results in a common open metadata
+repository that promotes reuse and sharing of these results.
+A simple plug-in mechanism to integrate discovery services enables users of 
ODF to easily combine and orchestrate algorithms built on different 
technologies,
+thereby gaining deeper insights into their data.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/install.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/install.md 
b/odf/odf-doc/src/site/markdown/install.md
new file mode 100755
index 0000000..8c521ba
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/install.md
@@ -0,0 +1,149 @@
+#
+#  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.
+#
+
+# Install ODF manually
+
+This section describes how to manually install ODF and its prerequisites.
+
+## Install ODF locally
+
+ODF is installed on an application server like jetty. Its prereqs (Kafka and 
Atlas)
+can run on separate machines, they simple must be reachable over the network.
+
+ODF's configuration is stored in Zookeeper which is a prereq for Kafka.
+
+
+### Prerequisites
+
+ODF has two prerequisites:
+
+1. Apache Atlas (only tested with 0.6 but no hard dependency required here)
+2. Apache Kafka 0.8.2.1 which, in turn, requires Zookeper 3.4
+
+#### Apache Atlas
+
+[Apache Atlas](http://atlas.incubator.apache.org/) is an open
+metadata infrastructure that is currently in incubator status.
+There is currently no binary download available, you have to [build it 
yourself](http://atlas.incubator.apache.org/InstallationSteps.html).
+Alternatively, you can download a version that we built 
[here](https://ibm.box.com/shared/static/of1tdea7465iaen8ywt7l1h761j0fplt.zip).
+
+After you built the distribution, simply unpack the tar ball, and run
+``bin/atlas_start.py``. Atlas will be started on port 21443 as default, so 
point
+your browser to [https://localhost:21443](https://localhost:21443) to look at 
the
+Atlas UI.
+Note that starting Atlas can take up to a minute.
+
+To stop, run ``bin/atlas_stop.py``.
+
+See the Atlas section in the [Troubleshooting guide](troubleshooting.html)
+for common issues and how to workaround them.
+
+#### Apache Kafka
+
+[Apache Kafka](http://kafka.apache.org/) is an open source project that 
implements
+a messaging infrastructure. ODF uses Kafka for notifications and queueing up 
requests to
+discovery services.
+
+To install Kafka, download the version 0.8.2.1 with Scala 2.10 (which is the 
version we used in
+our tests) from the Kafka website, see 
[here](https://www.apache.org/dyn/closer.cgi?path=/kafka/0.8.2.1/kafka_2.10-0.8.2.1.tgz).
+
+After unpacking the tar ball these steps should get you going:
+
+1. CD to the distribution directory.
+2. Start zookeeper first by running ``bin/zookeeper-server-start.sh 
config/zookeeper.properties``.
+3. Start Kafka: ``bin/kafka-server-start.sh config/server.properties``
+
+By default, Zookeeper is running on port 2181 and Kafka runs on port 9092. You 
can change the Zookeeper
+port by changing the properties ``clientPort`` in 
``config/zookeeper.properties`` and
+``zookeeper.connect`` in ``config/server.properties``. Change the Kafka port 
by changing
+``port`` in ``config/server.properties``.
+
+For Windows, run the respective .bat commands in the ``bin\windows`` directory.
+
+
+### Deploy ODF
+
+The only ODF artifact you need for deployment is the war file built by the 
odf-web maven project, which can typically
+be found here:
+
+       odf-web/target/odf-web-0.1.0-SNAPSHOT.war
+
+To tell ODF which Zookeeper / Kafka to use you will need to set the
+Java system property ``odf.zookeeper.connect`` to point
+to the Zookeeper host and port. The value is typically the same string as the 
``zookeeper.connect`` property
+in the Kafka installation ``config/server.properties`` file:
+
+       -Dodf.zookeeper.connect=zkserver.example.org:2181
+
+Note that if this property is not set, the default is ``localhost:52181``.
+
+
+#### Application Server
+
+ODF should run on any application server. As of now we have done most of our 
testing on Jetty.
+
+##### Jetty
+
+[Jetty](https://eclipse.org/jetty/) is an open source web and application 
server.
+We have used version 9.2.x for our testing (the most current one that supports 
Java 7).
+Download it from the web site 
[https://eclipse.org/jetty/](https://eclipse.org/jetty/).
+
+Here are some quick start instructions for creating a new Jetty base. Compare
+the respective Jetty documentation section 
[here](http://www.eclipse.org/jetty/documentation/9.2.10.v20150310/quickstart-running-jetty.html#creating-jetty-base).
+
+First, for in order to enable basic authentication, the following 
configuration needs to be added to the `etc/jetty.xml` file, right before the 
closing `</Configure>` tag at the end of the file:
+
+```
+<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>
+```
+
+Secondly, a `etc/realm.properties` file needs to be added that contains the 
credentials of the ODF users in the following 
[format](http://www.eclipse.org/jetty/documentation/9.2.10.v20150310/configuring-security-authentication.html#security-realms):
+
+```
+<username>: <password>[,<rolename> ...]
+```
+
+Then, you will have to create and initialize new directory where you deploy 
your web apps and
+copy the ODF war there. These commands should do the trick:
+
+       mkdir myjettybase
+       cd myjettybase
+       java -jar $JETTY_HOME\start.jar --add-to-startd=https,ssl,deploy
+       cp $ODFDIR/odf-web-0.1.0-SNAPSHOT.jar webapps
+       java -Dodf.zookeeper.connect=zkserver.example.org:2181 -jar 
$JETTY_HOME\start.jar
+
+The first java command initializes the jetty base directory by creating a 
directory ``start.d`` which
+contains some config files (e.g. http.ini contains the port the server runs 
on) and the
+empty ``webapps`` directory.
+The copy command copies the ODF war file to the webapps folder.
+The last command starts Jetty (on default port 8443). You can stop it by 
hitting Ctrl-C.
+
+You should see a message like this one indicating that the app was found and 
started.
+
+       2016-02-26 08:28:24.033:INFO:oejsh.ContextHandler:Scanner-0: Started 
o.e.j.w.WebAppContext@-545d793e{/odf-web-0.1.0-SNAPSHOT,file:/C:/temp/jetty-0.0.0.0-8443-odf-web-0.1.0-SNAPSHOT.war-_odf-web-0.1.0-SNAPSHOT-any-8485458047819836926.dir/webapp/,AVAILABLE}{myjettybase\webapps\odf-web-0.1.0-SNAPSHOT.war}
+
+Point your browser to 
[https://localhost:8443/odf-web-0.1.0-SNAPSHOT](https://localhost:8443/odf-web-0.1.0-SNAPSHOT)
 to see the ODF console.
+
+
+
+##### Websphere Liberty Profile
+
+Stay tuned

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/jenkins-build.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/jenkins-build.md 
b/odf/odf-doc/src/site/markdown/jenkins-build.md
new file mode 100755
index 0000000..1b22bb2
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/jenkins-build.md
@@ -0,0 +1,93 @@
+#
+#  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.
+#
+
+# ODF Jenkins build
+
+## General
+The Jenkins build is set up at
+[https://shared-discovery-platform-jenkins.swg-devops.com:8443](https://shared-discovery-platform-jenkins.swg-devops.com:8443).
+
+### Available jobs
+The following jobs are available:
+
+1. **Open-Discovery-Framework**: The main build on the master branch with the 
test environment.
+Built on Linux.
+2. **Open-Discovery-Framework-Parameters**: Job you can trigger manually for 
private branches
+and platforms. Using the `nodelabel` parameter with value `odfbuild` triggers 
the build on Linux.
+3. **Open-Discovery-Framework-Testenv**: Manages and/or installs the test env. 
This job is currently scheduled
+to install the current testenv on the [machine associated with label 
`odftestenv`](http://sdp1.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT) 
every night at 10PM EST.
+
+The parameter `nodelabel` defines the nodes the test env is / should be 
installed:
+
+- `odftestenv` for testing your private builds on 
[https://sdp1.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT](https://sdp1.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT).
+- `odfdemo` for the stable demo on 
[https://odfdemo.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT](https://odfdemo.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT).
+
+Possible actions selectable through the `action` parameter are:
+
+- `start`: (re)start the test env
+- `stop`: stop the test env
+- `cleanconfig`: (re)starts with clean configuration and Kafka topics
+- `cleanmetadata`: (re)starts with clean metadata
+- `cleanall`: (re)starts with cleanconfig plus cleanmetadata
+- `install`: Installs the build as specified in the `jenkinsjob` and 
`buildnumber` parameters.
+
+4. **Open-Discovery-Framework-BuildStarter**: Job polling for changes in the 
master branch and triggering
+the automated build. Starts the Open-Discovery-Framework Linux build. *You 
should typically not have to trigger this job manually!*
+
+You can find these jobs in Jenkins in the 
[1-ODF](https://shared-discovery-platform-jenkins.swg-devops.com:8443/view/1-ODF/)
 tab.
+
+### Node labels
+This Jenkins system currently contains two kinds of slaves which are 
distinguished by a
+so called [node 
label](https://www.safaribooksonline.com/library/view/jenkins-the-definitive/9781449311155/ch11s04.html).
+
+We currently have these node labels:
+
+1. `odfbuild`: Linux build
+2. `odftestenv`: Machine sdp1.rtp.raleigh.ibm.com where test envs can be 
deployed regularly for internal testing.
+
+
+### Some Important Settings
+
+- Use the profile `jenkinsbuild`. This is currently only used in the Bluemix 
Services and requires that the Bluemix password is not read from the 
`cf.password` system property but rather from the env var `CFPASSWORD`. This is 
only done so that the password doesn't appear in the log.
+- The firewall is smashed with a script called `smashlittletonfirewall.sh` 
(see below). You have to set the env var
+`INTRANETCREDENTIALS` from Jenkins as a combined credential variable (of the 
form user:password). The reason
+why this is a script and not put into the command line directly is that the 
user / password don't appear in the log
+
+
+### Build Slave Machines
+The build slave machines are:
+
+1. BuildNode: `sdp1.rtp.raleigh.ibm.com`
+2. BuildNode2: `sdpbuild2.rtp.raleigh.ibm.com`
+3. ODFTestEnv: `sdpdemo.rtp.raleigh.ibm.com`
+4. BuildNodeWin1: `sdpwin1.rtp.raleigh.ibm.com`
+
+Access user: ibmadmin / adm4sdp
+
+These VMs can be managed through 
[vLaunch](https://vlaunch.rtp.raleigh.ibm.com/).
+
+
+### Scripts / settings required on the build slave
+
+#### Windows
+On the windows slaves, install Git from IBM iRAM, e.g., 
[here](https://w3-03.ibm.com/tools/cm/iram/oslc/assets/503004E8-5971-230E-3D16-6F3FBDBE2E2C/2.5.1)
+and make sure that the *bin* directory of the installation (typically 
something like `C:\Program Files (x86)\Git\bin`) is in the path.
+This takes care that `sh.exe` is in the path and picked up by the Jenkins jobs.
+
+#### `smashlittletonfirewall.sh`
+
+Used to smash the Littleton firewall. Put this somewhere in the path, e.g., 
`~/bin`. The reason why this exists
+at all is so that the intranet credentials don't appear in the build log. The 
file consists of this one line:
+
+       curl -i -L  --user $INTRANETCREDENTIALS --insecure -X GET 
http://ips-rtc.swg.usma.ibm.com/jazz/web/projects

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/odf-metadata-api.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/odf-metadata-api.md 
b/odf/odf-doc/src/site/markdown/odf-metadata-api.md
new file mode 100755
index 0000000..6c5fa91
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/odf-metadata-api.md
@@ -0,0 +1,63 @@
+#
+#  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.
+#
+
+# ODF Metadata API
+
+ODF provides a very simple API for searching, retrieving, and (to a limited 
extent) for creating
+new metadata objects.
+This API abstracts away specifics of the underlying metadata store.
+See the REST resource `metadata`, e.g., 
[here](https://sdp1.rtp.raleigh.ibm.com:58081/odf-web-0.1.0-SNAPSHOT/swagger/#/metadata)
 or look at the Java interface 
`org.apache.atlas.odf.core.metadata.MetadataStore`.
+
+In this API we distinguish between `MetaDataObject`s and 
`MetadataObjectReferences`.
+Where the former represent an object as such, the latter is just a reference 
to an object.
+You may think of the `MetaDataObjectReference` as a generalized XMeta RID.
+
+Simply put, metadata objects are represented as JSON where object attributes
+are represented as JSON attribute with the same name.
+Simple types map to JSON simple types. References
+to another object are represented of JSON objects of type 
`MetadataObjectReference` that
+has three attribute:
+1. `id`: the object ID
+2. `repositoryId`: the ID of the repository where the object resides
+3. `url` (optional): A URL pointing to the object. For Atlas, this is a link 
to the object in the
+Atlas dashboard.
+
+The API is read-only, the only objects that can be created are annotations 
(see section [Data model and extensibility](data-model.html).
+
+Here is an example: suppose there is a table object which has a name and a 
list of columns. The JSON of this table would look something like this:
+
+       {
+          "name": "CUSTOMERS,
+          "columns": [
+                        {
+                           "id": "1234-abcd",
+                           "repositoryId": "atlas:repos1"
+                        },
+                        {
+                           "id": "5678-efgh",
+                           "repositoryId": "atlas:repos1"
+                        }
+                     ],
+          "reference": {
+                         "id": "9abc-ijkl",
+                         "repositoryId": "atlas:repos1"
+                       },
+          "javaClass": "corg.apache.atlas.odf.core.metadata.models.Table"      
        
+       }
+
+The `reference` value represent the reference to the object itself where as
+`javaClass` denotes the type of object (table in this case).
+The `name` attribute contains the table name where the `columns` value is a 
list
+of references to two column objects. These references can be retrieved 
separately
+to look at the details.

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6d19e129/odf/odf-doc/src/site/markdown/operations.md
----------------------------------------------------------------------
diff --git a/odf/odf-doc/src/site/markdown/operations.md 
b/odf/odf-doc/src/site/markdown/operations.md
new file mode 100755
index 0000000..f28699b
--- /dev/null
+++ b/odf/odf-doc/src/site/markdown/operations.md
@@ -0,0 +1,15 @@
+#
+#  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.
+#
+
+# Operations

Reply via email to