Repository: kylin
Updated Branches:
  refs/heads/master b66f3da5c -> b4d5a142a


KYLIN-3196 replace StringUtils.containsOnly with Regex

Signed-off-by: lidongsjtu <lid...@apache.org>


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

Branch: refs/heads/master
Commit: b4d5a142ac82873d599b0a0c798e0d9755de0f6c
Parents: b66f3da
Author: etherge <ethe...@163.com>
Authored: Thu Jan 25 19:45:35 2018 +0800
Committer: lidongsjtu <lid...@apache.org>
Committed: Thu Jan 25 21:25:07 2018 +0800

----------------------------------------------------------------------
 .../kylin/rest/controller/CubeController.java   | 13 +++----
 .../kylin/rest/controller/ModelController.java  | 16 ++++-----
 .../rest/controller/ProjectController.java      | 17 ++++-----
 .../java/org/apache/kylin/rest/msg/Message.java |  2 +-
 .../apache/kylin/rest/service/CubeService.java  | 16 ++++-----
 .../apache/kylin/rest/service/ModelService.java | 12 +++----
 .../apache/kylin/rest/util/ValidateUtil.java    |  7 +++-
 .../kylin/rest/util/ValidateUtilTest.java       | 36 ++++++++++++++++++++
 8 files changed, 77 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java
index a23c9b7..f6c2abf 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller/CubeController.java
@@ -18,8 +18,6 @@
 
 package org.apache.kylin.rest.controller;
 
-import static org.apache.kylin.rest.service.CubeService.VALID_CUBENAME;
-
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -76,6 +74,7 @@ import org.apache.kylin.rest.service.CubeService;
 import org.apache.kylin.rest.service.JobService;
 import org.apache.kylin.rest.service.ProjectService;
 import org.apache.kylin.rest.service.QueryService;
