<!--
 * 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
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
	<!-- Assembly file for the "in-memory" SystemML release. -->
	<id>inmemory</id>

	<formats>
		<format>jar</format>
	</formats>

	<includeBaseDirectory>false</includeBaseDirectory>

	<fileSets>
		<fileSet>
			<directory>${basedir}</directory>
			<includes>
				<include>DISCLAIMER</include>
			</includes>
			<outputDirectory>META-INF</outputDirectory>
		</fileSet>

		<fileSet>
			<directory>${basedir}/src/assembly/inmemory</directory>
			<includes>
				<include>LICENSE</include>
				<include>NOTICE</include>
			</includes>
			<outputDirectory>META-INF</outputDirectory>
		</fileSet>

		<fileSet>
			<directory>${project.build.directory}/hadoop-test</directory>
			<includes>
				<include>**/*</include>
			</includes>
			<outputDirectory>.</outputDirectory>
		</fileSet>

	</fileSets>

	<!-- 
	<files>
		<file>
			<source>target/${artifactId}-${project.version}.jar</source>
			<outputDirectory>.</outputDirectory>
			<destName>SystemML.jar</destName> 
		</file>
	</files>
	-->

	<!--  Include all the libraries needed to run in in-memory (JMLC) mode. -->
	<dependencySets>
		<dependencySet>
			<includes>
				<include>*:commons-collections*</include>
				<include>*:commons-configuration*</include>
				<include>*:commons-lang*</include>
				<include>*:commons-logging*</include>
				<include>*:hadoop-auth*</include>
				<include>*:hadoop-common*</include>
				<include>*:hadoop-mapreduce-client-core*</include>
				<include>*:log4j*</include>
				<include>*:slf4j-api*</include>
				<include>*:slf4j-log4j*</include>
				<include>*:systemml*</include>
			</includes>
			<unpackOptions>
				<excludes>
					<exclude>META-INF/ASL2.0</exclude>
					<exclude>META-INF/DEPENDENCIES</exclude>
					<exclude>META-INF/LICENSE.txt</exclude>
					<exclude>META-INF/NOTICE.txt</exclude>
					<exclude>META-INF/README.txt</exclude>
					<exclude>META-INF/LICENSE</exclude>
					<exclude>META-INF/NOTICE</exclude>
				</excludes>
			</unpackOptions>
			<outputDirectory>.</outputDirectory>
			<scope>provided</scope>
			<unpack>true</unpack>
		</dependencySet>
	</dependencySets>

</assembly>
