<!--
 * 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.
 *
 * -->
 
 
        Release Notes - jUDDI - Version 3.3.7
            
<h2>        Bug
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-991'>JUDDI-991</a>] -         JUDDI Uses EOL Version of Apache CXF
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-996'>JUDDI-996</a>] -         Admin gui, get all client subscriptions throws a classcast error
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-997'>JUDDI-997</a>] -         Admin gui has strange behavior and no feedback if the login fails
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-999'>JUDDI-999</a>] -         Issue with SQL Server Database with JUDDI 3.3.6 : The size (8192) given to the column &#39;instance_parms&#39; exceeds the maximum allowed for any data type (8000)
</li>
</ul>
                
<h2>        Improvement
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-995'>JUDDI-995</a>] -         Add automated generation of sha512 hashes during the build
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-1000'>JUDDI-1000</a>] -         Update embedded tomcat to the latest version available
</li>
</ul>
                                                                                                                                                        

        Release Notes - jUDDI - Version 3.3.6
            
<h2>        Bug
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-992'>JUDDI-992</a>] -         FindBinding API call doesn&#39;t exactly match the spec, can&#39;t search for just the service key
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-994'>JUDDI-994</a>] -         Bash scripts containing windows CRLF line endings
</li>
</ul>
                
<h2>        Improvement
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-988'>JUDDI-988</a>] -         Update to tomcat 9
</li>
</ul>
            
<h2>        Task
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-962'>JUDDI-962</a>] -         Convert juddi.apache.org back to mvn site
</li>
</ul>
                                                                                                                                        
                                                                                                                                        
        Release Notes - jUDDI - Version 3.3.5
                                
<h2>        Bug
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-904'>JUDDI-904</a>] -         intermittent test failures
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-943'>JUDDI-943</a>] -         WebHelper class: Client name not set in servletContext after getUDDIClient is called
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-948'>JUDDI-948</a>] -         API_070_FindEntityTest is not passing anymore
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-957'>JUDDI-957</a>] -         Integration test not passing. org.apache.juddi.v3.tck.UDDI_070_FindEntityIntegrationTest:findSignedEntities()
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-960'>JUDDI-960</a>] -         TCK tests not passing (windows 7, java 1.8)
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-970'>JUDDI-970</a>] -         Code smell that ignores InvalidValueException
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-975'>JUDDI-975</a>] -         mvn site is broken
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-977'>JUDDI-977</a>] -         reduce findbugs warnings
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-978'>JUDDI-978</a>] -         Build instability with Replication tests
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-983'>JUDDI-983</a>] -         Unable to compile under centos, openjdk8, sun.security.provider.certpath.OCSP api mismatch
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-984'>JUDDI-984</a>] -         Hibernate profile fails to deploy due to extraneous class in the orm xml file
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-985'>JUDDI-985</a>] -         Replication change record delete fails with hibernate
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-987'>JUDDI-987</a>] -         TBD
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-989'>JUDDI-989</a>] -         catalina.sh start script needs to remove DOS line endings
</li>
</ul>
                                        
<h2>        Improvement
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-955'>JUDDI-955</a>] -         Pom maintenance
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-974'>JUDDI-974</a>] -         Add findbugs to the site reporting tasks
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-979'>JUDDI-979</a>] -         Add maven enforcer rules 
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-980'>JUDDI-980</a>] -         Update juddi&#39;s parent pom to the latest apache pom
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-981'>JUDDI-981</a>] -         Force all tests to run in a random order
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-986'>JUDDI-986</a>] -         Update hibernate dependencies
</li>
</ul>
                                                                                
<h2>        Task
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-971'>JUDDI-971</a>] -         Update embedded tomcat to a more recent version
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-973'>JUDDI-973</a>] -         Code clean up juddi-client-cli
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-976'>JUDDI-976</a>] -         Add jacoco test results to mvn site
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-982'>JUDDI-982</a>] -         Removing the juddi-client-plugins module
</li>
</ul>
                                                                                                    