+import org.apache.kylin.rest.util.ValidateUtil;
 import org.apache.kylin.source.kafka.util.KafkaClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -498,9 +497,8 @@ public class CubeController extends BasicController {
         if (cube.getStatus() == RealizationStatusEnum.DESCBROKEN) {
             throw new BadRequestException("Broken cube can't be cloned");
         }
-        if (!StringUtils.containsOnly(newCubeName, VALID_CUBENAME)) {
-            logger.info("Invalid Cube name {}, only letters, numbers and 
underline supported.", newCubeName);
-            throw new BadRequestException("Invalid Cube name, only letters, 
numbers and underline supported.");
+        if (!ValidateUtil.isAlphanumericUnderscore(newCubeName)) {
+            throw new BadRequestException("Invalid Cube name, only letters, 
numbers and underscore supported.");
         }
 
         ProjectInstance project = 
cubeService.getProjectManager().getProject(projectName);
@@ -589,9 +587,8 @@ public class CubeController extends BasicController {
             logger.info("Cube name should not be empty.");
             throw new BadRequestException("Cube name should not be empty.");
         }
-        if (!StringUtils.containsOnly(name, VALID_CUBENAME)) {
-            logger.info("Invalid Cube name {}, only letters, numbers and 
underline supported.", name);
-            throw new BadRequestException("Invalid Cube name, only letters, 
numbers and underline supported.");
+        if (!ValidateUtil.isAlphanumericUnderscore(name)) {
+            throw new BadRequestException("Invalid Cube name, only letters, 
numbers and underscore supported.");
         }
 
         try {

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
index 3b22948..07478db 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
@@ -38,6 +38,7 @@ import org.apache.kylin.rest.response.EnvelopeResponse;
 import org.apache.kylin.rest.response.ResponseCode;
 import org.apache.kylin.rest.service.ModelService;
 import org.apache.kylin.rest.service.ProjectService;
+import org.apache.kylin.rest.util.ValidateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -65,9 +66,6 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 public class ModelController extends BasicController {
     private static final Logger logger = 
LoggerFactory.getLogger(ModelController.class);
 
-    private static final char[] VALID_MODELNAME = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
-            .toCharArray();
-
     @Autowired
     @Qualifier("modelMgmtService")
     private ModelService modelService;
@@ -114,9 +112,10 @@ public class ModelController extends BasicController {
             logger.info("Model name should not be empty.");
             throw new BadRequestException("Model name should not be empty.");
         }
-        if (!StringUtils.containsOnly(modelDesc.getName(), VALID_MODELNAME)) {
-            logger.info("Invalid Model name {}, only letters, numbers and 
underline supported.", modelDesc.getName());
-            throw new BadRequestException("Invalid Model name, only letters, 
numbers and underline supported.");
+        if (!ValidateUtil.isAlphanumericUnderscore(modelDesc.getName())) {
+            throw new BadRequestException(
+                    String.format("Invalid model name %s, only letters, 
numbers and underscore " + "supported."),
+                    modelDesc.getName());
         }
 
         try {
@@ -201,8 +200,9 @@ public class ModelController extends BasicController {
         if (StringUtils.isEmpty(newModelName)) {
             throw new BadRequestException("New model name should not be 
empty.");
         }
-        if (!StringUtils.containsOnly(newModelName, VALID_MODELNAME)) {
-            throw new BadRequestException("Invalid Model name, only letters, 
numbers and underline supported.");
+        if (!ValidateUtil.isAlphanumericUnderscore(newModelName)) {
+            throw new BadRequestException(String
+                    .format("Invalid model name %s, only letters, numbers and 
underscore supported.", newModelName));
         }
 
         DataModelDesc newModelDesc = DataModelDesc.getCopyOf(modelDesc);

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
index 8c998f7..902ed24 100644
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
+++ 
b/server-base/src/main/java/org/apache/kylin/rest/controller/ProjectController.java
@@ -33,6 +33,7 @@ import org.apache.kylin.rest.service.AccessService;
 import org.apache.kylin.rest.service.CubeService;
 import org.apache.kylin.rest.service.ProjectService;
 import org.apache.kylin.rest.util.AclEvaluate;
+import org.apache.kylin.rest.util.ValidateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,8 +55,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
 public class ProjectController extends BasicController {
     private static final Logger logger = 
LoggerFactory.getLogger(ProjectController.class);
 
-    private static final char[] VALID_PROJECTNAME = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_".toCharArray();
-
     @Autowired
     @Qualifier("projectService")
     private ProjectService projectService;
@@ -78,13 +77,15 @@ public class ProjectController extends BasicController {
      */
     @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { 
"application/json" })
     @ResponseBody
-    public List<ProjectInstance> getProjects(@RequestParam(value = "limit", 
required = false) Integer limit, @RequestParam(value = "offset", required = 
false) Integer offset) {
+    public List<ProjectInstance> getProjects(@RequestParam(value = "limit", 
required = false) Integer limit,
+            @RequestParam(value = "offset", required = false) Integer offset) {
         return projectService.listProjects(limit, offset);
     }
 
     @RequestMapping(value = "/readable", method = { RequestMethod.GET }, 
produces = { "application/json" })
     @ResponseBody
-    public List<ProjectInstance> getReadableProjects(@RequestParam(value = 
"limit", required = false) Integer limit, @RequestParam(value = "offset", 
required = false) Integer offset) {
+    public List<ProjectInstance> getReadableProjects(@RequestParam(value = 
"limit", required = false) Integer limit,
+            @RequestParam(value = "offset", required = false) Integer offset) {
 
         List<ProjectInstance> readableProjects = new 
ArrayList<ProjectInstance>();
 
@@ -132,16 +133,16 @@ public class ProjectController extends BasicController {
             throw new InternalErrorException("A project name must be given to 
create a project");
         }
 
-        if (!StringUtils.containsOnly(projectDesc.getName(), 
VALID_PROJECTNAME)) {
-            logger.info("Invalid Project name {}, only letters, numbers and 
underline supported.", projectDesc.getName());
-            throw new BadRequestException("Invalid Project name, only letters, 
numbers and underline supported.");
+        if (!ValidateUtil.isAlphanumericUnderscore(projectDesc.getName())) {
+            throw new BadRequestException(
+                    String.format("Invalid Project name %s, only letters, 
numbers and underscore supported."),
+                    projectDesc.getName());
         }
 
         ProjectInstance createdProj = null;
         try {
             createdProj = projectService.createProject(projectDesc);
         } catch (Exception e) {
-            logger.error("Failed to deal with the request.", e);
             throw new InternalErrorException(e.getLocalizedMessage());
         }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
----------------------------------------------------------------------
diff --git a/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java 
b/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
index fe1e24e..171c548 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/msg/Message.java
@@ -98,7 +98,7 @@ public class Message {
     }
 
     public String getINVALID_CUBE_NAME() {
-        return "Invalid Cube name '%s', only letters, numbers and underline 
supported.";
+        return "Invalid Cube name '%s', only letters, numbers and underscore 
supported.";
     }
 
     public String getCUBE_ALREADY_EXIST() {

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
index 2e93a81..a81d189 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java
@@ -70,6 +70,7 @@ import org.apache.kylin.rest.response.HBaseResponse;
 import org.apache.kylin.rest.response.MetricsResponse;
 import org.apache.kylin.rest.security.AclPermission;
 import org.apache.kylin.rest.util.AclEvaluate;
+import org.apache.kylin.rest.util.ValidateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
@@ -96,9 +97,6 @@ public class CubeService extends BasicService implements 
InitializingBean {
 
     private static final Logger logger = 
LoggerFactory.getLogger(CubeService.class);
 
-    public static final char[] VALID_CUBENAME = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
-            .toCharArray();
-
     protected Cache<String, HBaseResponse> htableInfoCache = 
CacheBuilder.newBuilder().build();
 
     @Autowired
@@ -121,7 +119,7 @@ public class CubeService extends BasicService implements 
InitializingBean {
     private AclEvaluate aclEvaluate;
 
     public boolean isCubeNameVaildate(final String cubeName) {
-        if (StringUtils.isEmpty(cubeName) || 
!StringUtils.containsOnly(cubeName, VALID_CUBENAME)) {
+        if (StringUtils.isEmpty(cubeName) || 
!ValidateUtil.isAlphanumericUnderscore(cubeName)) {
             return false;
         }
         for (CubeInstance cubeInstance : getCubeManager().listAllCubes()) {
@@ -521,8 +519,8 @@ public class CubeService extends BasicService implements 
InitializingBean {
 
         CubeUpdate update = new CubeUpdate(cube.latestCopyForWrite());
         update.setToRemoveSegs(cube.getSegments().toArray(new 
CubeSegment[cube.getSegments().size()]));
-        update.setCuboids(Maps.<Long, Long>newHashMap());
-        update.setCuboidsRecommend(Sets.<Long>newHashSet());
+        update.setCuboids(Maps.<Long, Long> newHashMap());
+        update.setCuboidsRecommend(Sets.<Long> newHashSet());
         CubeManager.getInstance(getConfig()).updateCube(update);
     }
 
@@ -611,8 +609,8 @@ public class CubeService extends BasicService implements 
InitializingBean {
             logger.info("Cube name should not be empty.");
             throw new BadRequestException(msg.getEMPTY_CUBE_NAME());
         }
-        if (!StringUtils.containsOnly(cubeName, VALID_CUBENAME)) {
-            logger.info("Invalid Cube name {}, only letters, numbers and 
underline supported.", cubeName);
+        if (!ValidateUtil.isAlphanumericUnderscore(cubeName)) {
+            logger.info("Invalid Cube name {}, only letters, numbers and 
underscore supported.", cubeName);
             throw new 
BadRequestException(String.format(msg.getINVALID_CUBE_NAME(), cubeName));
         }
 
@@ -766,7 +764,7 @@ public class CubeService extends BasicService implements 
InitializingBean {
     public CubeInstanceResponse createCubeInstanceResponse(CubeInstance cube) {
         return new CubeInstanceResponse(cube, 
projectService.getProjectOfCube(cube.getName()));
     }
-    
+
     public CuboidTreeResponse getCuboidTreeResponse(CuboidScheduler 
cuboidScheduler, Map<Long, Long> rowCountMap,
             Map<Long, Long> hitFrequencyMap, Map<Long, Long> queryMatchMap, 
Set<Long> currentCuboidSet) {
         long baseCuboidId = cuboidScheduler.getBaseCuboidId();

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java 
b/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
index 6a21fad..43ce0b1 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/ModelService.java
@@ -44,6 +44,7 @@ import org.apache.kylin.rest.msg.Message;
 import org.apache.kylin.rest.msg.MsgPicker;
 import org.apache.kylin.rest.security.AclPermission;
 import org.apache.kylin.rest.util.AclEvaluate;
+import org.apache.kylin.rest.util.ValidateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -63,9 +64,6 @@ public class ModelService extends BasicService {
 
     private static final Logger logger = 
LoggerFactory.getLogger(ModelService.class);
 
-    public static final char[] VALID_MODELNAME = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
-            .toCharArray();
-
     @Autowired
     @Qualifier("accessService")
     private AccessService accessService;
@@ -78,7 +76,7 @@ public class ModelService extends BasicService {
     private AclEvaluate aclEvaluate;
 
     public boolean isModelNameValidate(final String modelName) {
-        if (StringUtils.isEmpty(modelName) || 
!StringUtils.containsOnly(modelName, VALID_MODELNAME)) {
+        if (StringUtils.isEmpty(modelName) || 
!ValidateUtil.isAlphanumericUnderscore(modelName)) {
             return false;
         }
         for (DataModelDesc model : getDataModelManager().getModels()) {
@@ -140,7 +138,7 @@ public class ModelService extends BasicService {
         if (getDataModelManager().getDataModelDesc(desc.getName()) != null) {
             throw new 
BadRequestException(String.format(msg.getDUPLICATE_MODEL_NAME(), 
desc.getName()));
         }
-        
+
         DataModelDesc createdDesc = null;
         String owner = 
SecurityContextHolder.getContext().getAuthentication().getName();
         createdDesc = getDataModelManager().createDataModelDesc(desc, 
projectName, owner);
@@ -345,8 +343,8 @@ public class ModelService extends BasicService {
             logger.info("Model name should not be empty.");
             throw new BadRequestException(msg.getEMPTY_MODEL_NAME());
         }
-        if (!StringUtils.containsOnly(modelName, VALID_MODELNAME)) {
-            logger.info("Invalid Model name {}, only letters, numbers and 
underline supported.", modelDesc.getName());
+        if (!ValidateUtil.isAlphanumericUnderscore(modelName)) {
+            logger.info("Invalid model name {}, only letters, numbers and 
underscore supported.", modelDesc.getName());
             throw new 
BadRequestException(String.format(msg.getINVALID_MODEL_NAME(), modelName));
         }
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/main/java/org/apache/kylin/rest/util/ValidateUtil.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/util/ValidateUtil.java 
b/server-base/src/main/java/org/apache/kylin/rest/util/ValidateUtil.java
index be20419..90d41ca 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/util/ValidateUtil.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/util/ValidateUtil.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.kylin.common.persistence.AclEntity;
@@ -50,6 +51,7 @@ import com.google.common.base.Preconditions;
 
 @Component("validateUtil")
 public class ValidateUtil {
+    private final static Pattern alphaNumUnderscorePattren = 
Pattern.compile("[a-zA-Z0-9_]+");
 
     @Autowired
     @Qualifier("userService")
@@ -71,6 +73,10 @@ public class ValidateUtil {
     @Qualifier("userGroupService")
     private IUserGroupService userGroupService;
 
+    public static boolean isAlphanumericUnderscore(String toCheck) {
+        return toCheck == null ? false : 
alphaNumUnderscorePattren.matcher(toCheck).matches();
+    }
+
     //Identifiers may be user or user authority(you may call role or group)
     public void validateIdentifiers(String name, String type) throws 
IOException {
         if (type.equalsIgnoreCase(MetadataConstants.TYPE_USER) && 
!userService.userExists(name)) {
@@ -169,5 +175,4 @@ public class ValidateUtil {
         }
         return cols;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/b4d5a142/server-base/src/test/java/org/apache/kylin/rest/util/ValidateUtilTest.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/test/java/org/apache/kylin/rest/util/ValidateUtilTest.java 
b/server-base/src/test/java/org/apache/kylin/rest/util/ValidateUtilTest.java
new file mode 100644
index 0000000..8f3b14c
--- /dev/null
+++ b/server-base/src/test/java/org/apache/kylin/rest/util/ValidateUtilTest.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.kylin.rest.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ValidateUtilTest {
+
+    @Test
+    public void testIsAlphanumericUnderscore() {
+        Assert.assertTrue(ValidateUtil.isAlphanumericUnderscore("a"));
+        Assert.assertTrue(ValidateUtil.isAlphanumericUnderscore("123"));
+        Assert.assertTrue(ValidateUtil.isAlphanumericUnderscore("abc123"));
+        Assert.assertTrue(ValidateUtil.isAlphanumericUnderscore("abc123_"));
+        Assert.assertFalse(ValidateUtil.isAlphanumericUnderscore("abc@"));
+        Assert.assertFalse(ValidateUtil.isAlphanumericUnderscore(""));
+        Assert.assertFalse(ValidateUtil.isAlphanumericUnderscore(null));
+    }
+}

Reply via email to