<?xml version="1.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.
-->
<metainfo>
  <schemaVersion>2.0</schemaVersion>
  <application>
    <name>TOMCAT</name>
    <comment>Apache Tomcat</comment>
    <version>0.0.1</version>
    <exportedConfigs>None</exportedConfigs>
    <exportGroups>
      <exportGroup>
        <name>Servers</name>
        <exports>
          <export>
            <name>tomcat.http_port</name>
            <value>${TOMCAT_HOST}:${site.server-xml.http.port}</value>
          </export>
        </exports>
      </exportGroup>
       <exportGroup>
          <name>QuickLinks</name>
          <exports>
             <export>
                <name>HTTP</name>
                <value>http://${TOMCAT_HOST}:${site.server-xml.http.port}</value>
             </export>
          </exports>
       </exportGroup>
    </exportGroups>

    <components>
      <component>
        <name>TOMCAT</name>
        <category>MASTER</category>
        <appExports>Servers-tomcat.http_port,QuickLinks-HTTP</appExports>
        <componentExports>
          <componentExport>
            <name>tomcat.http.port</name>
            <value>${TOMCAT_HOST}:${site.server-xml.http.port}</value>
          </componentExport>
          <componentExport>
            <name>HTTP</name>
            <value>http://${TOMCAT_HOST}:${site.global.listen_port}</value>
          </componentExport>
        </componentExports>
        <commandScript>
          <script>scripts/tomcat.py</script>
          <scriptType>PYTHON</scriptType>
        </commandScript>
      </component>
    </components>

    <osSpecifics>
      <osSpecific>
        <osType>any</osType>
        <packages>
          <package>
            <type>tarball</type>
            <name>files/tomcat-8.0.30.tar.gz</name>
          </package>
        </packages>
      </osSpecific>
    </osSpecifics>

    <configFiles>
      <configFile>
        <type>env</type>
        <fileName>server.xml</fileName>
        <dictionaryName>server-xml</dictionaryName>
      </configFile>
      <configFile>
        <type>env</type>
        <fileName>tomcat-users.xml</fileName>
        <dictionaryName>tomcat-users-xml</dictionaryName>
      </configFile>
    </configFiles>
  </application>
</metainfo>
