<!--
 * Copyright 2001-2009 The Apache Software Foundation.
 *
 * Licensed 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></id>
	<formats>
		<format>tar.gz</format>
		<format>zip</format>
	</formats>
	<fileSets>
	        <fileSet>
                        <directory>${basedir}/devguide/target/docbook/publish/en-US/pdf</directory>
                        <includes>
                                <include>*.pdf</include>
                        </includes>
			<outputDirectory></outputDirectory>
		</fileSet>
		<fileSet>
			<directory>${basedir}/userguide/target/docbook/publish/en-US/pdf</directory>
			<includes>
				<include>*.pdf</include>
			</includes>
			<outputDirectory></outputDirectory>
		</fileSet>
		<fileSet>
			<directory>${basedir}</directory>
			<includes>
				<include>*.java</include>
			</includes>
			<outputDirectory></outputDirectory>
		</fileSet>
                <fileSet>
                        <directory>${basedir}/examples/auth</directory>
                        <includes>
                                <include>*.pdf</include>
                                <include>*.java</include>
                        </includes>
                        <outputDirectory>examples/auth</outputDirectory>
                </fileSet>
                <fileSet>
                        <directory>${basedir}/uddi3-specification</directory>
                        <includes>
                                <include>*.pdf</include>
				<include>*.txt</include>
                                <include>*.java</include>
                        </includes>
                        <outputDirectory>uddi3-specification</outputDirectory>
                </fileSet>
	</fileSets>
</assembly>
