Fixes issue 14636: Support database views defined in the AD in the Data Access Layer, Fixes issue 9640: Table Validation on View
authorMartin Taal <martin.taal@openbravo.com>
Sat, 25 Sep 2010 11:26:10 +0200
changeset 8448 d61bca59af84
parent 8447 d6f404defcf2
child 8449 508c1e4e6b7a
Fixes issue 14636: Support database views defined in the AD in the Data Access Layer, Fixes issue 9640: Table Validation on View
src-test/org/openbravo/test/AllAntTaskTests.java
src-test/org/openbravo/test/dal/ViewTest.java
src/org/openbravo/base/model/Column.java
src/org/openbravo/base/model/ModelProvider.java
--- a/src-test/org/openbravo/test/AllAntTaskTests.java	Fri Sep 24 15:33:32 2010 +0200
+++ b/src-test/org/openbravo/test/AllAntTaskTests.java	Sat Sep 25 11:26:10 2010 +0200
@@ -40,6 +40,7 @@
 import org.openbravo.test.dal.OBContextTest;
 import org.openbravo.test.dal.ReadByNameTest;
 import org.openbravo.test.dal.ValidationTest;
+import org.openbravo.test.dal.ViewTest;
 import org.openbravo.test.expression.EvaluationTest;
 import org.openbravo.test.model.ClassLoaderTest;
 import org.openbravo.test.model.OneToManyTest;
@@ -98,6 +99,7 @@
     suite.addTestSuite(DalStoredProcedureTest.class);
     suite.addTestSuite(ReadByNameTest.class);
     suite.addTestSuite(AdminContextTest.class);
+    suite.addTestSuite(ViewTest.class);
 
     // expression
     suite.addTestSuite(EvaluationTest.class);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src-test/org/openbravo/test/dal/ViewTest.java	Sat Sep 25 11:26:10 2010 +0200
@@ -0,0 +1,52 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo  Public  License
+ * Version  1.0  (the  "License"),  being   the  Mozilla   Public  License
+ * Version 1.1  with a permitted attribution clause; you may not  use this
+ * file except in compliance with the License. You  may  obtain  a copy of
+ * the License at http://www.openbravo.com/legal/license.html 
+ * Software distributed under the License  is  distributed  on  an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific  language  governing  rights  and  limitations
+ * under the License. 
+ * The Original Code is Openbravo ERP. 
+ * The Initial Developer of the Original Code is Openbravo SLU 
+ * All portions are Copyright (C) 2010 Openbravo SLU 
+ * All Rights Reserved. 
+ * Contributor(s):  ______________________________________.
+ ************************************************************************
+ */
+
+package org.openbravo.test.dal;
+
+import org.openbravo.base.model.Entity;
+import org.openbravo.base.model.ModelProvider;
+import org.openbravo.base.structure.BaseOBObject;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.test.base.BaseTest;
+
+/**
+ * Test if views work properly
+ * 
+ * @author mtaal
+ */
+public class ViewTest extends BaseTest {
+
+  /**
+   * Iterates over all views
+   */
+  public void testViews() {
+    setBigBazaarAdminContext();
+    int cnt = 0;
+    for (Entity entity : ModelProvider.getInstance().getModel()) {
+      if (entity.isView()) {
+        for (BaseOBObject bob : OBDal.getInstance().createQuery(entity.getName(), "").list()) {
+          assertTrue(bob.getEntity() == entity);
+          cnt++;
+        }
+      }
+    }
+    assertTrue(cnt > 0);
+    System.err.println(cnt);
+  }
+}
\ No newline at end of file
--- a/src/org/openbravo/base/model/Column.java	Fri Sep 24 15:33:32 2010 +0200
+++ b/src/org/openbravo/base/model/Column.java	Sat Sep 25 11:26:10 2010 +0200
@@ -249,9 +249,7 @@
       // note calls isSuperActive(), if it would call isActive there is a danger
       // for infinite looping, see issue:
       // https://issues.openbravo.com/view.php?id=8632
-      if (thatColumn != null
-          && (!thatColumn.isSuperActive() || !thatColumn.getTable().isActive() || thatColumn
-              .getTable().isView())) {
+      if (thatColumn != null && (!thatColumn.isSuperActive() || !thatColumn.getTable().isActive())) {
         log.error("Column " + this + " refers to a non active table or column or to a view"
             + thatColumn);
       }
--- a/src/org/openbravo/base/model/ModelProvider.java	Fri Sep 24 15:33:32 2010 +0200
+++ b/src/org/openbravo/base/model/ModelProvider.java	Sat Sep 25 11:26:10 2010 +0200
@@ -181,9 +181,6 @@
       // this map stores the mapped tables
       tablesByTableName = new HashMap<String, Table>();
       for (final Table t : tables) {
-        if (t.isView()) {
-          continue;
-        }
         // tables are stored case insensitive!
         tablesByTableName.put(t.getTableName().toLowerCase(), t);
       }
@@ -242,7 +239,8 @@
       for (final Entity e : model) {
         for (final Property p : e.getProperties()) {
           p.initializeName();
-          if (p.getColumnName() != null) {
+          // don't do mandatory value setting for views
+          if (!e.isView() && p.getColumnName() != null) {
             final Boolean mandatory = colMandatories.get(createColumnMandatoryKey(e.getTableName(),
                 p.getColumnName()));
             if (mandatory != null) {
@@ -385,9 +383,10 @@
           log.debug("Setting targetEntity and reference Property for " + thisProp);
           final Column thatColumn = c.getReferenceType();
           if (thatColumn == null) {
-            log.error("Property "
-                + thisProp
-                + " is mapped incorrectly, there is no reference column for it, removing from the mapping");
+            log
+                .error("Property "
+                    + thisProp
+                    + " is mapped incorrectly, there is no reference column for it, removing from the mapping");
             thisProp.getEntity().getProperties().remove(thisProp);
             if (thisProp.getEntity().getIdProperties().remove(thisProp)) {
               Check.fail("Incorrect mapping for property " + thisProp
@@ -429,9 +428,11 @@
       // }
 
       if (t.getPrimaryKeyColumns().size() == 0) {
+        // note, after this issue is solved:
+        // https://issues.openbravo.com/view.php?id=14696
+        // then also log.warn for views
         if (!t.isView()) {
-          // don't log the views, these are ignored anyway
-          log.warn("Ignoring table " + t.getName() + " because it has no primary key columns");
+          log.warn("Ignoring table/view " + t.getName() + " because it has no primary key columns");
         }
         toRemove.add(t);
         continue;