<!--
  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.
-->
<assembly>
    <id>${project.version}.winpkg</id>
    <formats>
        <format>dir</format>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <!-- resources -->
        <fileSet>
          <directory>${basedir}/src/resources</directory>
          <outputDirectory>/resources</outputDirectory>
          <includes>
            <include>**</include>
          </includes>
        </fileSet>
        <!-- scripts -->
        <fileSet>
          <directory>${basedir}/src/scripts</directory>
          <outputDirectory>/scripts</outputDirectory>
          <includes>
            <include>**</include>
          </includes>
        </fileSet>
		<fileSet>
          <directory>${basedir}/src/template/bin</directory>
          <outputDirectory>/template</outputDirectory>
          <includes>
            <include>**</include>
          </includes>
        </fileSet>
        <!-- Ranger Secure Zip -->
        <fileSet>
          <directory>${basedir}/../target/</directory>
          <outputDirectory>/resources</outputDirectory>
          <includes>
            <include>ranger-*-usersync.zip</include>
			<include>ranger-*-admin.zip</include>
			<include>ranger*plugin.zip</include>
          </includes>
          <excludes>
            <exclude>*-src.zip</exclude>
          </excludes>
        </fileSet>
    </fileSets>
</assembly>
