<?xml version='1.0'?>
<!--
 * 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.
 *
 */ -->

<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % BOOK_ENTITIES SYSTEM "jUDDI_Dev_Guide.ent">
%BOOK_ENTITIES;
]>

<bookinfo id="Dev_Guide-demobooks">
	<title>jUDDI Dev Guide</title>
	<subtitle>A developer's guide to using jUDDI</subtitle>
	<productname>jUDDI</productname>
	<edition>1</edition>
    <pubsnumber>1</pubsnumber>
    <productnumber>5.0.0</productnumber>
	<abstract>
		<para>
        This document is a Developer's Guide for jUDDI. jUDDI (pronounced "Judy") is an open
        source Java implementation of the Universal Description, Discovery, and
        Integration (UDDI v3) specification for Web Services.
		</para>
	</abstract>
	<corpauthor>
		<inlinemediaobject>
			<imageobject>
				<imagedata format='SVG' fileref="Common_Content/images/title_logo.svg" />
			</imageobject>
			<textobject><phrase>Logo</phrase></textobject>
		</inlinemediaobject>
	</corpauthor>
	<copyright>
		<year>&YEAR;</year>
		<holder>&HOLDER;</holder>
	</copyright>
	
	<xi:include href="Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
		<xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
			<xi:include href="Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
		</xi:fallback>
	</xi:include>
	
	<xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</bookinfo>



