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)); + } +}