You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by da...@apache.org on 2006/06/01 23:54:33 UTC
svn commit: r410975 - in /db/derby/code/trunk/java:
client/org/apache/derby/client/am/SqlException.java
testing/org/apache/derbyTesting/functionTests/tests/i18n/MessageBundleTest.java
testing/org/apache/derbyTesting/functionTests/tests/i18n/build.xml
Author: davidvc
Date: Thu Jun 1 14:54:32 2006
New Revision: 410975
URL: http://svn.apache.org/viewvc?rev=410975&view=rev
Log:
DERBY-1186 - Add a new test that does a sanity check of our message ids,
looking for duplicates and orphans. Not part of derbyall yet because
there are a number of failures I need to track down. The failures will
be fixed as a separate JIRA
No test suites run, as this is a new test and has no interaction with
existing code.
This checkin also has a rider which is a small javadoc fix to
SqlException.java
Added:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/MessageBundleTest.java
Modified:
db/derby/code/trunk/java/client/org/apache/derby/client/am/SqlException.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/build.xml
Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/SqlException.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/SqlException.java?rev=410975&r1=410974&r2=410975&view=diff
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/SqlException.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/SqlException.java Thu Jun 1 14:54:32 2006
@@ -162,9 +162,6 @@
* using initCause(). On JDK 1.3, since initCause() does not exist,
* a non-SQL exception can not be chained. Instead, the exception class
* and message text is appended to the message for this exception.
- *
- * @return
- * An instance of SqlException that you can throw to your heart's content.
*/
public SqlException(LogWriter logwriter,
ClientMessageId msgid, Object[] args, Throwable cause)
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/MessageBundleTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/MessageBundleTest.java?rev=410975&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/MessageBundleTest.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/MessageBundleTest.java Thu Jun 1 14:54:32 2006
@@ -0,0 +1,214 @@
+/*
+
+ Derby - Class org.apache.derbyTesting.functionTests.tests.i18n.MessageBundleTest
+
+ Copyright (c) 2001, 2006 The Apache Software Foundation or its licensors, where applicable.
+
+ 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.
+
+ */
+
+package org.apache.derbyTesting.functionTests.tests.i18n;
+
+import org.apache.derbyTesting.functionTests.util.BaseTestCase;
+import org.apache.derby.shared.common.reference.SQLState;
+import org.apache.derby.shared.common.reference.MessageId;
+
+import java.util.HashSet;
+import java.lang.reflect.Field;
+import java.util.ResourceBundle;
+import java.util.Locale;
+import java.util.Iterator;
+
+/**
+ * This class does everything we can to validate that the messages_en.properties
+ * file is in synch with SQLState.java and MessageId.java. We want to make sure
+ * that message ids defined in SQLState and MessageId have matching messages
+ * in the messages properties file, and also find out if there are any messages
+ * that don't have matching ids in the SQLState and MessageId files. The
+ * first is a bug, the second is something to be aware of.
+ */
+public class MessageBundleTest extends BaseTestCase {
+ public MessageBundleTest(String name) {
+ super(name);
+ }
+
+ // The list of ids. We use a HashSet so we can detect duplicates easily
+ static HashSet sqlStateIds = new HashSet();
+ static HashSet messageIdIds = new HashSet();
+ static HashSet messageBundleIds = new HashSet();
+
+ static {
+ try {
+ // Load all the ids for the SQLState class
+ loadClassIds(SQLState.class, sqlStateIds);
+
+ // Load all the ids for the MessageId class
+ loadClassIds(MessageId.class, messageIdIds);
+
+ // Load all the ids for the messages_en properties file
+ loadMessageBundleIds();
+ } catch ( Exception e ) {
+ e.printStackTrace();
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+
+ static void loadClassIds(Class idclass, HashSet set) throws Exception {
+ Field[] fields = idclass.getFields();
+
+ int length = fields.length;
+ for ( int i = 0; i < length ; i++ )
+ {
+ String id = (String)fields[i].get(null);
+
+ if ( id.length() == 2 ) {
+ // Skip past identifiers that are just categories
+ continue;
+ }
+
+ if ( id.equals("close.C.1") ) {
+ // This one is not expected to have a message string
+ continue;
+ }
+ if ( ! set.add(id) )
+ {
+ System.err.println("ERROR: The id " + id +
+ " was found twice in " + idclass.getName());
+ }
+ }
+ }
+
+ /**
+ * Load all the message ids from messages_en.properties into a HashSet.
+ * This assumes its available on the classpath
+ */
+ static void loadMessageBundleIds() throws Exception {
+ ResourceBundle bundle;
+
+ // The messages_*.properties files are split into fifty separate
+ // message bundle files. We need to load each one in turn
+ int numBundles = 50;
+
+ for ( int i=0 ; i < numBundles ; i++ ) {
+ loadMessageBundle(i);
+ }
+ }
+
+ static void loadMessageBundle(int index) {
+ String bundleName = "org.apache.derby.loc.m" + index;
+
+ ResourceBundle bundle =
+ ResourceBundle.getBundle(bundleName, Locale.ENGLISH);
+
+ java.util.Enumeration keys = bundle.getKeys();
+
+ while ( keys.hasMoreElements() ) {
+ String key = (String)keys.nextElement();
+
+ if ( ! messageBundleIds.add(key) ) {
+ System.err.println("ERROR: the key " + key +
+ " exists twice in messages_en.properties");
+ }
+ }
+ }
+
+ /**
+ * See if there are any message ids in SQLState.java that are
+ * not in the message bundle
+ */
+ public void testSQLStateOrphanedIds() throws Exception {
+ Iterator it = sqlStateIds.iterator();
+ boolean success = true;
+
+ while ( it.hasNext() ) {
+ String sqlStateId = (String)it.next();
+
+ if ( ! messageBundleIds.contains(sqlStateId) ) {
+ // Don't fail out on the first one, we want to catch
+ // all of them. Just note there was a failure and continue
+ System.err.println("ERROR: Message id " + sqlStateId +
+ " in SQLState.java was not found in" +
+ " messages_en.properties");
+
+ success = false;
+ }
+ }
+
+ if ( ! success ) {
+ fail("One or more message ids in MessageId.java was not found " +
+ "in messages_en.properties");
+ }
+ }
+
+ /**
+ * See if there are any message ids in MessageId.java not in
+ * the message bundle
+ */
+ public void testMessageIdOrphanedIds() throws Exception {
+ Iterator it = messageIdIds.iterator();
+ boolean success = true;
+
+ while ( it.hasNext() ) {
+ String sqlStateId = (String)it.next();
+
+ if ( ! messageBundleIds.contains(sqlStateId) ) {
+ // Don't fail out on the first one, we want to catch
+ // all of them. Just note there was a failure and continue
+ System.err.println("ERROR: Message id " + sqlStateId +
+ " in MessageId.java was not found in" +
+ " messages_en.properties");
+
+ success = false;
+ }
+ }
+
+ if ( ! success ) {
+ fail("One or more message ids in MessageId.java was not found " +
+ "in messages_en.properties");
+ }
+ }
+
+ /**
+ * See if there are any message ids in the message bundle that
+ * are <b>not</b> in SQLState.java or MessageId.java
+ */
+ public void testMessageBundleOrphanedMessages() throws Exception {
+ Iterator it = messageBundleIds.iterator();
+ boolean success = true;
+
+ while (it.hasNext() ) {
+ String msgid = (String)it.next();
+
+ if ( sqlStateIds.contains(msgid)) {
+ continue;
+ }
+
+ if ( messageIdIds.contains(msgid)) {
+ continue;
+ }
+
+ // Don't fail out on the first one, we want to catch
+ // all of them. Just note there was a failure and continue
+ System.err.println("WARNING: Message id " + msgid +
+ " in messages_en.properties is not " +
+ "referenced in either SQLState.java or MessageId.java");
+ success = false;
+ }
+
+ if ( ! success ) {
+ fail("One or more message ids in messages_en.properties was not " +
+ "found in SQLState.java or MessageId.java");
+ }
+ }
+}
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/build.xml
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/build.xml?rev=410975&r1=410974&r2=410975&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/build.xml (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/i18n/build.xml Thu Jun 1 14:54:32 2006
@@ -50,7 +50,6 @@
</target>
<target name="compile">
- <echo message="junit is ${junit}"/>
<javac
source="1.3"
target="1.3"