http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
deleted file mode 100644
index 12cd717..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelControllerV2.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.common.util.JsonUtil;
-import org.apache.kylin.cube.CubeInstance;
-import org.apache.kylin.metadata.MetadataManager;
-import org.apache.kylin.metadata.draft.Draft;
-import org.apache.kylin.metadata.draft.DraftManager;
-import org.apache.kylin.metadata.model.DataModelDesc;
-import org.apache.kylin.metadata.model.TblColRef;
-import org.apache.kylin.metadata.project.ProjectInstance;
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.BadRequestException;
-import org.apache.kylin.rest.msg.Message;
-import org.apache.kylin.rest.msg.MsgPicker;
-import org.apache.kylin.rest.request.ModelRequest;
-import org.apache.kylin.rest.response.DataModelDescResponse;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.GeneralResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.service.CacheService;
-import org.apache.kylin.rest.service.ModelService;
-import org.apache.kylin.rest.service.ProjectService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Sets;
-
-/**
- * ModelController is defined as Restful API entrance for UI.
- *
- * @author jiazhong
- */
-@Controller
-@RequestMapping(value = "/models")
-public class ModelControllerV2 extends BasicController {
-    private static final Logger logger = 
LoggerFactory.getLogger(ModelControllerV2.class);
-
-    public static final char[] VALID_MODELNAME = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
-            .toCharArray();
-
-    @Autowired
-    @Qualifier("modelMgmtService")
-    private ModelService modelService;
-
-    @Autowired
-    @Qualifier("projectService")
-    private ProjectService projectService;
-
-    @Autowired
-    @Qualifier("cacheService")
-    private CacheService cacheService;
-
-    @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getModelsPaging(@RequestParam(value = "modelName", 
required = false) String modelName,
-            @RequestParam(value = "exactMatch", required = false, defaultValue 
= "true") boolean exactMatch,
-            @RequestParam(value = "projectName", required = false) String 
projectName,
-            @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
-            @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize)
-            throws IOException {
-
-        List<DataModelDescResponse> response = new 
ArrayList<DataModelDescResponse>();
-
-        // official models
-        for (DataModelDesc m : modelService.listAllModels(modelName, 
projectName, exactMatch)) {
-            Preconditions.checkState(!m.isDraft());
-
-            DataModelDescResponse r = new DataModelDescResponse(m);
-            r.setProject(projectService.getProjectOfModel(m.getName()));
-            response.add(r);
-        }
-
-        // draft models
-        for (Draft d : modelService.listModelDrafts(modelName, projectName)) {
-            DataModelDesc m = (DataModelDesc) d.getEntity();
-            Preconditions.checkState(m.isDraft());
-
-            if (contains(response, m.getName()) == false) {
-                DataModelDescResponse r = new DataModelDescResponse(m);
-                r.setProject(d.getProject());
-                response.add(r);
-            }
-        }
-
-        int offset = pageOffset * pageSize;
-        int limit = pageSize;
-        int size = response.size();
-
-        if (size <= offset) {
-            offset = size;
-            limit = 0;
-        }
-
-        if ((size - offset) < limit) {
-            limit = size - offset;
-        }
-        HashMap<String, Object> data = new HashMap<String, Object>();
-        data.put("models", response.subList(offset, offset + limit));
-        data.put("size", size);
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    private boolean contains(List<DataModelDescResponse> response, String 
name) {
-        for (DataModelDescResponse m : response) {
-            if (m.getName().equals(name))
-                return true;
-        }
-        return false;
-    }
-
-    @RequestMapping(value = "", method = { RequestMethod.PUT }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse updateModelDescV2(@RequestBody ModelRequest 
modelRequest) throws IOException {
-        DraftManager draftMgr = modelService.getDraftManager();
-
-        DataModelDesc modelDesc = deserializeDataModelDescV2(modelRequest);
-        modelService.primaryCheck(modelDesc);
-
-        String project = (null == modelRequest.getProject()) ? 
ProjectInstance.DEFAULT_PROJECT_NAME
-                : modelRequest.getProject();
-
-        // don't use checkpoint/rollback, the following update is the only 
change that must succeed
-
-        // save/update model
-        modelDesc = modelService.updateModelToResourceStore(modelDesc, 
project);
-
-        // remove any previous draft
-        draftMgr.delete(modelDesc.getUuid());
-
-        String descData = JsonUtil.writeValueAsIndentString(modelDesc);
-        GeneralResponse data = new GeneralResponse();
-        data.setProperty("uuid", modelDesc.getUuid());
-        data.setProperty("modelDescData", descData);
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    @RequestMapping(value = "/validness", method = { RequestMethod.POST }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse checkModel(@RequestBody ModelRequest modelRequest) 
throws IOException {
-        Preconditions.checkNotNull(modelRequest.getProject());
-        Preconditions.checkNotNull(modelRequest.getModelDescData());
-
-        DataModelDesc modelDesc = deserializeDataModelDescV2(modelRequest);
-        modelService.primaryCheck(modelDesc);
-        modelService.checkCCExpression(modelDesc, modelRequest.getProject());
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, null, "");
-    }
-
-    @RequestMapping(value = "/draft", method = { RequestMethod.PUT }, produces 
= {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse updateModelDescDraftV2(@RequestBody ModelRequest 
modelRequest) throws IOException {
-        DraftManager draftMgr = modelService.getDraftManager();
-
-        DataModelDesc modelDesc = deserializeDataModelDescV2(modelRequest);
-        modelService.primaryCheck(modelDesc);
-
-        String project = (null == modelRequest.getProject()) ? 
ProjectInstance.DEFAULT_PROJECT_NAME
-                : modelRequest.getProject();
-
-        if (modelDesc.getUuid() == null)
-            modelDesc.updateRandomUuid();
-        modelDesc.setDraft(true);
-
-        draftMgr.save(project, modelDesc.getUuid(), modelDesc);
-
-        String descData = JsonUtil.writeValueAsIndentString(modelDesc);
-        GeneralResponse data = new GeneralResponse();
-        data.setProperty("uuid", modelDesc.getUuid());
-        data.setProperty("modelDescData", descData);
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    @RequestMapping(value = "/{projectName}/{modelName}", method = { 
RequestMethod.DELETE }, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void deleteModelV2(@PathVariable String projectName, @PathVariable 
String modelName) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        DataModelDesc model = modelService.getModel(modelName, projectName);
-        Draft draft = modelService.getModelDraft(modelName, projectName);
-        if (null == model && null == draft)
-            throw new 
BadRequestException(String.format(msg.getMODEL_NOT_FOUND(), modelName));
-
-        if (model != null)
-            modelService.dropModel(model);
-
-        if (draft != null)
-            modelService.getDraftManager().delete(draft.getUuid());
-    }
-
-    @RequestMapping(value = "/{modelName}/clone", method = { RequestMethod.PUT 
}, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse cloneModelV2(@PathVariable String modelName, 
@RequestBody ModelRequest modelRequest)
-            throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        String project = modelRequest.getProject();
-        MetadataManager metaManager = 
MetadataManager.getInstance(KylinConfig.getInstanceFromEnv());
-        DataModelDesc modelDesc = metaManager.getDataModelDesc(modelName);
-        String newModelName = modelRequest.getModelName();
-
-        if (StringUtils.isEmpty(project)) {
-            logger.info("Project name should not be empty.");
-            throw new BadRequestException(msg.getEMPTY_PROJECT_NAME());
-        }
-
-        if (modelDesc == null || StringUtils.isEmpty(modelName)) {
-            throw new BadRequestException(msg.getEMPTY_MODEL_NAME());
-        }
-
-        if (StringUtils.isEmpty(newModelName)) {
-            logger.info("New model name is empty.");
-            throw new BadRequestException(msg.getEMPTY_NEW_MODEL_NAME());
-        }
-        if (!StringUtils.containsOnly(newModelName, VALID_MODELNAME)) {
-            logger.info("Invalid Model name {}, only letters, numbers and 
underline supported.", newModelName);
-            throw new 
BadRequestException(String.format(msg.getINVALID_MODEL_NAME(), newModelName));
-        }
-
-        DataModelDesc newModelDesc = DataModelDesc.getCopyOf(modelDesc);
-        newModelDesc.setName(newModelName);
-
-        newModelDesc = modelService.createModelDesc(project, newModelDesc);
-
-        //reload avoid shallow
-        
metaManager.reloadDataModelDescAt(DataModelDesc.concatResourcePath(newModelName));
-
-        String descData = JsonUtil.writeValueAsIndentString(newModelDesc);
-        GeneralResponse data = new GeneralResponse();
-        data.setProperty("uuid", newModelDesc.getUuid());
-        data.setProperty("modelDescData", descData);
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    private DataModelDesc deserializeDataModelDescV2(ModelRequest 
modelRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        DataModelDesc desc = null;
-        try {
-            logger.debug("deserialize MODEL " + 
modelRequest.getModelDescData());
-            desc = JsonUtil.readValue(modelRequest.getModelDescData(), 
DataModelDesc.class);
-        } catch (JsonParseException e) {
-            logger.error("The data model definition is not valid.", e);
-            throw new BadRequestException(msg.getINVALID_MODEL_DEFINITION());
-        } catch (JsonMappingException e) {
-            logger.error("The data model definition is not valid.", e);
-            throw new BadRequestException(msg.getINVALID_MODEL_DEFINITION());
-        }
-        return desc;
-    }
-
-    @RequestMapping(value = "/{modelName}/{projectName}/usedCols", method = 
RequestMethod.GET, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getUsedColsV2(@PathVariable String projectName, 
@PathVariable String modelName) {
-
-        Map<String, Set<String>> data = new HashMap<>();
-
-        for (Map.Entry<TblColRef, Set<CubeInstance>> entry : 
modelService.getUsedDimCols(modelName, projectName)
-                .entrySet()) {
-            populateUsedColResponse(entry.getKey(), entry.getValue(), data);
-        }
-
-        for (Map.Entry<TblColRef, Set<CubeInstance>> entry : 
modelService.getUsedNonDimCols(modelName, projectName)
-                .entrySet()) {
-            populateUsedColResponse(entry.getKey(), entry.getValue(), data);
-        }
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    private void populateUsedColResponse(TblColRef tblColRef, 
Set<CubeInstance> cubeInstances,
-            Map<String, Set<String>> ret) {
-        String columnIdentity = tblColRef.getIdentity();
-        if (!ret.containsKey(columnIdentity)) {
-            ret.put(columnIdentity, Sets.<String> newHashSet());
-        }
-
-        for (CubeInstance cubeInstance : cubeInstances) {
-            ret.get(columnIdentity).add(cubeInstance.getCanonicalName());
-        }
-    }
-
-    public void setModelService(ModelService modelService) {
-        this.modelService = modelService;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
deleted file mode 100644
index 88089f5..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ModelDescControllerV2.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-import org.apache.kylin.common.KylinConfig;
-import org.apache.kylin.metadata.MetadataManager;
-import org.apache.kylin.metadata.draft.Draft;
-import org.apache.kylin.metadata.model.DataModelDesc;
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.BadRequestException;
-import org.apache.kylin.rest.msg.Message;
-import org.apache.kylin.rest.msg.MsgPicker;
-import org.apache.kylin.rest.response.DataModelDescResponse;
-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.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.google.common.base.Preconditions;
-
-/**
- * @author jiazhong
- * 
- */
-@Controller
-@RequestMapping(value = "/model_desc")
-public class ModelDescControllerV2 extends BasicController {
-
-    @Autowired
-    @Qualifier("modelMgmtService")
-    private ModelService modelService;
-
-    @Autowired
-    @Qualifier("projectService")
-    private ProjectService projectService;
-
-    /**
-     * Get detail information of the "Model ID"
-     *
-     * @param modelName
-     *            Model ID
-     * @return
-     * @throws IOException
-     */
-    @RequestMapping(value = "/{projectName}/{modelName}", method = { 
RequestMethod.GET }, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getModelV2(@PathVariable String projectName, 
@PathVariable String modelName) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        KylinConfig config = KylinConfig.getInstanceFromEnv();
-        MetadataManager metaMgr = MetadataManager.getInstance(config);
-
-        DataModelDesc model = modelService.getModel(modelName, projectName);
-        Draft draft = modelService.getModelDraft(modelName, projectName);
-
-        if (model == null && draft == null)
-            throw new 
BadRequestException(String.format(msg.getMODEL_NOT_FOUND(), modelName));
-
-        // figure out project
-        String project = null;
-        if (model != null) {
-            project = projectService.getProjectOfModel(modelName);
-        } else {
-            project = draft.getProject();
-        }
-
-        // result
-        HashMap<String, DataModelDescResponse> result = new HashMap<String, 
DataModelDescResponse>();
-        if (model != null) {
-            Preconditions.checkState(!model.isDraft());
-            DataModelDescResponse r = new DataModelDescResponse(model);
-            r.setProject(project);
-            result.put("model", r);
-        }
-        if (draft != null) {
-            DataModelDesc dm = (DataModelDesc) draft.getEntity();
-            Preconditions.checkState(dm.isDraft());
-            DataModelDescResponse r = new DataModelDescResponse(dm);
-            r.setProject(project);
-            result.put("draft", r);
-        }
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, result, "");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java
deleted file mode 100644
index d6ac8f2..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/ProjectControllerV2.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.kylin.common.util.JsonUtil;
-import org.apache.kylin.metadata.project.ProjectInstance;
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.BadRequestException;
-import org.apache.kylin.rest.msg.Message;
-import org.apache.kylin.rest.msg.MsgPicker;
-import org.apache.kylin.rest.request.ProjectRequest;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.service.CubeService;
-import org.apache.kylin.rest.service.ModelService;
-import org.apache.kylin.rest.service.ProjectService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-/**
- * @author xduo
- */
-@Controller
-@RequestMapping(value = "/projects")
-public class ProjectControllerV2 extends BasicController {
-    private static final Logger logger = 
LoggerFactory.getLogger(ProjectControllerV2.class);
-
-    private static final char[] VALID_PROJECTNAME = 
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
-            .toCharArray();
-
-    @Autowired
-    @Qualifier("projectService")
-    private ProjectService projectService;
-
-    @Autowired
-    @Qualifier("cubeMgmtService")
-    private CubeService cubeService;
-
-    @Autowired
-    @Qualifier("modelMgmtService")
-    private ModelService modelService;
-
-    @RequestMapping(value = "", method = { RequestMethod.GET }, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getReadableProjectsV2(
-            @RequestParam(value = "projectName", required = false) String 
projectName,
-            @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
-            @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize) {
-
-        HashMap<String, Object> data = new HashMap<String, Object>();
-
-        List<ProjectInstance> readableProjects = 
projectService.getReadableProjects(projectName);
-        int offset = pageOffset * pageSize;
-        int limit = pageSize;
-
-        if (readableProjects.size() <= offset) {
-            offset = readableProjects.size();
-            limit = 0;
-        }
-
-        if ((readableProjects.size() - offset) < limit) {
-            limit = readableProjects.size() - offset;
-        }
-        data.put("projects", readableProjects.subList(offset, offset + limit));
-        data.put("size", readableProjects.size());
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    @RequestMapping(value = "", method = { RequestMethod.POST }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse saveProjectV2(@RequestBody ProjectRequest 
projectRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        ProjectInstance projectDesc = deserializeProjectDescV2(projectRequest);
-
-        if (StringUtils.isEmpty(projectDesc.getName())) {
-            throw new BadRequestException(msg.getEMPTY_PROJECT_NAME());
-        }
-
-        if (!StringUtils.containsOnly(projectDesc.getName(), 
VALID_PROJECTNAME)) {
-            logger.info("Invalid Project name {}, only letters, numbers and 
underline supported.",
-                    projectDesc.getName());
-            throw new 
BadRequestException(String.format(msg.getINVALID_PROJECT_NAME(), 
projectDesc.getName()));
-        }
-
-        ProjectInstance createdProj = null;
-        createdProj = projectService.createProject(projectDesc);
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, createdProj, 
"");
-    }
-
-    @RequestMapping(value = "", method = { RequestMethod.PUT }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse updateProjectV2(@RequestBody ProjectRequest 
projectRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        String formerProjectName = projectRequest.getFormerProjectName();
-        if (StringUtils.isEmpty(formerProjectName)) {
-            throw new BadRequestException(msg.getEMPTY_PROJECT_NAME());
-        }
-
-        ProjectInstance projectDesc = deserializeProjectDescV2(projectRequest);
-
-        ProjectInstance currentProject = 
projectService.getProjectManager().getProject(formerProjectName);
-        if (currentProject == null) {
-            throw new 
BadRequestException(String.format(msg.getPROJECT_NOT_FOUND(), 
formerProjectName));
-        }
-
-        ProjectInstance updatedProj;
-        if (projectDesc.getName().equals(currentProject.getName())) {
-            updatedProj = projectService.updateProject(projectDesc, 
currentProject);
-        } else {
-            if (!isProjectEmpty(formerProjectName)) {
-                throw new 
BadRequestException(msg.getDELETE_PROJECT_NOT_EMPTY());
-            }
-            // disable project rename
-            updatedProj = projectService.renameProject(projectDesc, 
currentProject);
-        }
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, updatedProj, 
"");
-    }
-
-    private ProjectInstance deserializeProjectDescV2(ProjectRequest 
projectRequest) throws IOException {
-        logger.debug("Saving project " + projectRequest.getProjectDescData());
-        ProjectInstance projectDesc = 
JsonUtil.readValue(projectRequest.getProjectDescData(), ProjectInstance.class);
-        return projectDesc;
-    }
-
-    @RequestMapping(value = "/{projectName}", method = { RequestMethod.DELETE 
}, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void deleteProjectV2(@PathVariable String projectName) throws 
IOException {
-        Message msg = MsgPicker.getMsg();
-        ProjectInstance project = 
projectService.getProjectManager().getProject(projectName);
-        if (!isProjectEmpty(projectName)) {
-            throw new BadRequestException(msg.getDELETE_PROJECT_NOT_EMPTY());
-        }
-
-        projectService.deleteProject(projectName, project);
-    }
-
-    private boolean isProjectEmpty(String projectName) throws IOException {
-        return cubeService.listAllCubes(projectName).isEmpty()
-                && cubeService.listCubeDrafts(null, null, projectName, 
true).isEmpty()
-                && modelService.listAllModels(null, projectName, 
false).isEmpty()
-                && modelService.listModelDrafts(null, projectName).isEmpty();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/QueryControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/QueryControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/QueryControllerV2.java
deleted file mode 100644
index 1aa72ba..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/QueryControllerV2.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.sql.SQLException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.kylin.common.debug.BackdoorToggles;
-import org.apache.kylin.metadata.querymeta.SelectedColumnMeta;
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.InternalErrorException;
-import org.apache.kylin.rest.model.Query;
-import org.apache.kylin.rest.request.MetaRequest;
-import org.apache.kylin.rest.request.PrepareSqlRequest;
-import org.apache.kylin.rest.request.SQLRequest;
-import org.apache.kylin.rest.request.SaveSqlRequest;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.response.SQLResponse;
-import org.apache.kylin.rest.service.QueryService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.http.MediaType;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.supercsv.io.CsvListWriter;
-import org.supercsv.io.ICsvListWriter;
-import org.supercsv.prefs.CsvPreference;
-
-import com.google.common.collect.Maps;
-
-/**
- * Handle query requests.
- * 
- * @author xduo
- */
-@Controller
-public class QueryControllerV2 extends BasicController {
-
-    @SuppressWarnings("unused")
-    private static final Logger logger = 
LoggerFactory.getLogger(QueryControllerV2.class);
-
-    @Autowired
-    @Qualifier("queryService")
-    private QueryService queryService;
-
-    @RequestMapping(value = "/query", method = RequestMethod.POST, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse queryV2(@RequestBody SQLRequest sqlRequest) {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
queryService.doQueryWithCache(sqlRequest), "");
-    }
-
-    // TODO should be just "prepare" a statement, get back expected 
ResultSetMetaData
-
-    @RequestMapping(value = "/query/prestate", method = RequestMethod.POST, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse prepareQueryV2(@RequestBody PrepareSqlRequest 
sqlRequest) {
-        Map<String, String> newToggles = Maps.newHashMap();
-        if (sqlRequest.getBackdoorToggles() != null)
-            newToggles.putAll(sqlRequest.getBackdoorToggles());
-        newToggles.put(BackdoorToggles.DEBUG_TOGGLE_PREPARE_ONLY, "true");
-        sqlRequest.setBackdoorToggles(newToggles);
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
queryService.doQueryWithCache(sqlRequest), "");
-    }
-
-    @RequestMapping(value = "/saved_queries", method = RequestMethod.POST, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void saveQueryV2(@RequestBody SaveSqlRequest sqlRequest) throws 
IOException {
-
-        String creator = 
SecurityContextHolder.getContext().getAuthentication().getName();
-        Query newQuery = new Query(sqlRequest.getName(), 
sqlRequest.getProject(), sqlRequest.getSql(),
-                sqlRequest.getDescription());
-
-        queryService.saveQuery(creator, newQuery);
-    }
-
-    @RequestMapping(value = "/saved_queries/{id}", method = 
RequestMethod.DELETE, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void removeQueryV2(@PathVariable String id) throws IOException {
-
-        String creator = 
SecurityContextHolder.getContext().getAuthentication().getName();
-        queryService.removeQuery(creator, id);
-    }
-
-    @RequestMapping(value = "/saved_queries", method = RequestMethod.GET, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getQueriesV2(@RequestParam(value = "project", 
required = false) String project,
-            @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
-            @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize)
-            throws IOException {
-
-        HashMap<String, Object> data = new HashMap<String, Object>();
-        String creator = 
SecurityContextHolder.getContext().getAuthentication().getName();
-        List<Query> queries = new ArrayList<Query>();
-        for (Query query : queryService.getQueries(creator)) {
-            if (project == null || query.getProject().equals(project))
-                queries.add(query);
-        }
-
-        int offset = pageOffset * pageSize;
-        int limit = pageSize;
-
-        if (queries.size() <= offset) {
-            offset = queries.size();
-            limit = 0;
-        }
-
-        if ((queries.size() - offset) < limit) {
-            limit = queries.size() - offset;
-        }
-
-        data.put("queries", queries.subList(offset, offset + limit));
-        data.put("size", queries.size());
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-    }
-
-    @RequestMapping(value = "/query/format/{format}", method = 
RequestMethod.POST, produces = {
-            "application/vnd.apache.kylin-v2+json" }, consumes = 
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
-    @ResponseBody
-    public void downloadQueryResultV2(@PathVariable String format, SQLRequest 
sqlRequest,
-            HttpServletResponse response) throws IOException {
-
-        SQLResponse result = queryService.doQueryWithCache(sqlRequest);
-
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-        String nowStr = sdf.format(new Date());
-        response.setContentType("text/" + format + ";charset=utf-8");
-        response.setHeader("Content-Disposition", "attachment; filename=\"" + 
nowStr + ".result." + format + "\"");
-        ICsvListWriter csvWriter = null;
-
-        try {
-            //Add a BOM for Excel
-            Writer writer = new OutputStreamWriter(response.getOutputStream(), 
StandardCharsets.UTF_8);
-            writer.write('\uFEFF');
-
-            csvWriter = new CsvListWriter(writer, 
CsvPreference.STANDARD_PREFERENCE);
-            List<String> headerList = new ArrayList<String>();
-
-            for (SelectedColumnMeta column : result.getColumnMetas()) {
-                headerList.add(column.getLabel());
-            }
-
-            String[] headers = new String[headerList.size()];
-            csvWriter.writeHeader(headerList.toArray(headers));
-
-            for (List<String> row : result.getResults()) {
-                csvWriter.write(row);
-            }
-        } catch (IOException e) {
-            throw new InternalErrorException(e);
-        } finally {
-            IOUtils.closeQuietly(csvWriter);
-        }
-    }
-
-    @RequestMapping(value = "/tables_and_columns", method = RequestMethod.GET, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getMetadataV2(MetaRequest metaRequest) throws 
SQLException, IOException {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
queryService.getMetadataV2(metaRequest.getProject()),
-                "");
-    }
-
-    public void setQueryService(QueryService queryService) {
-        this.queryService = queryService;
-    }
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
deleted file mode 100644
index 90f2a45..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/StreamingControllerV2.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.util.UUID;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.kylin.common.util.HadoopUtil;
-import org.apache.kylin.common.util.JsonUtil;
-import org.apache.kylin.metadata.model.TableDesc;
-import org.apache.kylin.metadata.streaming.StreamingConfig;
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.BadRequestException;
-import org.apache.kylin.rest.exception.ForbiddenException;
-import org.apache.kylin.rest.exception.InternalErrorException;
-import org.apache.kylin.rest.msg.Message;
-import org.apache.kylin.rest.msg.MsgPicker;
-import org.apache.kylin.rest.request.StreamingRequest;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.service.KafkaConfigService;
-import org.apache.kylin.rest.service.StreamingService;
-import org.apache.kylin.rest.service.TableService;
-import org.apache.kylin.source.kafka.config.KafkaConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-
-/**
- * StreamingController is defined as Restful API entrance for UI.
- *
- * @author jiazhong
- */
-@Controller
-@RequestMapping(value = "/streaming")
-public class StreamingControllerV2 extends BasicController {
-    private static final Logger logger = 
LoggerFactory.getLogger(StreamingControllerV2.class);
-
-    @Autowired
-    @Qualifier("streamingMgmtService")
-    private StreamingService streamingService;
-
-    @Autowired
-    @Qualifier("kafkaMgmtService")
-    private KafkaConfigService kafkaConfigService;
-
-    @Autowired
-    @Qualifier("tableService")
-    private TableService tableService;
-
-    @RequestMapping(value = "/getConfig", method = { RequestMethod.GET }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getStreamingsV2(@RequestParam(value = "table", 
required = false) String table,
-            @RequestParam(value = "project", required = true) String project,
-            @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
-            @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize)
-            throws IOException {
-
-        int offset = pageOffset * pageSize;
-        int limit = pageSize;
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS,
-                streamingService.getStreamingConfigs(table, project, limit, 
offset), "");
-    }
-
-    @RequestMapping(value = "/getKfkConfig", method = { RequestMethod.GET }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getKafkaConfigsV2(
-            @RequestParam(value = "kafkaConfigName", required = false) String 
kafkaConfigName,
-            @RequestParam(value = "project", required = true) String project,
-            @RequestParam(value = "pageOffset", required = false, defaultValue 
= "0") Integer pageOffset,
-            @RequestParam(value = "pageSize", required = false, defaultValue = 
"10") Integer pageSize)
-            throws IOException {
-
-        int offset = pageOffset * pageSize;
-        int limit = pageSize;
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS,
-                kafkaConfigService.getKafkaConfigs(kafkaConfigName, project, 
limit, offset), "");
-    }
-
-    /**
-     *
-     * create Streaming Schema
-     * @throws java.io.IOException
-     */
-
-    @RequestMapping(value = "", method = { RequestMethod.POST }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void saveStreamingConfigV2(@RequestBody StreamingRequest 
streamingRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        String project = streamingRequest.getProject();
-        TableDesc tableDesc = deserializeTableDescV2(streamingRequest);
-        if (null == tableDesc) {
-            throw new 
BadRequestException(msg.getINVALID_TABLE_DESC_DEFINITION());
-        }
-
-        StreamingConfig streamingConfig = 
deserializeSchemalDescV2(streamingRequest);
-        KafkaConfig kafkaConfig = 
deserializeKafkaSchemalDescV2(streamingRequest);
-
-        boolean saveStreamingSuccess = false, saveKafkaSuccess = false;
-
-        try {
-            tableService.addStreamingTable(tableDesc, project);
-        } catch (IOException e) {
-            throw new 
InternalErrorException(msg.getADD_STREAMING_TABLE_FAIL());
-        }
-
-        streamingConfig.setName(tableDesc.getIdentity());
-        kafkaConfig.setName(tableDesc.getIdentity());
-        try {
-            if (StringUtils.isEmpty(streamingConfig.getName())) {
-                logger.info("StreamingConfig should not be empty.");
-                throw new 
BadRequestException(msg.getEMPTY_STREAMING_CONFIG_NAME());
-            }
-            try {
-                streamingConfig.setUuid(UUID.randomUUID().toString());
-                streamingService.createStreamingConfig(streamingConfig, 
project);
-                saveStreamingSuccess = true;
-            } catch (IOException e) {
-                logger.error("Failed to save StreamingConfig:" + 
e.getLocalizedMessage(), e);
-                throw new 
InternalErrorException(msg.getSAVE_STREAMING_CONFIG_FAIL());
-            }
-            try {
-                kafkaConfig.setUuid(UUID.randomUUID().toString());
-                kafkaConfigService.createKafkaConfig(kafkaConfig, project);
-                saveKafkaSuccess = true;
-            } catch (IOException e) {
-                try {
-                    streamingService.dropStreamingConfig(streamingConfig, 
project);
-                } catch (IOException e1) {
-                    throw new 
InternalErrorException(msg.getCREATE_KAFKA_CONFIG_FAIL());
-                }
-                logger.error("Failed to save KafkaConfig:" + 
e.getLocalizedMessage(), e);
-                throw new 
InternalErrorException(msg.getSAVE_KAFKA_CONFIG_FAIL());
-            }
-        } finally {
-            if (saveKafkaSuccess == false || saveStreamingSuccess == false) {
-
-                if (saveStreamingSuccess == true) {
-                    StreamingConfig sConfig = 
streamingService.getStreamingManager()
-                            .getStreamingConfig(streamingConfig.getName());
-                    try {
-                        streamingService.dropStreamingConfig(sConfig, project);
-                    } catch (IOException e) {
-                        throw new 
InternalErrorException(msg.getROLLBACK_STREAMING_CONFIG_FAIL());
-                    }
-                }
-                if (saveKafkaSuccess == true) {
-                    try {
-                        KafkaConfig kConfig = 
kafkaConfigService.getKafkaConfig(kafkaConfig.getName(), project);
-                        kafkaConfigService.dropKafkaConfig(kConfig, project);
-                    } catch (IOException e) {
-                        throw new 
InternalErrorException(msg.getROLLBACK_KAFKA_CONFIG_FAIL());
-                    }
-                }
-            }
-
-        }
-    }
-
-    @RequestMapping(value = "", method = { RequestMethod.PUT }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void updateStreamingConfigV2(@RequestBody StreamingRequest 
streamingRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        StreamingConfig streamingConfig = 
deserializeSchemalDescV2(streamingRequest);
-        KafkaConfig kafkaConfig = 
deserializeKafkaSchemalDescV2(streamingRequest);
-        String project = streamingRequest.getProject();
-
-        if (streamingConfig == null) {
-            throw new 
BadRequestException(msg.getINVALID_STREAMING_CONFIG_DEFINITION());
-        }
-        try {
-            streamingService.updateStreamingConfig(streamingConfig, project);
-        } catch (AccessDeniedException accessDeniedException) {
-            throw new 
ForbiddenException(msg.getUPDATE_STREAMING_CONFIG_NO_RIGHT());
-        }
-
-        try {
-            kafkaConfigService.updateKafkaConfig(kafkaConfig, project);
-        } catch (AccessDeniedException accessDeniedException) {
-            throw new 
ForbiddenException(msg.getUPDATE_KAFKA_CONFIG_NO_RIGHT());
-        }
-    }
-
-    @RequestMapping(value = "/{project}/{configName}", method = { 
RequestMethod.DELETE }, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void deleteConfigV2(@PathVariable String project, @PathVariable 
String configName) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        StreamingConfig config = 
streamingService.getStreamingManager().getStreamingConfig(configName);
-        KafkaConfig kafkaConfig = 
kafkaConfigService.getKafkaConfig(configName, project);
-        if (null == config) {
-            throw new 
BadRequestException(String.format(msg.getSTREAMING_CONFIG_NOT_FOUND(), 
configName));
-        }
-        streamingService.dropStreamingConfig(config, project);
-        kafkaConfigService.dropKafkaConfig(kafkaConfig, project);
-    }
-
-    private TableDesc deserializeTableDescV2(StreamingRequest 
streamingRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        TableDesc desc = null;
-        try {
-            logger.debug("Saving TableDesc " + 
streamingRequest.getTableData());
-            desc = JsonUtil.readValue(streamingRequest.getTableData(), 
TableDesc.class);
-        } catch (JsonParseException e) {
-            logger.error("The TableDesc definition is invalid.", e);
-            throw new 
BadRequestException(msg.getINVALID_TABLE_DESC_DEFINITION());
-        } catch (JsonMappingException e) {
-            logger.error("The data TableDesc definition is invalid.", e);
-            throw new 
BadRequestException(msg.getINVALID_TABLE_DESC_DEFINITION());
-        }
-
-        if (null != desc) {
-            String[] dbTable = 
HadoopUtil.parseHiveTableName(desc.getIdentity());
-            desc.setName(dbTable[1]);
-            desc.setDatabase(dbTable[0]);
-        }
-        return desc;
-    }
-
-    private StreamingConfig deserializeSchemalDescV2(StreamingRequest 
streamingRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        StreamingConfig desc = null;
-        try {
-            logger.debug("Saving StreamingConfig " + 
streamingRequest.getStreamingConfig());
-            desc = JsonUtil.readValue(streamingRequest.getStreamingConfig(), 
StreamingConfig.class);
-        } catch (JsonParseException e) {
-            logger.error("The StreamingConfig definition is invalid.", e);
-            throw new 
BadRequestException(msg.getINVALID_STREAMING_CONFIG_DEFINITION());
-        } catch (JsonMappingException e) {
-            logger.error("The data StreamingConfig definition is invalid.", e);
-            throw new 
BadRequestException(msg.getINVALID_STREAMING_CONFIG_DEFINITION());
-        }
-        return desc;
-    }
-
-    private KafkaConfig deserializeKafkaSchemalDescV2(StreamingRequest 
streamingRequest) throws IOException {
-        Message msg = MsgPicker.getMsg();
-
-        KafkaConfig desc = null;
-        try {
-            logger.debug("Saving KafkaConfig " + 
streamingRequest.getKafkaConfig());
-            desc = JsonUtil.readValue(streamingRequest.getKafkaConfig(), 
KafkaConfig.class);
-        } catch (JsonParseException e) {
-            logger.error("The KafkaConfig definition is invalid.", e);
-            throw new 
BadRequestException(msg.getINVALID_KAFKA_CONFIG_DEFINITION());
-        } catch (JsonMappingException e) {
-            logger.error("The data KafkaConfig definition is invalid.", e);
-            updateRequest(streamingRequest, false, e.getMessage());
-            throw new 
BadRequestException(msg.getINVALID_KAFKA_CONFIG_DEFINITION());
-        }
-        return desc;
-    }
-
-    private void updateRequest(StreamingRequest request, boolean success, 
String message) {
-        request.setSuccessful(success);
-        request.setMessage(message);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/TableAclControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/TableAclControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/TableAclControllerV2.java
deleted file mode 100644
index a72efa2..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/TableAclControllerV2.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.service.TableACLService;
-import org.apache.kylin.rest.util.ValidateUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-@Controller
-@RequestMapping(value = "/acl")
-public class TableAclControllerV2 extends BasicController {
-
-    @Autowired
-    @Qualifier("TableAclService")
-    private TableACLService tableACLService;
-
-    @Autowired
-    @Qualifier("validateUtil")
-    private ValidateUtil validateUtil;
-
-    @RequestMapping(value = "/table/{project}/{table:.+}", method = 
{RequestMethod.GET}, produces = {"application/vnd.apache.kylin-v2+json"})
-    @ResponseBody
-    public EnvelopeResponse getTableWhiteListByTable(@PathVariable String 
project, @PathVariable String table) throws IOException {
-        validateUtil.vaildateArgs(project, table);
-        project = project.toUpperCase();
-        validateUtil.validateTable(project, table);
-        List<String> allUsers = validateUtil.getAllUsers();
-        List<String> whiteList = 
tableACLService.getTableWhiteListByTable(project, table, allUsers);
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, whiteList, "get 
table acl");
-    }
-
-    @RequestMapping(value = "/table/{project}/black/{table:.+}", method = 
{RequestMethod.GET}, produces = {"application/vnd.apache.kylin-v2+json"})
-    @ResponseBody
-    public EnvelopeResponse getTableBlackListByTable(@PathVariable String 
project, @PathVariable String table) throws IOException {
-        validateUtil.vaildateArgs(project, table);
-        project = project.toUpperCase();
-        validateUtil.validateTable(project, table);
-        List<String> blackList = 
tableACLService.getBlockedUserByTable(project, table);
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, blackList, "get 
table acl");
-    }
-
-    // because the frontend passes user can not visit, so that means put it to 
the table black list
-    @RequestMapping(value = "/table/{project}/{table}/{username}", method = 
{RequestMethod.DELETE}, produces = {"application/vnd.apache.kylin-v2+json"})
-    @ResponseBody
-    public EnvelopeResponse putUserToTableBlackList(
-            @PathVariable String project,
-            @PathVariable String table,
-            @PathVariable String username) throws IOException {
-        validateUtil.vaildateArgs(project, table, username);
-        project = project.toUpperCase();
-        validateUtil.validateUser(username);
-        validateUtil.validateTable(project, table);
-        tableACLService.addToTableBlackList(project, username, table);
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, "", "revoke 
user table query permission and add user to table black list.");
-    }
-
-    // because the frontend passes user can visit, so that means remove the 
user from the table black list
-    @RequestMapping(value = "/table/{project}/{table}/{username}", method = 
{RequestMethod.POST}, produces = {"application/vnd.apache.kylin-v2+json"})
-    @ResponseBody
-    public EnvelopeResponse deleteUserFromTableBlackList(
-            @PathVariable String project,
-            @PathVariable String table,
-            @PathVariable String username) throws IOException {
-        validateUtil.vaildateArgs(project, table, username);
-        project = project.toUpperCase();
-        validateUtil.validateUser(username);
-        validateUtil.validateTable(project, table);
-        tableACLService.deleteFromTableBlackList(project, username, table);
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, "", "grant user 
table query permission and remove user from table black list.");
-    }
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
deleted file mode 100644
index 39c6c32..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/TableControllerV2.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-
-import org.apache.kylin.metadata.model.TableDesc;
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.BadRequestException;
-import org.apache.kylin.rest.msg.Message;
-import org.apache.kylin.rest.msg.MsgPicker;
-import org.apache.kylin.rest.request.HiveTableRequestV2;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.service.TableService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-/**
- * @author xduo
- */
-@Controller
-@RequestMapping(value = "/tables")
-public class TableControllerV2 extends BasicController {
-
-    @SuppressWarnings("unused")
-    private static final Logger logger = 
LoggerFactory.getLogger(TableControllerV2.class);
-
-    @Autowired
-    @Qualifier("tableService")
-    private TableService tableService;
-
-    /**
-     * Get available table list of the project
-     *
-     * @return Table metadata array
-     * @throws IOException
-     */
-
-    @RequestMapping(value = "", method = { RequestMethod.GET }, produces = { 
"application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getTableDescV2(@RequestParam(value = "ext", 
required = false) boolean withExt,
-            @RequestParam(value = "project", required = true) String project) 
throws IOException {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
tableService.getTableDescByProject(project, withExt),
-                "");
-    }
-
-    // FIXME prj-table
-    /**
-     * Get available table list of the input database
-     *
-     * @return Table metadata array
-     * @throws IOException
-     */
-    @RequestMapping(value = "/{project}/{tableName:.+}", method = { 
RequestMethod.GET }, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse getTableDescV2(@PathVariable String tableName, 
@PathVariable String project) {
-        Message msg = MsgPicker.getMsg();
-
-        TableDesc table = tableService.getTableDescByName(tableName, false, 
project);
-        if (table == null)
-            throw new 
BadRequestException(String.format(msg.getHIVE_TABLE_NOT_FOUND(), tableName));
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, table, "");
-    }
-
-    @RequestMapping(value = "/load", method = { RequestMethod.POST }, produces 
= {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse loadHiveTablesV2(@RequestBody HiveTableRequestV2 
requestV2) throws Exception {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS,
-                tableService.loadHiveTables(requestV2.getTables(), 
requestV2.getProject(), requestV2.isNeedProfile()),
-                "");
-    }
-
-    @RequestMapping(value = "/load", method = { RequestMethod.DELETE }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse unLoadHiveTablesV2(@RequestBody HiveTableRequestV2 
requestV2) throws IOException {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS,
-                tableService.unloadHiveTables(requestV2.getTables(), 
requestV2.getProject()), "");
-    }
-
-    // FIXME prj-table
-    /**
-     * Regenerate table cardinality
-     *
-     * @return Table metadata array
-     * @throws IOException
-     */
-    @RequestMapping(value = "/cardinality", method = { RequestMethod.POST }, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public void generateCardinalityV2(@RequestBody HiveTableRequestV2 
requestV2) throws Exception {
-
-        String submitter = 
SecurityContextHolder.getContext().getAuthentication().getName();
-        String[] tables = requestV2.getTables();
-        String project = requestV2.getProject();
-
-        for (String table : tables) {
-            tableService.calculateCardinality(table.toUpperCase(), submitter, 
project);
-        }
-    }
-
-    /**
-     * Show all databases in Hive
-     *
-     * @return Hive databases list
-     * @throws IOException
-     */
-
-    @RequestMapping(value = "/hive", method = { RequestMethod.GET }, produces 
= {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    private EnvelopeResponse showHiveDatabasesV2() throws Exception {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
tableService.getHiveDbNames(), "");
-    }
-
-    /**
-     * Show all tables in a Hive database
-     *
-     * @return Hive table list
-     * @throws IOException
-     */
-
-    @RequestMapping(value = "/hive/{database}", method = { RequestMethod.GET 
}, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    private EnvelopeResponse showHiveTablesV2(@PathVariable String database) 
throws Exception {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
tableService.getHiveTableNames(database), "");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/server-base/src/main/java/org/apache/kylin/rest/controller2/UserControllerV2.java
----------------------------------------------------------------------
diff --git 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/UserControllerV2.java
 
b/server-base/src/main/java/org/apache/kylin/rest/controller2/UserControllerV2.java
deleted file mode 100644
index c0f5c17..0000000
--- 
a/server-base/src/main/java/org/apache/kylin/rest/controller2/UserControllerV2.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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.controller2;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.kylin.rest.controller.BasicController;
-import org.apache.kylin.rest.exception.UnauthorizedException;
-import org.apache.kylin.rest.msg.Message;
-import org.apache.kylin.rest.msg.MsgPicker;
-import org.apache.kylin.rest.response.EnvelopeResponse;
-import org.apache.kylin.rest.response.ResponseCode;
-import org.apache.kylin.rest.service.UserService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-/**
- * Handle user authentication request to protected kylin rest resources by
- * spring security.
- * 
- * @author xduo
- * 
- */
-@Controller
-@RequestMapping(value = "/user")
-public class UserControllerV2 extends BasicController {
-
-    private static final Logger logger = 
LoggerFactory.getLogger(UserControllerV2.class);
-
-    @Autowired
-    @Qualifier("userService")
-    UserService userService;
-
-    @RequestMapping(value = "/authentication", method = RequestMethod.POST, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse<UserDetails> authenticateV2() {
-        EnvelopeResponse response = authenticatedUserV2();
-        logger.debug("User login: {}", response.data);
-        return response;
-    }
-
-    @RequestMapping(value = "/authentication", method = RequestMethod.GET, 
produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse<UserDetails> authenticatedUserV2() {
-        Message msg = MsgPicker.getMsg();
-
-        Authentication authentication = 
SecurityContextHolder.getContext().getAuthentication();
-        UserDetails data = null;
-
-        if (authentication == null) {
-            logger.debug("authentication is null.");
-            throw new UnauthorizedException(msg.getAUTH_INFO_NOT_FOUND());
-        }
-
-        if (authentication.getPrincipal() instanceof UserDetails) {
-            data = (UserDetails) authentication.getPrincipal();
-            return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-        }
-
-        if (authentication.getDetails() instanceof UserDetails) {
-            data = (UserDetails) authentication.getDetails();
-            return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, data, "");
-        }
-
-        throw new UnauthorizedException(msg.getAUTH_INFO_NOT_FOUND());
-    }
-
-    @RequestMapping(value = "/authentication/authorities", method = 
RequestMethod.GET, produces = {
-            "application/vnd.apache.kylin-v2+json" })
-    @ResponseBody
-    public EnvelopeResponse<List<String>> getAuthoritiesV2() throws 
IOException {
-
-        return new EnvelopeResponse(ResponseCode.CODE_SUCCESS, 
userService.listUserAuthorities(), "");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/kylin/blob/92306639/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 61c8bff..585a4c3 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
@@ -18,8 +18,6 @@
 
 package org.apache.kylin.rest.service;
 
-import static 
org.apache.kylin.rest.controller2.ModelControllerV2.VALID_MODELNAME;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -71,6 +69,9 @@ 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;

Reply via email to