From ef6e713214ee61583a83339c7b2c2f1580e2943a Mon Sep 17 00:00:00 2001
From: ribeaudc <ribeaudc>
Date: Tue, 12 Jun 2007 07:11:45 +0000
Subject: [PATCH] change: - 'DBRestrictions' and 'SQLCommandTokenizer' (with
 corresponding Unit tests) moved from package 'ch.systemsx.cisd.common.parser'
 to package 'ch.systemsx.cisd.common.db' - [DBRestrictions] 'findInArray'
 method uses 'ArrayUtils.indexOf' method. - [DBRestrictions] better
 diagnostics when command starts correctly but can not be parsed because it is
 ill-formed.

SVN: 467
---
 .../cisd/common/db/DBRestrictionsTest.java    | 183 ++++++++++++++++++
 .../cisd/common/db/DBRestrictionsTest.sql     |  50 +++++
 .../common/db/SQLCommandTokenizerTest.java    | 111 +++++++++++
 3 files changed, 344 insertions(+)
 create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java
 create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql
 create mode 100644 common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java

diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java
new file mode 100644
index 00000000000..15defe1c9a4
--- /dev/null
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * 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 ch.systemsx.cisd.common.db;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.logging.LogInitializer;
+import ch.systemsx.cisd.common.utilities.FileUtilities;
+
+/**
+ * Test cases for the {@link DBRestrictions}.
+ * 
+ * @author Bernd Rinn
+ */
+public class DBRestrictionsTest
+{
+
+    static
+    {
+        LogInitializer.init();
+    }
+
+    @Test
+    public void testNormalize()
+    {
+        final List<String> normalizedList = DBRestrictions.normalize(" a  1 ;; B\t2;\n\nC; \n--D\n E ");
+        assertEquals(Arrays.asList("a 1", "b 2", "c", "e"), normalizedList);
+    }
+
+    @Test
+    public void testGetDomains()
+    {
+        final List<String> domainScript =
+                Arrays.asList("create table sometable", "create domain user_id as varchar(15)",
+                        "create domain bla for varchar(0)", "create domain code as varchar(8)",
+                        "create domain description_80 as varchar(81)");
+        final Map<String, Integer> domains = DBRestrictions.parseDomains(domainScript);
+        final Map<String, Integer> expectedDomains = new HashMap<String, Integer>();
+        expectedDomains.put("user_id", 15);
+        expectedDomains.put("code", 8);
+        expectedDomains.put("description_80", 81);
+        assertEquals(expectedDomains, domains);
+    }
+
+    @Test
+    public void testColumnLengths()
+    {
+        final String sqlScript =
+                FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql");
+        assert sqlScript != null;
+        final DBRestrictions parser = new DBRestrictions(sqlScript);
+
+        assertEquals(10, parser.getTableRestrictions("contacts").getLength("cnta_type"));
+        assertEquals(30, parser.getTableRestrictions("contacts").getLength("firstname"));
+        assertEquals(1, parser.getTableRestrictions("contacts").getLength("midinitial"));
+        assertEquals(30, parser.getTableRestrictions("contacts").getLength("lastname"));
+        assertEquals(50, parser.getTableRestrictions("contacts").getLength("email"));
+        assertEquals(15, parser.getTableRestrictions("contacts").getLength("user_id"));
+
+        assertEquals(8, parser.getTableRestrictions("material_types").getLength("code"));
+        assertEquals(80, parser.getTableRestrictions("material_types").getLength("description"));
+
+        assertEquals(50, parser.getTableRestrictions("materials").getLength("name"));
+        assertEquals(4, parser.getTableRestrictions("materials").getLength("mate_sub_type"));
+    }
+
+    @Test(expectedExceptions = AssertionError.class)
+    public void testInvalidTable()
+    {
+        final DBRestrictions parser = new DBRestrictions("");
+        assertEquals(Integer.MAX_VALUE, parser.getTableRestrictions("doesnotexit").getLength("doesnotexist"));
+    }
+
+    @Test(expectedExceptions = AssertionError.class)
+    public void testInvalidColumn()
+    {
+        final DBRestrictions parser = new DBRestrictions("create table tab (a integer, b varchar(1))");
+        assertEquals(Integer.MAX_VALUE, parser.getTableRestrictions("tab").getLength("doesnotexist"));
+    }
+
+    @Test
+    public void testCheckedConstraints()
+    {
+        final String sqlScript =
+                FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql");
+        assert sqlScript != null;
+        final DBRestrictions parser = new DBRestrictions(sqlScript);
+
+        assertEquals(new HashSet<String>(Arrays.asList("PERS", "ORGA")), parser.getTableRestrictions("contacts")
+                .getCheckedConstaint("cnta_type"));
+        assertEquals(new HashSet<String>(Arrays.asList("STOB", "MATE")), parser.getTableRestrictions("materials")
+                .getCheckedConstaint("mate_sub_type"));
+    }
+
+    @Test
+    public void testCheckOK()
+    {
+        final String sqlScript =
+                FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql");
+        assert sqlScript != null;
+        final DBRestrictions parser = new DBRestrictions(sqlScript);
+
+        parser.check("contacts", "cnta_type", "ORGA");
+        parser.check("material_types", "code", "somecode");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testCheckViolateLength()
+    {
+        final String sqlScript =
+                FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql");
+        assert sqlScript != null;
+        final DBRestrictions parser = new DBRestrictions(sqlScript);
+
+        try
+        {
+            parser.check("material_types", "code", "somecode1");
+        } catch (UserFailureException ex)
+        {
+            System.err.println(ex.getMessage());
+            throw ex;
+        }
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testCheckAlternatives()
+    {
+        final String sqlScript =
+                FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql");
+        assert sqlScript != null;
+        final DBRestrictions parser = new DBRestrictions(sqlScript);
+
+        try
+        {
+            parser.check("materials", "mate_sub_type", "stob");
+        } catch (UserFailureException ex)
+        {
+            System.err.println(ex.getMessage());
+            throw ex;
+        }
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testCheckNotNullConstraint()
+    {
+        final String sqlScript =
+                FileUtilities.loadToString(getClass(), "/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql");
+        assert sqlScript != null;
+        final DBRestrictions parser = new DBRestrictions(sqlScript);
+
+        try
+        {
+            parser.check("material_types", "description", null);
+        } catch (UserFailureException ex)
+        {
+            System.err.println(ex.getMessage());
+            throw ex;
+        }
+    }
+}
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql
new file mode 100644
index 00000000000..39419d793b6
--- /dev/null
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/db/DBRestrictionsTest.sql
@@ -0,0 +1,50 @@
+-- D:\DDL\postgresql\3V_LIMS_Version_1.sql
+--
+-- Generated for ANSI SQL92 on Thu May 10  15:50:21 2007 by Server Generator 10.1.2.6.18
+
+
+ CREATE DOMAIN DESCRIPTION_80 AS VARCHAR(80);
+CREATE DOMAIN USER_ID AS VARCHAR(15);
+CREATE DOMAIN TECH_ID AS INTEGER;
+CREATE DOMAIN OBJECT_NAME AS VARCHAR(50);
+CREATE DOMAIN CODE AS VARCHAR(8);
+CREATE DOMAIN DESCRIPTION_250 AS VARCHAR(250);
+CREATE TABLE EXPERIMENT_TYPES  (CODE CODE NOT NULL,DESCRIPTION 
+DESCRIPTION_80 NOT NULL) ;
+CREATE TABLE CONTACTS  (ID TECH_ID NOT NULL,CNTA_TYPE VARCHAR(10) NOT NULL DEFAULT 'PERS',FIRSTNAME VARCHAR(30),MIDINITIAL VARCHAR(1),LASTNAME VARCHAR(30),EMAIL VARCHAR(50),USER_ID USER_ID,CNTA_ID_ORGANIZATION TECH_ID,ORGANIZATION_NAME OBJECT_NAME,DESCRIPTION DESCRIPTION_80) ;
+CREATE TABLE MATERIAL_TYPES  (CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_80 NOT NULL) ;
+CREATE TABLE MATERIALS  (ID TECH_ID NOT NULL,NAME OBJECT_NAME,MATE_SUB_TYPE VARCHAR(4) NOT NULL DEFAULT 'MATE',MATY_CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_250) ;
+CREATE TABLE EXPERIMENTS  (ID TECH_ID NOT NULL,NAME OBJECT_NAME,CNTA_ID_REGISTERER TECH_ID NOT NULL,MATE_ID_STUDY_OBJECT TECH_ID NOT NULL,EXTY_CODE CODE NOT NULL,REGISTRATION_DATE DATE,DESCRIPTION DESCRIPTION_250) ;
+
+ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_PK PRIMARY KEY(CODE);
+ALTER TABLE CONTACTS ADD CONSTRAINT CNTA_PK PRIMARY KEY(ID);
+ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_PK PRIMARY KEY(CODE);
+ALTER TABLE MATERIALS ADD CONSTRAINT MATE_PK PRIMARY KEY(ID);
+ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_PK PRIMARY KEY(ID);
+
+ALTER TABLE CONTACTS ADD CONSTRAINT AVCON_1178805021_CNTA__000 CHECK (CNTA_TYPE IN 
+  ('PERS', 
+  'ORGA')
+) ;
+ALTER TABLE MATERIALS ADD CONSTRAINT AVCON_1178805021_MATE__000 CHECK (MATE_SUB_TYPE IN ('MATE', 'STOB')) ;
+ALTER TABLE CONTACTS ADD CONSTRAINT CNTA_CNTA_ORGANIZATION_FK FOREIGN KEY (CNTA_ID_ORGANIZATION)REFERENCES CONTACTS(ID);
+ALTER TABLE MATERIALS ADD CONSTRAINT MATE_MATY_FK FOREIGN KEY (MATY_CODE)REFERENCES MATERIAL_TYPES(CODE);
+ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_CNTA_FK FOREIGN KEY (CNTA_ID_REGISTERER)REFERENCES CONTACTS(ID);
+ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_MATE_FK FOREIGN KEY (MATE_ID_STUDY_OBJECT)REFERENCES MATERIALS(ID);
+ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_EXTY_FK FOREIGN KEY (EXTY_CODE)REFERENCES EXPERIMENT_TYPES(CODE);
+
+-- D:\DDL\oracle\3V_LIMS_Version_1.sqs
+--
+-- Generated for Oracle 9i on Thu May 10  15:49:25 2007 by Server Generator 10.1.2.6.18
+ 
+-- Creating Sequence 'CONTACT_ID_SEQ'
+CREATE SEQUENCE CONTACT_ID_SEQ;
+
+-- Creating Sequence 'EXPERIMENT_ID_SEQ'
+CREATE SEQUENCE EXPERIMENT_ID_SEQ;
+
+-- Creating Sequence 'MATERIAL_ID_SEQ'
+CREATE SEQUENCE MATERIAL_ID_SEQ;
+
+
+
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java
new file mode 100644
index 00000000000..a771314becd
--- /dev/null
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/db/SQLCommandTokenizerTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2007 ETH Zuerich, CISD
+ *
+ * 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 ch.systemsx.cisd.common.db;
+
+import org.testng.annotations.Test;
+import static org.testng.AssertJUnit.*;
+
+/**
+ * Test cases for the {@link SQLCommandTokenizer}.
+ * 
+ * @author Bernd Rinn
+ */
+public class SQLCommandTokenizerTest
+{
+    @Test
+    public void testNormal()
+    {
+        final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;\nb;\ncC;");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b", cmdTokenizer.getNextCommand());
+        assertEquals("cc", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testOneLine()
+    {
+        final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;b;cC;");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b", cmdTokenizer.getNextCommand());
+        assertEquals("cc", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testMissingSemicolon()
+    {
+        final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;\nb;\ncC");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b", cmdTokenizer.getNextCommand());
+        assertEquals("cc", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testMissingSemicolonButEOL()
+    {
+        final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A;\nb;\ncC\n");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b", cmdTokenizer.getNextCommand());
+        assertEquals("cc", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testWhitespaces()
+    {
+        final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer(" A ; \n b   B;\t  c\tC\n ");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b b", cmdTokenizer.getNextCommand());
+        assertEquals("c c", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testCommentLine()
+    {
+        final SQLCommandTokenizer cmdTokenizer =
+                new SQLCommandTokenizer(" A ; \n\n  -- Some Comment \nb   B;\t  c\tC\n ");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b b", cmdTokenizer.getNextCommand());
+        assertEquals("c c", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testMoreCommentLines()
+    {
+        final SQLCommandTokenizer cmdTokenizer =
+                new SQLCommandTokenizer(" A ; \n\n  -- Some Comment \n--'Bla'\n\nb   B;\t  c\tC\n ");
+        assertEquals("a", cmdTokenizer.getNextCommand());
+        assertEquals("b b", cmdTokenizer.getNextCommand());
+        assertEquals("c c", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+    @Test
+    public void testConstants()
+    {
+        final SQLCommandTokenizer cmdTokenizer = new SQLCommandTokenizer("A 'A  \\'B\tc';\nb;\ncC;");
+        assertEquals("a 'A  \\'B\tc'", cmdTokenizer.getNextCommand());
+        assertEquals("b", cmdTokenizer.getNextCommand());
+        assertEquals("cc", cmdTokenizer.getNextCommand());
+        assertNull(cmdTokenizer.getNextCommand());
+    }
+
+}
-- 
GitLab