LENS-828 : Adds validation for derived cube creation

Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/7b5f4a09
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/7b5f4a09
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/7b5f4a09

Branch: refs/heads/LENS-581
Commit: 7b5f4a09a9471fdedc25e955cc4fd6990e89f1ef
Parents: bc86587
Author: Rajat Khandelwal <[email protected]>
Authored: Wed Nov 18 13:55:59 2015 +0530
Committer: Amareshwari Sriramadasu <[email protected]>
Committed: Wed Nov 18 13:55:59 2015 +0530

----------------------------------------------------------------------
 lens-api/src/main/resources/lens-errors.conf    | 12 +++++-
 .../lens/cube/error/LensCubeErrorCode.java      |  3 +-
 .../org/apache/lens/cube/metadata/Cube.java     | 10 ++---
 .../lens/cube/metadata/CubeMetastoreClient.java |  2 +-
 .../apache/lens/cube/metadata/DerivedCube.java  | 43 ++++++++++++++++++--
 .../cube/metadata/TestCubeMetastoreClient.java  |  8 ++--
 .../apache/lens/cube/parse/CubeTestSetup.java   | 17 ++++++--
 .../metastore/CubeMetastoreServiceImpl.java     | 13 +-----
 .../apache/lens/server/metastore/JAXBUtils.java | 30 +++++++-------
 .../server/metastore/TestMetastoreService.java  | 36 ++++++++++++----
 10 files changed, 120 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-api/src/main/resources/lens-errors.conf
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/lens-errors.conf 
b/lens-api/src/main/resources/lens-errors.conf
index a582dc2..7526456 100644
--- a/lens-api/src/main/resources/lens-errors.conf
+++ b/lens-api/src/main/resources/lens-errors.conf
@@ -99,7 +99,7 @@ lensServerErrors = [
 
 # lensCubeErrors: Defined for lens-cube module
 
-lensCubeErrors = [
+lensCubeErrorsForQuery = [
 
   {
     errorCode = 3001
@@ -284,6 +284,16 @@ lensCubeErrors = [
   }
 ]
 
+lensCubeErrorsForMetastore = [
+  {
+    errorCode = 3101
+    httpStatusCode = ${BAD_REQUEST}
+    errorMsg = "Problem in submitting entity: %s"
+  }
+]
+
+lensCubeErrors = ${lensCubeErrorsForQuery}${lensCubeErrorsForMetastore}
+
 # Overriding errors in lens-errors.conf via lens-errors-override.conf:
 #
 # Step 1: Copy contents of lens-errors.conf to lens-errors-override.conf

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java 
b/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
index 73a584f..2119b64 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
@@ -52,7 +52,8 @@ public enum LensCubeErrorCode {
   NO_CANDIDATE_DIM_AVAILABLE(3027, 1100),
   NO_CANDIDATE_FACT_AVAILABLE(3028, 1200),
   NO_CANDIDATE_DIM_STORAGE_TABLES(3029, 1300),
-  NO_STORAGE_TABLE_AVAIABLE(3030, 1400);
+  NO_STORAGE_TABLE_AVAIABLE(3030, 1400),
+  ERROR_IN_ENTITY_DEFINITION(3101, 100);
 
   public LensErrorInfo getLensErrorInfo() {
     return this.errorInfo;

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
index 98fb92e..f09da37 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
@@ -205,19 +205,19 @@ public class Cube extends AbstractBaseTable implements 
CubeInterface {
   }
 
   public CubeDimAttribute getDimAttributeByName(String dimension) {
-    return dimMap.get(dimension == null ? dimension : dimension.toLowerCase());
+    return dimMap.get(dimension == null ? null : dimension.toLowerCase());
   }
 
   public CubeMeasure getMeasureByName(String measure) {
-    return measureMap.get(measure == null ? measure : measure.toLowerCase());
+    return measureMap.get(measure == null ? null : measure.toLowerCase());
   }
 
   public CubeColumn getColumnByName(String column) {
-    CubeColumn cubeCol = (CubeColumn) super.getExpressionByName(column);
+    CubeColumn cubeCol = super.getExpressionByName(column);
     if (cubeCol == null) {
-      cubeCol = (CubeColumn) getMeasureByName(column);
+      cubeCol = getMeasureByName(column);
       if (cubeCol == null) {
-        cubeCol = (CubeColumn) getDimAttributeByName(column);
+        cubeCol = getDimAttributeByName(column);
       }
     }
     return cubeCol;

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
index daf7434..f945e0f 100644
--- 
a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
+++ 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
@@ -651,7 +651,7 @@ public class CubeMetastoreClient {
    * @throws HiveException
    */
   public void createDerivedCube(String parent, String name, Set<String> 
measures, Set<String> dimensions,
-    Map<String, String> properties, double weight) throws HiveException {
+    Map<String, String> properties, double weight) throws HiveException, 
LensException {
     DerivedCube cube = new DerivedCube(name, measures, dimensions, properties, 
weight, (Cube) getCube(parent));
     createCube(cube);
   }

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java 
b/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
index e7012f7..3c30f78 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
@@ -20,11 +20,16 @@ package org.apache.lens.cube.metadata;
 
 import java.util.*;
 
+import org.apache.lens.cube.error.LensCubeErrorCode;
+import org.apache.lens.server.api.error.LensException;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.metadata.Table;
 
+import com.google.common.collect.Lists;
+
 public class DerivedCube extends AbstractCubeTable implements CubeInterface {
 
   private static final List<FieldSchema> COLUMNS = new 
ArrayList<FieldSchema>();
@@ -37,12 +42,12 @@ public class DerivedCube extends AbstractCubeTable 
implements CubeInterface {
   private final Set<String> measures = new HashSet<String>();
   private final Set<String> dimensions = new HashSet<String>();
 
-  public DerivedCube(String name, Set<String> measures, Set<String> 
dimensions, Cube parent) {
+  public DerivedCube(String name, Set<String> measures, Set<String> 
dimensions, Cube parent) throws LensException {
     this(name, measures, dimensions, new HashMap<String, String>(), 0L, 
parent);
   }
 
   public DerivedCube(String name, Set<String> measures, Set<String> 
dimensions, Map<String, String> properties,
-    double weight, Cube parent) {
+    double weight, Cube parent) throws LensException {
     super(name, COLUMNS, properties, weight);
     for (String msr : measures) {
       this.measures.add(msr.toLowerCase());
@@ -51,10 +56,42 @@ public class DerivedCube extends AbstractCubeTable 
implements CubeInterface {
       this.dimensions.add(dim.toLowerCase());
     }
     this.parent = parent;
-
+    validate();
     addProperties();
   }
 
+  public void validate() throws LensException {
+    List<String> measuresNotInParentCube = Lists.newArrayList();
+    List<String> dimAttributesNotInParentCube = Lists.newArrayList();
+    for (String msr : measures) {
+      if (parent.getMeasureByName(msr) == null) {
+        measuresNotInParentCube.add(msr);
+      }
+    }
+    for (String dim : dimensions) {
+      if (parent.getDimAttributeByName(dim) == null) {
+        dimAttributesNotInParentCube.add(dim);
+      }
+    }
+    StringBuilder validationErrorStringBuilder = new StringBuilder();
+    String sep = "";
+    boolean invalid = false;
+    if (!measuresNotInParentCube.isEmpty()) {
+      validationErrorStringBuilder.append(sep).append("Measures 
").append(measuresNotInParentCube);
+      sep = " and ";
+      invalid = true;
+    }
+    if (!dimAttributesNotInParentCube.isEmpty()) {
+      validationErrorStringBuilder.append(sep).append("Dim Attributes 
").append(dimAttributesNotInParentCube);
+      invalid = true;
+    }
+    if (invalid) {
+      throw new 
LensException(LensCubeErrorCode.ERROR_IN_ENTITY_DEFINITION.getLensErrorInfo(),
+        "Derived cube invalid: " + validationErrorStringBuilder.append(" were 
not present in " + "parent cube ")
+          .append(parent));
+    }
+  }
+
   public DerivedCube(Table tbl, Cube parent) {
     super(tbl);
     this.measures.addAll(getMeasures(getName(), getProperties()));

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java
 
b/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java
index 7d5ed0f..6a2dc50 100644
--- 
a/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java
+++ 
b/lens-cube/src/test/java/org/apache/lens/cube/metadata/TestCubeMetastoreClient.java
@@ -114,7 +114,7 @@ public class TestCubeMetastoreClient {
   }
 
   @BeforeClass
-  public static void setup() throws HiveException, AlreadyExistsException, 
ParseException {
+  public static void setup() throws HiveException, AlreadyExistsException, 
LensException {
     SessionState.start(conf);
     now = new Date();
     Calendar cal = Calendar.getInstance();
@@ -158,7 +158,7 @@ public class TestCubeMetastoreClient {
   }
 
   private static void defineCube(String cubeName, String cubeNameWithProps, 
String derivedCubeName,
-    String derivedCubeNameWithProps) throws ParseException {
+    String derivedCubeNameWithProps) throws LensException {
     cubeMeasures = new HashSet<CubeMeasure>();
     cubeMeasures.add(new ColumnMeasure(
       new FieldSchema("msr1", "int", "first measure"), null, null, null, null, 
null, null, null, 0.0, 9999.0));
@@ -299,7 +299,7 @@ public class TestCubeMetastoreClient {
       new DerivedCube(derivedCubeNameWithProps, measures, dimensions, 
CUBE_PROPERTIES, 0L, cubeWithProps);
   }
 
-  private static void defineUberDims() throws ParseException {
+  private static void defineUberDims() {
     // Define zip dimension
     zipAttrs.add(new BaseDimAttribute(new FieldSchema("zipcode", "int", 
"code")));
     zipAttrs.add(new BaseDimAttribute(new FieldSchema("f1", "string", 
"field1")));
@@ -2541,7 +2541,7 @@ public class TestCubeMetastoreClient {
   }
 
   @Test(priority = 3)
-  public void testCaching() throws HiveException, ParseException {
+  public void testCaching() throws HiveException,  LensException {
     client = CubeMetastoreClient.getInstance(conf);
     CubeMetastoreClient client2 = CubeMetastoreClient.getInstance(new 
HiveConf(TestCubeMetastoreClient.class));
     assertEquals(5, client.getAllCubes().size());

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
----------------------------------------------------------------------
diff --git 
a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java 
b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
index 826f6b6..92f5067 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
@@ -27,6 +27,7 @@ import static org.apache.lens.cube.metadata.UpdatePeriod.*;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -585,7 +586,7 @@ public class CubeTestSetup {
 
   Set<ExprColumn> exprs;
 
-  private void createCube(CubeMetastoreClient client) throws HiveException, 
ParseException {
+  private void createCube(CubeMetastoreClient client) throws HiveException, 
ParseException, LensException {
     cubeMeasures = new HashSet<CubeMeasure>();
     cubeMeasures.add(new ColumnMeasure(new FieldSchema("msr1", "int", "first 
measure")));
     cubeMeasures.add(new ColumnMeasure(new FieldSchema("msr2", "float", 
"second measure"), "Measure2", null, "SUM",
@@ -749,8 +750,18 @@ public class CubeTestSetup {
     Set<String> dimensions = new HashSet<String>();
     dimensions.add("dim1");
     dimensions.add("dim2");
-    client
-      .createDerivedCube(TEST_CUBE_NAME, DERIVED_CUBE_NAME, measures, 
dimensions, new HashMap<String, String>(), 5L);
+    // Try creating derived cube with non existant dim/measures
+    try{
+      client.createDerivedCube(TEST_CUBE_NAME, DERIVED_CUBE_NAME,
+        Sets.newHashSet("random_measure"), 
Sets.newHashSet("random_dim_attribute"),
+        new HashMap<String, String>(), 5L);
+    } catch(LensException e) {
+      assertTrue(e.getMessage().contains("random_measure"));
+      assertTrue(e.getMessage().contains("random_dim_attribute"));
+      assertTrue(e.getMessage().contains("not present"));
+    }
+    client.createDerivedCube(TEST_CUBE_NAME, DERIVED_CUBE_NAME,
+      measures, dimensions, new HashMap<String, String>(), 5L);
   }
 
   private void createBaseAndDerivedCubes(CubeMetastoreClient client)

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
 
b/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
index ea913ad..27f9e0e 100644
--- 
a/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
+++ 
b/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
@@ -28,7 +28,6 @@ import javax.ws.rs.NotFoundException;
 import org.apache.lens.api.LensSessionHandle;
 import org.apache.lens.api.metastore.*;
 import org.apache.lens.cube.metadata.*;
-import org.apache.lens.cube.metadata.Dimension;
 import org.apache.lens.cube.metadata.timeline.PartitionTimeline;
 import org.apache.lens.server.BaseLensService;
 import org.apache.lens.server.LensServerConf;
@@ -40,10 +39,10 @@ import org.apache.lens.server.session.LensSessionImpl;
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hive.metastore.IMetaStoreClient;
 import org.apache.hadoop.hive.metastore.api.*;
-import org.apache.hadoop.hive.ql.metadata.*;
+import org.apache.hadoop.hive.ql.metadata.Hive;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.metadata.Partition;
 import org.apache.hadoop.hive.ql.metadata.Table;
-import org.apache.hadoop.hive.ql.parse.ParseException;
 import org.apache.hive.service.cli.CLIService;
 
 import com.google.common.collect.Lists;
@@ -200,8 +199,6 @@ public class CubeMetastoreServiceImpl extends 
BaseLensService implements CubeMet
       log.info("Created cube " + cube.getName());
     } catch (HiveException e) {
       throw new LensException(e);
-    } catch (ParseException e) {
-      throw new LensException(e);
     } finally {
       release(sessionid);
     }
@@ -264,8 +261,6 @@ public class CubeMetastoreServiceImpl extends 
BaseLensService implements CubeMet
       log.info("Cube updated " + cube.getName());
     } catch (HiveException e) {
       throw new LensException(e);
-    } catch (ParseException e) {
-      throw new LensException(e);
     } finally {
       release(sessionid);
     }
@@ -1108,8 +1103,6 @@ public class CubeMetastoreServiceImpl extends 
BaseLensService implements CubeMet
       log.info("Created dimension " + dimension.getName());
     } catch (HiveException e) {
       throw new LensException(e);
-    } catch (ParseException e) {
-      throw new LensException(e);
     } finally {
       release(sessionid);
     }
@@ -1152,8 +1145,6 @@ public class CubeMetastoreServiceImpl extends 
BaseLensService implements CubeMet
       log.info("Altered dimension " + dimName);
     } catch (HiveException e) {
       throw new LensException(e);
-    } catch (ParseException e) {
-      throw new LensException(e);
     } finally {
       release(sessionid);
     }

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java 
b/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java
index 1ed81eb..f5db7bc 100644
--- a/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java
+++ b/lens-server/src/main/java/org/apache/lens/server/metastore/JAXBUtils.java
@@ -19,6 +19,7 @@
 package org.apache.lens.server.metastore;
 
 import java.lang.reflect.Constructor;
+import java.text.ParseException;
 import java.util.*;
 
 import javax.ws.rs.WebApplicationException;
@@ -30,6 +31,7 @@ import org.apache.lens.api.metastore.*;
 import org.apache.lens.cube.metadata.*;
 import org.apache.lens.cube.metadata.ExprColumn.ExprSpec;
 import org.apache.lens.cube.metadata.ReferencedDimAtrribute.ChainRefCol;
+import org.apache.lens.server.api.error.LensException;
 
 import org.apache.hadoop.hive.metastore.TableType;
 import org.apache.hadoop.hive.metastore.api.FieldSchema;
@@ -39,7 +41,6 @@ import org.apache.hadoop.hive.ql.io.HiveOutputFormat;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.metadata.Partition;
 import org.apache.hadoop.hive.ql.metadata.Table;
-import org.apache.hadoop.hive.ql.parse.ParseException;
 import org.apache.hadoop.hive.serde.serdeConstants;
 import org.apache.hadoop.mapred.InputFormat;
 
@@ -59,13 +60,13 @@ public final class JAXBUtils {
   private static final ObjectFactory XCF = new ObjectFactory();
 
   /**
-   * Create a hive ql cube obejct from corresponding JAXB object
+   * Create a hive ql cube object from corresponding JAXB object
    *
    * @param cube JAXB Cube
    * @return {@link Cube}
-   * @throws ParseException
+   * @throws LensException
    */
-  public static CubeInterface hiveCubeFromXCube(XCube cube, Cube parent) 
throws ParseException {
+  public static CubeInterface hiveCubeFromXCube(XCube cube, Cube parent) 
throws LensException {
     if (cube instanceof XDerivedCube) {
       XDerivedCube dcube = (XDerivedCube) cube;
       Set<String> dims = new LinkedHashSet<String>();
@@ -348,7 +349,7 @@ public final class JAXBUtils {
           }
           refspec.getChainRefColumn().add(xcc);
         }
-        xd.setJoinKey(Boolean.valueOf(false));
+        xd.setJoinKey(false);
       } else {
         List<TableReference> dimRefs = rd.getReferences();
         refspec.setTableReferences(new XTableReferences());
@@ -477,7 +478,7 @@ public final class JAXBUtils {
     return jc;
   }
 
-  public static ExprColumn hiveExprColumnFromXExprColumn(XExprColumn xe) 
throws ParseException {
+  public static ExprColumn hiveExprColumnFromXExprColumn(XExprColumn xe) {
     ExprColumn ec = new ExprColumn(new FieldSchema(xe.getName(), 
xe.getType().toLowerCase(),
       xe.getDescription()),
       xe.getDisplayString(),
@@ -601,7 +602,7 @@ public final class JAXBUtils {
     try {
       Class<?> clazz = Class.forName(xs.getClassname());
       Constructor<?> constructor = clazz.getConstructor(String.class);
-      storage = (Storage) constructor.newInstance(new Object[]{xs.getName()});
+      storage = (Storage) constructor.newInstance(xs.getName());
       storage.addProperties(mapFromXProperties(xs.getProperties()));
       return storage;
     } catch (Exception e) {
@@ -664,14 +665,12 @@ public final class JAXBUtils {
 
   public static CubeDimensionTable cubeDimTableFromDimTable(XDimensionTable 
dimensionTable) {
 
-    CubeDimensionTable cdim = new 
CubeDimensionTable(dimensionTable.getDimensionName(),
+    return new CubeDimensionTable(dimensionTable.getDimensionName(),
       dimensionTable.getTableName(),
       fieldSchemaListFromColumns(dimensionTable.getColumns()),
       dimensionTable.getWeight(),
       dumpPeriodsFromStorageTables(dimensionTable.getStorageTables()),
       mapFromXProperties(dimensionTable.getProperties()));
-
-    return cdim;
   }
 
   public static CubeFactTable cubeFactFromFactTable(XFactTable fact) {
@@ -870,7 +869,7 @@ public final class JAXBUtils {
           
xp.getNonTimePartitionSpec().getPartSpecElement().add(partSpecElement);
         }
       }
-    } catch (java.text.ParseException exc) {
+    } catch (ParseException exc) {
       log.debug("can't form time part spec from " + partSpec, exc);
       xp.setTimePartitionSpec(null);
       xp.setNonTimePartitionSpec(null);
@@ -881,17 +880,16 @@ public final class JAXBUtils {
     return xp;
   }
 
-  public static void updatePartitionFromXPartition(Partition partition, 
XPartition xp)
-    throws ClassNotFoundException, HiveException {
+  public static void updatePartitionFromXPartition(Partition partition, 
XPartition xp) throws ClassNotFoundException {
     
partition.getParameters().putAll(mapFromXProperties(xp.getPartitionParameters()));
     
partition.getTPartition().getSd().getSerdeInfo().setParameters(mapFromXProperties(xp.getSerdeParameters()));
     partition.setLocation(xp.getLocation());
     if (xp.getInputFormat() != null) {
-      partition.setInputFormatClass((Class<? extends InputFormat>) 
Class.forName(xp.getInputFormat()));
+      
partition.setInputFormatClass(Class.forName(xp.getInputFormat()).asSubclass(InputFormat.class));
     }
     if (xp.getOutputFormat() != null) {
       Class<? extends HiveOutputFormat> outputFormatClass =
-        (Class<? extends HiveOutputFormat>) 
Class.forName(xp.getOutputFormat());
+        Class.forName(xp.getOutputFormat()).asSubclass(HiveOutputFormat.class);
       partition.setOutputFormatClass(outputFormatClass);
       // Again a hack, for the issue described in HIVE-11278
       partition.getTPartition().getSd().setOutputFormat(
@@ -926,7 +924,7 @@ public final class JAXBUtils {
     return ret;
   }
 
-  public static Dimension dimensionFromXDimension(XDimension dimension) throws 
ParseException {
+  public static Dimension dimensionFromXDimension(XDimension dimension) {
     Set<CubeDimAttribute> dims = new LinkedHashSet<CubeDimAttribute>();
     for (XDimAttribute xd : dimension.getAttributes().getDimAttribute()) {
       dims.add(hiveDimAttrFromXDimAttr(xd));

http://git-wip-us.apache.org/repos/asf/lens/blob/7b5f4a09/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
----------------------------------------------------------------------
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
 
b/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
index ca0fe56..e6a798a 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/metastore/TestMetastoreService.java
@@ -417,7 +417,7 @@ public class TestMetastoreService extends LensJerseyTest {
     return cube;
   }
 
-  private XDerivedCube createDerivedCube(String cubeName, String parent) 
throws Exception {
+  private XDerivedCube createDerivedCube(String cubeName, String parent, 
boolean addExtraFields) throws Exception {
     XDerivedCube cube = cubeObjectFactory.createXDerivedCube();
     cube.setName(cubeName);
     cube.setDimAttrNames(new XDimAttrNames());
@@ -426,7 +426,10 @@ public class TestMetastoreService extends LensJerseyTest {
 
     cube.getDimAttrNames().getAttrName().add("dim1");
     cube.getMeasureNames().getMeasureName().add("msr1");
-
+    if (addExtraFields) {
+      cube.getDimAttrNames().getAttrName().add("random_dim");
+      cube.getMeasureNames().getMeasureName().add("random_measure");
+    }
     XProperty xp1 = cubeObjectFactory.createXProperty();
     xp1.setName("derived.foo");
     xp1.setValue("derived.bar");
@@ -469,13 +472,20 @@ public class TestMetastoreService extends LensJerseyTest {
       }
 
       assertTrue(foundcube);
-
+      // create invalid derived cube
+      XCube dcube = createDerivedCube("testderived", "testCube1", true);
+      result = target.queryParam("sessionid", lensSessionId).request(
+        mediaType).post(Entity.xml(cubeObjectFactory.createXCube(dcube)), 
APIResult.class);
+      assertEquals(result.getStatus(), Status.FAILED);
+      assertEquals(result.getMessage(), "ERROR_IN_ENTITY_DEFINITION[Derived 
cube invalid: "
+        + "Measures [random_measure] and Dim Attributes "
+        + "[random_dim] were not present in parent cube testcube1]");
       // create derived cube
-      final XCube dcube = createDerivedCube("testderived", "testCube1");
+      dcube = createDerivedCube("testderived", "testCube1", false);
       result = target.queryParam("sessionid", lensSessionId).request(
         mediaType).post(Entity.xml(cubeObjectFactory.createXCube(dcube)), 
APIResult.class);
       assertNotNull(result);
-      assertEquals(result.getStatus(), APIResult.Status.SUCCEEDED);
+      assertEquals(result.getStatus(), Status.SUCCEEDED);
 
       cubes = target().path("metastore/cubes").queryParam("sessionid", 
lensSessionId).request(mediaType)
         .get(StringList.class);
@@ -706,7 +716,7 @@ public class TestMetastoreService extends LensJerseyTest {
       Assert.assertTrue(links.get(1).isMapsToMany());
       Assert.assertEquals(links.get(1).toString(), "testdim.col1[n]");
 
-      final XDerivedCube dcube = createDerivedCube("testGetDerivedCube", 
"testGetCube");
+      final XDerivedCube dcube = createDerivedCube("testGetDerivedCube", 
"testGetCube", false);
       target = target().path("metastore").path("cubes");
       // Create this cube first
       element = cubeObjectFactory.createXCube(dcube);
@@ -746,7 +756,7 @@ public class TestMetastoreService extends LensJerseyTest {
         target.queryParam("sessionid", 
lensSessionId).request(mediaType).post(Entity.xml(element), APIResult.class);
       assertEquals(result.getStatus(), APIResult.Status.SUCCEEDED);
 
-      final XCube dcube = createDerivedCube("test_drop_derived_cube", 
"test_drop_cube");
+      final XCube dcube = createDerivedCube("test_drop_derived_cube", 
"test_drop_cube", false);
       target = target().path("metastore").path("cubes");
       // Create this cube first
       element = cubeObjectFactory.createXCube(dcube);
@@ -841,7 +851,15 @@ public class TestMetastoreService extends LensJerseyTest {
       assertNotNull(hcube.getDimAttributeByName("dim3"));
       assertEquals(((AbstractCubeTable) hcube).getProperties().get("foo2"), 
"bar2");
 
-      final XDerivedCube dcube = createDerivedCube("test_update_derived", 
cubeName);
+      XDerivedCube dcube = createDerivedCube("test_update_derived", cubeName, 
true);
+      element = cubeObjectFactory.createXCube(dcube);
+      result =
+        target.queryParam("sessionid", 
lensSessionId).request(mediaType).post(Entity.xml(element), APIResult.class);
+      assertEquals(result.getStatus(), Status.FAILED);
+      assertEquals(result.getMessage(), "ERROR_IN_ENTITY_DEFINITION[Derived 
cube invalid: "
+        + "Measures [random_measure] and Dim Attributes "
+        + "[random_dim] were not present in parent cube test_update]");
+      dcube = createDerivedCube("test_update_derived", cubeName, false);
       // Create this cube first
       element = cubeObjectFactory.createXCube(dcube);
       result =
@@ -1262,7 +1280,7 @@ public class TestMetastoreService extends LensJerseyTest {
       assertEquals(col4h3.getType(), "string");
       assertEquals(col4h3.getChainRefColumns().get(0).getChainName(), 
"chain1");
       assertEquals(col4h3.getChainRefColumns().get(0).getRefColumn(), "col2");
-      assertEquals(col4h3.getNumOfDistinctValues().get(), (Long)1000L);
+      assertEquals(col4h3.getNumOfDistinctValues().get(), (Long) 1000L);
       assertNotNull(dim.getAttributeByName("col5"));
       ReferencedDimAtrribute col5 = (ReferencedDimAtrribute) 
dim.getAttributeByName("col5");
       assertEquals(col5.getDescription(), "ref column");

Reply via email to