<!--
 * 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.8
            
<h2>        Bug
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-937'>JUDDI-937</a>] -         PolicyRoundRobin not working without service cache
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-1003'>JUDDI-1003</a>] -         spring-web jar supplied with latest JUDDI distribution has security vulnerability
</li>
</ul>
                
<h2>        Improvement
</h2>
<ul>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-993'>JUDDI-993</a>] -         InVm transport for embedded juddi needs to handle authentication and a sample for usage
</li>
<li>[<a href='https://issues.apache.org/jira/browse/JUDDI-1002'>JUDDI-1002</a>] -         tModelInstanceInfo value does not check for maximum length
</li>
</ul>
                                                                                                                                                        
        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>
                                                                                                    
