You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2018/06/05 14:27:26 UTC
atlas git commit: ATLAS-2730: added validation of TimeBoundry values
in classifications
Repository: atlas
Updated Branches:
refs/heads/master 86af9e3b7 -> e73a80998
ATLAS-2730: added validation of TimeBoundry values in classifications
Signed-off-by: Madhan Neethiraj <ma...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/e73a8099
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/e73a8099
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/e73a8099
Branch: refs/heads/master
Commit: e73a80998ee39aab54eee637aee7ccb99e4156c1
Parents: 86af9e3
Author: nixonrodrigues <ni...@apache.org>
Authored: Fri Jun 1 12:46:47 2018 +0530
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Tue Jun 5 07:27:09 2018 -0700
----------------------------------------------------------------------
intg/pom.xml | 6 ++
.../java/org/apache/atlas/AtlasErrorCode.java | 3 +
.../atlas/type/AtlasClassificationType.java | 87 ++++++++++++++++++++
.../atlas/type/TestAtlasClassificationType.java | 32 ++++++-
pom.xml | 1 +
.../store/graph/v2/AtlasEntityStoreV2.java | 5 ++
6 files changed, 131 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/atlas/blob/e73a8099/intg/pom.xml
----------------------------------------------------------------------
diff --git a/intg/pom.xml b/intg/pom.xml
index 57803bd..31361e2 100644
--- a/intg/pom.xml
+++ b/intg/pom.xml
@@ -47,6 +47,12 @@
</dependency>
<dependency>
+ <groupId>commons-validator</groupId>
+ <artifactId>commons-validator</artifactId>
+ <version>${commons-validator.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
<version>${jackson.version}</version>
http://git-wip-us.apache.org/repos/asf/atlas/blob/e73a8099/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
index 06b4345..f0585eb 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -148,6 +148,9 @@ public enum AtlasErrorCode {
MISSING_CATEGORY_DISPLAY_NAME(400, "ATLAS-400-00-082", "Category name is empty/null"),
INVALID_DISPLAY_NAME(400, "ATLAS-400-00-083", "name cannot contain following special chars ('@', '.')"),
TERM_HAS_ENTITY_ASSOCIATION(400, "ATLAS-400-00-086", "Term (guid={0}) can't be deleted as it has been assigned to {1} entities."),
+ INVALID_TIMEBOUNDRY_START_TIME(400, "ATLAS-400-00-87B", "Invalid startTime {0}"),
+ INVALID_TIMEBOUNDRY_END_TIME(400, "ATLAS-400-00-87C", "Invalid endTime {0}"),
+ INVALID_TIMEBOUNDRY_DATERANGE(400, "ATLAS-400-00-87D", "Invalid dateRange: startTime {0} must be before endTime {1}"),
UNAUTHORIZED_ACCESS(403, "ATLAS-403-00-001", "{0} is not authorized to perform {1}"),
http://git-wip-us.apache.org/repos/asf/atlas/blob/e73a8099/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
index abacd78..1adb362 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasClassificationType.java
@@ -20,11 +20,13 @@ package org.apache.atlas.type;
import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TimeBoundary;
import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.typedef.AtlasClassificationDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.validator.routines.DateValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -302,6 +304,10 @@ public class AtlasClassificationType extends AtlasStructType {
}
}
+ if (!validateTimeBoundaries(obj, null)) {
+ return false;
+ }
+
return super.isValidValue(obj);
}
@@ -328,6 +334,10 @@ public class AtlasClassificationType extends AtlasStructType {
}
}
+ if (!validateTimeBoundaries(obj, null)) {
+ return false;
+ }
+
return super.isValidValueForUpdate(obj);
}
@@ -381,6 +391,8 @@ public class AtlasClassificationType extends AtlasStructType {
ret = superType.validateValue(obj, objName, messages) && ret;
}
+ ret = validateTimeBoundaries(obj, messages) && ret;
+
ret = super.validateValue(obj, objName, messages) && ret;
}
@@ -396,6 +408,8 @@ public class AtlasClassificationType extends AtlasStructType {
ret = superType.validateValueForUpdate(obj, objName, messages) && ret;
}
+ ret = validateTimeBoundaries(obj, messages) && ret;
+
ret = super.validateValueForUpdate(obj, objName, messages) && ret;
}
@@ -516,4 +530,77 @@ public class AtlasClassificationType extends AtlasStructType {
}
}
}
+
+ private boolean validateTimeBoundaries(Object classificationObj, List<String> messages) {
+ boolean ret = true;
+ AtlasClassification classification = null;
+
+ if (classificationObj instanceof AtlasClassification) {
+ classification = (AtlasClassification) classificationObj;
+ } else if (classificationObj instanceof Map) {
+ classification = new AtlasClassification((Map) classificationObj);
+ }
+
+ if (classification != null && classification.getValidityPeriods() != null) {
+ for (TimeBoundary timeBoundary : classification.getValidityPeriods()) {
+ if (timeBoundary != null) {
+ ret = validateTimeBoundry(timeBoundary, messages) && ret;
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ private boolean validateTimeBoundry(TimeBoundary timeBoundary, List<String> messages) {
+ boolean ret = true;
+ DateValidator dateValidator = DateValidator.getInstance();
+ Date startDate = null;
+ Date endDate = null;
+ final TimeZone timezone;
+
+ if (StringUtils.isNotEmpty(timeBoundary.getTimeZone())) {
+ timezone = TimeZone.getTimeZone(timeBoundary.getTimeZone());
+ } else {
+ timezone = java.util.TimeZone.getDefault();
+ }
+
+ if (StringUtils.isNotEmpty(timeBoundary.getStartTime())) {
+ startDate = dateValidator.validate(timeBoundary.getStartTime(), TimeBoundary.TIME_FORMAT, timezone);
+
+ if (startDate == null) {
+ addValidationMessageIfNotPresent(new AtlasBaseException(AtlasErrorCode.INVALID_TIMEBOUNDRY_START_TIME, timeBoundary.getStartTime()), messages);
+
+ ret = false;
+ }
+ }
+
+ if (StringUtils.isNotEmpty(timeBoundary.getEndTime())) {
+ endDate = dateValidator.validate(timeBoundary.getEndTime(), TimeBoundary.TIME_FORMAT, timezone);
+
+ if (endDate == null) {
+ addValidationMessageIfNotPresent(new AtlasBaseException(AtlasErrorCode.INVALID_TIMEBOUNDRY_END_TIME, timeBoundary.getEndTime()), messages);
+
+ ret = false;
+ }
+ }
+
+ if (startDate != null && endDate != null) {
+ if (endDate.before(startDate)) {
+ addValidationMessageIfNotPresent(new AtlasBaseException(AtlasErrorCode.INVALID_TIMEBOUNDRY_DATERANGE, timeBoundary.getStartTime(), timeBoundary.getEndTime()), messages);
+
+ ret = false;
+ }
+ }
+
+ return ret;
+ }
+
+ private void addValidationMessageIfNotPresent(AtlasBaseException excp, List<String> messages) {
+ String msg = excp.getMessage();
+
+ if (messages != null && !messages.contains(msg)) {
+ messages.add(msg);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/e73a8099/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
index 0badfcf..1ade5f7 100644
--- a/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasClassificationType.java
@@ -21,6 +21,7 @@ import java.util.*;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.ModelTestUtil;
+import org.apache.atlas.model.TimeBoundary;
import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
import org.apache.atlas.model.typedef.AtlasClassificationDef;
@@ -39,9 +40,28 @@ public class TestAtlasClassificationType {
{
classificationType = getClassificationType(ModelTestUtil.getClassificationDefWithSuperTypes());
- AtlasClassification invalidValue1 = classificationType.createDefaultValue();
- AtlasClassification invalidValue2 = classificationType.createDefaultValue();
- Map<String, Object> invalidValue3 = classificationType.createDefaultValue().getAttributes();
+ AtlasClassification invalidValue1 = classificationType.createDefaultValue();
+ AtlasClassification invalidValue2 = classificationType.createDefaultValue();
+ Map<String, Object> invalidValue3 = classificationType.createDefaultValue().getAttributes();
+ AtlasClassification validValueTB1 = classificationType.createDefaultValue();
+ AtlasClassification validValueTB2 = classificationType.createDefaultValue();
+ AtlasClassification validValueTB3 = classificationType.createDefaultValue();
+ AtlasClassification invalidValueTB1 = classificationType.createDefaultValue();
+ AtlasClassification invalidValueTB2 = classificationType.createDefaultValue();
+ AtlasClassification invalidValueTB3 = classificationType.createDefaultValue();
+ TimeBoundary validTB1 = new TimeBoundary("2018/07/07 04:38:55"); // valid start-time
+ TimeBoundary validTB2 = new TimeBoundary(null, "2018/07/08 04:38:55"); // valid end-time
+ TimeBoundary validTB3 = new TimeBoundary("2018/07/07 04:38:55", "2018/07/08 04:38:55"); // valid start and end times
+ TimeBoundary invalidTB1 = new TimeBoundary("2018-07-07 04:38:55"); // invalid start-time
+ TimeBoundary invalidTB2 = new TimeBoundary(null, "2018-07-08 04:38:55"); // invalid end-time
+ TimeBoundary invalidTB3 = new TimeBoundary("2018/07/08 04:38:55", "2018/07/07 04:38:55"); // invalid time-ranger
+
+ validValueTB1.addValityPeriod(validTB1);
+ validValueTB2.addValityPeriod(validTB2);
+ validValueTB3.addValityPeriod(validTB3);
+ invalidValueTB1.addValityPeriod(invalidTB1);
+ invalidValueTB2.addValityPeriod(invalidTB2);
+ invalidValueTB3.addValityPeriod(invalidTB3);
// invalid value for int
invalidValue1.setAttribute(ModelTestUtil.getDefaultAttributeName(AtlasBaseTypeDef.ATLAS_TYPE_INT), "xyz");
@@ -53,6 +73,9 @@ public class TestAtlasClassificationType {
validValues.add(null);
validValues.add(classificationType.createDefaultValue());
validValues.add(classificationType.createDefaultValue().getAttributes()); // Map<String, Object>
+ validValues.add(validValueTB1);
+ validValues.add(validValueTB2);
+ validValues.add(validValueTB3);
invalidValues.add(invalidValue1);
invalidValues.add(invalidValue2);
invalidValues.add(invalidValue3);
@@ -62,6 +85,9 @@ public class TestAtlasClassificationType {
invalidValues.add(new HashSet()); // incorrect datatype
invalidValues.add(new ArrayList()); // incorrect datatype
invalidValues.add(new String[] {}); // incorrect datatype
+ invalidValues.add(invalidValueTB1);
+ invalidValues.add(invalidValueTB2);
+ invalidValues.add(invalidValueTB3);
}
@Test
http://git-wip-us.apache.org/repos/asf/atlas/blob/e73a8099/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 87ca5dd..b571a26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -583,6 +583,7 @@
<commons-collections.version>3.2.2</commons-collections.version>
<commons-logging.version>1.1.3</commons-logging.version>
<commons-lang.version>2.6</commons-lang.version>
+ <commons-validator.version>1.4.0</commons-validator.version>
<javax-inject.version>1</javax-inject.version>
<jettison.version>1.3.7</jettison.version>
<paranamer.version>2.7</paranamer.version>
http://git-wip-us.apache.org/repos/asf/atlas/blob/e73a8099/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
index 5e33cf5..40593be 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
@@ -403,6 +403,7 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore {
}
GraphTransactionInterceptor.lockObjectAndReleasePostCommit(guid);
+
for (AtlasClassification classification : classifications) {
validateAndNormalize(classification);
}
@@ -436,6 +437,10 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore {
GraphTransactionInterceptor.lockObjectAndReleasePostCommit(guid);
+ for (AtlasClassification classification : classifications) {
+ validateAndNormalize(classification);
+ }
+
entityGraphMapper.updateClassifications(new EntityMutationContext(), guid, classifications);
}