You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by sm...@apache.org on 2015/03/01 09:34:55 UTC

[1/2] incubator-slider git commit: Cleaning up metainfo

Repository: incubator-slider
Updated Branches:
  refs/heads/feature/packaging_improvements f3cab4445 -> 5b1826e1b


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Export.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Export.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Export.java
deleted file mode 100644
index 7331144..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Export.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents package description.
- */
-public class Export {
-  protected static final Logger
-      log = LoggerFactory.getLogger(Export.class);
-
-
-  private String name;
-  private String value;
-
-  /**
-   * Creator.
-   */
-  public Export() {
-  }
-
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setValue(String value) {
-    this.value = value;
-  }
-
-  public String getValue() {
-    return value;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ExportGroup.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ExportGroup.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ExportGroup.java
deleted file mode 100644
index e95497d..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ExportGroup.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents package description.
- */
-public class ExportGroup {
-  protected static final Logger
-      log = LoggerFactory.getLogger(ExportGroup.class);
-
-
-  private String name;
-  private List<Export> exports = new ArrayList<Export>();
-
-  /**
-   * Creator.
-   */
-  public ExportGroup() {
-  }
-
-  @JsonProperty("exports")
-  public List<Export> getExports() {
-    return this.exports;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfo.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfo.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfo.java
deleted file mode 100644
index ff81fb9..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfo.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.apache.slider.core.exceptions.BadConfigException;
-import org.apache.slider.providers.agent.application.metadata.Metainfo;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents the metadata associated with the application.
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-public class MetaInfo {
-  protected static final Logger
-      log = LoggerFactory.getLogger(MetaInfo.class);
-
-  private static final String UTF_8 = "UTF-8";
-
-  /**
-   * version
-   */
-  private String schemaVersion = "2.1";
-
-  private Application application;
-
-
-  /**
-   * Creator.
-   */
-  public MetaInfo() {
-  }
-
-  public void setApplication(Application application) {
-    this.application = application;
-  }
-
-  public Application getApplication() {
-    return application;
-  }
-
-  public void setSchemaVersion(String version) {
-    schemaVersion = version;
-  }
-
-  public String getSchemaVersion() {
-    return schemaVersion;
-  }
-
-  public static MetaInfo upConverted(Metainfo fromVersion2dot0) throws BadConfigException {
-    if (fromVersion2dot0 == null) {
-      return null;
-    }
-
-    MetaInfo metaInfo = new MetaInfo();
-
-    if (fromVersion2dot0.getApplication() != null) {
-      Application app = new Application();
-      metaInfo.setApplication(app);
-
-      app.setComment(fromVersion2dot0.getApplication().getComment());
-      app.setExportedConfigs(fromVersion2dot0.getApplication().getExportedConfigs());
-      app.setName(fromVersion2dot0.getApplication().getName());
-      app.setVersion(fromVersion2dot0.getApplication().getVersion());
-
-      // command order
-      if (fromVersion2dot0.getApplication().getCommandOrder() != null) {
-        for (org.apache.slider.providers.agent.application.metadata.CommandOrder xmlCo :
-            fromVersion2dot0.getApplication().getCommandOrder()) {
-          CommandOrder co = new CommandOrder();
-          co.setCommand(xmlCo.getCommand());
-          co.setRequires(xmlCo.getRequires());
-          app.getCommandOrders().add(co);
-        }
-      }
-
-      // packages
-      if (fromVersion2dot0.getApplication().getOSSpecifics() != null) {
-        for (org.apache.slider.providers.agent.application.metadata.OSSpecific xmlOSS :
-            fromVersion2dot0.getApplication().getOSSpecifics()) {
-          for (org.apache.slider.providers.agent.application.metadata.OSPackage xmlOSP : xmlOSS.getPackages()) {
-            Package pkg = new Package();
-            pkg.setName(xmlOSP.getName());
-            pkg.setType(xmlOSP.getType());
-            app.getPackages().add(pkg);
-          }
-        }
-      }
-
-      // export
-      if (fromVersion2dot0.getApplication().getExportGroups() != null) {
-        for (org.apache.slider.providers.agent.application.metadata.ExportGroup xmlEg :
-            fromVersion2dot0.getApplication().getExportGroups()) {
-          ExportGroup eg = new ExportGroup();
-          eg.setName(xmlEg.getName());
-          app.getExportGroups().add(eg);
-          for (org.apache.slider.providers.agent.application.metadata.Export xmlEx :
-              xmlEg.getExports()) {
-            Export exp = new Export();
-            exp.setName(xmlEx.getName());
-            exp.setValue(xmlEx.getValue());
-            eg.getExports().add(exp);
-          }
-        }
-      }
-
-      // config file
-      if (fromVersion2dot0.getApplication().getConfigFiles() != null) {
-        for (org.apache.slider.providers.agent.application.metadata.ConfigFile xmlConf :
-            fromVersion2dot0.getApplication().getConfigFiles()) {
-          ConfigFile conf = new ConfigFile();
-          conf.setDictionaryName(xmlConf.getDictionaryName());
-          conf.setFileName(xmlConf.getFileName());
-          conf.setType(xmlConf.getType());
-          app.getConfigFiles().add(conf);
-        }
-      }
-
-      // component
-      if (fromVersion2dot0.getApplication().getComponents() != null) {
-        for (org.apache.slider.providers.agent.application.metadata.Component xmlComp :
-            fromVersion2dot0.getApplication().getComponents()) {
-          Component comp = new Component();
-          comp.setAppExports(xmlComp.getAppExports());
-          comp.setAutoStartOnFailure(xmlComp.getRequiresAutoRestart());
-          comp.setCategory(xmlComp.getCategory());
-          comp.setCompExports(xmlComp.getCompExports());
-          comp.setMaxInstanceCount(xmlComp.getMaxInstanceCountInt());
-          comp.setMinInstanceCount(xmlComp.getMinInstanceCountInt());
-          comp.setName(xmlComp.getName());
-          comp.setPublishConfig(xmlComp.getPublishConfig());
-          if(xmlComp.getCommandScript() != null) {
-            CommandScript commandScript = new CommandScript();
-            commandScript.setScript(xmlComp.getCommandScript().getScript());
-            commandScript.setScriptType(xmlComp.getCommandScript().getScriptType());
-            commandScript.setTimeout(xmlComp.getCommandScript().getTimeout());
-            comp.setCommandScript(commandScript);
-          }
-          app.getComponents().add(comp);
-        }
-      }
-
-    }
-    return metaInfo;
-  }
-
-  public Component getApplicationComponent(String roleName) {
-    if (application == null) {
-      log.error("Malformed app definition: Expect application as the top level element for metainfo");
-    } else {
-      for (Component component : application.getComponents()) {
-        if (component.getName().equals(roleName)) {
-          return component;
-        }
-      }
-    }
-    return null;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfoParser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfoParser.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfoParser.java
deleted file mode 100644
index f821b82..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/MetaInfoParser.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-
-/**
- * Represents the metadata associated with the application.
- */
-public class MetaInfoParser {
-  protected static final Logger
-      log = LoggerFactory.getLogger(MetaInfoParser.class);
-
-  private final GsonBuilder gsonBuilder = new GsonBuilder();
-  private Gson gson;
-
-  /**
-   * Creator.
-   */
-  public MetaInfoParser() {
-    gson = gsonBuilder.create();
-  }
-
-
-  /**
-   * Convert to a JSON string
-   *
-   * @return a JSON string description
-   *
-   * @throws IOException Problems mapping/writing the object
-   */
-  public String toJsonString(MetaInfo metaInfo) throws IOException {
-    return gson.toJson(metaInfo);
-  }
-
-  /**
-   * Convert from JSON
-   *
-   * @param json input
-   *
-   * @return the parsed JSON
-   *
-   * @throws IOException IO
-   */
-  public MetaInfo fromJsonString(String json)
-      throws IOException {
-    return gson.fromJson(json, MetaInfo.class);
-  }
-
-  /**
-   * Parse metainfo from an IOStream
-   * @param is
-   * @return
-   * @throws IOException
-   */
-  public MetaInfo fromInputStream(InputStream is) throws IOException {
-    StringWriter writer = new StringWriter();
-    IOUtils.copy(is, writer);
-    return fromJsonString(writer.toString());
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Package.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Package.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Package.java
deleted file mode 100644
index b9bddd6..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Package.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents package description.
- */
-public class Package {
-  protected static final Logger
-      log = LoggerFactory.getLogger(Package.class);
-
-
-  private String name;
-  private String type;
-
-  public Package() {
-  }
-
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public String getType() {
-    return type;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/Container.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/Container.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/Container.java
deleted file mode 100644
index ef58920..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/Container.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.server.appmaster.web.rest.agent;
-
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents a docker container
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-public class Container {
-  protected static final Logger
-      log = LoggerFactory.getLogger(Container.class);
-
-  private String name;
-  private String image;
-  private String options;
-  private List<ContainerMount> mounts = new ArrayList<>();
-  private List<ContainerPort> ports = new ArrayList<>();
-
-
-  public Container() {
-  }
-
-  @JsonProperty("mounts")
-  public List<ContainerMount> getMounts() {
-    return this.mounts;
-  }
-
-  @JsonProperty("ports")
-  public List<ContainerPort> getPorts() {
-    return this.ports;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getImage() {
-    return image;
-  }
-
-  public void setImage(String image) {
-    this.image = image;
-  }
-
-  public String getOptions() {
-    return options;
-  }
-
-  public void setOptions(String options) {
-    this.options = options;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerMount.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerMount.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerMount.java
deleted file mode 100644
index c2670c7..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerMount.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.server.appmaster.web.rest.agent;
-
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents a docker container mount
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-public class ContainerMount {
-  protected static final Logger
-      log = LoggerFactory.getLogger(ContainerMount.class);
-
-
-  // TODO: Rename
-  private String containerMount;
-  private String hostMount;
-
-  public ContainerMount() {
-  }
-
-  public String getContainerMount() {
-    return containerMount;
-  }
-
-  public void setContainerMount(String containerMount) {
-    this.containerMount = containerMount;
-  }
-
-  public String getHostMount() {
-    return hostMount;
-  }
-
-  public void setHostMount(String hostMount) {
-    this.hostMount = hostMount;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerPort.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerPort.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerPort.java
deleted file mode 100644
index a36194c..0000000
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ContainerPort.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.server.appmaster.web.rest.agent;
-
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents a docker container port
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-public class ContainerPort {
-  protected static final Logger
-      log = LoggerFactory.getLogger(ContainerPort.class);
-
-
-  private String containerPort;
-  private String hostPort;
-
-  public ContainerPort() {
-  }
-
-  public String getContainerPort() {
-    return containerPort;
-  }
-
-  public void setContainerPort(String containerPort) {
-    this.containerPort = containerPort;
-  }
-
-  public String getHostPort() {
-    return hostPort;
-  }
-
-  public void setHostPort(String hostPort) {
-    this.hostPort = hostPort;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
index 054bc46..9208707 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/agent/ExecutionCommand.java
@@ -18,8 +18,11 @@ package org.apache.slider.server.appmaster.web.rest.agent;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.slider.providers.agent.application.metadata.json.Component;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
+import org.apache.slider.providers.agent.application.metadata.Component;
+import org.apache.slider.providers.agent.application.metadata.DockerContainer;
+import org.apache.slider.providers.agent.application.metadata.DockerContainerMount;
+import org.apache.slider.providers.agent.application.metadata.DockerContainerPort;
+import org.apache.slider.providers.agent.application.metadata.Metainfo;
 import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 import org.codehaus.jackson.annotate.JsonProperty;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -54,14 +57,14 @@ public class ExecutionCommand {
   private String serviceName;
   private String componentName;
   private String componentType;
-  private List<Container> containers = new ArrayList<>();
+  private List<DockerContainer> containers = new ArrayList<>();
 
   public ExecutionCommand(AgentCommandType commandType) {
     this.commandType = commandType;
   }
 
   @JsonProperty("containers")
-  public List<Container> getContainers() {
+  public List<DockerContainer> getContainers() {
     return containers;
   }
 
@@ -220,26 +223,26 @@ public class ExecutionCommand {
     return builder.toString();
   }
 
-  public void addContainerDetails(String componentName, MetaInfo metaInfo) {
+  public void addContainerDetails(String componentName, Metainfo metaInfo) {
     Component component = metaInfo.getApplicationComponent(componentName);
     this.setComponentType(component.getType());
     log.info("Adding container details for {}", componentName);
-    for(org.apache.slider.providers.agent.application.metadata.json.Container metaContainer: component.getContainers()) {
-      Container container = new Container();
+    for(DockerContainer metaContainer: component.getDockerContainers()) {
+      DockerContainer container = new DockerContainer();
       container.setImage(metaContainer.getImage());
       container.setName(metaContainer.getName());
       container.setOptions(metaContainer.getOptions());
       if(metaContainer.getMounts().size() > 0) {
-        for(org.apache.slider.providers.agent.application.metadata.json.ContainerMount metaContMount : metaContainer.getMounts()) {
-          ContainerMount contMnt = new ContainerMount();
+        for(DockerContainerMount metaContMount : metaContainer.getMounts()) {
+          DockerContainerMount contMnt = new DockerContainerMount();
           contMnt.setContainerMount(metaContMount.getContainerMount());
           contMnt.setHostMount(metaContMount.getHostMount());
           container.getMounts().add(contMnt);
         }
       }
       if(metaContainer.getPorts().size() > 0) {
-        for(org.apache.slider.providers.agent.application.metadata.json.ContainerPort metaCntPort : metaContainer.getPorts()) {
-          ContainerPort cntPort = new ContainerPort();
+        for(DockerContainerPort metaCntPort : metaContainer.getPorts()) {
+          DockerContainerPort cntPort = new DockerContainerPort();
           cntPort.setContainerPort(metaCntPort.getContainerPort());
           cntPort.setHostPort(metaCntPort.getHostPort());
           container.getPorts().add(cntPort);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/test/groovy/org/apache/slider/common/tools/TestWindowsSupport.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/common/tools/TestWindowsSupport.groovy b/slider-core/src/test/groovy/org/apache/slider/common/tools/TestWindowsSupport.groovy
index c3f52e7..d96886a 100644
--- a/slider-core/src/test/groovy/org/apache/slider/common/tools/TestWindowsSupport.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/common/tools/TestWindowsSupport.groovy
@@ -97,7 +97,7 @@ class TestWindowsSupport extends YarnMiniClusterTestBase {
     assumeWindows()
     SliderFileSystem sfs = new SliderFileSystem(new Configuration())
     try {
-      def metainfo = AgentUtils.getApplicationMetaInfo(sfs, windowsFile)
+      def metainfo = AgentUtils.getApplicationMetainfo(sfs, windowsFile)
     } catch (FileNotFoundException fnfe) {
       // expected
     }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java
index 466b300..92efafd 100644
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java
+++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentClientProvider2.java
@@ -30,9 +30,9 @@ import org.apache.slider.core.conf.ConfTree;
 import org.apache.slider.core.exceptions.BadCommandArgumentsException;
 import org.apache.slider.core.exceptions.SliderException;
 import org.apache.slider.providers.ProviderUtils;
-import org.apache.slider.providers.agent.application.metadata.json.Application;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
-import org.apache.slider.providers.agent.application.metadata.json.Package;
+import org.apache.slider.providers.agent.application.metadata.Application;
+import org.apache.slider.providers.agent.application.metadata.Metainfo;
+import org.apache.slider.providers.agent.application.metadata.Package;
 import org.codehaus.jettison.json.JSONObject;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -120,7 +120,7 @@ public class TestAgentClientProvider2 {
     global.put("d", "{app_install_dir}/d");
     inputConfig.put("global", global);
 
-    MetaInfo metainfo = new MetaInfo();
+    Metainfo metainfo = new Metainfo();
     Application app = new Application();
     metainfo.setApplication(app);
     Package pkg = new Package();

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
index 7746867..95b7d56 100644
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
+++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
@@ -48,17 +48,16 @@ import org.apache.slider.core.registry.docstore.ExportEntry;
 import org.apache.slider.core.registry.docstore.PublishedExports;
 import org.apache.slider.core.registry.docstore.PublishedExportsSet;
 import org.apache.slider.providers.ProviderRole;
-import org.apache.slider.providers.agent.application.metadata.json.Application;
-import org.apache.slider.providers.agent.application.metadata.json.CommandOrder;
-import org.apache.slider.providers.agent.application.metadata.json.CommandScript;
-import org.apache.slider.providers.agent.application.metadata.json.Component;
+import org.apache.slider.providers.agent.application.metadata.Application;
+import org.apache.slider.providers.agent.application.metadata.CommandOrder;
+import org.apache.slider.providers.agent.application.metadata.CommandScript;
+import org.apache.slider.providers.agent.application.metadata.Component;
 import org.apache.slider.providers.agent.application.metadata.ComponentExport;
-import org.apache.slider.providers.agent.application.metadata.json.ConfigFile;
+import org.apache.slider.providers.agent.application.metadata.ConfigFile;
 import org.apache.slider.providers.agent.application.metadata.DefaultConfig;
-import org.apache.slider.providers.agent.application.metadata.json.Export;
-import org.apache.slider.providers.agent.application.metadata.json.ExportGroup;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfoParser;
+import org.apache.slider.providers.agent.application.metadata.Export;
+import org.apache.slider.providers.agent.application.metadata.ExportGroup;
+import org.apache.slider.providers.agent.application.metadata.Metainfo;
 import org.apache.slider.providers.agent.application.metadata.MetainfoParser;
 import org.apache.slider.providers.agent.application.metadata.PropertyInfo;
 import org.apache.slider.server.appmaster.model.mock.MockRegistryOperations;
@@ -304,8 +303,13 @@ public class TestAgentProviderService {
     CommandScript cs = new CommandScript();
     cs.setScript("scripts/hbase_master.py");
     doReturn(cs).when(mockAps).getScriptPathFromMetainfo(anyString());
-    MetaInfo metainfo = new MetaInfo();
+    Metainfo metainfo = new Metainfo();
     metainfo.setApplication(new Application());
+
+    Component hm = new Component();
+    hm.setName("HBASE_MASTER");
+    metainfo.getApplication().addComponent(hm);
+
     doReturn(metainfo).when(mockAps).getApplicationMetainfo(any(SliderFileSystem.class), anyString());
 
     Configuration conf = new Configuration();
@@ -451,7 +455,7 @@ public class TestAgentProviderService {
     cs.setScript("scripts/hbase_master.py");
     doReturn(cs).when(mockAps)
         .getScriptPathFromMetainfo(anyString());
-    MetaInfo metainfo = new MetaInfo();
+    Metainfo metainfo = new Metainfo();
     Application application = new Application();
     metainfo.setApplication(application);
     doReturn(metainfo).when(mockAps).getApplicationMetainfo(
@@ -470,7 +474,7 @@ public class TestAgentProviderService {
     }
 
     doNothing().when(mockAps).processAllocatedPorts(anyString(), anyString(),
-        anyString(), anyMap());
+                                                    anyString(), anyMap());
     expect(access.isApplicationLive()).andReturn(true).anyTimes();
     ClusterDescription desc = new ClusterDescription();
     desc.setOption(OptionKeys.ZOOKEEPER_QUORUM, "host1:2181");
@@ -496,14 +500,14 @@ public class TestAgentProviderService {
     ProviderRole providerRole = new ProviderRole(role, 1);
     providerRoleMap.put(1, providerRole);
     mockAps.rebuildContainerDetails(containers, "mockcontainer_1",
-        providerRoleMap);
+                                    providerRoleMap);
     return mockAps;
   }
 
   @Test
   public void testThreeInstallFailures() throws IOException, SliderException {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     ConfTree tree = new ConfTree();
     tree.global.put(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
 
@@ -544,7 +548,7 @@ public class TestAgentProviderService {
     doReturn(access).when(mockAps).getAmState();
     doReturn(metainfo).when(mockAps).getApplicationMetainfo(any(SliderFileSystem.class), anyString());
     doReturn(new HashMap<String, DefaultConfig>()).when(mockAps).
-        initializeDefaultConfigs(any(SliderFileSystem.class), anyString(), any(MetaInfo.class));
+        initializeDefaultConfigs(any(SliderFileSystem.class), anyString(), any(Metainfo.class));
 
 
     try {
@@ -631,14 +635,23 @@ public class TestAgentProviderService {
   }
 
   @Test
-  public void testAgentStateStarted() throws Exception, SliderException {
+  public void testAgentStateStarted() throws Exception {
     AggregateConf instanceDefinition = prepareConfForAgentStateTests();
     AgentProviderService mockAps = prepareProviderServiceForAgentStateTests();
+
+    Metainfo metainfo = new Metainfo();
+    Application application = new Application();
+    Component hbaseMaster = new Component();
+    hbaseMaster.setName("HBASE_MASTER");
+    application.addComponent(hbaseMaster);
+    metainfo.setApplication(application);
+    doReturn(metainfo).when(mockAps).getMetaInfo();
+
     Register reg = new Register();
     reg.setResponseId(0);
     reg.setLabel("mockcontainer_1___HBASE_MASTER");
     Map<String,String> ports = new HashMap<String,String>();
-    ports.put("a","100");
+    ports.put("a", "100");
     reg.setAllocatedPorts(ports);
 
     // Simulating agent in STARTED state
@@ -688,12 +701,15 @@ public class TestAgentProviderService {
     AggregateConf instanceDefinition = prepareConfForAgentStateTests();
     AgentProviderService mockAps = prepareProviderServiceForAgentStateTests();
 
-    MetaInfo metainfo = new MetaInfo();
+    Metainfo metainfo = new Metainfo();
     Application application = new Application();
     CommandOrder cmdOrder = new CommandOrder();
     cmdOrder.setCommand("HBASE_MASTER-START");
     cmdOrder.setRequires("HBASE_MASTER-INSTALLED");
     application.getCommandOrders().add(cmdOrder);
+    Component hbaseMaster = new Component();
+    hbaseMaster.setName("HBASE_MASTER");
+    application.addComponent(hbaseMaster);
     metainfo.setApplication(application);
     doReturn(metainfo).when(mockAps).getApplicationMetainfo(
         any(SliderFileSystem.class), anyString());
@@ -808,11 +824,49 @@ public class TestAgentProviderService {
     aps.close();
   }
 
+  @Test
+  public void testComponentSpecificPublishes() throws Exception {
+    InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
+    AgentProviderService aps = createAgentProviderService(new Configuration());
+    AgentProviderService mockAps = Mockito.spy(aps);
+    doNothing().when(mockAps).publishApplicationInstanceData(anyString(), anyString(), anyCollection());
+    doReturn(metainfo).when(mockAps).getMetaInfo();
+
+    Map<String, String> ports = new HashMap<String, String>();
+    ports.put("global.listen_port", "10010");
+    mockAps.processAndPublishComponentSpecificData(ports,
+                                                   "cid1",
+                                                   "host1",
+                                                   "HBASE_REGIONSERVER");
+    ArgumentCaptor<Collection> entriesCaptor = ArgumentCaptor.
+        forClass(Collection.class);
+    ArgumentCaptor<String> publishNameCaptor = ArgumentCaptor.
+        forClass(String.class);
+    Mockito.verify(mockAps, Mockito.times(1)).publishApplicationInstanceData(
+        anyString(),
+        publishNameCaptor.capture(),
+        entriesCaptor.capture());
+    assert entriesCaptor.getAllValues().size() == 1;
+    for (Collection coll : entriesCaptor.getAllValues()) {
+      Set<Map.Entry<String, String>> entrySet = (Set<Map.Entry<String, String>>) coll;
+      for (Map.Entry entry : entrySet) {
+        log.info("{}:{}", entry.getKey(), entry.getValue().toString());
+        if (entry.getKey().equals("PropertyA")) {
+          assert entry.getValue().toString().equals("host1:10010");
+        }
+      }
+    }
+    assert publishNameCaptor.getAllValues().size() == 1;
+    for (String coll : publishNameCaptor.getAllValues()) {
+      assert coll.equals("ComponentInstanceData");
+    }
+  }
 
   @Test
   public void testComponentSpecificPublishes2() throws Exception {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     AgentProviderService aps = createAgentProviderService(new Configuration());
     AgentProviderService mockAps = Mockito.spy(aps);
     doNothing().when(mockAps).publishApplicationInstanceData(anyString(), anyString(), anyCollection());
@@ -897,7 +951,7 @@ public class TestAgentProviderService {
   @Test
   public void testProcessConfig() throws Exception {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     Assert.assertNotNull(metainfo.getApplication());
     AgentProviderService aps = createAgentProviderService(new Configuration());
     HeartBeat hb = new HeartBeat();
@@ -982,7 +1036,7 @@ public class TestAgentProviderService {
   @Test
   public void testMetaInfoParsing() throws Exception {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     Assert.assertNotNull(metainfo.getApplication());
     Application application = metainfo.getApplication();
     log.info("Service: " + application.toString());
@@ -993,10 +1047,10 @@ public class TestAgentProviderService {
     int found = 0;
     for (Component component : components) {
       if (component.getName().equals("HBASE_MASTER")) {
-        Assert.assertEquals(component.getAutoStartOnFailure(), Boolean.TRUE);
-        Assert.assertEquals(component.getAutoStartOnFailure(), Boolean.TRUE);
-        Assert.assertEquals(component.getMinInstanceCount(), 1);
-        Assert.assertEquals(component.getMaxInstanceCount(), 2);
+        Assert.assertEquals("true", component.getAutoStartOnFailure());
+        Assert.assertEquals(Boolean.TRUE, component.getAutoStartOnFailureBoolean());
+        Assert.assertEquals(component.getMinInstanceCountInt(), 1);
+        Assert.assertEquals(component.getMaxInstanceCountInt(), 2);
         Assert.assertEquals(component.getCommandScript().getScript(), "scripts/hbase_master.py");
         Assert.assertEquals(component.getCategory(), "MASTER");
         Assert.assertEquals(component.getAppExports(), "QuickLinks-JMX_Endpoint,QuickLinks-Master_Status");
@@ -1004,8 +1058,8 @@ public class TestAgentProviderService {
         found++;
       }
       if (component.getName().equals("HBASE_REGIONSERVER")) {
-        Assert.assertEquals(component.getAutoStartOnFailure(), "Falsee");
-        Assert.assertEquals(component.getAutoStartOnFailure(), Boolean.FALSE);
+        Assert.assertEquals("Falsee", component.getAutoStartOnFailure());
+        Assert.assertEquals(Boolean.FALSE, component.getAutoStartOnFailureBoolean());
         Assert.assertEquals(component.getMinInstanceCount(), "1");
         Assert.assertNull(component.getMaxInstanceCount());
         Assert.assertEquals(component.getCommandScript().getScript(), "scripts/hbase_regionserver.py");
@@ -1084,16 +1138,16 @@ public class TestAgentProviderService {
                                 + "      </comment>\n";
 
     metainfo_1 = new ByteArrayInputStream(metainfo_1_str_bad.getBytes());
-    metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     Assert.assertNull(metainfo);
   }
 
   @Test
   public void testMetaInfoRelatedOperations() throws Exception {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     InputStream metainfo_2 = new ByteArrayInputStream(metainfo_2_str.getBytes());
-    MetaInfo metainfo2 = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_2));
+    Metainfo metainfo2 = new MetainfoParser().fromXmlStream(metainfo_2);
     String role_hm = "HBASE_MASTER";
     String role_hrs = "HBASE_REGIONSERVER";
 
@@ -1122,7 +1176,7 @@ public class TestAgentProviderService {
     // App has two components HBASE_MASTER and HBASE_REGIONSERVER
     // Start of HBASE_RS depends on the start of HBASE_MASTER
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     ConfTree tree = new ConfTree();
     tree.global.put(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
 
@@ -1165,7 +1219,7 @@ public class TestAgentProviderService {
     doReturn(access).when(mockAps).getAmState();
     doReturn(metainfo).when(mockAps).getApplicationMetainfo(any(SliderFileSystem.class), anyString());
     doReturn(new HashMap<String, DefaultConfig>()).when(mockAps).
-        initializeDefaultConfigs(any(SliderFileSystem.class), anyString(), any(MetaInfo.class));
+        initializeDefaultConfigs(any(SliderFileSystem.class), anyString(), any(Metainfo.class));
 
 
     try {
@@ -1495,7 +1549,7 @@ public class TestAgentProviderService {
   @Test
   public void testAddInstallCommand() throws Exception {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
-    MetaInfo metainfo = MetaInfo.upConverted(new MetainfoParser().parse(metainfo_1));
+    Metainfo metainfo = new MetainfoParser().fromXmlStream(metainfo_1);
     AgentProviderService aps = createAgentProviderService(new Configuration());
     HeartBeatResponse hbr = new HeartBeatResponse();
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/test/java/org/apache/slider/providers/agent/TestComponentCommandOrder.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestComponentCommandOrder.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestComponentCommandOrder.java
index bac1158..c123fbb 100644
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestComponentCommandOrder.java
+++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestComponentCommandOrder.java
@@ -18,7 +18,7 @@
 
 package org.apache.slider.providers.agent;
 
-import org.apache.slider.providers.agent.application.metadata.json.CommandOrder;
+import org.apache.slider.providers.agent.application.metadata.CommandOrder;
 import org.apache.slider.server.appmaster.model.mock.MockContainerId;
 import org.junit.Assert;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/TestMetainfoParser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/TestMetainfoParser.java b/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/TestMetainfoParser.java
index 1177e9d..7930c8b 100644
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/TestMetainfoParser.java
+++ b/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/TestMetainfoParser.java
@@ -45,7 +45,7 @@ public class TestMetainfoParser {
     InputStream resStream = this.getClass().getResourceAsStream(
         METAINFO_XML);
     MetainfoParser parser = new MetainfoParser();
-    Metainfo metainfo = parser.parse(resStream);
+    Metainfo metainfo = parser.fromXmlStream(resStream);
     Assert.assertNotNull(metainfo);
     Assert.assertNotNull(metainfo.getApplication());
     Application application = metainfo.getApplication();
@@ -67,4 +67,106 @@ public class TestMetainfoParser {
     assert found;
     Assert.assertEquals(0, application.getConfigFiles().size());
   }
+
+  @Test
+  public void testJsonParse() throws IOException {
+    String metaInfo1_json = "{\n"
+                            + "\"schemaVersion\":\"2.2\",\n"
+                            + "\"application\":{\n"
+                            +     "\"name\": \"MEMCACHED\","
+                            +     "\"exportGroups\": ["
+                            +        "{"
+                            +          "\"name\": \"Servers\","
+                            +          "\"exports\": ["
+                            +            "{"
+                            +               "\"name\": \"host_port\","
+                            +               "\"value\": \"${MEMCACHED_HOST}:${site.global.port}\""
+                            +            "}"
+                            +          "]"
+                            +        "}"
+                            +      "],"
+                            +     "\"components\": ["
+                            +        "{"
+                            +          "\"name\": \"MEMCACHED\","
+                            +          "\"compExports\": \"Servers-host_port\","
+                            +          "\"commands\": ["
+                            +            "{"
+                            +               "\"exec\": \"java -classpath /usr/myapps/memcached/*:/usr/lib/hadoop/lib/* com.thimbleware.jmemcached.Main\""
+                            +            "}"
+                            +          "]"
+                            +        "},"
+                            +        "{"
+                            +          "\"name\": \"MEMCACHED2\","
+                            +          "\"commands\": ["
+                            +            "{"
+                            +               "\"exec\": \"scripts/config.py\","
+                            +               "\"type\": \"PYTHON\","
+                            +               "\"name\": \"CONFIGURE\""
+                            +            "}"
+                            +          "],"
+                            +          "\"dockerContainers\": ["
+                            +            "{"
+                            +               "\"name\": \"redis\","
+                            +               "\"image\": \"dockerhub/redis\","
+                            +               "\"options\": \"-net=bridge\","
+                            +               "\"mounts\": ["
+                            +                 "{"
+                            +                   "\"containerMount\": \"/tmp/conf\","
+                            +                   "\"hostMount\": \"{$conf:@//site/global/app_root}/conf\""
+                            +                 "}"
+                            +               "]"
+                            +            "}"
+                            +          "]"
+                            +        "}"
+                            +      "]"
+                            +   "}"
+                            + "}";
+
+    MetainfoParser parser = new MetainfoParser();
+    Metainfo mInfo = parser.fromJsonString(metaInfo1_json);
+    Assert.assertEquals("2.2", mInfo.getSchemaVersion());
+
+    Application app = mInfo.getApplication();
+    Assert.assertNotNull(app);
+
+    Assert.assertEquals("MEMCACHED", app.getName());
+    List<ExportGroup> egs = app.getExportGroups();
+    Assert.assertEquals(1, egs.size());
+    ExportGroup eg = egs.get(0);
+    Assert.assertEquals("Servers", eg.getName());
+    List<Export> exports = eg.getExports();
+    Assert.assertEquals(1, exports.size());
+    Export export = exports.get(0);
+    Assert.assertEquals("host_port", export.getName());
+    Assert.assertEquals("${MEMCACHED_HOST}:${site.global.port}", export.getValue());
+
+    List<Component> components = app.getComponents();
+    Assert.assertEquals(2, components.size());
+
+    Component c1 = mInfo.getApplicationComponent("MEMCACHED");
+    Assert.assertNotNull(c1);
+    Assert.assertEquals("MEMCACHED", c1.getName());
+    Assert.assertEquals("Servers-host_port", c1.getCompExports());
+    Assert.assertEquals(1, c1.getCommands().size());
+    ComponentCommand cmd = c1.getCommands().get(0);
+    Assert.assertEquals("START", cmd.getName());
+    Assert.assertEquals("SHELL", cmd.getType());
+    Assert.assertEquals("java -classpath /usr/myapps/memcached/*:/usr/lib/hadoop/lib/* com.thimbleware.jmemcached.Main",
+                        cmd.getExec());
+
+    Component c2 = mInfo.getApplicationComponent("MEMCACHED2");
+    Assert.assertNotNull(c2);
+    Assert.assertEquals("MEMCACHED2", c2.getName());
+    Assert.assertEquals(1, c2.getCommands().size());
+    cmd = c2.getCommands().get(0);
+    Assert.assertEquals("CONFIGURE", cmd.getName());
+    Assert.assertEquals("PYTHON", cmd.getType());
+    Assert.assertEquals("scripts/config.py", cmd.getExec());
+    Assert.assertEquals(1, c2.getDockerContainers().size());
+    DockerContainer cont = c2.getDockerContainers().get(0);
+    Assert.assertEquals("redis", cont.getName());
+    Assert.assertEquals(1, cont.getMounts().size());
+    DockerContainerMount mount = cont.getMounts().get(0);
+    Assert.assertEquals("{$conf:@//site/global/app_root}/conf", mount.getHostMount());
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/json/TestMetaInfoParser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/json/TestMetaInfoParser.java b/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/json/TestMetaInfoParser.java
deleted file mode 100644
index 83a87a4..0000000
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/application/metadata/json/TestMetaInfoParser.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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.
- */
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- *
- */
-public class TestMetaInfoParser {
-  protected static final Logger log =
-      LoggerFactory.getLogger(TestMetaInfoParser.class);
-
-  @Test
-  public void testParse() throws IOException {
-    String metaInfo1_json = "{\n"
-                            + "\"schemaVersion\":\"2.2\",\n"
-                            + "\"application\":{\n"
-                            +     "\"name\": \"MEMCACHED\","
-                            +     "\"exportGroups\": ["
-                            +        "{"
-                            +          "\"name\": \"Servers\","
-                            +          "\"exports\": ["
-                            +            "{"
-                            +               "\"name\": \"host_port\","
-                            +               "\"value\": \"${MEMCACHED_HOST}:${site.global.port}\""
-                            +            "}"
-                            +          "]"
-                            +        "}"
-                            +      "],"
-                            +     "\"components\": ["
-                            +        "{"
-                            +          "\"name\": \"MEMCACHED\","
-                            +          "\"compExports\": \"Servers-host_port\","
-                            +          "\"commands\": ["
-                            +            "{"
-                            +               "\"exec\": \"java -classpath /usr/myapps/memcached/*:/usr/lib/hadoop/lib/* com.thimbleware.jmemcached.Main\""
-                            +            "}"
-                            +          "]"
-                            +        "},"
-                            +        "{"
-                            +          "\"name\": \"MEMCACHED2\","
-                            +          "\"commands\": ["
-                            +            "{"
-                            +               "\"exec\": \"scripts/config.py\","
-                            +               "\"type\": \"PYTHON\","
-                            +               "\"name\": \"CONFIGURE\""
-                            +            "}"
-                            +          "],"
-                            +          "\"containers\": ["
-                            +            "{"
-                            +               "\"name\": \"redis\","
-                            +               "\"image\": \"dockerhub/redis\","
-                            +               "\"options\": \"-net=bridge\","
-                            +               "\"mounts\": ["
-                            +                 "{"
-                            +                   "\"containerMount\": \"/tmp/conf\","
-                            +                   "\"hostMount\": \"{$conf:@//site/global/app_root}/conf\""
-                            +                 "}"
-                            +               "]"
-                            +            "}"
-                            +          "]"
-                            +        "}"
-                            +      "]"
-                            +   "}"
-                            + "}";
-
-    MetaInfoParser parser = new MetaInfoParser();
-    MetaInfo mInfo = parser.fromJsonString(metaInfo1_json);
-    Assert.assertEquals("2.2", mInfo.getSchemaVersion());
-
-    Application app = mInfo.getApplication();
-    Assert.assertNotNull(app);
-
-    Assert.assertEquals("MEMCACHED", app.getName());
-    List<ExportGroup> egs = app.getExportGroups();
-    Assert.assertEquals(1, egs.size());
-    ExportGroup eg = egs.get(0);
-    Assert.assertEquals("Servers", eg.getName());
-    List<Export> exports = eg.getExports();
-    Assert.assertEquals(1, exports.size());
-    Export export = exports.get(0);
-    Assert.assertEquals("host_port", export.getName());
-    Assert.assertEquals("${MEMCACHED_HOST}:${site.global.port}", export.getValue());
-
-    List<Component> components = app.getComponents();
-    Assert.assertEquals(2, components.size());
-
-    Component c1 = app.getApplicationComponent("MEMCACHED");
-    Assert.assertNotNull(c1);
-    Assert.assertEquals("MEMCACHED", c1.getName());
-    Assert.assertEquals("Servers-host_port", c1.getCompExports());
-    Assert.assertEquals(1, c1.getCommands().size());
-    ComponentCommand cmd = c1.getCommands().get(0);
-    Assert.assertEquals("START", cmd.getName());
-    Assert.assertEquals("SHELL", cmd.getType());
-    Assert.assertEquals("java -classpath /usr/myapps/memcached/*:/usr/lib/hadoop/lib/* com.thimbleware.jmemcached.Main", cmd.getExec());
-
-    Component c2 = app.getApplicationComponent("MEMCACHED2");
-    Assert.assertNotNull(c2);
-    Assert.assertEquals("MEMCACHED2", c2.getName());
-    Assert.assertEquals(1, c2.getCommands().size());
-    cmd = c2.getCommands().get(0);
-    Assert.assertEquals("CONFIGURE", cmd.getName());
-    Assert.assertEquals("PYTHON", cmd.getType());
-    Assert.assertEquals("scripts/config.py", cmd.getExec());
-    Assert.assertEquals(1, c2.getContainers().size());
-    Container cont = c2.getContainers().get(0);
-    Assert.assertEquals("redis", cont.getName());
-    Assert.assertEquals(1, cont.getMounts().size());
-    ContainerMount mount = cont.getMounts().get(0);
-    Assert.assertEquals("{$conf:@//site/global/app_root}/conf", mount.getHostMount());
-  }
-}


[2/2] incubator-slider git commit: Cleaning up metainfo

Posted by sm...@apache.org.
Cleaning up metainfo


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/5b1826e1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/5b1826e1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/5b1826e1

Branch: refs/heads/feature/packaging_improvements
Commit: 5b1826e1b030383ea5e552ef3268334cc654ecff
Parents: f3cab44
Author: Sumit Mohanty <sm...@hortonworks.com>
Authored: Sun Mar 1 00:34:35 2015 -0800
Committer: Sumit Mohanty <sm...@hortonworks.com>
Committed: Sun Mar 1 00:34:35 2015 -0800

----------------------------------------------------------------------
 .../providers/agent/AgentClientProvider.java    |  40 +++--
 .../providers/agent/AgentProviderService.java   | 110 +++++++++---
 .../slider/providers/agent/AgentUtils.java      |  22 +--
 .../providers/agent/ComponentCommandOrder.java  |   2 +-
 .../agent/application/metadata/Application.java |  94 ++++++++--
 .../application/metadata/CommandOrder.java      |   9 +-
 .../application/metadata/CommandScript.java     |  11 +-
 .../agent/application/metadata/Component.java   |  97 ++++++++--
 .../application/metadata/ComponentCommand.java  |  72 ++++++++
 .../agent/application/metadata/ConfigFile.java  |   8 +-
 .../application/metadata/DockerContainer.java   |  91 ++++++++++
 .../metadata/DockerContainerMount.java          |  59 ++++++
 .../metadata/DockerContainerPort.java           |  59 ++++++
 .../agent/application/metadata/Export.java      |   9 +-
 .../agent/application/metadata/ExportGroup.java |  11 +-
 .../agent/application/metadata/Metainfo.java    |  32 ++--
 .../application/metadata/MetainfoParser.java    |  62 ++++++-
 .../agent/application/metadata/OSPackage.java   |   9 +-
 .../agent/application/metadata/OSSpecific.java  |  11 +-
 .../agent/application/metadata/Package.java     |  60 +++++++
 .../agent/application/metadata/Validate.java    |  27 +++
 .../application/metadata/json/Application.java  | 123 -------------
 .../application/metadata/json/CommandOrder.java |  57 ------
 .../metadata/json/CommandScript.java            |  66 -------
 .../application/metadata/json/Component.java    | 144 ---------------
 .../metadata/json/ComponentCommand.java         |  79 --------
 .../application/metadata/json/ConfigFile.java   |  53 ------
 .../application/metadata/json/Container.java    |  79 --------
 .../metadata/json/ContainerMount.java           |  53 ------
 .../metadata/json/ContainerPort.java            |  53 ------
 .../agent/application/metadata/json/Export.java |  57 ------
 .../application/metadata/json/ExportGroup.java  |  57 ------
 .../application/metadata/json/MetaInfo.java     | 178 -------------------
 .../metadata/json/MetaInfoParser.java           |  85 ---------
 .../application/metadata/json/Package.java      |  54 ------
 .../appmaster/web/rest/agent/Container.java     |  82 ---------
 .../web/rest/agent/ContainerMount.java          |  58 ------
 .../appmaster/web/rest/agent/ContainerPort.java |  57 ------
 .../web/rest/agent/ExecutionCommand.java        |  25 +--
 .../common/tools/TestWindowsSupport.groovy      |   2 +-
 .../agent/TestAgentClientProvider2.java         |   8 +-
 .../agent/TestAgentProviderService.java         | 120 +++++++++----
 .../agent/TestComponentCommandOrder.java        |   2 +-
 .../metadata/TestMetainfoParser.java            | 104 ++++++++++-
 .../metadata/json/TestMetaInfoParser.java       | 134 --------------
 45 files changed, 1003 insertions(+), 1622 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
index 42ac47d..9978b0a 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
@@ -40,10 +40,10 @@ import org.apache.slider.core.launch.AbstractLauncher;
 import org.apache.slider.providers.AbstractClientProvider;
 import org.apache.slider.providers.ProviderRole;
 import org.apache.slider.providers.ProviderUtils;
-import org.apache.slider.providers.agent.application.metadata.json.Application;
-import org.apache.slider.providers.agent.application.metadata.json.Component;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfoParser;
+import org.apache.slider.providers.agent.application.metadata.Application;
+import org.apache.slider.providers.agent.application.metadata.Component;
+import org.apache.slider.providers.agent.application.metadata.Metainfo;
+import org.apache.slider.providers.agent.application.metadata.MetainfoParser;
 import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
 import org.slf4j.Logger;
@@ -164,10 +164,10 @@ public class AgentClientProvider extends AbstractClientProvider
     names.remove(SliderKeys.COMPONENT_AM);
     Map<Integer, String> priorityMap = new HashMap<Integer, String>();
 
-    MetaInfo metaInfo = null;
+    Metainfo metaInfo = null;
     if (fs != null) {
       try {
-        metaInfo = AgentUtils.getApplicationMetaInfo(fs, appDef);
+        metaInfo = AgentUtils.getApplicationMetainfo(fs, appDef);
       } catch (IOException ioe) {
         // Ignore missing metainfo file for now
         log.info("Missing metainfo {}", ioe.getMessage());
@@ -218,8 +218,8 @@ public class AgentClientProvider extends AbstractClientProvider
         MapOperations componentConfig = resources.getMandatoryComponent(name);
         int count =
             componentConfig.getMandatoryOptionInt(ResourceKeys.COMPONENT_INSTANCES);
-        int definedMinCount = componentDef.getMinInstanceCount();
-        int definedMaxCount = componentDef.getMaxInstanceCount();
+        int definedMinCount = componentDef.getMinInstanceCountInt();
+        int definedMaxCount = componentDef.getMaxInstanceCountInt();
         if (count < definedMinCount || count > definedMaxCount) {
           throw new BadConfigException("Component %s, %s value %d out of range. "
                                        + "Expected minimum is %d and maximum is %d",
@@ -265,9 +265,9 @@ public class AgentClientProvider extends AbstractClientProvider
   public Set<String> getApplicationTags(SliderFileSystem fileSystem,
                                         String appDef) throws SliderException {
     Set<String> tags;
-    MetaInfo metainfo;
+    Metainfo metainfo;
     try {
-      metainfo = AgentUtils.getApplicationMetaInfo(fileSystem, appDef);
+      metainfo = AgentUtils.getApplicationMetainfo(fileSystem, appDef);
     } catch (IOException e) {
       log.error("Error retrieving metainfo from {}", appDef, e);
       throw new SliderException("Error retrieving metainfo", e);
@@ -306,7 +306,7 @@ public class AgentClientProvider extends AbstractClientProvider
     File cmdDir = new File(tmpDir, "command");
     cmdDir.mkdir();
 
-    MetaInfo metaInfo = null;
+    Metainfo metaInfo = null;
     JSONObject defaultConfig = null;
     try {
       // expand app package into /app_pkg
@@ -326,7 +326,19 @@ public class AgentClientProvider extends AbstractClientProvider
                 while (offset < size) {
                   offset += zipInputStream.read(content, offset, size - offset);
                 }
-                metaInfo = new MetaInfoParser().fromInputStream(new ByteArrayInputStream(content));
+                metaInfo = new MetainfoParser().fromXmlStream(new ByteArrayInputStream(content));
+              }
+            } else if ("metainfo.json".equals(zipEntry.getName())) {
+              int size = (int) zipEntry.getSize();
+              if (size != -1) {
+                log.info("Reading {} of size {}", zipEntry.getName(),
+                         zipEntry.getSize());
+                byte[] content = new byte[size];
+                int offset = 0;
+                while (offset < size) {
+                  offset += zipInputStream.read(content, offset, size - offset);
+                }
+                metaInfo = new MetainfoParser().fromJsonStream(new ByteArrayInputStream(content));
               }
             } else if ("clientInstallConfig-default.json".equals(zipEntry.getName())) {
               int size = (int) zipEntry.getSize();
@@ -361,7 +373,7 @@ public class AgentClientProvider extends AbstractClientProvider
       }
 
       if (metaInfo == null) {
-        throw new SliderException("Not a valid app package. Could not read metainfo.xml.");
+        throw new SliderException("Not a valid app package. Could not read metainfo.");
       }
 
       expandAgentTar(agentPkgDir);
@@ -502,7 +514,7 @@ public class AgentClientProvider extends AbstractClientProvider
 
   protected JSONObject getCommandJson(JSONObject defaultConfig,
                                       JSONObject inputConfig,
-                                      MetaInfo metainfo,
+                                      Metainfo metainfo,
                                       File clientInstallPath) throws SliderException {
     try {
       JSONObject pkgList = new JSONObject();

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
index b98795a..b624221 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
@@ -66,16 +66,19 @@ import org.apache.slider.providers.AbstractProviderService;
 import org.apache.slider.providers.ProviderCore;
 import org.apache.slider.providers.ProviderRole;
 import org.apache.slider.providers.ProviderUtils;
-import org.apache.slider.providers.agent.application.metadata.json.Application;
-import org.apache.slider.providers.agent.application.metadata.json.CommandScript;
-import org.apache.slider.providers.agent.application.metadata.json.Component;
-import org.apache.slider.providers.agent.application.metadata.json.ComponentCommand;
-import org.apache.slider.providers.agent.application.metadata.json.ConfigFile;
+import org.apache.slider.providers.agent.application.metadata.Application;
+import org.apache.slider.providers.agent.application.metadata.CommandScript;
+import org.apache.slider.providers.agent.application.metadata.Component;
+import org.apache.slider.providers.agent.application.metadata.ComponentCommand;
+import org.apache.slider.providers.agent.application.metadata.ComponentExport;
+import org.apache.slider.providers.agent.application.metadata.ConfigFile;
 import org.apache.slider.providers.agent.application.metadata.DefaultConfig;
-import org.apache.slider.providers.agent.application.metadata.json.Export;
-import org.apache.slider.providers.agent.application.metadata.json.ExportGroup;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
-import org.apache.slider.providers.agent.application.metadata.json.Package;
+import org.apache.slider.providers.agent.application.metadata.Export;
+import org.apache.slider.providers.agent.application.metadata.ExportGroup;
+import org.apache.slider.providers.agent.application.metadata.Metainfo;
+import org.apache.slider.providers.agent.application.metadata.OSPackage;
+import org.apache.slider.providers.agent.application.metadata.OSSpecific;
+import org.apache.slider.providers.agent.application.metadata.Package;
 import org.apache.slider.providers.agent.application.metadata.PropertyInfo;
 import org.apache.slider.server.appmaster.actions.ProviderReportedContainerLoss;
 import org.apache.slider.server.appmaster.actions.RegisterComponentInstance;
@@ -155,7 +158,7 @@ public class AgentProviderService extends AbstractProviderService implements
   private int heartbeatMonitorInterval = 0;
   private AgentClientProvider clientProvider;
   private AtomicInteger taskId = new AtomicInteger(0);
-  private volatile MetaInfo metaInfo = null;
+  private volatile Metainfo metaInfo = null;
   private Map<String, DefaultConfig> defaultConfigs = null;
   private ComponentCommandOrder commandOrder = null;
   private HeartbeatMonitor monitor;
@@ -240,8 +243,8 @@ public class AgentProviderService extends AbstractProviderService implements
       MapOperations componentConfig = resources.getMandatoryComponent(name);
       int count =
           componentConfig.getMandatoryOptionInt(ResourceKeys.COMPONENT_INSTANCES);
-      int definedMinCount = componentDef.getMinInstanceCount();
-      int definedMaxCount = componentDef.getMaxInstanceCount();
+      int definedMinCount = componentDef.getMinInstanceCountInt();
+      int definedMaxCount = componentDef.getMaxInstanceCountInt();
       if (count < definedMinCount || count > definedMaxCount) {
         throw new BadConfigException("Component %s, %s value %d out of range. "
                                      + "Expected minimum is %d and maximum is %d",
@@ -272,8 +275,7 @@ public class AgentProviderService extends AbstractProviderService implements
             throw new SliderException(
                 "metainfo.xml is required in app package.");
           }
-          commandOrder = new ComponentCommandOrder(metaInfo.getApplication()
-                                                       .getCommandOrders());
+          commandOrder = new ComponentCommandOrder(metaInfo.getApplication().getCommandOrders());
           defaultConfigs = initializeDefaultConfigs(fileSystem, appDef, metaInfo);
           monitor = new HeartbeatMonitor(this, getHeartbeatMonitorInterval());
           monitor.start();
@@ -891,6 +893,7 @@ public class AgentProviderService extends AbstractProviderService implements
       }
     }
 
+    processAndPublishComponentSpecificData(ports, containerId, fqdn, roleName);
     processAndPublishComponentSpecificExports(ports, containerId, fqdn, roleName);
 
     // and update registration entries
@@ -1043,7 +1046,7 @@ public class AgentProviderService extends AbstractProviderService implements
   }
 
   @VisibleForTesting
-  protected MetaInfo getMetaInfo() {
+  protected Metainfo getMetaInfo() {
     return this.metaInfo;
   }
 
@@ -1053,9 +1056,9 @@ public class AgentProviderService extends AbstractProviderService implements
   }
 
   @VisibleForTesting
-  protected MetaInfo getApplicationMetainfo(SliderFileSystem fileSystem,
+  protected Metainfo getApplicationMetainfo(SliderFileSystem fileSystem,
                                             String appDef) throws IOException, BadConfigException {
-    return AgentUtils.getApplicationMetaInfo(fileSystem, appDef);
+    return AgentUtils.getApplicationMetainfo(fileSystem, appDef);
   }
 
   @VisibleForTesting
@@ -1075,7 +1078,7 @@ public class AgentProviderService extends AbstractProviderService implements
    * @throws IOException
    */
   protected Map<String, DefaultConfig> initializeDefaultConfigs(SliderFileSystem fileSystem,
-                                                                String appDef, MetaInfo metainfo) throws IOException {
+                                                                String appDef, Metainfo metainfo) throws IOException {
     Map<String, DefaultConfig> defaultConfigMap = new HashMap<>();
     if (SliderUtils.isNotEmpty(metainfo.getApplication().getConfigFiles())) {
       for (ConfigFile configFile : metainfo.getApplication().getConfigFiles()) {
@@ -1392,6 +1395,56 @@ public class AgentProviderService extends AbstractProviderService implements
     }
   }
 
+  /** Publish component instance specific data if the component demands it */
+  protected void processAndPublishComponentSpecificData(Map<String, String> ports,
+                                                        String containerId,
+                                                        String hostFqdn,
+                                                        String componentName) {
+    String portVarFormat = "${site.%s}";
+    String hostNamePattern = "${THIS_HOST}";
+    Map<String, String> toPublish = new HashMap<String, String>();
+
+    Application application = getMetaInfo().getApplication();
+    for (Component component : application.getComponents()) {
+      if (component.getName().equals(componentName)) {
+        if (component.getComponentExports().size() > 0) {
+
+          for (ComponentExport export : component.getComponentExports()) {
+            String templateToExport = export.getValue();
+            for (String portName : ports.keySet()) {
+              boolean publishData = false;
+              String portValPattern = String.format(portVarFormat, portName);
+              if (templateToExport.contains(portValPattern)) {
+                templateToExport = templateToExport.replace(portValPattern, ports.get(portName));
+                publishData = true;
+              }
+              if (templateToExport.contains(hostNamePattern)) {
+                templateToExport = templateToExport.replace(hostNamePattern, hostFqdn);
+                publishData = true;
+              }
+              if (publishData) {
+                toPublish.put(export.getName(), templateToExport);
+                log.info("Publishing {} for name {} and container {}",
+                         templateToExport, export.getName(), containerId);
+              }
+            }
+          }
+        }
+      }
+    }
+
+    if (toPublish.size() > 0) {
+      Map<String, String> perContainerData = null;
+      if (!getComponentInstanceData().containsKey(containerId)) {
+        perContainerData = new ConcurrentHashMap<String, String>();
+      } else {
+        perContainerData = getComponentInstanceData().get(containerId);
+      }
+      perContainerData.putAll(toPublish);
+      getComponentInstanceData().put(containerId, perContainerData);
+      publishComponentInstanceData();
+    }
+  }
 
   /** Publish component instance specific data if the component demands it */
   protected void processAndPublishComponentSpecificExports(Map<String, String> ports,
@@ -1564,7 +1617,7 @@ public class AgentProviderService extends AbstractProviderService implements
   protected boolean isMarkedAutoRestart(String roleName) {
     Component component = getApplicationComponent(roleName);
     if (component != null) {
-      return component.getAutoStartOnFailure();
+      return component.getAutoStartOnFailureBoolean();
     }
     return false;
   }
@@ -1692,9 +1745,22 @@ public class AgentProviderService extends AbstractProviderService implements
     String pkgListFormatString = "[%s]";
     List<String> packages = new ArrayList();
     if (application != null) {
-      List<Package> appPackages = application.getPackages();
-      for (Package appPackage : appPackages){
-        packages.add(String.format(pkgFormatString, appPackage.getType(), appPackage.getName()));
+      if (application.getPackages().size() > 0) {
+        List<Package> appPackages = application.getPackages();
+        for (Package appPackage : appPackages) {
+          packages.add(String.format(pkgFormatString, appPackage.getType(), appPackage.getName()));
+        }
+      } else {
+        List<OSSpecific> osSpecifics = application.getOSSpecifics();
+        if (osSpecifics != null && osSpecifics.size() > 0) {
+          for (OSSpecific osSpecific : osSpecifics) {
+            if (osSpecific.getOsType().equals("any")) {
+              for (OSPackage osPackage : osSpecific.getPackages()) {
+                packages.add(String.format(pkgFormatString, osPackage.getType(), osPackage.getName()));
+              }
+            }
+          }
+        }
       }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/AgentUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentUtils.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentUtils.java
index 2795692..6fe1161 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentUtils.java
@@ -16,7 +16,6 @@
  */
 package org.apache.slider.providers.agent;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.slider.common.tools.SliderFileSystem;
@@ -26,16 +25,12 @@ import org.apache.slider.providers.agent.application.metadata.DefaultConfig;
 import org.apache.slider.providers.agent.application.metadata.DefaultConfigParser;
 import org.apache.slider.providers.agent.application.metadata.Metainfo;
 import org.apache.slider.providers.agent.application.metadata.MetainfoParser;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfoParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.FileNotFoundException;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.StringWriter;
 
 /**
  *
@@ -43,33 +38,32 @@ import java.io.StringWriter;
 public class AgentUtils {
   private static final Logger log = LoggerFactory.getLogger(AgentUtils.class);
 
-  public static MetaInfo getApplicationMetaInfo(SliderFileSystem fileSystem,
-                                                String appDef) throws IOException, BadConfigException   {
+  public static Metainfo getApplicationMetainfo(SliderFileSystem fileSystem,
+                                                String appDef) throws IOException, BadConfigException {
     log.info("Reading metainfo at {}", appDef);
     FileSystem fs = fileSystem.getFileSystem();
     Path appPath = new Path(appDef);
 
-    MetaInfo metaInfo = null;
+    Metainfo metainfo = null;
+    MetainfoParser metainfoParser = new MetainfoParser();
     InputStream metainfoJsonStream = SliderUtils.getApplicationResourceInputStream(
         fs, appPath, "metainfo.json");
     if (metainfoJsonStream == null) {
       InputStream metainfoXMLStream = SliderUtils.getApplicationResourceInputStream(
           fs, appPath, "metainfo.xml");
       if (metainfoXMLStream != null) {
-        Metainfo metaInfoFromXML = new MetainfoParser().parse(metainfoXMLStream);
-        metaInfo = MetaInfo.upConverted(metaInfoFromXML);
+        metainfo = metainfoParser.fromXmlStream(metainfoXMLStream);
       }
     } else {
-      MetaInfoParser parser = new MetaInfoParser();
-      metaInfo = parser.fromInputStream(metainfoJsonStream);
+      metainfo = metainfoParser.fromJsonStream(metainfoJsonStream);
     }
 
-    if (metaInfo == null) {
+    if (metainfo == null) {
       log.error("metainfo is unavailable at {}.", appDef);
       throw new FileNotFoundException("metainfo.xml/json is required in app package. " +
                                       appPath);
     }
-    return metaInfo;
+    return metainfo;
   }
 
   static DefaultConfig getDefaultConfig(SliderFileSystem fileSystem,

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/ComponentCommandOrder.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/ComponentCommandOrder.java b/slider-core/src/main/java/org/apache/slider/providers/agent/ComponentCommandOrder.java
index 8e41b6b..194d6ff 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/ComponentCommandOrder.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/ComponentCommandOrder.java
@@ -18,7 +18,7 @@
 
 package org.apache.slider.providers.agent;
 
-import org.apache.slider.providers.agent.application.metadata.json.CommandOrder;
+import org.apache.slider.providers.agent.application.metadata.CommandOrder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Application.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Application.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Application.java
index bc43d4b..cd5555f 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Application.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Application.java
@@ -16,29 +16,31 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.apache.slider.common.tools.SliderUtils;
+import org.apache.slider.core.exceptions.BadCommandArgumentsException;
+import org.apache.slider.core.exceptions.SliderException;
+import org.codehaus.jackson.annotate.JsonProperty;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Application type defined in the metainfo
  */
-public class Application {
+public class Application implements Validate {
   String name;
   String comment;
   String version;
   String exportedConfigs;
-  List<Component> components;
-  List<ExportGroup> exportGroups;
-  List<OSSpecific> osSpecifics;
-  List<CommandOrder> commandOrders;
-  List<ConfigFile> configFiles;
+  List<Component> components = new ArrayList<>();
+  List<ExportGroup> exportGroups = new ArrayList<>();
+  List<OSSpecific> osSpecifics = new ArrayList<>();
+  List<CommandOrder> commandOrders = new ArrayList<>();
+  List<ConfigFile> configFiles = new ArrayList<>();
+  List<Package> packages = new ArrayList<>();
 
   public Application() {
-    exportGroups = new ArrayList<ExportGroup>();
-    components = new ArrayList<Component>();
-    osSpecifics = new ArrayList<OSSpecific>();
-    commandOrders = new ArrayList<CommandOrder>();
-    configFiles = new ArrayList<ConfigFile>();
   }
 
   public String getName() {
@@ -73,18 +75,20 @@ public class Application {
     this.exportedConfigs = exportedConfigs;
   }
 
-  public List<ConfigFile> getConfigFiles() {
-    return configFiles;
-  }
-
   public void addConfigFile(ConfigFile configFile) {
     this.configFiles.add(configFile);
   }
 
+  @JsonProperty("configFiles")
+  public List<ConfigFile> getConfigFiles() {
+    return configFiles;
+  }
+
   public void addComponent(Component component) {
     components.add(component);
   }
 
+  @JsonProperty("components")
   public List<Component> getComponents() {
     return components;
   }
@@ -93,6 +97,7 @@ public class Application {
     exportGroups.add(exportGroup);
   }
 
+  @JsonProperty("exportGroups")
   public List<ExportGroup> getExportGroups() {
     return exportGroups;
   }
@@ -101,6 +106,7 @@ public class Application {
     osSpecifics.add(osSpecific);
   }
 
+  @JsonIgnore
   public List<OSSpecific> getOSSpecifics() {
     return osSpecifics;
   }
@@ -109,10 +115,16 @@ public class Application {
     commandOrders.add(commandOrder);
   }
 
-  public List<CommandOrder> getCommandOrder() {
+  @JsonProperty("commandOrders")
+  public List<CommandOrder> getCommandOrders() {
     return commandOrders;
   }
 
+  @JsonProperty("packages")
+  public List<Package> getPackages() {
+    return packages;
+  }
+
   @Override
   public String toString() {
     final StringBuilder sb =
@@ -128,4 +140,54 @@ public class Application {
     sb.append('}');
     return sb.toString();
   }
+
+  public void validate(String version) throws SliderException {
+    if(SliderUtils.isUnset(version)) {
+      throw new BadCommandArgumentsException("schema version cannot be null");
+    }
+
+    Metainfo.checkNonNull(getName(), "name", "application");
+
+    Metainfo.checkNonNull(getVersion(), "version", "application");
+
+    if(getComponents().size() == 0) {
+      throw new SliderException("application must contain at least one component");
+    }
+
+    if(version.equals(Metainfo.VERSION_TWO_ZERO)) {
+      if(getPackages().size() > 0) {
+        throw new SliderException("packages is not supported in version " + version);
+      }
+    }
+
+    if(version.equals(Metainfo.VERSION_TWO_ONE)) {
+      if(getOSSpecifics().size() > 0) {
+        throw new SliderException("osSpecifics is not supported in version " + version);
+      }
+    }
+
+    for(CommandOrder co : getCommandOrders()) {
+      co.validate(version);
+    }
+
+    for(Component comp : getComponents()) {
+      comp.validate(version);
+    }
+
+    for(ConfigFile cf : getConfigFiles()) {
+      cf.validate(version);
+    }
+
+    for(ExportGroup eg : getExportGroups()) {
+      eg.validate(version);
+    }
+
+    for(Package pkg : getPackages()) {
+      pkg.validate(version);
+    }
+
+    for(OSSpecific os : getOSSpecifics()) {
+      os.validate(version);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandOrder.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandOrder.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandOrder.java
index 825a104..40d8cc6 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandOrder.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandOrder.java
@@ -16,10 +16,12 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 /**
  *
  */
-public class CommandOrder {
+public class CommandOrder implements Validate {
   String command;
   String requires;
 
@@ -51,4 +53,9 @@ public class CommandOrder {
     sb.append('}');
     return sb.toString();
   }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getCommand(), "command", "package");
+    Metainfo.checkNonNull(getRequires(), "requires", "package");
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandScript.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandScript.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandScript.java
index 612322f..9915ba1 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandScript.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/CommandScript.java
@@ -16,10 +16,12 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 /**
- *
+ * CommandScript that implements all component commands
  */
-public class CommandScript {
+public class CommandScript implements Validate {
   String script;
   String scriptType;
   long timeout;
@@ -62,4 +64,9 @@ public class CommandScript {
     sb.append('}');
     return sb.toString();
   }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getScript(), "script", "commandScript");
+    Metainfo.checkNonNull(getScriptType(), "scriptType", "commandScript");
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Component.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Component.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Component.java
index 418868c..9ed07e6 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Component.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Component.java
@@ -19,6 +19,7 @@ package org.apache.slider.providers.agent.application.metadata;
 import org.apache.slider.common.tools.SliderUtils;
 import org.apache.slider.core.exceptions.BadConfigException;
 import org.apache.slider.core.exceptions.SliderException;
+import org.codehaus.jackson.annotate.JsonProperty;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -26,21 +27,29 @@ import java.util.List;
 /**
  *
  */
-public class Component {
+public class Component implements Validate {
+
+  public static String TYPE_STANDARD = "STANDARD";
+  public static String TYPE_DOCKER = "DOCKER";
+  public static String CATEGORY_MASTER = "MASTER";
+  public static String CATEGORY_SLAVE = "SLAVE";
+  public static String CATEGORY_CLIENT = "CLIENT";
+
   String name;
-  String category;
-  String publishConfig;
-  String minInstanceCount;
+  String category = CATEGORY_MASTER;
+  String publishConfig = Boolean.FALSE.toString();
+  String minInstanceCount = "1";
   String maxInstanceCount;
-  String autoStartOnFailure;
+  String autoStartOnFailure = Boolean.FALSE.toString();
   String appExports;
   String compExports;
   CommandScript commandScript;
-  List<ComponentExport> componentExports;
+  String type = TYPE_STANDARD;
+  List<ComponentExport> componentExports = new ArrayList<>();
+  List<ComponentCommand> commands = new ArrayList<>();
+  List<DockerContainer> dockerContainers = new ArrayList<>();
 
   public Component() {
-    publishConfig = Boolean.FALSE.toString();
-    componentExports = new ArrayList<ComponentExport>();
   }
 
   public String getName() {
@@ -51,6 +60,14 @@ public class Component {
     this.name = name;
   }
 
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
   public String getCategory() {
     return category;
   }
@@ -95,6 +112,14 @@ public class Component {
     return minInstanceCount;
   }
 
+  public Boolean getAutoStartOnFailureBoolean() {
+    if (SliderUtils.isUnset(getAutoStartOnFailure())) {
+      return Boolean.FALSE;
+    }
+
+    return Boolean.parseBoolean(getAutoStartOnFailure());
+  }
+
   public int getMinInstanceCountInt() throws BadConfigException {
     if (SliderUtils.isUnset(minInstanceCount)) {
       return 0;
@@ -151,6 +176,16 @@ public class Component {
     return Boolean.parseBoolean(this.autoStartOnFailure);
   }
 
+  @JsonProperty("commands")
+  public List<ComponentCommand> getCommands() {
+    return this.commands;
+  }
+
+  @JsonProperty("dockerContainers")
+  public List<DockerContainer> getDockerContainers() {
+    return this.dockerContainers;
+  }
+
   @Override
   public String toString() {
     final StringBuilder sb =
@@ -162,9 +197,47 @@ public class Component {
     return sb.toString();
   }
 
-  class AutoRestartSettings {
-    private boolean requiresAutoRestart;
-    private int maxFailures;
-    private int inThisManyMinutes;
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "component");
+    Metainfo.checkNonNull(getCategory(), "category", "component");
+    if (!getCategory().equals(CATEGORY_MASTER)
+        && !getCategory().equals(CATEGORY_SLAVE)
+        && !getCategory().equals(CATEGORY_CLIENT)) {
+      throw new SliderException("Invalid category for the component " + getCategory());
+    }
+
+    Metainfo.checkNonNull(getType(), "type", "component");
+    if (!getType().equals(TYPE_DOCKER)
+        && !getType().equals(TYPE_STANDARD)) {
+      throw new SliderException("Invalid type for the component " + getType());
+    }
+
+    if (version.equals(Metainfo.VERSION_TWO_ZERO)) {
+      if (getType().equals(TYPE_DOCKER)) {
+        throw new SliderException(TYPE_DOCKER + " is not supported in version " + Metainfo.VERSION_TWO_ZERO);
+      }
+
+      if (getCommands().size() > 0) {
+        throw new SliderException("commands are not supported in version " + Metainfo.VERSION_TWO_ZERO);
+      }
+
+      if (getDockerContainers().size() > 0) {
+        throw new SliderException("containers are not supported in version " + Metainfo.VERSION_TWO_ZERO);
+      }
+    }
+
+    if (commandScript != null) {
+      commandScript.validate(version);
+    }
+
+    if (version.equals(Metainfo.VERSION_TWO_ONE)) {
+      for (DockerContainer dc : getDockerContainers()) {
+        dc.validate(version);
+      }
+
+      for (ComponentCommand cc : getCommands()) {
+        cc.validate(version);
+      }
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ComponentCommand.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ComponentCommand.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ComponentCommand.java
new file mode 100644
index 0000000..2724dbd
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ComponentCommand.java
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+package org.apache.slider.providers.agent.application.metadata;
+
+import org.apache.slider.core.exceptions.SliderException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents the metadata associated with the application.
+ */
+public class ComponentCommand implements Validate {
+  protected static final Logger
+      log = LoggerFactory.getLogger(ComponentCommand.class);
+
+
+  private String exec;
+  private String name = "START";
+  private String type = "SHELL";
+
+  /**
+   * Creator.
+   */
+  public ComponentCommand() {
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setExec(String exec) {
+    this.exec = exec;
+  }
+
+  public String getExec() {
+    return exec;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "componentCommand");
+
+    Metainfo.checkNonNull(getType(), "version", "application");
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ConfigFile.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ConfigFile.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ConfigFile.java
index b9dfb4e..cb47512 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ConfigFile.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ConfigFile.java
@@ -16,10 +16,12 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 /**
  *
  */
-public class ConfigFile {
+public class ConfigFile implements Validate {
   String type;
   String fileName;
   String dictionaryName;
@@ -50,4 +52,8 @@ public class ConfigFile {
   public void setDictionaryName(String dictionaryName) {
     this.dictionaryName = dictionaryName;
   }
+
+  public void validate(String version) throws SliderException {
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainer.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainer.java
new file mode 100644
index 0000000..3117f3b
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainer.java
@@ -0,0 +1,91 @@
+/*
+ * 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.
+ */
+
+package org.apache.slider.providers.agent.application.metadata;
+
+import org.apache.slider.core.exceptions.SliderException;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a docker container
+ */
+public class DockerContainer implements Validate {
+  protected static final Logger
+      log = LoggerFactory.getLogger(DockerContainer.class);
+
+
+  private String name;
+  private String image;
+  private String options;
+  private List<DockerContainerMount> mounts = new ArrayList<>();
+  private List<DockerContainerPort> ports = new ArrayList<>();
+
+
+  public DockerContainer() {
+  }
+
+  @JsonProperty("mounts")
+  public List<DockerContainerMount> getMounts() {
+    return this.mounts;
+  }
+
+  @JsonProperty("ports")
+  public List<DockerContainerPort> getPorts() {
+    return this.ports;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getImage() {
+    return image;
+  }
+
+  public void setImage(String image) {
+    this.image = image;
+  }
+
+  public String getOptions() {
+    return options;
+  }
+
+  public void setOptions(String options) {
+    this.options = options;
+  }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "dockerContainer");
+    Metainfo.checkNonNull(getImage(), "image", "dockerContainer");
+    for (DockerContainerMount dcm : getMounts()) {
+      dcm.validate(version);
+    }
+    for (DockerContainerPort dcp : getPorts()) {
+      dcp.validate(version);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerMount.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerMount.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerMount.java
new file mode 100644
index 0000000..760e15e
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerMount.java
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+package org.apache.slider.providers.agent.application.metadata;
+
+import org.apache.slider.core.exceptions.SliderException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents a docker container mount
+ */
+public class DockerContainerMount implements Validate {
+  protected static final Logger
+      log = LoggerFactory.getLogger(DockerContainerMount.class);
+
+
+  private String containerMount;
+  private String hostMount;
+
+  public DockerContainerMount() {
+  }
+
+  public String getContainerMount() {
+    return containerMount;
+  }
+
+  public void setContainerMount(String containerMount) {
+    this.containerMount = containerMount;
+  }
+
+  public String getHostMount() {
+    return hostMount;
+  }
+
+  public void setHostMount(String hostMount) {
+    this.hostMount = hostMount;
+  }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getContainerMount(), "containerMount", "dockerContainerMount");
+    Metainfo.checkNonNull(getHostMount(), "hostMount", "dockerContainerMount");
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerPort.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerPort.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerPort.java
new file mode 100644
index 0000000..7e717f1
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/DockerContainerPort.java
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+package org.apache.slider.providers.agent.application.metadata;
+
+import org.apache.slider.core.exceptions.SliderException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents a docker container port
+ */
+public class DockerContainerPort implements Validate {
+  protected static final Logger
+      log = LoggerFactory.getLogger(DockerContainerPort.class);
+
+
+  private String containerPort;
+  private String hostPort;
+
+  public DockerContainerPort() {
+  }
+
+  public String getContainerPort() {
+    return containerPort;
+  }
+
+  public void setContainerPort(String containerPort) {
+    this.containerPort = containerPort;
+  }
+
+  public String getHostPort() {
+    return hostPort;
+  }
+
+  public void setHostPort(String hostPort) {
+    this.hostPort = hostPort;
+  }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getContainerPort(), "containerPort", "dockerContainerPort");
+    Metainfo.checkNonNull(getHostPort(), "hostPort", "dockerContainerPort");
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Export.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Export.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Export.java
index 17326a3..5e0fb24 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Export.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Export.java
@@ -16,10 +16,12 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 /**
  *
  */
-public class Export {
+public class Export implements Validate {
   String name;
   String value;
 
@@ -51,4 +53,9 @@ public class Export {
     sb.append('}');
     return sb.toString();
   }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "export");
+    Metainfo.checkNonNull(getValue(), "value", "export");
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ExportGroup.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ExportGroup.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ExportGroup.java
index d2e20a4..3d9f34c 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ExportGroup.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/ExportGroup.java
@@ -16,13 +16,15 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  *
  */
-public class ExportGroup {
+public class ExportGroup implements Validate {
   String name;
   List<Export> exports;
 
@@ -59,4 +61,11 @@ public class ExportGroup {
     sb.append('}');
     return sb.toString();
   }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "exportGroup");
+    for(Export exp : getExports()) {
+      exp.validate(version);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Metainfo.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Metainfo.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Metainfo.java
index ea23678..f89846e 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Metainfo.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Metainfo.java
@@ -16,7 +16,8 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
-import org.apache.slider.providers.agent.application.metadata.json.MetaInfo;
+import org.apache.slider.common.tools.SliderUtils;
+import org.apache.slider.core.exceptions.SliderException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -26,19 +27,11 @@ import org.slf4j.LoggerFactory;
 public class Metainfo {
   protected static final Logger log =
       LoggerFactory.getLogger(Metainfo.class);
+  public static String VERSION_TWO_ZERO = "2.0";
+  public static String VERSION_TWO_ONE = "2.1";
 
   String schemaVersion;
   Application application;
-  MetaInfo jsonEncoded;
-
-  public Metainfo() {
-  }
-
-  // TODO: Temporary code - the plan is to move to the json parsed MetaInfo
-  public Metainfo(MetaInfo jsonEncoded) {
-    jsonEncoded = jsonEncoded;
-    // initialize the class
-  }
 
   public String getSchemaVersion() {
     return schemaVersion;
@@ -58,7 +51,7 @@ public class Metainfo {
 
   public Component getApplicationComponent(String roleName) {
     if (application == null) {
-      log.error("Malformed app definition: Expect application as the top level element for metainfo.xml");
+      log.error("Malformed app definition: Expect application as the top level element for metainfo");
     } else {
       for (Component component : application.getComponents()) {
         if (component.getName().equals(roleName)) {
@@ -69,7 +62,18 @@ public class Metainfo {
     return null;
   }
 
-  public static Metainfo fromJsonObject(MetaInfo jsonEncoded) {
-    return new Metainfo(jsonEncoded);
+  public void validate() throws SliderException {
+    if (!VERSION_TWO_ONE.equals(schemaVersion) ||
+        !VERSION_TWO_ZERO.equals(schemaVersion)) {
+      throw new SliderException("Unsupported version " + getSchemaVersion());
+    }
+
+    application.validate(schemaVersion);
+  }
+
+  public static void checkNonNull(String value, String field, String type) throws SliderException {
+    if (SliderUtils.isUnset(value)) {
+      throw new SliderException(type + "." + field + " cannot be null");
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/MetainfoParser.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/MetainfoParser.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/MetainfoParser.java
index 1d8403f..12af586 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/MetainfoParser.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/MetainfoParser.java
@@ -16,18 +16,78 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import org.apache.commons.digester.Digester;
+import org.apache.commons.io.IOUtils;
 import org.xml.sax.SAXException;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.StringWriter;
 
 /**
  *
  */
 public class MetainfoParser {
+  private final GsonBuilder gsonBuilder = new GsonBuilder();
+  private final Gson gson;
 
-  public Metainfo parse(InputStream metainfoStream) throws IOException {
+  public MetainfoParser() {
+    gson = gsonBuilder.create();
+  }
+
+  /**
+   * Convert to a JSON string
+   *
+   * @return a JSON string description
+   *
+   * @throws IOException Problems mapping/writing the object
+   */
+  public String toJsonString(Metainfo metaInfo) throws IOException {
+    return gson.toJson(metaInfo);
+  }
+
+  /**
+   * Convert from JSON
+   *
+   * @param json input
+   *
+   * @return the parsed JSON
+   *
+   * @throws IOException IO
+   */
+  public Metainfo fromJsonString(String json)
+      throws IOException {
+    return gson.fromJson(json, Metainfo.class);
+  }
+
+  /**
+   * Parse metainfo from an IOStream
+   *
+   * @param is
+   *
+   * @return
+   *
+   * @throws IOException
+   */
+  public Metainfo fromJsonStream(InputStream is) throws IOException {
+    StringWriter writer = new StringWriter();
+    IOUtils.copy(is, writer);
+    return fromJsonString(writer.toString());
+  }
+
+
+  /**
+   * Parse metainfo from an XML formatted IOStream
+   *
+   * @param metainfoStream
+   *
+   * @return
+   *
+   * @throws IOException
+   */
+  public Metainfo fromXmlStream(InputStream metainfoStream) throws IOException {
     Digester digester = new Digester();
     digester.setValidating(false);
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSPackage.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSPackage.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSPackage.java
index 334f96b..32b4890 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSPackage.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSPackage.java
@@ -16,10 +16,12 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 /**
  *
  */
-public class OSPackage {
+public class OSPackage implements Validate {
   String type;
   String name;
 
@@ -41,4 +43,9 @@ public class OSPackage {
   public void setName(String name) {
     this.name = name;
   }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "osPackage");
+    Metainfo.checkNonNull(getType(), "type", "osPackage");
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSSpecific.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSSpecific.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSSpecific.java
index 7c36e8e..c06d498 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSSpecific.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/OSSpecific.java
@@ -16,13 +16,15 @@
  */
 package org.apache.slider.providers.agent.application.metadata;
 
+import org.apache.slider.core.exceptions.SliderException;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  *
  */
-public class OSSpecific {
+public class OSSpecific implements Validate {
   String osType;
   List<OSPackage> packages;
 
@@ -45,4 +47,11 @@ public class OSSpecific {
   public List<OSPackage> getPackages() {
     return packages;
   }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getOsType(), "osType", "osSpecific");
+    for (OSPackage opkg : getPackages()) {
+      opkg.validate(version);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Package.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Package.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Package.java
new file mode 100644
index 0000000..b88f77d
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Package.java
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ */
+
+package org.apache.slider.providers.agent.application.metadata;
+
+import org.apache.slider.core.exceptions.SliderException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents package description.
+ */
+public class Package implements Validate {
+  protected static final Logger
+      log = LoggerFactory.getLogger(Package.class);
+
+
+  private String name;
+  private String type;
+
+  public Package() {
+  }
+
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public void setType(String type) {
+    this.type = type;
+  }
+
+  public void validate(String version) throws SliderException {
+    Metainfo.checkNonNull(getName(), "name", "package");
+    Metainfo.checkNonNull(getType(), "type", "package");
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Validate.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Validate.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Validate.java
new file mode 100644
index 0000000..ef03dcd
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/Validate.java
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+package org.apache.slider.providers.agent.application.metadata;
+
+import org.apache.slider.core.exceptions.SliderException;
+
+/**
+ * Implementer provides a validate method
+ */
+public interface Validate {
+
+  public void validate(String version) throws SliderException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Application.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Application.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Application.java
deleted file mode 100644
index 4dfa18d..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Application.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents the metadata associated with the application.
- */
-public class Application {
-  protected static final Logger
-      log = LoggerFactory.getLogger(Application.class);
-
-
-  private String name;
-  private List<Component> components = new ArrayList<>();
-  private String comment;
-  private String version;
-  private String exportedConfigs;
-  private List<ExportGroup> exportGroups = new ArrayList<>();
-  private List<Package> packages = new ArrayList<>();
-  private List<CommandOrder> commandOrders = new ArrayList<>();
-  private List<ConfigFile> configFiles = new ArrayList<>();
-
-  public Application() {
-  }
-
-  @JsonProperty("components")
-  public List<Component> getComponents() {
-    return this.components;
-  }
-
-  @JsonProperty("exportGroups")
-  public List<ExportGroup> getExportGroups() {
-    return this.exportGroups;
-  }
-
-  @JsonProperty("packages")
-  public List<Package> getPackages() {
-    return this.packages;
-  }
-
-  @JsonProperty("commandOrders")
-  public List<CommandOrder> getCommandOrders() {
-    return this.commandOrders;
-  }
-
-  @JsonProperty("configFiles")
-  public List<ConfigFile> getConfigFiles() {
-    return this.configFiles;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  @JsonIgnore
-  public Component getApplicationComponent(String name) {
-    for (Component component : components) {
-      if (name.equals(component.getName())) {
-        return component;
-      }
-    }
-    return null;
-  }
-
-  public String getComment() {
-    return comment;
-  }
-
-  public void setComment(String comment) {
-    this.comment = comment;
-  }
-
-  public String getVersion() {
-    return version;
-  }
-
-  public void setVersion(String version) {
-    this.version = version;
-  }
-
-  public String getExportedConfigs() {
-    return exportedConfigs;
-  }
-
-  public void setExportedConfigs(String exportedConfigs) {
-    this.exportedConfigs = exportedConfigs;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandOrder.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandOrder.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandOrder.java
deleted file mode 100644
index 1ac12aa..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandOrder.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents package description.
- */
-public class CommandOrder {
-  protected static final Logger
-      log = LoggerFactory.getLogger(CommandOrder.class);
-
-
-  private String command;
-  private String requires;
-
-  /**
-   * Creator.
-   */
-  public CommandOrder() {
-  }
-
-
-  public void setCommand(String name) {
-    command = command;
-  }
-
-  public String getCommand() {
-    return command;
-  }
-
-  public void setRequires(String type) {
-    requires = requires;
-  }
-
-  public String getRequires() {
-    return requires;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandScript.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandScript.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandScript.java
deleted file mode 100644
index 51869a0..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/CommandScript.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents package description.
- */
-public class CommandScript {
-  protected static final Logger
-      log = LoggerFactory.getLogger(CommandScript.class);
-
-
-  private String script;
-  private String scriptType;
-  private long timeout;
-
-  /**
-   * Creator.
-   */
-  public CommandScript() {
-  }
-
-
-  public void setScript(String script) {
-    this.script = script;
-  }
-
-  public String getScript() {
-    return script;
-  }
-
-  public String getScriptType() {
-    return scriptType;
-  }
-
-  public void setScriptType(String scriptType) {
-    this.scriptType = scriptType;
-  }
-
-  public long getTimeout() {
-    return timeout;
-  }
-
-  public void setTimeout(long timeout) {
-    this.timeout = timeout;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Component.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Component.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Component.java
deleted file mode 100644
index 84147a3..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Component.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents the metadata associated with the application.
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-public class Component {
-  protected static final Logger
-      log = LoggerFactory.getLogger(Component.class);
-
-  private String name;
-  private String compExports;
-  private String category = "MASTER";
-  private String publishConfig;
-  private String type;
-  private int minInstanceCount = 1;
-  private int maxInstanceCount = Integer.MAX_VALUE;
-  private Boolean autoStartOnFailure = false;
-  private String appExports;
-  private CommandScript commandScript;
-  private List<ComponentCommand> commands = new ArrayList<ComponentCommand>();
-  private List<Container> containers = new ArrayList<Container>();
-
-  public Component() {
-  }
-
-  @JsonProperty("commands")
-  public List<ComponentCommand> getCommands() {
-    return this.commands;
-  }
-
-  @JsonProperty("containers")
-  public List<Container> getContainers() {
-    return this.containers;
-  }
-
-  public CommandScript getCommandScript() {
-    return commandScript;
-  }
-
-  public void setCommandScript(CommandScript commandScript) {
-    this.commandScript = commandScript;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public String getCompExports() {
-    return compExports;
-  }
-
-  public void setCompExports(String compExports) {
-    this.compExports = compExports;
-  }
-
-  public String getCategory() {
-    return category;
-  }
-
-  public void setCategory(String category) {
-    this.category = category;
-  }
-
-  public String getPublishConfig() {
-    return publishConfig;
-  }
-
-  public void setPublishConfig(String publishConfig) {
-    this.publishConfig = publishConfig;
-  }
-
-  public int getMinInstanceCount() {
-    return minInstanceCount;
-  }
-
-  public void setMinInstanceCount(int minInstanceCount) {
-    this.minInstanceCount = minInstanceCount;
-  }
-
-  public int getMaxInstanceCount() {
-    return maxInstanceCount;
-  }
-
-  public void setMaxInstanceCount(int maxInstanceCount) {
-    this.maxInstanceCount = maxInstanceCount;
-  }
-
-  public Boolean getAutoStartOnFailure() {
-    return autoStartOnFailure;
-  }
-
-  public void setAutoStartOnFailure(Boolean autoStartOnFailure) {
-    this.autoStartOnFailure = autoStartOnFailure;
-  }
-
-  public String getAppExports() {
-    return appExports;
-  }
-
-  public void setAppExports(String appExports) {
-    this.appExports = appExports;
-  }
-
-  public String getType() {
-    return type;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ComponentCommand.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ComponentCommand.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ComponentCommand.java
deleted file mode 100644
index aa7f3c3..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ComponentCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents the metadata associated with the application.
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-public class ComponentCommand {
-  protected static final Logger
-      log = LoggerFactory.getLogger(ComponentCommand.class);
-
-
-  private String exec;
-  private String name = "START";
-  private String type = "SHELL";
-
-  /**
-   * Creator.
-   */
-  public ComponentCommand() {
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setExec(String exec) {
-    this.exec = exec;
-  }
-
-  public String getExec() {
-    return exec;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-
-  public String getType() {
-    return type;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ConfigFile.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ConfigFile.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ConfigFile.java
deleted file mode 100644
index 9a83f35..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ConfigFile.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.
- */
-package org.apache.slider.providers.agent.application.metadata.json;
-
-/**
- *
- */
-public class ConfigFile {
-  String type;
-  String fileName;
-  String dictionaryName;
-
-  public ConfigFile() {
-  }
-
-  public String getType() {
-    return type;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-
-  public String getFileName() {
-    return fileName;
-  }
-
-  public void setFileName(String fileName) {
-    this.fileName = fileName;
-  }
-
-  public String getDictionaryName() {
-    return dictionaryName;
-  }
-
-  public void setDictionaryName(String dictionaryName) {
-    this.dictionaryName = dictionaryName;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Container.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Container.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Container.java
deleted file mode 100644
index e95406e..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/Container.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents a docker container
- */
-public class Container {
-  protected static final Logger
-      log = LoggerFactory.getLogger(Container.class);
-
-
-  private String name;
-  private String image;
-  private String options;
-  private List<ContainerMount> mounts = new ArrayList<>();
-  private List<ContainerPort> ports = new ArrayList<>();
-
-
-  public Container() {
-  }
-
-  @JsonProperty("mounts")
-  public List<ContainerMount> getMounts() {
-    return this.mounts;
-  }
-
-  @JsonProperty("ports")
-  public List<ContainerPort> getPorts() {
-    return this.ports;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public String getImage() {
-    return image;
-  }
-
-  public void setImage(String image) {
-    this.image = image;
-  }
-
-  public String getOptions() {
-    return options;
-  }
-
-  public void setOptions(String options) {
-    this.options = options;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerMount.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerMount.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerMount.java
deleted file mode 100644
index b31b602..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerMount.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents a docker container mount
- */
-public class ContainerMount {
-  protected static final Logger
-      log = LoggerFactory.getLogger(ContainerMount.class);
-
-
-  private String containerMount;
-  private String hostMount;
-
-  public ContainerMount() {
-  }
-
-  public String getContainerMount() {
-    return containerMount;
-  }
-
-  public void setContainerMount(String containerMount) {
-    this.containerMount = containerMount;
-  }
-
-  public String getHostMount() {
-    return hostMount;
-  }
-
-  public void setHostMount(String hostMount) {
-    this.hostMount = hostMount;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5b1826e1/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerPort.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerPort.java b/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerPort.java
deleted file mode 100644
index d2dcb09..0000000
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/application/metadata/json/ContainerPort.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.slider.providers.agent.application.metadata.json;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Represents a docker container port
- */
-public class ContainerPort {
-  protected static final Logger
-      log = LoggerFactory.getLogger(ContainerPort.class);
-
-
-  private String containerPort;
-  private String hostPort;
-
-  public ContainerPort() {
-  }
-
-  public String getContainerPort() {
-    return containerPort;
-  }
-
-  public void setContainerPort(String containerPort) {
-    this.containerPort = containerPort;
-  }
-
-  public String getHostPort() {
-    return hostPort;
-  }
-
-  public void setHostPort(String hostPort) {
-    this.hostPort = hostPort;
-  }
-}