http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/AdminController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/AdminController.java b/server/src/main/java/org/apache/kylin/rest/controller/AdminController.java deleted file mode 100644 index de3c4b4..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/AdminController.java +++ /dev/null @@ -1,97 +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.controller; - -import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.rest.request.MetricsRequest; -import org.apache.kylin.rest.request.UpdateConfigRequest; -import org.apache.kylin.rest.response.GeneralResponse; -import org.apache.kylin.rest.response.MetricsResponse; -import org.apache.kylin.rest.service.AdminService; -import org.apache.kylin.rest.service.CubeService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -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.ResponseBody; - -/** - * Admin Controller is defined as Restful API entrance for UI. - * - * @author jianliu - * - */ -@Controller -@RequestMapping(value = "/admin") -public class AdminController extends BasicController { - - @Autowired - private AdminService adminService; - @Autowired - private CubeService cubeMgmtService; - - @RequestMapping(value = "/env", method = { RequestMethod.GET }) - @ResponseBody - public GeneralResponse getEnv() { - String env = adminService.getEnv(); - - GeneralResponse envRes = new GeneralResponse(); - envRes.put("env", env); - - return envRes; - } - - @RequestMapping(value = "/config", method = { RequestMethod.GET }) - @ResponseBody - public GeneralResponse getConfig() { - String config = adminService.getConfigAsString(); - - GeneralResponse configRes = new GeneralResponse(); - configRes.put("config", config); - - return configRes; - } - - @RequestMapping(value = "/metrics/cubes", method = { RequestMethod.GET }) - @ResponseBody - public MetricsResponse cubeMetrics(MetricsRequest request) { - return cubeMgmtService.calculateMetrics(request); - } - - @RequestMapping(value = "/storage", method = { RequestMethod.DELETE }) - @ResponseBody - public void cleanupStorage() { - adminService.cleanupStorage(); - } - - @RequestMapping(value = "/config", method = { RequestMethod.PUT }) - public void updateKylinConfig(@RequestBody UpdateConfigRequest updateConfigRequest) { - KylinConfig.getInstanceFromEnv().setProperty(updateConfigRequest.getKey(), updateConfigRequest.getValue()); - } - - public void setAdminService(AdminService adminService) { - this.adminService = adminService; - } - - public void setCubeMgmtService(CubeService cubeMgmtService) { - this.cubeMgmtService = cubeMgmtService; - } - -}
http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/BasicController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/BasicController.java b/server/src/main/java/org/apache/kylin/rest/controller/BasicController.java deleted file mode 100644 index 0e4a70c..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/BasicController.java +++ /dev/null @@ -1,69 +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.controller; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.kylin.rest.exception.BadRequestException; -import org.apache.kylin.rest.exception.ForbiddenException; -import org.apache.kylin.rest.exception.NotFoundException; -import org.apache.kylin.rest.response.ErrorResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -/** - */ -public class BasicController { - - private static final Logger logger = LoggerFactory.getLogger(BasicController.class); - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(Exception.class) - @ResponseBody - ErrorResponse handleError(HttpServletRequest req, Exception ex) { - logger.error("", ex); - return new ErrorResponse(req.getRequestURL().toString(), ex); - } - - @ResponseStatus(HttpStatus.FORBIDDEN) - @ExceptionHandler(ForbiddenException.class) - @ResponseBody - ErrorResponse handleForbidden(HttpServletRequest req, Exception ex) { - return new ErrorResponse(req.getRequestURL().toString(), ex); - } - - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(NotFoundException.class) - @ResponseBody - ErrorResponse handleNotFound(HttpServletRequest req, Exception ex) { - return new ErrorResponse(req.getRequestURL().toString(), ex); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(BadRequestException.class) - @ResponseBody - ErrorResponse handleBadRequest(HttpServletRequest req, Exception ex) { - logger.error("", ex); - return new ErrorResponse(req.getRequestURL().toString(), ex); - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/CacheController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/CacheController.java b/server/src/main/java/org/apache/kylin/rest/controller/CacheController.java deleted file mode 100644 index 845ffe0..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/CacheController.java +++ /dev/null @@ -1,82 +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.controller; - -import java.io.IOException; - -import org.apache.kylin.common.restclient.Broadcaster; -import org.apache.kylin.common.restclient.Broadcaster.EVENT; -import org.apache.kylin.rest.service.CacheService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -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; - -/** - * CubeController is defined as Restful API entrance for UI. - * - * @author jianliu - */ -@Controller -@RequestMapping(value = "/cache") -public class CacheController extends BasicController { - private static final Logger logger = LoggerFactory.getLogger(CacheController.class); - - @Autowired - private CacheService cacheService; - - /** - * Wipe system cache - * - * @param type {@link Broadcaster.TYPE} - * @param event {@link Broadcaster.EVENT} - * @param name - * @return if the action success - * @throws IOException - */ - @RequestMapping(value = "/{type}/{name}/{event}", method = { RequestMethod.PUT }) - @ResponseBody - public void wipeCache(@PathVariable String type, @PathVariable String event, @PathVariable String name) throws IOException { - - Broadcaster.TYPE wipeType = Broadcaster.TYPE.getType(type); - EVENT wipeEvent = Broadcaster.EVENT.getEvent(event); - - logger.info("wipe cache type: " + wipeType + " event:" + wipeEvent + " name:" + name); - - switch (wipeEvent) { - case CREATE: - case UPDATE: - cacheService.rebuildCache(wipeType, name); - break; - case DROP: - cacheService.removeCache(wipeType, name); - break; - default: - throw new RuntimeException("invalid type:" + wipeEvent); - } - } - - public void setCacheService(CacheService cacheService) { - this.cacheService = cacheService; - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java b/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java deleted file mode 100644 index 9315a20..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/CubeController.java +++ /dev/null @@ -1,615 +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.controller; - -import java.io.IOException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import org.apache.commons.lang.StringUtils; -import org.apache.kylin.common.util.JsonUtil; -import org.apache.kylin.cube.CubeInstance; -import org.apache.kylin.cube.CubeSegment; -import org.apache.kylin.cube.model.CubeBuildTypeEnum; -import org.apache.kylin.cube.model.CubeDesc; -import org.apache.kylin.cube.model.CubeJoinedFlatTableDesc; -import org.apache.kylin.dimension.DimensionEncodingFactory; -import org.apache.kylin.engine.streaming.StreamingConfig; -import org.apache.kylin.job.JobInstance; -import org.apache.kylin.job.JoinedFlatTable; -import org.apache.kylin.metadata.model.SegmentStatusEnum; -import org.apache.kylin.metadata.project.ProjectInstance; -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.exception.NotFoundException; -import org.apache.kylin.rest.request.CubeRequest; -import org.apache.kylin.rest.request.JobBuildRequest; -import org.apache.kylin.rest.request.JobBuildRequest2; -import org.apache.kylin.rest.response.GeneralResponse; -import org.apache.kylin.rest.response.HBaseResponse; -import org.apache.kylin.rest.service.CubeService; -import org.apache.kylin.rest.service.JobService; -import org.apache.kylin.rest.service.KafkaConfigService; -import org.apache.kylin.rest.service.StreamingService; -import org.apache.kylin.source.kafka.config.KafkaConfig; -import org.apache.kylin.storage.hbase.cube.v1.coprocessor.observer.ObserverEnabler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.AccessDeniedException; -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 com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; - -import com.google.common.collect.Sets; - -/** - * CubeController is defined as Restful API entrance for UI. - */ -@Controller -@RequestMapping(value = "/cubes") -public class CubeController extends BasicController { - private static final Logger logger = LoggerFactory.getLogger(CubeController.class); - - @Autowired - private StreamingService streamingService; - - @Autowired - private KafkaConfigService kafkaConfigService; - - @Autowired - private CubeService cubeService; - - @Autowired - private JobService jobService; - - @RequestMapping(value = "", method = { RequestMethod.GET }) - @ResponseBody - public List<CubeInstance> getCubes(@RequestParam(value = "cubeName", required = false) String cubeName, @RequestParam(value = "modelName", required = false) String modelName, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { - return cubeService.getCubes(cubeName, projectName, modelName, limit, offset); - } - - @RequestMapping(value = "validEncodings", method = { RequestMethod.GET }) - @ResponseBody - public Set<String> getValidEncodings() { - Set<String> encodings; - try { - encodings = DimensionEncodingFactory.getValidEncodings(); - } catch (Exception e) { - return Sets.newTreeSet(); - } - return encodings; - } - - @RequestMapping(value = "/{cubeName}", method = { RequestMethod.GET }) - @ResponseBody - public CubeInstance getCube(@PathVariable String cubeName) { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - if (cube == null) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - return cube; - } - - /** - * Get hive SQL of the cube - * - * @param cubeName Cube Name - * @return - * @throws UnknownHostException - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}/segs/{segmentName}/sql", method = { RequestMethod.GET }) - @ResponseBody - public GeneralResponse getSql(@PathVariable String cubeName, @PathVariable String segmentName) { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - CubeDesc cubeDesc = cube.getDescriptor(); - CubeSegment cubeSegment = cube.getSegment(segmentName, SegmentStatusEnum.READY); - CubeJoinedFlatTableDesc flatTableDesc = new CubeJoinedFlatTableDesc(cubeDesc, cubeSegment); - String sql = JoinedFlatTable.generateSelectDataStatement(flatTableDesc); - - GeneralResponse repsonse = new GeneralResponse(); - repsonse.setProperty("sql", sql); - - return repsonse; - } - - /** - * Update cube notify list - * - * @param cubeName - * @param notifyList - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}/notify_list", method = { RequestMethod.PUT }) - @ResponseBody - public void updateNotifyList(@PathVariable String cubeName, @RequestBody List<String> notifyList) { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - - if (cube == null) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - - try { - cubeService.updateCubeNotifyList(cube, notifyList); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e.getLocalizedMessage()); - } - - } - - @RequestMapping(value = "/{cubeName}/cost", method = { RequestMethod.PUT }) - @ResponseBody - public CubeInstance updateCubeCost(@PathVariable String cubeName, @RequestParam(value = "cost") int cost) { - try { - return cubeService.updateCubeCost(cubeName, cost); - } catch (Exception e) { - String message = "Failed to update cube cost: " + cubeName + " : " + cost; - logger.error(message, e); - throw new InternalErrorException(message + " Caused by: " + e.getMessage(), e); - } - } - - @RequestMapping(value = "/{cubeName}/coprocessor", method = { RequestMethod.PUT }) - @ResponseBody - public Map<String, Boolean> updateCubeCoprocessor(@PathVariable String cubeName, @RequestParam(value = "force") String force) { - try { - ObserverEnabler.updateCubeOverride(cubeName, force); - return ObserverEnabler.getCubeOverrides(); - } catch (Exception e) { - String message = "Failed to update cube coprocessor: " + cubeName + " : " + force; - logger.error(message, e); - throw new InternalErrorException(message + " Caused by: " + e.getMessage(), e); - } - } - - /** - * Force rebuild a cube's lookup table snapshot - * - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}/segs/{segmentName}/refresh_lookup", method = { RequestMethod.PUT }) - @ResponseBody - public CubeInstance rebuildLookupSnapshot(@PathVariable String cubeName, @PathVariable String segmentName, @RequestParam(value = "lookupTable") String lookupTable) { - try { - return cubeService.rebuildLookupSnapshot(cubeName, segmentName, lookupTable); - } catch (IOException e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e.getLocalizedMessage()); - } - } - - /** - * Delete a cube segment - * - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}/segs/{segmentName}", method = { RequestMethod.DELETE }) - @ResponseBody - public CubeInstance deleteSegment(@PathVariable String cubeName, @PathVariable String segmentName) { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - - if (cube == null) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - - CubeSegment segment = cube.getSegment(segmentName, null); - if (segment == null) { - throw new InternalErrorException("Cannot find segment '" + segmentName + "'"); - } - - try { - return cubeService.deleteSegment(cube, segmentName); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e.getLocalizedMessage()); - } - } - - /** Build/Rebuild a cube segment */ - @RequestMapping(value = "/{cubeName}/build", method = { RequestMethod.PUT }) - @ResponseBody - public JobInstance build(@PathVariable String cubeName, @RequestBody JobBuildRequest req) { - return rebuild(cubeName, req); - } - - /** Build/Rebuild a cube segment */ - @RequestMapping(value = "/{cubeName}/rebuild", method = { RequestMethod.PUT }) - @ResponseBody - public JobInstance rebuild(@PathVariable String cubeName, @RequestBody JobBuildRequest req) { - return buildInternal(cubeName, req.getStartTime(), req.getEndTime(), 0, 0, req.getBuildType(), req.isForce() || req.isForceMergeEmptySegment()); - } - - /** Build/Rebuild a cube segment by source offset */ - @RequestMapping(value = "/{cubeName}/build2", method = { RequestMethod.PUT }) - @ResponseBody - public JobInstance build(@PathVariable String cubeName, @RequestBody JobBuildRequest2 req) { - return rebuild(cubeName, req); - } - - /** Build/Rebuild a cube segment by source offset */ - @RequestMapping(value = "/{cubeName}/rebuild2", method = { RequestMethod.PUT }) - @ResponseBody - public JobInstance rebuild(@PathVariable String cubeName, @RequestBody JobBuildRequest2 req) { - return buildInternal(cubeName, 0, 0, req.getStartSourceOffset(), req.getEndSourceOffset(), req.getBuildType(), req.isForce()); - } - - private JobInstance buildInternal(String cubeName, long startTime, long endTime, // - long startOffset, long endOffset, String buildType, boolean force) { - try { - String submitter = SecurityContextHolder.getContext().getAuthentication().getName(); - CubeInstance cube = jobService.getCubeManager().getCube(cubeName); - return jobService.submitJob(cube, startTime, endTime, startOffset, endOffset, // - CubeBuildTypeEnum.valueOf(buildType), force, submitter); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e.getLocalizedMessage()); - } - } - - @RequestMapping(value = "/{cubeName}/disable", method = { RequestMethod.PUT }) - @ResponseBody - public CubeInstance disableCube(@PathVariable String cubeName) { - try { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - - if (cube == null) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - - return cubeService.disableCube(cube); - } catch (Exception e) { - String message = "Failed to disable cube: " + cubeName; - logger.error(message, e); - throw new InternalErrorException(message + " Caused by: " + e.getMessage(), e); - } - } - - @RequestMapping(value = "/{cubeName}/purge", method = { RequestMethod.PUT }) - @ResponseBody - public CubeInstance purgeCube(@PathVariable String cubeName) { - try { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - - if (cube == null) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - - return cubeService.purgeCube(cube); - } catch (Exception e) { - String message = "Failed to purge cube: " + cubeName; - logger.error(message, e); - throw new InternalErrorException(message + " Caused by: " + e.getMessage(), e); - } - } - - @RequestMapping(value = "/{cubeName}/clone", method = { RequestMethod.PUT }) - @ResponseBody - public CubeInstance cloneCube(@PathVariable String cubeName, @RequestBody CubeRequest cubeRequest) { - String newCubeName = cubeRequest.getCubeName(); - String project = cubeRequest.getProject(); - - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - if (cube == null) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - CubeDesc cubeDesc = cube.getDescriptor(); - CubeDesc newCubeDesc = CubeDesc.getCopyOf(cubeDesc); - newCubeDesc.setName(newCubeName); - - CubeInstance newCube; - try { - newCube = cubeService.createCubeAndDesc(newCubeName, project, newCubeDesc); - - //reload to avoid shallow clone - cubeService.getCubeDescManager().reloadCubeDescLocal(newCubeName); - } catch (IOException e) { - throw new InternalErrorException("Failed to clone cube ", e); - } - - return newCube; - - } - - @RequestMapping(value = "/{cubeName}/enable", method = { RequestMethod.PUT }) - @ResponseBody - public CubeInstance enableCube(@PathVariable String cubeName) { - try { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - if (null == cube) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - - return cubeService.enableCube(cube); - } catch (Exception e) { - String message = "Failed to enable cube: " + cubeName; - logger.error(message, e); - throw new InternalErrorException(message + " Caused by: " + e.getMessage(), e); - } - } - - @RequestMapping(value = "/{cubeName}", method = { RequestMethod.DELETE }) - @ResponseBody - public void deleteCube(@PathVariable String cubeName) { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - if (null == cube) { - throw new NotFoundException("Cube with name " + cubeName + " not found.."); - } - - //drop Cube - try { - cubeService.deleteCube(cube); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to delete cube. " + " Caused by: " + e.getMessage(), e); - } - - } - - /** - * save cubeDesc - * - * @return Table metadata array - * @throws IOException - */ - @RequestMapping(value = "", method = { RequestMethod.POST }) - @ResponseBody - public CubeRequest saveCubeDesc(@RequestBody CubeRequest cubeRequest) { - - CubeDesc desc = deserializeCubeDesc(cubeRequest); - if (desc == null) { - cubeRequest.setMessage("CubeDesc is null."); - return cubeRequest; - } - String name = CubeService.getCubeNameFromDesc(desc.getName()); - if (StringUtils.isEmpty(name)) { - logger.info("Cube name should not be empty."); - throw new BadRequestException("Cube name should not be empty."); - } - - try { - desc.setUuid(UUID.randomUUID().toString()); - String projectName = (null == cubeRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME : cubeRequest.getProject(); - cubeService.createCubeAndDesc(name, projectName, desc); - } catch (Exception e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException(e.getLocalizedMessage(), e); - } - - cubeRequest.setUuid(desc.getUuid()); - cubeRequest.setSuccessful(true); - return cubeRequest; - } - - /** - * update CubDesc - * - * @return Table metadata array - * @throws JsonProcessingException - * @throws IOException - */ - @RequestMapping(value = "", method = { RequestMethod.PUT }) - @ResponseBody - public CubeRequest updateCubeDesc(@RequestBody CubeRequest cubeRequest) throws JsonProcessingException { - - //update cube - CubeDesc desc = deserializeCubeDesc(cubeRequest); - CubeDesc oldCubeDesc; - boolean isCubeDescFreeEditable; - - if (desc == null) { - return cubeRequest; - } - - // Check if the cube is editable - isCubeDescFreeEditable = cubeService.isCubeDescFreeEditable(desc); - - String projectName = (null == cubeRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME : cubeRequest.getProject(); - try { - CubeInstance cube = cubeService.getCubeManager().getCube(cubeRequest.getCubeName()); - - if (cube == null) { - String error = "The cube named " + cubeRequest.getCubeName() + " does not exist "; - updateRequest(cubeRequest, false, error); - return cubeRequest; - } - - //cube renaming is not allowed - if (!cube.getDescriptor().getName().equalsIgnoreCase(desc.getName())) { - String error = "Cube Desc renaming is not allowed: desc.getName(): " + desc.getName() + ", cubeRequest.getCubeName(): " + cubeRequest.getCubeName(); - updateRequest(cubeRequest, false, error); - return cubeRequest; - } - - oldCubeDesc = cube.getDescriptor(); - if (isCubeDescFreeEditable || oldCubeDesc.consistentWith(desc)) { - desc = cubeService.updateCubeAndDesc(cube, desc, projectName, true); - } else { - logger.warn("Won't update the cube desc due to inconsistency"); - updateRequest(cubeRequest, false, "CubeDesc " + desc.getName() + " is inconsistent with existing. Try purge that cube first or avoid updating key cube desc fields."); - return cubeRequest; - } - } catch (AccessDeniedException accessDeniedException) { - throw new ForbiddenException("You don't have right to update this cube."); - } catch (Exception e) { - logger.error("Failed to deal with the request:" + e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to deal with the request: " + e.getLocalizedMessage()); - } - - if (!desc.getError().isEmpty()) { - logger.warn("Cube " + desc.getName() + " fail to update because " + desc.getError()); - updateRequest(cubeRequest, false, omitMessage(desc.getError())); - return cubeRequest; - } - - String descData = JsonUtil.writeValueAsIndentString(desc); - cubeRequest.setCubeDescData(descData); - cubeRequest.setSuccessful(true); - return cubeRequest; - } - - /** - * get Hbase Info - * - * @return true - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}/hbase", method = { RequestMethod.GET }) - @ResponseBody - public List<HBaseResponse> getHBaseInfo(@PathVariable String cubeName) { - List<HBaseResponse> hbase = new ArrayList<HBaseResponse>(); - - CubeInstance cube = cubeService.getCubeManager().getCube(cubeName); - if (null == cube) { - throw new InternalErrorException("Cannot find cube " + cubeName); - } - - List<CubeSegment> segments = cube.getSegments(); - - for (CubeSegment segment : segments) { - String tableName = segment.getStorageLocationIdentifier(); - HBaseResponse hr = null; - - // Get info of given table. - try { - hr = cubeService.getHTableInfo(tableName); - } catch (IOException e) { - logger.error("Failed to calcuate size of HTable \"" + tableName + "\".", e); - } - - if (null == hr) { - logger.info("Failed to calcuate size of HTable \"" + tableName + "\"."); - hr = new HBaseResponse(); - } - - hr.setTableName(tableName); - hr.setDateRangeStart(segment.getDateRangeStart()); - hr.setDateRangeEnd(segment.getDateRangeEnd()); - hbase.add(hr); - } - - return hbase; - } - - private CubeDesc deserializeCubeDesc(CubeRequest cubeRequest) { - CubeDesc desc = null; - try { - logger.debug("Saving cube " + cubeRequest.getCubeDescData()); - desc = JsonUtil.readValue(cubeRequest.getCubeDescData(), CubeDesc.class); - } catch (JsonParseException e) { - logger.error("The cube definition is not valid.", e); - updateRequest(cubeRequest, false, e.getMessage()); - } catch (JsonMappingException e) { - logger.error("The cube definition is not valid.", e); - updateRequest(cubeRequest, false, e.getMessage()); - } catch (IOException e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException("Failed to deal with the request:" + e.getMessage(), e); - } - return desc; - } - - private StreamingConfig deserializeStreamingDesc(CubeRequest cubeRequest) { - StreamingConfig desc = null; - try { - logger.debug("Saving StreamingConfig " + cubeRequest.getStreamingData()); - desc = JsonUtil.readValue(cubeRequest.getStreamingData(), StreamingConfig.class); - } catch (JsonParseException e) { - logger.error("The StreamingConfig definition is not valid.", e); - updateRequest(cubeRequest, false, e.getMessage()); - } catch (JsonMappingException e) { - logger.error("The data StreamingConfig definition is not valid.", e); - updateRequest(cubeRequest, false, e.getMessage()); - } catch (IOException e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException("Failed to deal with the request:" + e.getMessage(), e); - } - return desc; - } - - private KafkaConfig deserializeKafkaDesc(CubeRequest cubeRequest) { - KafkaConfig desc = null; - try { - logger.debug("Saving KafkaConfig " + cubeRequest.getKafkaData()); - desc = JsonUtil.readValue(cubeRequest.getKafkaData(), KafkaConfig.class); - } catch (JsonParseException e) { - logger.error("The KafkaConfig definition is not valid.", e); - updateRequest(cubeRequest, false, e.getMessage()); - } catch (JsonMappingException e) { - logger.error("The data KafkaConfig definition is not valid.", e); - updateRequest(cubeRequest, false, e.getMessage()); - } catch (IOException e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException("Failed to deal with the request:" + e.getMessage(), e); - } - return desc; - } - - /** - * @return - */ - private String omitMessage(List<String> errors) { - StringBuffer buffer = new StringBuffer(); - for (Iterator<String> iterator = errors.iterator(); iterator.hasNext();) { - String string = (String) iterator.next(); - buffer.append(string); - buffer.append("\n"); - } - return buffer.toString(); - } - - private void updateRequest(CubeRequest request, boolean success, String message) { - request.setCubeDescData(""); - request.setSuccessful(success); - request.setMessage(message); - } - - public void setCubeService(CubeService cubeService) { - this.cubeService = cubeService; - } - - public void setJobService(JobService jobService) { - this.jobService = jobService; - } - - public void setStreamingService(StreamingService streamingService) { - this.streamingService = streamingService; - } - - public void setKafkaConfigService(KafkaConfigService kafkaConfigService) { - this.kafkaConfigService = kafkaConfigService; - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java b/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java deleted file mode 100644 index 61584a3..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/CubeDescController.java +++ /dev/null @@ -1,95 +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.controller; - -import java.io.IOException; - -import org.apache.kylin.cube.CubeInstance; -import org.apache.kylin.cube.model.CubeDesc; -import org.apache.kylin.rest.service.CubeService; -import org.springframework.beans.factory.annotation.Autowired; -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; - -/** - * @author xduo - * - */ -@Controller -@RequestMapping(value = "/cube_desc") -public class CubeDescController { - - @Autowired - private CubeService cubeService; - - /** - * Get detail information of the "Cube ID" - * - * @param cubeDescName - * Cube ID - * @return - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}", method = { RequestMethod.GET }) - @ResponseBody - public CubeDesc[] getCube(@PathVariable String cubeName) { - CubeInstance cubeInstance = cubeService.getCubeManager().getCube(cubeName); - if (cubeInstance == null) { - return null; - } - CubeDesc cSchema = cubeInstance.getDescriptor(); - if (cSchema != null) { - return new CubeDesc[] { cSchema }; - } else { - return null; - } - } - - /** - * Get detail information of the "Cube ID" - * return CubeDesc instead of CubeDesc[] - * - * @param cubeDescName - * Cube ID - * @return - * @throws IOException - */ - @RequestMapping(value = "/{cubeName}/desc", method = { RequestMethod.GET }) - @ResponseBody - public CubeDesc getDesc(@PathVariable String cubeName) { - CubeInstance cubeInstance = cubeService.getCubeManager().getCube(cubeName); - if (cubeInstance == null) { - return null; - } - CubeDesc cSchema = cubeInstance.getDescriptor(); - if (cSchema != null) { - return cSchema; - } else { - return null; - } - } - - public void setCubeService(CubeService cubeService) { - this.cubeService = cubeService; - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java b/server/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java deleted file mode 100644 index b9da9b2..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/DiagnosisController.java +++ /dev/null @@ -1,120 +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.controller; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.io.IOUtils; -import org.apache.kylin.metadata.badquery.BadQueryEntry; -import org.apache.kylin.metadata.badquery.BadQueryHistory; -import org.apache.kylin.rest.exception.InternalErrorException; -import org.apache.kylin.rest.service.DiagnosisService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -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.collect.Lists; - -@Controller -@RequestMapping(value = "/diag") -public class DiagnosisController { - - private static final Logger logger = LoggerFactory.getLogger(DiagnosisController.class); - - @Autowired - private DiagnosisService dgService; - - /** - * Get bad query history - */ - @RequestMapping(value = "/{project}/sql", method = { RequestMethod.GET }) - @ResponseBody - public List<BadQueryEntry> getBadQuerySql(@PathVariable String project) { - - List<BadQueryEntry> badEntry = Lists.newArrayList(); - try { - BadQueryHistory badQueryHistory = dgService.getProjectBadQueryHistory(project); - badEntry.addAll(badQueryHistory.getEntries()); - } catch (IOException e) { - throw new InternalErrorException(e + " Caused by: " + e.getMessage(), e); - } - - return badEntry; - } - - /** - * Get diagnosis information for project - */ - @RequestMapping(value = "/project/{project}/download", method = { RequestMethod.GET }) - @ResponseBody - public void dumpProjectDiagnosisInfo(@PathVariable String project, final HttpServletRequest request, final HttpServletResponse response) { - String filePath; - try { - filePath = dgService.dumpProjectDiagnosisInfo(project); - } catch (IOException e) { - throw new InternalErrorException(e + " Caused by: " + e.getMessage(), e); - } - - setDownloadResponse(filePath, response); - } - - /** - * Get diagnosis information for job - */ - @RequestMapping(value = "/job/{jobId}/download", method = { RequestMethod.GET }) - @ResponseBody - public void dumpJobDiagnosisInfo(@PathVariable String jobId, final HttpServletRequest request, final HttpServletResponse response) { - String filePath; - try { - filePath = dgService.dumpJobDiagnosisInfo(jobId); - } catch (IOException e) { - throw new InternalErrorException(e + " Caused by: " + e.getMessage(), e); - } - - setDownloadResponse(filePath, response); - } - - private void setDownloadResponse(String downloadFile, final HttpServletResponse response) { - File file = new File(downloadFile); - try (InputStream fileInputStream = new FileInputStream(file); OutputStream output = response.getOutputStream();) { - response.reset(); - response.setContentType("application/octet-stream"); - response.setContentLength((int) (file.length())); - response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); - IOUtils.copyLarge(fileInputStream, output); - output.flush(); - } catch (IOException e) { - throw new InternalErrorException(e + " Caused by: " + e.getMessage(), e); - } - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/ExternalFilterController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ExternalFilterController.java b/server/src/main/java/org/apache/kylin/rest/controller/ExternalFilterController.java deleted file mode 100644 index 7baa639..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/ExternalFilterController.java +++ /dev/null @@ -1,97 +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.controller; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.apache.kylin.common.util.JsonUtil; -import org.apache.kylin.metadata.model.ExternalFilterDesc; -import org.apache.kylin.rest.request.ExternalFilterRequest; -import org.apache.kylin.rest.service.ExtFilterService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -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.google.common.collect.Lists; - -/** - * @author jiazhong - */ -@Controller -@RequestMapping(value = "/extFilter") -public class ExternalFilterController extends BasicController { - private static final Logger logger = LoggerFactory.getLogger(ExternalFilterController.class); - - @Autowired - private ExtFilterService extFilterService; - - @RequestMapping(value = "/saveExtFilter", method = { RequestMethod.POST }) - @ResponseBody - public Map<String, String> saveExternalFilter(@RequestBody ExternalFilterRequest request) throws IOException { - Map<String, String> result = new HashMap(); - String filterProject = request.getProject(); - ExternalFilterDesc desc = JsonUtil.readValue(request.getExtFilter(), ExternalFilterDesc.class); - desc.setUuid(UUID.randomUUID().toString()); - extFilterService.saveExternalFilter(desc); - extFilterService.syncExtFilterToProject(new String[] { desc.getName() }, filterProject); - result.put("success", "true"); - return result; - } - - @RequestMapping(value = "/updateExtFilter", method = { RequestMethod.PUT }) - @ResponseBody - public Map<String, String> updateExternalFilter(@RequestBody ExternalFilterRequest request) throws IOException { - Map<String, String> result = new HashMap(); - ExternalFilterDesc desc = JsonUtil.readValue(request.getExtFilter(), ExternalFilterDesc.class); - extFilterService.updateExternalFilter(desc); - extFilterService.syncExtFilterToProject(new String[] { desc.getName() }, request.getProject()); - result.put("success", "true"); - return result; - } - - @RequestMapping(value = "/{filter}/{project}", method = { RequestMethod.DELETE }) - @ResponseBody - public Map<String, String> removeFilter(@PathVariable String filter, @PathVariable String project) throws IOException { - Map<String, String> result = new HashMap<String, String>(); - extFilterService.removeExtFilterFromProject(filter, project); - extFilterService.removeExternalFilter(filter); - result.put("success", "true"); - return result; - } - - @RequestMapping(value = "", method = { RequestMethod.GET }) - @ResponseBody - public List<ExternalFilterDesc> getExternalFilters(@RequestParam(value = "project", required = true) String project) throws IOException { - List<ExternalFilterDesc> filterDescs = Lists.newArrayList(); - filterDescs.addAll(extFilterService.getProjectManager().listExternalFilterDescs(project).values()); - return filterDescs; - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/JobController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/JobController.java b/server/src/main/java/org/apache/kylin/rest/controller/JobController.java deleted file mode 100644 index dce3847..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/JobController.java +++ /dev/null @@ -1,221 +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.controller; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.common.util.ClassUtil; -import org.apache.kylin.job.JobInstance; -import org.apache.kylin.job.Scheduler; -import org.apache.kylin.job.SchedulerFactory; -import org.apache.kylin.job.constant.JobStatusEnum; -import org.apache.kylin.job.constant.JobTimeFilterEnum; -import org.apache.kylin.job.engine.JobEngineConfig; -import org.apache.kylin.job.exception.SchedulerException; -import org.apache.kylin.job.execution.AbstractExecutable; -import org.apache.kylin.job.lock.JobLock; -import org.apache.kylin.rest.exception.InternalErrorException; -import org.apache.kylin.rest.request.JobListRequest; -import org.apache.kylin.rest.service.JobService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -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 = "jobs") -public class JobController extends BasicController implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(JobController.class); - - @Autowired - private JobService jobService; - - private JobLock jobLock; - - /* - * (non-Javadoc) - * - * @see - * org.springframework.beans.factory.InitializingBean#afterPropertiesSet() - */ - @SuppressWarnings("unchecked") - @Override - public void afterPropertiesSet() throws Exception { - - String timeZone = jobService.getConfig().getTimeZone(); - TimeZone tzone = TimeZone.getTimeZone(timeZone); - TimeZone.setDefault(tzone); - - final KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv(); - final Scheduler<AbstractExecutable> scheduler = (Scheduler<AbstractExecutable>) SchedulerFactory.scheduler(kylinConfig.getSchedulerType()); - - jobLock = (JobLock) ClassUtil.newInstance(kylinConfig.getJobControllerLock()); - - new Thread(new Runnable() { - @Override - public void run() { - try { - scheduler.init(new JobEngineConfig(kylinConfig), jobLock); - while (!scheduler.hasStarted()) { - logger.error("scheduler has not been started"); - Thread.sleep(1000); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - }).start(); - - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - @Override - public void run() { - try { - scheduler.shutdown(); - } catch (SchedulerException e) { - logger.error("error occurred to shutdown scheduler", e); - } - } - })); - } - - /** - * get all cube jobs - * - * @return - * @throws IOException - */ - @RequestMapping(value = "", method = { RequestMethod.GET }) - @ResponseBody - public List<JobInstance> list(JobListRequest jobRequest) { - - List<JobInstance> jobInstanceList = Collections.emptyList(); - List<JobStatusEnum> statusList = new ArrayList<JobStatusEnum>(); - - if (null != jobRequest.getStatus()) { - for (int status : jobRequest.getStatus()) { - statusList.add(JobStatusEnum.getByCode(status)); - } - } - - JobTimeFilterEnum timeFilter = JobTimeFilterEnum.getByCode(jobRequest.getTimeFilter()); - - try { - jobInstanceList = jobService.listAllJobs(jobRequest.getCubeName(), jobRequest.getProjectName(), statusList, jobRequest.getLimit(), jobRequest.getOffset(), timeFilter); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e); - } - return jobInstanceList; - } - - /** - * Get a cube job - * - * @return - * @throws IOException - */ - @RequestMapping(value = "/{jobId}", method = { RequestMethod.GET }) - @ResponseBody - public JobInstance get(@PathVariable String jobId) { - JobInstance jobInstance = null; - try { - jobInstance = jobService.getJobInstance(jobId); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e); - } - - return jobInstance; - } - - /** - * Get a job step output - * - * @return - * @throws IOException - */ - @RequestMapping(value = "/{jobId}/steps/{stepId}/output", method = { RequestMethod.GET }) - @ResponseBody - public Map<String, String> getStepOutput(@PathVariable String jobId, @PathVariable String stepId) { - Map<String, String> result = new HashMap<String, String>(); - result.put("jobId", jobId); - result.put("stepId", String.valueOf(stepId)); - result.put("cmd_output", jobService.getExecutableManager().getOutput(stepId).getVerboseMsg()); - return result; - } - - /** - * Resume a cube job - * - * @return - * @throws IOException - */ - @RequestMapping(value = "/{jobId}/resume", method = { RequestMethod.PUT }) - @ResponseBody - public JobInstance resume(@PathVariable String jobId) { - try { - final JobInstance jobInstance = jobService.getJobInstance(jobId); - jobService.resumeJob(jobInstance); - return jobService.getJobInstance(jobId); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e); - } - } - - /** - * Cancel a job - * - * @return - * @throws IOException - */ - @RequestMapping(value = "/{jobId}/cancel", method = { RequestMethod.PUT }) - @ResponseBody - public JobInstance cancel(@PathVariable String jobId) { - - try { - final JobInstance jobInstance = jobService.getJobInstance(jobId); - return jobService.cancelJob(jobInstance); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException(e); - } - - } - - public void setJobService(JobService jobService) { - this.jobService = jobService; - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java b/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java deleted file mode 100644 index 5f6a91b..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java +++ /dev/null @@ -1,236 +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.controller; - -import java.io.IOException; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -import org.apache.commons.lang.StringUtils; -import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.common.util.JsonUtil; -import org.apache.kylin.metadata.MetadataManager; -import org.apache.kylin.metadata.model.DataModelDesc; -import org.apache.kylin.metadata.project.ProjectInstance; -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.exception.NotFoundException; -import org.apache.kylin.rest.request.ModelRequest; -import org.apache.kylin.rest.service.ModelService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -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.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; - -/** - * ModelController is defined as Restful API entrance for UI. - * - * @author jiazhong - */ -@Controller -@RequestMapping(value = "/models") -public class ModelController extends BasicController { - private static final Logger logger = LoggerFactory.getLogger(ModelController.class); - - @Autowired - private ModelService modelService; - - @RequestMapping(value = "", method = { RequestMethod.GET }) - @ResponseBody - public List<DataModelDesc> getModels(@RequestParam(value = "modelName", required = false) String modelName, @RequestParam(value = "projectName", required = false) String projectName, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { - try { - return modelService.getModels(modelName, projectName, limit, offset); - } catch (IOException e) { - logger.error("Failed to deal with the request:" + e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to deal with the request: " + e.getLocalizedMessage()); - } - } - - /** - * - * create model - * @throws java.io.IOException - */ - @RequestMapping(value = "", method = { RequestMethod.POST }) - @ResponseBody - public ModelRequest saveModelDesc(@RequestBody ModelRequest modelRequest) { - //Update Model - DataModelDesc modelDesc = deserializeDataModelDesc(modelRequest); - if (modelDesc == null || StringUtils.isEmpty(modelDesc.getName())) { - return modelRequest; - } - - if (StringUtils.isEmpty(modelDesc.getName())) { - logger.info("Model name should not be empty."); - throw new BadRequestException("Model name should not be empty."); - } - - try { - modelDesc.setUuid(UUID.randomUUID().toString()); - String projectName = (null == modelRequest.getProject()) ? ProjectInstance.DEFAULT_PROJECT_NAME : modelRequest.getProject(); - - modelService.createModelDesc(projectName, modelDesc); - } catch (IOException e) { - // TODO Auto-generated catch block - logger.error("Failed to deal with the request:" + e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to deal with the request: " + e.getLocalizedMessage()); - } - - modelRequest.setUuid(modelDesc.getUuid()); - modelRequest.setSuccessful(true); - return modelRequest; - } - - @RequestMapping(value = "", method = { RequestMethod.PUT }) - @ResponseBody - public ModelRequest updateModelDesc(@RequestBody ModelRequest modelRequest) throws JsonProcessingException { - DataModelDesc modelDesc = deserializeDataModelDesc(modelRequest); - if (modelDesc == null) { - return modelRequest; - } - try { - modelDesc = modelService.updateModelAndDesc(modelDesc); - } catch (AccessDeniedException accessDeniedException) { - throw new ForbiddenException("You don't have right to update this model."); - } catch (Exception e) { - logger.error("Failed to deal with the request:" + e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to deal with the request: " + e.getLocalizedMessage()); - } - - if (modelDesc.getError().isEmpty()) { - modelRequest.setSuccessful(true); - } else { - logger.warn("Model " + modelDesc.getName() + " fail to update because " + modelDesc.getError()); - updateRequest(modelRequest, false, omitMessage(modelDesc.getError())); - } - String descData = JsonUtil.writeValueAsIndentString(modelDesc); - modelRequest.setModelDescData(descData); - return modelRequest; - } - - @RequestMapping(value = "/{modelName}", method = { RequestMethod.DELETE }) - @ResponseBody - public void deleteModel(@PathVariable String modelName) { - DataModelDesc desc = modelService.getMetadataManager().getDataModelDesc(modelName); - if (null == desc) { - throw new NotFoundException("Data Model with name " + modelName + " not found.."); - } - try { - modelService.dropModel(desc); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to delete model. " + " Caused by: " + e.getMessage(), e); - } - } - - @RequestMapping(value = "/{modelName}/clone", method = { RequestMethod.PUT }) - @ResponseBody - public ModelRequest cloneModel(@PathVariable String modelName, @RequestBody ModelRequest modelRequest) { - 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("Project name should not be empty."); - } - - if (modelDesc == null || StringUtils.isEmpty(modelName)) { - logger.info("Model does not exist."); - throw new BadRequestException("Model does not exist."); - } - - if (StringUtils.isEmpty(newModelName)) { - logger.info("New model name is empty."); - throw new BadRequestException("New model name is empty."); - } - - DataModelDesc newModelDesc = DataModelDesc.getCopyOf(modelDesc); - newModelDesc.setName(newModelName); - try { - newModelDesc = modelService.createModelDesc(project, newModelDesc); - - //reload avoid shallow - metaManager.reloadDataModelDesc(newModelName); - } catch (IOException e) { - throw new InternalErrorException("failed to clone DataModelDesc", e); - } - - modelRequest.setUuid(newModelDesc.getUuid()); - modelRequest.setSuccessful(true); - return modelRequest; - } - - private DataModelDesc deserializeDataModelDesc(ModelRequest modelRequest) { - DataModelDesc desc = null; - try { - logger.debug("Saving MODEL " + modelRequest.getModelDescData()); - desc = JsonUtil.readValue(modelRequest.getModelDescData(), DataModelDesc.class); - } catch (JsonParseException e) { - logger.error("The data model definition is not valid.", e); - updateRequest(modelRequest, false, e.getMessage()); - } catch (JsonMappingException e) { - logger.error("The data model definition is not valid.", e); - updateRequest(modelRequest, false, e.getMessage()); - } catch (IOException e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException("Failed to deal with the request:" + e.getMessage(), e); - } - return desc; - } - - private void updateRequest(ModelRequest request, boolean success, String message) { - request.setModelDescData(""); - request.setSuccessful(success); - request.setMessage(message); - } - - public void setModelService(ModelService modelService) { - this.modelService = modelService; - } - - /** - * @param errors - * @return - */ - private String omitMessage(List<String> errors) { - StringBuffer buffer = new StringBuffer(); - for (Iterator<String> iterator = errors.iterator(); iterator.hasNext();) { - String string = (String) iterator.next(); - buffer.append(string); - buffer.append("\n"); - } - return buffer.toString(); - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/ModelDescController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ModelDescController.java b/server/src/main/java/org/apache/kylin/rest/controller/ModelDescController.java deleted file mode 100644 index 4171afd..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/ModelDescController.java +++ /dev/null @@ -1,57 +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.controller; - -import java.io.IOException; - -import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.metadata.MetadataManager; -import org.apache.kylin.metadata.model.DataModelDesc; -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; - -/** - * @author jiazhong - * - */ -@Controller -@RequestMapping(value = "/model") -public class ModelDescController extends BasicController { - - /** - * Get detail information of the "Model ID" - * - * @param modelDescName - * Model ID - * @return - * @throws IOException - */ - @RequestMapping(value = "/{model_name}", method = { RequestMethod.GET }) - @ResponseBody - public DataModelDesc getModel(@PathVariable String model_name) { - MetadataManager metaManager = MetadataManager.getInstance(KylinConfig.getInstanceFromEnv()); - DataModelDesc modeDesc = metaManager.getDataModelDesc(model_name); - return modeDesc; - - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java b/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java deleted file mode 100644 index f829fff..0000000 --- a/server/src/main/java/org/apache/kylin/rest/controller/ProjectController.java +++ /dev/null @@ -1,257 +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.controller; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang.StringUtils; -import org.apache.kylin.common.persistence.AclEntity; -import org.apache.kylin.cube.CubeInstance; -import org.apache.kylin.metadata.project.ProjectInstance; -import org.apache.kylin.rest.constant.Constant; -import org.apache.kylin.rest.exception.InternalErrorException; -import org.apache.kylin.rest.request.CreateProjectRequest; -import org.apache.kylin.rest.request.UpdateProjectRequest; -import org.apache.kylin.rest.service.AccessService; -import org.apache.kylin.rest.service.CubeService; -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.security.acls.domain.GrantedAuthoritySid; -import org.springframework.security.acls.domain.PrincipalSid; -import org.springframework.security.acls.model.AccessControlEntry; -import org.springframework.security.acls.model.Acl; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -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.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 ProjectController extends BasicController { - private static final Logger logger = LoggerFactory.getLogger(ProjectController.class); - - @Autowired - private ProjectService projectService; - @Autowired - private AccessService accessService; - @Autowired - private CubeService cubeService; - - /** - * Get available project list - * - * @return Table metadata array - * @throws IOException - */ - @RequestMapping(value = "", method = { RequestMethod.GET }) - @ResponseBody - public List<ProjectInstance> getProjects(@RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { - return projectService.listAllProjects(limit, offset); - } - - @RequestMapping(value = "/readable", method = { RequestMethod.GET }) - @ResponseBody - public List<ProjectInstance> getReadableProjects(@RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "offset", required = false) Integer offset) { - List<ProjectInstance> readableProjects = new ArrayList<ProjectInstance>(); - //list all projects first - List<ProjectInstance> projectInstances = projectService.listAllProjects(limit, offset); - - //get user infomation - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - UserDetails userDetails = null; - if (authentication == null) { - logger.debug("authentication is null."); - throw new InternalErrorException("Can not find authentication infomation."); - } - if (authentication.getPrincipal() instanceof UserDetails) { - logger.debug("authentication.getPrincipal() is " + authentication.getPrincipal()); - userDetails = (UserDetails) authentication.getPrincipal(); - } - if (authentication.getDetails() instanceof UserDetails) { - logger.debug("authentication.getDetails() is " + authentication.getDetails()); - userDetails = (UserDetails) authentication.getDetails(); - } - - //check if ROLE_ADMIN return all,also get user role list - List<String> userAuthority = new ArrayList<>(); - for (GrantedAuthority auth : authentication.getAuthorities()) { - userAuthority.add(auth.getAuthority()); - if (auth.getAuthority().equals(Constant.ROLE_ADMIN)) - return projectInstances; - } - String userName = userDetails.getUsername(); - for (ProjectInstance projectInstance : projectInstances) { - if (projectInstance == null) { - continue; - } - - boolean hasProjectPermission = false; - AclEntity ae = accessService.getAclEntity("ProjectInstance", projectInstance.getId()); - Acl projectAcl = accessService.getAcl(ae); - //project no Acl info will be skipped - if (projectAcl != null) { - - //project owner has permission - if (((PrincipalSid) projectAcl.getOwner()).getPrincipal().equals(userName)) { - readableProjects.add(projectInstance); - continue; - } - - //check project permission and role - for (AccessControlEntry ace : projectAcl.getEntries()) { - if (ace.getSid() instanceof PrincipalSid && ((PrincipalSid) ace.getSid()).getPrincipal().equals(userName)) { - hasProjectPermission = true; - readableProjects.add(projectInstance); - break; - - } else if (ace.getSid() instanceof GrantedAuthoritySid) { - String projectAuthority = ((GrantedAuthoritySid) ace.getSid()).getGrantedAuthority(); - if (userAuthority.contains(projectAuthority)) { - hasProjectPermission = true; - readableProjects.add(projectInstance); - break; - } - - } - - } - } - - if (!hasProjectPermission) { - List<CubeInstance> cubeInstances = cubeService.listAllCubes(projectInstance.getName()); - - for (CubeInstance cubeInstance : cubeInstances) { - if (cubeInstance == null) { - continue; - } - boolean hasCubePermission = false; - AclEntity cubeAe = accessService.getAclEntity("CubeInstance", cubeInstance.getId()); - Acl cubeAcl = accessService.getAcl(cubeAe); - //cube no Acl info will not be used to filter project - if (cubeAcl != null) { - //cube owner will have permission to read project - if (((PrincipalSid) cubeAcl.getOwner()).getPrincipal().equals(userName)) { - hasProjectPermission = true; - break; - } - for (AccessControlEntry cubeAce : cubeAcl.getEntries()) { - - if (cubeAce.getSid() instanceof PrincipalSid && ((PrincipalSid) cubeAce.getSid()).getPrincipal().equals(userName)) { - hasCubePermission = true; - break; - } else if (cubeAce.getSid() instanceof GrantedAuthoritySid) { - String cubeAuthority = ((GrantedAuthoritySid) cubeAce.getSid()).getGrantedAuthority(); - if (userAuthority.contains(cubeAuthority)) { - hasCubePermission = true; - break; - } - - } - } - } - if (hasCubePermission) { - hasProjectPermission = true; - break; - } - } - if (hasProjectPermission) { - readableProjects.add(projectInstance); - } - } - - } - return readableProjects; - } - - @RequestMapping(value = "", method = { RequestMethod.POST }) - @ResponseBody - public ProjectInstance saveProject(@RequestBody CreateProjectRequest projectRequest) { - if (StringUtils.isEmpty(projectRequest.getName())) { - throw new InternalErrorException("A project name must be given to create a project"); - } - - ProjectInstance createdProj = null; - try { - createdProj = projectService.createProject(projectRequest); - } catch (Exception e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException(e.getLocalizedMessage()); - } - - return createdProj; - } - - @RequestMapping(value = "", method = { RequestMethod.PUT }) - @ResponseBody - public ProjectInstance updateProject(@RequestBody UpdateProjectRequest projectRequest) { - if (StringUtils.isEmpty(projectRequest.getFormerProjectName())) { - throw new InternalErrorException("A project name must be given to update a project"); - } - - ProjectInstance updatedProj = null; - try { - ProjectInstance currentProject = projectService.getProjectManager().getProject(projectRequest.getFormerProjectName()); - updatedProj = projectService.updateProject(projectRequest, currentProject); - } catch (Exception e) { - logger.error("Failed to deal with the request.", e); - throw new InternalErrorException(e.getLocalizedMessage()); - } - - return updatedProj; - } - - @RequestMapping(value = "/{projectName}", method = { RequestMethod.DELETE }) - @ResponseBody - public void deleteProject(@PathVariable String projectName) { - try { - - ProjectInstance project = projectService.getProjectManager().getProject(projectName); - projectService.deleteProject(projectName, project); - } catch (Exception e) { - logger.error(e.getLocalizedMessage(), e); - throw new InternalErrorException("Failed to delete project. " + " Caused by: " + e.getMessage(), e); - } - } - - public void setProjectService(ProjectService projectService) { - this.projectService = projectService; - } - - public void setAccessService(AccessService accessService) { - this.accessService = accessService; - } - - public void setCubeService(CubeService cubeService) { - this.cubeService = cubeService; - } -}
