<!--
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>bin</id>
  <formats>
    <format>tar.gz</format>
    <format>zip</format>
  </formats>
  
  <includeBaseDirectory>true</includeBaseDirectory>
  
  <baseDirectory>apache-uima-ruta-${project.version}</baseDirectory>
  
  <!-- Copy each core binary into the /lib dir of the distribution -->
  <dependencySets>
    <dependencySet>
      <includes>
        <include>org.apache.uima:ruta-core</include>
      </includes>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <outputDirectory>lib</outputDirectory>
      <outputFileNameMapping>${artifact.build.finalName}.jar</outputFileNameMapping>
      <useProjectArtifact>false</useProjectArtifact>
      <fileMode>644</fileMode> 
      <directoryMode>755</directoryMode>        
    </dependencySet>
    
    <!-- Copy each eclipse plugin into the /eclipsePlugins dir of the distribution -->
    <dependencySet>
      <includes>
        <include>org.apache.uima:ruta-ep-addons</include>
        <include>org.apache.uima:ruta-ep-caseditor</include>
        <include>org.apache.uima:ruta-ep-engine</include>
        <include>org.apache.uima:ruta-ep-ide</include>
        <include>org.apache.uima:ruta-ep-textruler</include>
      </includes>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <outputDirectory>eclipsePlugins</outputDirectory>
      <outputFileNameMapping>${artifact.build.finalName}.jar</outputFileNameMapping>
      <useProjectArtifact>false</useProjectArtifact>
      <fileMode>644</fileMode> 
      <directoryMode>755</directoryMode>        
    </dependencySet>
  </dependencySets>
  
  <!-- Add other files - scripts, documentation, examples -->
  <fileSets>
  
    <!-- copy bin distr license and notice -->
    <fileSet>
      <directory>src/main/readme</directory>
      <outputDirectory></outputDirectory>
      <fileMode>644</fileMode>
      <directoryMode>755</directoryMode>      
    </fileSet>
    
    <!-- copy standard top level files -->        
    <fileSet>
      <directory>.</directory>
      <outputDirectory></outputDirectory>
      <fileMode>644</fileMode>
      <directoryMode>755</directoryMode> 
      <includes>
        <include>README*</include>
        <include>readme*</include>
        <include>RELEASE_NOTES*</include>
        <include>Release-Notes*</include>
        <include>issuesFixed/**</include>      
      </includes>       
    </fileSet>

    <!-- docbooks -->
    <fileSet>
      <directory>ruta-docbook/target/site/</directory>
      <outputDirectory>docs</outputDirectory>
      <fileMode>644</fileMode>
      <directoryMode>755</directoryMode>        
    </fileSet>
        
    <!-- examples -->
    <fileSet>
      <directory>example-projects</directory>
      <outputDirectory>examples</outputDirectory>
      <fileMode>644</fileMode>
      <directoryMode>755</directoryMode>
    </fileSet>
  </fileSets>
</assembly>