Repository: kylin Updated Branches: refs/heads/master af093f76e -> 1a124e68f
http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java b/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java deleted file mode 100644 index c0610a2..0000000 --- a/server/src/main/java/org/apache/kylin/rest/service/ProjectService.java +++ /dev/null @@ -1,127 +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.service; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -import org.apache.kylin.metadata.project.ProjectInstance; -import org.apache.kylin.metadata.project.ProjectManager; -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.security.AclPermission; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -/** - * @author xduo - * - */ -@Component("projectService") -public class ProjectService extends BasicService { - - private static final Logger logger = LoggerFactory.getLogger(ProjectService.class); - - @Autowired - private AccessService accessService; - - public ProjectInstance createProject(CreateProjectRequest projectRequest) throws IOException { - String projectName = projectRequest.getName(); - String description = projectRequest.getDescription(); - ProjectInstance currentProject = getProjectManager().getProject(projectName); - - if (currentProject != null) { - throw new InternalErrorException("The project named " + projectName + " already exists"); - } - String owner = SecurityContextHolder.getContext().getAuthentication().getName(); - ProjectInstance createdProject = getProjectManager().createProject(projectName, owner, description); - accessService.init(createdProject, AclPermission.ADMINISTRATION); - logger.debug("New project created."); - - return createdProject; - } - - @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#currentProject, 'ADMINISTRATION') or hasPermission(#currentProject, 'MANAGEMENT')") - public ProjectInstance updateProject(UpdateProjectRequest projectRequest, ProjectInstance currentProject) throws IOException { - String formerProjectName = projectRequest.getFormerProjectName(); - String newProjectName = projectRequest.getNewProjectName(); - String newDescription = projectRequest.getNewDescription(); - - if (currentProject == null) { - throw new InternalErrorException("The project named " + formerProjectName + " does not exists"); - } - - ProjectInstance updatedProject = getProjectManager().updateProject(currentProject, newProjectName, newDescription); - - logger.debug("Project updated."); - - return updatedProject; - } - - public List<ProjectInstance> listAllProjects(final Integer limit, final Integer offset) { - List<ProjectInstance> projects = getProjectManager().listAllProjects(); - - int climit = (null == limit) ? Integer.MAX_VALUE : limit; - int coffset = (null == offset) ? 0 : offset; - - if (projects.size() <= coffset) { - return Collections.emptyList(); - } - - if ((projects.size() - coffset) < climit) { - return projects.subList(coffset, projects.size()); - } - - return projects.subList(coffset, coffset + climit); - } - - @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#project, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')") - public void deleteProject(String projectName, ProjectInstance project) throws IOException { - getProjectManager().dropProject(projectName); - - accessService.clean(project, true); - } - - public boolean isTableInAnyProject(String tableName) { - for (ProjectInstance projectInstance : ProjectManager.getInstance(getConfig()).listAllProjects()) { - if (projectInstance.containsTable(tableName.toUpperCase())) { - return true; - } - } - return false; - } - - public boolean isTableInProject(String tableName, String projectName) { - ProjectInstance projectInstance = ProjectManager.getInstance(getConfig()).getProject(projectName); - if (projectInstance != null) { - if (projectInstance.containsTable(tableName.toUpperCase())) { - return true; - } - } - return false; - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/service/QueryService.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/service/QueryService.java b/server/src/main/java/org/apache/kylin/rest/service/QueryService.java deleted file mode 100644 index 84a5c67..0000000 --- a/server/src/main/java/org/apache/kylin/rest/service/QueryService.java +++ /dev/null @@ -1,517 +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.service; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.sql.DataSource; - -import org.apache.calcite.avatica.ColumnMetaData.Rep; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.hadoop.hbase.client.Get; -import org.apache.hadoop.hbase.client.HConnection; -import org.apache.hadoop.hbase.client.HTableInterface; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Result; -import org.apache.kylin.common.KylinConfig; -import org.apache.kylin.common.util.Bytes; -import org.apache.kylin.cube.CubeInstance; -import org.apache.kylin.cube.CubeManager; -import org.apache.kylin.cube.cuboid.Cuboid; -import org.apache.kylin.query.relnode.OLAPContext; -import org.apache.kylin.rest.constant.Constant; -import org.apache.kylin.rest.model.ColumnMeta; -import org.apache.kylin.rest.model.Query; -import org.apache.kylin.rest.model.SelectedColumnMeta; -import org.apache.kylin.rest.model.TableMeta; -import org.apache.kylin.rest.request.PrepareSqlRequest; -import org.apache.kylin.rest.request.SQLRequest; -import org.apache.kylin.rest.response.SQLResponse; -import org.apache.kylin.rest.util.QueryUtil; -import org.apache.kylin.rest.util.Serializer; -import org.apache.kylin.storage.hbase.HBaseConnection; -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.access.prepost.PreAuthorize; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; - -import com.google.common.collect.Lists; - -/** - * @author xduo - */ -@Component("queryService") -public class QueryService extends BasicService { - - private static final Logger logger = LoggerFactory.getLogger(QueryService.class); - - @Autowired - private CacheService cacheService; - - public static final String USER_QUERY_FAMILY = "q"; - private static final String DEFAULT_TABLE_PREFIX = "kylin_metadata"; - private static final String USER_TABLE_NAME = "_user"; - private static final String USER_QUERY_COLUMN = "c"; - - private final Serializer<Query[]> querySerializer = new Serializer<Query[]>(Query[].class); - private final BadQueryDetector badQueryDetector = new BadQueryDetector(); - - private final String hbaseUrl; - private final String tableNameBase; - private final String userTableName; - - public QueryService() { - String metadataUrl = KylinConfig.getInstanceFromEnv().getMetadataUrl(); - // split TABLE@HBASE_URL - int cut = metadataUrl.indexOf('@'); - tableNameBase = cut < 0 ? DEFAULT_TABLE_PREFIX : metadataUrl.substring(0, cut); - hbaseUrl = cut < 0 ? metadataUrl : metadataUrl.substring(cut + 1); - userTableName = tableNameBase + USER_TABLE_NAME; - - badQueryDetector.start(); - } - - public List<TableMeta> getMetadata(String project) throws SQLException { - return getMetadata(getCubeManager(), project, true); - } - - public SQLResponse query(SQLRequest sqlRequest) throws Exception { - try { - badQueryDetector.queryStart(Thread.currentThread(), sqlRequest); - - return queryWithSqlMassage(sqlRequest); - - } finally { - badQueryDetector.queryEnd(Thread.currentThread()); - } - } - - public void saveQuery(final String creator, final Query query) throws IOException { - List<Query> queries = getQueries(creator); - queries.add(query); - Query[] queryArray = new Query[queries.size()]; - - byte[] bytes = querySerializer.serialize(queries.toArray(queryArray)); - HTableInterface htable = null; - try { - htable = HBaseConnection.get(hbaseUrl).getTable(userTableName); - Put put = new Put(Bytes.toBytes(creator)); - put.add(Bytes.toBytes(USER_QUERY_FAMILY), Bytes.toBytes(USER_QUERY_COLUMN), bytes); - - htable.put(put); - htable.flushCommits(); - } finally { - IOUtils.closeQuietly(htable); - } - } - - public void removeQuery(final String creator, final String id) throws IOException { - List<Query> queries = getQueries(creator); - Iterator<Query> queryIter = queries.iterator(); - - boolean changed = false; - while (queryIter.hasNext()) { - Query temp = queryIter.next(); - if (temp.getId().equals(id)) { - queryIter.remove(); - changed = true; - break; - } - } - - if (!changed) { - return; - } - - Query[] queryArray = new Query[queries.size()]; - byte[] bytes = querySerializer.serialize(queries.toArray(queryArray)); - HTableInterface htable = null; - try { - htable = HBaseConnection.get(hbaseUrl).getTable(userTableName); - Put put = new Put(Bytes.toBytes(creator)); - put.add(Bytes.toBytes(USER_QUERY_FAMILY), Bytes.toBytes(USER_QUERY_COLUMN), bytes); - - htable.put(put); - htable.flushCommits(); - } finally { - IOUtils.closeQuietly(htable); - } - } - - public List<Query> getQueries(final String creator) throws IOException { - if (null == creator) { - return null; - } - - List<Query> queries = new ArrayList<Query>(); - HTableInterface htable = null; - try { - HConnection conn = HBaseConnection.get(hbaseUrl); - HBaseConnection.createHTableIfNeeded(conn, userTableName, USER_QUERY_FAMILY); - - htable = conn.getTable(userTableName); - Get get = new Get(Bytes.toBytes(creator)); - get.addFamily(Bytes.toBytes(USER_QUERY_FAMILY)); - Result result = htable.get(get); - Query[] query = querySerializer.deserialize(result.getValue(Bytes.toBytes(USER_QUERY_FAMILY), Bytes.toBytes(USER_QUERY_COLUMN))); - - if (null != query) { - queries.addAll(Arrays.asList(query)); - } - } finally { - IOUtils.closeQuietly(htable); - } - - return queries; - } - - public void logQuery(final SQLRequest request, final SQLResponse response) { - final String user = SecurityContextHolder.getContext().getAuthentication().getName(); - final Set<String> realizationNames = new HashSet<String>(); - final Set<Long> cuboidIds = new HashSet<Long>(); - float duration = response.getDuration() / (float) 1000; - boolean storageCacheUsed = response.isStorageCacheUsed(); - - if (!response.isHitExceptionCache() && null != OLAPContext.getThreadLocalContexts()) { - for (OLAPContext ctx : OLAPContext.getThreadLocalContexts()) { - Cuboid cuboid = ctx.storageContext.getCuboid(); - if (cuboid != null) { - //Some queries do not involve cuboid, e.g. lookup table query - cuboidIds.add(cuboid.getId()); - } - - if (ctx.realization != null) { - String realizationName = ctx.realization.getName(); - realizationNames.add(realizationName); - } - - } - } - - int resultRowCount = 0; - if (!response.getIsException() && response.getResults() != null) { - resultRowCount = response.getResults().size(); - } - - String newLine = System.getProperty("line.separator"); - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(newLine); - stringBuilder.append("==========================[QUERY]===============================").append(newLine); - stringBuilder.append("SQL: ").append(request.getSql()).append(newLine); - stringBuilder.append("User: ").append(user).append(newLine); - stringBuilder.append("Success: ").append((null == response.getExceptionMessage())).append(newLine); - stringBuilder.append("Duration: ").append(duration).append(newLine); - stringBuilder.append("Project: ").append(request.getProject()).append(newLine); - stringBuilder.append("Realization Names: ").append(realizationNames).append(newLine); - stringBuilder.append("Cuboid Ids: ").append(cuboidIds).append(newLine); - stringBuilder.append("Total scan count: ").append(response.getTotalScanCount()).append(newLine); - stringBuilder.append("Result row count: ").append(resultRowCount).append(newLine); - stringBuilder.append("Accept Partial: ").append(request.isAcceptPartial()).append(newLine); - stringBuilder.append("Is Partial Result: ").append(response.isPartial()).append(newLine); - stringBuilder.append("Hit Exception Cache: ").append(response.isHitExceptionCache()).append(newLine); - stringBuilder.append("Storage cache used: ").append(storageCacheUsed).append(newLine); - stringBuilder.append("Message: ").append(response.getExceptionMessage()).append(newLine); - stringBuilder.append("==========================[QUERY]===============================").append(newLine); - - logger.info(stringBuilder.toString()); - } - - @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#cube, 'ADMINISTRATION') or hasPermission(#cube, 'MANAGEMENT')" + " or hasPermission(#cube, 'OPERATION') or hasPermission(#cube, 'READ')") - public void checkAuthorization(CubeInstance cube) throws AccessDeniedException { - } - - private SQLResponse queryWithSqlMassage(SQLRequest sqlRequest) throws Exception { - SQLResponse fakeResponse = QueryUtil.tableauIntercept(sqlRequest.getSql()); - if (null != fakeResponse) { - logger.debug("Return fake response, is exception? " + fakeResponse.getIsException()); - return fakeResponse; - } - - String correctedSql = QueryUtil.massageSql(sqlRequest); - if (correctedSql.equals(sqlRequest.getSql()) == false) - logger.info("The corrected query: " + correctedSql); - - // add extra parameters into olap context, like acceptPartial - Map<String, String> parameters = new HashMap<String, String>(); - parameters.put(OLAPContext.PRM_ACCEPT_PARTIAL_RESULT, String.valueOf(sqlRequest.isAcceptPartial())); - OLAPContext.setParameters(parameters); - - return execute(correctedSql, sqlRequest); - - } - - protected List<TableMeta> getMetadata(CubeManager cubeMgr, String project, boolean cubedOnly) throws SQLException { - - Connection conn = null; - ResultSet columnMeta = null; - List<TableMeta> tableMetas = null; - if (StringUtils.isBlank(project)) { - return Collections.emptyList(); - } - ResultSet JDBCTableMeta = null; - try { - DataSource dataSource = cacheService.getOLAPDataSource(project); - conn = dataSource.getConnection(); - DatabaseMetaData metaData = conn.getMetaData(); - - logger.debug("getting table metas"); - JDBCTableMeta = metaData.getTables(null, null, null, null); - - tableMetas = new LinkedList<TableMeta>(); - Map<String, TableMeta> tableMap = new HashMap<String, TableMeta>(); - while (JDBCTableMeta.next()) { - String catalogName = JDBCTableMeta.getString(1); - String schemaName = JDBCTableMeta.getString(2); - - // Not every JDBC data provider offers full 10 columns, e.g., PostgreSQL has only 5 - TableMeta tblMeta = new TableMeta(catalogName == null ? Constant.FakeCatalogName : catalogName, schemaName == null ? Constant.FakeSchemaName : schemaName, JDBCTableMeta.getString(3), JDBCTableMeta.getString(4), JDBCTableMeta.getString(5), null, null, null, null, null); - - if (!cubedOnly || getProjectManager().isExposedTable(project, schemaName + "." + tblMeta.getTABLE_NAME())) { - tableMetas.add(tblMeta); - tableMap.put(tblMeta.getTABLE_SCHEM() + "#" + tblMeta.getTABLE_NAME(), tblMeta); - } - } - - logger.debug("getting column metas"); - columnMeta = metaData.getColumns(null, null, null, null); - - while (columnMeta.next()) { - String catalogName = columnMeta.getString(1); - String schemaName = columnMeta.getString(2); - - // kylin(optiq) is not strictly following JDBC specification - ColumnMeta colmnMeta = new ColumnMeta(catalogName == null ? Constant.FakeCatalogName : catalogName, schemaName == null ? Constant.FakeSchemaName : schemaName, columnMeta.getString(3), columnMeta.getString(4), columnMeta.getInt(5), columnMeta.getString(6), columnMeta.getInt(7), getInt(columnMeta.getString(8)), columnMeta.getInt(9), columnMeta.getInt(10), columnMeta.getInt(11), columnMeta.getString(12), columnMeta.getString(13), getInt(columnMeta.getString(14)), getInt(columnMeta.getString(15)), columnMeta.getInt(16), columnMeta.getInt(17), columnMeta.getString(18), columnMeta.getString(19), columnMeta.getString(20), columnMeta.getString(21), getShort(columnMeta.getString(22)), columnMeta.getString(23)); - - if (!cubedOnly || getProjectManager().isExposedColumn(project, schemaName + "." + colmnMeta.getTABLE_NAME(), colmnMeta.getCOLUMN_NAME())) { - tableMap.get(colmnMeta.getTABLE_SCHEM() + "#" + colmnMeta.getTABLE_NAME()).addColumn(colmnMeta); - } - } - logger.debug("done column metas"); - } finally { - close(columnMeta, null, conn); - if (JDBCTableMeta != null) { - JDBCTableMeta.close(); - } - } - - return tableMetas; - } - - /** - * @param sql - * @param sqlRequest - * @return - * @throws Exception - */ - private SQLResponse execute(String sql, SQLRequest sqlRequest) throws Exception { - Connection conn = null; - Statement stat = null; - ResultSet resultSet = null; - - List<List<String>> results = Lists.newArrayList(); - List<SelectedColumnMeta> columnMetas = Lists.newArrayList(); - - try { - conn = cacheService.getOLAPDataSource(sqlRequest.getProject()).getConnection(); - - if (sqlRequest instanceof PrepareSqlRequest) { - PreparedStatement preparedState = conn.prepareStatement(sql); - - for (int i = 0; i < ((PrepareSqlRequest) sqlRequest).getParams().length; i++) { - setParam(preparedState, i + 1, ((PrepareSqlRequest) sqlRequest).getParams()[i]); - } - - resultSet = preparedState.executeQuery(); - } else { - stat = conn.createStatement(); - resultSet = stat.executeQuery(sql); - } - - ResultSetMetaData metaData = resultSet.getMetaData(); - int columnCount = metaData.getColumnCount(); - - // Fill in selected column meta - for (int i = 1; i <= columnCount; ++i) { - columnMetas.add(new SelectedColumnMeta(metaData.isAutoIncrement(i), metaData.isCaseSensitive(i), metaData.isSearchable(i), metaData.isCurrency(i), metaData.isNullable(i), metaData.isSigned(i), metaData.getColumnDisplaySize(i), metaData.getColumnLabel(i), metaData.getColumnName(i), metaData.getSchemaName(i), metaData.getCatalogName(i), metaData.getTableName(i), metaData.getPrecision(i), metaData.getScale(i), metaData.getColumnType(i), metaData.getColumnTypeName(i), metaData.isReadOnly(i), metaData.isWritable(i), metaData.isDefinitelyWritable(i))); - } - - // fill in results - while (resultSet.next()) { - List<String> oneRow = Lists.newArrayListWithCapacity(columnCount); - for (int i = 0; i < columnCount; i++) { - oneRow.add((resultSet.getString(i + 1))); - } - - results.add(oneRow); - } - } finally { - close(resultSet, stat, conn); - } - - boolean isPartialResult = false; - String cube = ""; - StringBuilder sb = new StringBuilder("Scan count for each storageContext: "); - long totalScanCount = 0; - if (OLAPContext.getThreadLocalContexts() != null) { // contexts can be null in case of 'explain plan for' - for (OLAPContext ctx : OLAPContext.getThreadLocalContexts()) { - if (ctx.realization != null) { - isPartialResult |= ctx.storageContext.isPartialResultReturned(); - cube = ctx.realization.getName(); - totalScanCount += ctx.storageContext.getTotalScanCount(); - sb.append(ctx.storageContext.getTotalScanCount() + ","); - } - } - } - logger.info(sb.toString()); - - SQLResponse response = new SQLResponse(columnMetas, results, cube, 0, false, null, isPartialResult); - response.setTotalScanCount(totalScanCount); - - return response; - } - - /** - * @param preparedState - * @param param - * @throws SQLException - */ - private void setParam(PreparedStatement preparedState, int index, PrepareSqlRequest.StateParam param) throws SQLException { - boolean isNull = (null == param.getValue()); - - Class<?> clazz; - try { - clazz = Class.forName(param.getClassName()); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e.getMessage(), e); - } - - Rep rep = Rep.of(clazz); - - switch (rep) { - case PRIMITIVE_CHAR: - case CHARACTER: - case STRING: - preparedState.setString(index, isNull ? null : String.valueOf(param.getValue())); - break; - case PRIMITIVE_INT: - case INTEGER: - preparedState.setInt(index, isNull ? 0 : Integer.valueOf(param.getValue())); - break; - case PRIMITIVE_SHORT: - case SHORT: - preparedState.setShort(index, isNull ? 0 : Short.valueOf(param.getValue())); - break; - case PRIMITIVE_LONG: - case LONG: - preparedState.setLong(index, isNull ? 0 : Long.valueOf(param.getValue())); - break; - case PRIMITIVE_FLOAT: - case FLOAT: - preparedState.setFloat(index, isNull ? 0 : Float.valueOf(param.getValue())); - break; - case PRIMITIVE_DOUBLE: - case DOUBLE: - preparedState.setDouble(index, isNull ? 0 : Double.valueOf(param.getValue())); - break; - case PRIMITIVE_BOOLEAN: - case BOOLEAN: - preparedState.setBoolean(index, !isNull && Boolean.parseBoolean(param.getValue())); - break; - case PRIMITIVE_BYTE: - case BYTE: - preparedState.setByte(index, isNull ? 0 : Byte.valueOf(param.getValue())); - break; - case JAVA_UTIL_DATE: - case JAVA_SQL_DATE: - preparedState.setDate(index, isNull ? null : java.sql.Date.valueOf(param.getValue())); - break; - case JAVA_SQL_TIME: - preparedState.setTime(index, isNull ? null : Time.valueOf(param.getValue())); - break; - case JAVA_SQL_TIMESTAMP: - preparedState.setTimestamp(index, isNull ? null : Timestamp.valueOf(param.getValue())); - break; - default: - preparedState.setObject(index, isNull ? null : param.getValue()); - } - } - - private int getInt(String content) { - try { - return Integer.parseInt(content); - } catch (Exception e) { - return -1; - } - } - - private short getShort(String content) { - try { - return Short.parseShort(content); - } catch (Exception e) { - return -1; - } - } - - private static void close(ResultSet resultSet, Statement stat, Connection conn) { - OLAPContext.clearParameter(); - - if (resultSet != null) - try { - resultSet.close(); - } catch (SQLException e) { - logger.error("failed to close", e); - } - if (stat != null) - try { - stat.close(); - } catch (SQLException e) { - logger.error("failed to close", e); - } - if (conn != null) - try { - conn.close(); - } catch (SQLException e) { - logger.error("failed to close", e); - } - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/service/StreamingService.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/service/StreamingService.java b/server/src/main/java/org/apache/kylin/rest/service/StreamingService.java deleted file mode 100644 index e49e882..0000000 --- a/server/src/main/java/org/apache/kylin/rest/service/StreamingService.java +++ /dev/null @@ -1,88 +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.service; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.apache.kylin.engine.streaming.StreamingConfig; -import org.apache.kylin.rest.constant.Constant; -import org.apache.kylin.rest.exception.InternalErrorException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PostFilter; -import org.springframework.stereotype.Component; - -@Component("streamingMgmtService") -public class StreamingService extends BasicService { - - @Autowired - private AccessService accessService; - - @PostFilter(Constant.ACCESS_POST_FILTER_READ) - public List<StreamingConfig> listAllStreamingConfigs(final String table) throws IOException { - List<StreamingConfig> streamingConfigs = new ArrayList(); - if (StringUtils.isEmpty(table)) { - streamingConfigs = getStreamingManager().listAllStreaming(); - } else { - StreamingConfig config = getStreamingManager().getConfig(table); - if (config != null) { - streamingConfigs.add(config); - } - } - - return streamingConfigs; - } - - public List<StreamingConfig> getStreamingConfigs(final String table, final Integer limit, final Integer offset) throws IOException { - - List<StreamingConfig> streamingConfigs; - streamingConfigs = listAllStreamingConfigs(table); - - if (limit == null || offset == null) { - return streamingConfigs; - } - - if ((streamingConfigs.size() - offset) < limit) { - return streamingConfigs.subList(offset, streamingConfigs.size()); - } - - return streamingConfigs.subList(offset, offset + limit); - } - - public StreamingConfig createStreamingConfig(StreamingConfig config) throws IOException { - if (getStreamingManager().getStreamingConfig(config.getName()) != null) { - throw new InternalErrorException("The streamingConfig named " + config.getName() + " already exists"); - } - StreamingConfig streamingConfig = getStreamingManager().saveStreamingConfig(config); - return streamingConfig; - } - - // @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')") - public StreamingConfig updateStreamingConfig(StreamingConfig config) throws IOException { - return getStreamingManager().updateStreamingConfig(config); - } - - // @PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')") - public void dropStreamingConfig(StreamingConfig config) throws IOException { - getStreamingManager().removeStreamingConfig(config); - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/service/UserService.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/service/UserService.java b/server/src/main/java/org/apache/kylin/rest/service/UserService.java deleted file mode 100644 index 07c7c6f..0000000 --- a/server/src/main/java/org/apache/kylin/rest/service/UserService.java +++ /dev/null @@ -1,289 +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.service; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import javax.annotation.PostConstruct; - -import org.apache.commons.io.IOUtils; -import org.apache.hadoop.hbase.client.Delete; -import org.apache.hadoop.hbase.client.Get; -import org.apache.hadoop.hbase.client.HTableInterface; -import org.apache.hadoop.hbase.client.Put; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.ResultScanner; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.kylin.common.util.Bytes; -import org.apache.kylin.common.util.Pair; -import org.apache.kylin.rest.security.AclHBaseStorage; -import org.apache.kylin.rest.util.Serializer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.provisioning.UserDetailsManager; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; - -/** - */ -@Component("userService") -public class UserService implements UserDetailsManager { - - private static final String PWD_PREFIX = "PWD:"; - - private Serializer<UserGrantedAuthority[]> ugaSerializer = new Serializer<UserGrantedAuthority[]>(UserGrantedAuthority[].class); - - private String userTableName = null; - - @Autowired - protected AclHBaseStorage aclHBaseStorage; - - @PostConstruct - public void init() throws IOException { - userTableName = aclHBaseStorage.prepareHBaseTable(UserService.class); - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - HTableInterface htable = null; - try { - htable = aclHBaseStorage.getTable(userTableName); - - Get get = new Get(Bytes.toBytes(username)); - get.addFamily(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY)); - Result result = htable.get(get); - - User user = hbaseRowToUser(result); - if (user == null) - throw new UsernameNotFoundException("User " + username + " not found."); - - return user; - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - IOUtils.closeQuietly(htable); - } - } - - private User hbaseRowToUser(Result result) throws JsonParseException, JsonMappingException, IOException { - if (null == result || result.isEmpty()) - return null; - - String username = Bytes.toString(result.getRow()); - - byte[] valueBytes = result.getValue(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN)); - UserGrantedAuthority[] deserialized = ugaSerializer.deserialize(valueBytes); - - String password = ""; - List<UserGrantedAuthority> authorities = Collections.emptyList(); - - // password is stored at [0] of authorities for backward compatibility - if (deserialized != null) { - if (deserialized.length > 0 && deserialized[0].getAuthority().startsWith(PWD_PREFIX)) { - password = deserialized[0].getAuthority().substring(PWD_PREFIX.length()); - authorities = Arrays.asList(deserialized).subList(1, deserialized.length); - } else { - authorities = Arrays.asList(deserialized); - } - } - - return new User(username, password, authorities); - } - - private Pair<byte[], byte[]> userToHBaseRow(UserDetails user) throws JsonProcessingException { - byte[] key = Bytes.toBytes(user.getUsername()); - - Collection<? extends GrantedAuthority> authorities = user.getAuthorities(); - if (authorities == null) - authorities = Collections.emptyList(); - - UserGrantedAuthority[] serializing = new UserGrantedAuthority[authorities.size() + 1]; - - // password is stored as the [0] authority - serializing[0] = new UserGrantedAuthority(PWD_PREFIX + user.getPassword()); - int i = 1; - for (GrantedAuthority a : authorities) { - serializing[i++] = new UserGrantedAuthority(a.getAuthority()); - } - - byte[] value = ugaSerializer.serialize(serializing); - return Pair.newPair(key, value); - } - - @Override - public void createUser(UserDetails user) { - updateUser(user); - } - - @Override - public void updateUser(UserDetails user) { - HTableInterface htable = null; - try { - htable = aclHBaseStorage.getTable(userTableName); - - Pair<byte[], byte[]> pair = userToHBaseRow(user); - Put put = new Put(pair.getKey()); - put.add(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN), pair.getSecond()); - - htable.put(put); - htable.flushCommits(); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - IOUtils.closeQuietly(htable); - } - } - - @Override - public void deleteUser(String username) { - HTableInterface htable = null; - try { - htable = aclHBaseStorage.getTable(userTableName); - - Delete delete = new Delete(Bytes.toBytes(username)); - - htable.delete(delete); - htable.flushCommits(); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - IOUtils.closeQuietly(htable); - } - } - - @Override - public void changePassword(String oldPassword, String newPassword) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean userExists(String username) { - HTableInterface htable = null; - try { - htable = aclHBaseStorage.getTable(userTableName); - - Result result = htable.get(new Get(Bytes.toBytes(username))); - - return null != result && !result.isEmpty(); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - IOUtils.closeQuietly(htable); - } - } - - public List<String> listUserAuthorities() { - List<String> all = new ArrayList<String>(); - for (UserDetails user : listUsers()) { - for (GrantedAuthority auth : user.getAuthorities()) { - if (!all.contains(auth.getAuthority())) { - all.add(auth.getAuthority()); - } - } - } - return all; - } - - public List<UserDetails> listUsers() { - Scan s = new Scan(); - s.addColumn(Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_FAMILY), Bytes.toBytes(AclHBaseStorage.USER_AUTHORITY_COLUMN)); - - List<UserDetails> all = new ArrayList<UserDetails>(); - HTableInterface htable = null; - ResultScanner scanner = null; - try { - htable = aclHBaseStorage.getTable(userTableName); - scanner = htable.getScanner(s); - - for (Result result = scanner.next(); result != null; result = scanner.next()) { - User user = hbaseRowToUser(result); - all.add(user); - } - } catch (IOException e) { - throw new RuntimeException("Failed to scan users", e); - } finally { - IOUtils.closeQuietly(scanner); - IOUtils.closeQuietly(htable); - } - return all; - } - - public static class UserGrantedAuthority implements GrantedAuthority { - private static final long serialVersionUID = -5128905636841891058L; - private String authority; - - public UserGrantedAuthority() { - } - - public UserGrantedAuthority(String authority) { - setAuthority(authority); - } - - @Override - public String getAuthority() { - return authority; - } - - public void setAuthority(String authority) { - this.authority = authority; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((authority == null) ? 0 : authority.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - UserGrantedAuthority other = (UserGrantedAuthority) obj; - if (authority == null) { - if (other.authority != null) - return false; - } else if (!authority.equals(other.authority)) - return false; - return true; - } - - @Override - public String toString() { - return authority; - } - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/util/Log4jConfigListener.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/util/Log4jConfigListener.java b/server/src/main/java/org/apache/kylin/rest/util/Log4jConfigListener.java deleted file mode 100644 index 7e79511..0000000 --- a/server/src/main/java/org/apache/kylin/rest/util/Log4jConfigListener.java +++ /dev/null @@ -1,47 +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.util; - -import javax.servlet.ServletContextEvent; - -import org.apache.kylin.common.KylinConfig; - -public class Log4jConfigListener extends org.springframework.web.util.Log4jConfigListener { - - private boolean isDebugTomcat; - - public Log4jConfigListener() { - this.isDebugTomcat = KylinConfig.getInstanceFromEnv().isDevEnv(); - } - - @Override - public void contextInitialized(ServletContextEvent event) { - if (!isDebugTomcat) { - super.contextInitialized(event); - } - } - - @Override - public void contextDestroyed(ServletContextEvent event) { - if (!isDebugTomcat) { - super.contextDestroyed(event); - } - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/util/QueryUtil.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/util/QueryUtil.java b/server/src/main/java/org/apache/kylin/rest/util/QueryUtil.java deleted file mode 100644 index c15e5f9..0000000 --- a/server/src/main/java/org/apache/kylin/rest/util/QueryUtil.java +++ /dev/null @@ -1,210 +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.util; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.kylin.rest.model.SelectedColumnMeta; -import org.apache.kylin.rest.request.SQLRequest; -import org.apache.kylin.rest.response.SQLResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - */ -public class QueryUtil { - - protected static final Logger logger = LoggerFactory.getLogger(QueryUtil.class); - - private static final String S0 = "\\s*"; - private static final String S1 = "\\s"; - private static final String SM = "\\s+"; - private static final Pattern PTN_GROUP_BY = Pattern.compile(S1 + "GROUP" + SM + "BY" + S1, Pattern.CASE_INSENSITIVE); - private static final Pattern PTN_HAVING_COUNT_GREATER_THAN_ZERO = Pattern.compile(S1 + "HAVING" + SM + "[(]?" + S0 + "COUNT" + S0 + "[(]" + S0 + "1" + S0 + "[)]" + S0 + ">" + S0 + "0" + S0 + "[)]?", Pattern.CASE_INSENSITIVE); - private static final Pattern PTN_SUM_1 = Pattern.compile(S1 + "SUM" + S0 + "[(]" + S0 + "[1]" + S0 + "[)]" + S1, Pattern.CASE_INSENSITIVE); - - // private static final Pattern PTN_HAVING_ESCAPE_FUNCTION = - // Pattern.compile("\\{fn" + "(" + S0 + ")" + "\\}", - // Pattern.CASE_INSENSITIVE); - private static final Pattern PTN_HAVING_ESCAPE_FUNCTION = Pattern.compile("\\{fn" + "(.*?)" + "\\}", Pattern.CASE_INSENSITIVE); - - private static String[] tableauTestQueries = new String[] { "SELECT 1", // - "CREATE LOCAL TEMPORARY TABLE \"XTableau_B_Connect\" ( \"COL\" INTEGER ) ON COMMIT PRESERVE ROWS", // - "DROP TABLE \"XTableau_B_Connect\"", // - "SELECT \"COL\" FROM (SELECT 1 AS \"COL\") AS \"SUBQUERY\"", // - "SELECT TOP 1 \"COL\" FROM (SELECT 1 AS \"COL\") AS \"CHECKTOP\"", "SELECT \"COL\" FROM (SELECT 1 AS \"COL\") AS \"CHECKTOP\" LIMIT 1", // - "SELECT \"SUBCOL\" AS \"COL\" FROM ( SELECT 1 AS \"SUBCOL\" ) \"SUBQUERY\" GROUP BY 1", "SELECT \"SUBCOL\" AS \"COL\" FROM ( SELECT 1 AS \"SUBCOL\" ) \"SUBQUERY\" GROUP BY 2", "INSERT INTO \"XTableau_C_Connect\" SELECT * FROM (SELECT 1 AS COL) AS CHECKTEMP LIMIT 1", "DROP TABLE \"XTableau_C_Connect\"", "INSERT INTO \"XTableau_B_Connect\" SELECT * FROM (SELECT 1 AS COL) AS CHECKTEMP LIMIT 1" }; - - private static SQLResponse temp = new SQLResponse(new LinkedList<SelectedColumnMeta>() { - private static final long serialVersionUID = -8086728462624901359L; - - { - add(new SelectedColumnMeta(false, false, true, false, 2, true, 11, "COL", "COL", "", "", "", 10, 0, 4, "int4", false, true, false)); - } - }, new LinkedList<List<String>>() { - private static final long serialVersionUID = -470083340592928073L; - - { - add(new LinkedList<String>() { - private static final long serialVersionUID = -3673192785838230054L; - - { - add("1"); - } - }); - } - }, 0, false, null); - - private static SQLResponse[] fakeResponses = new SQLResponse[] { temp, new SQLResponse(null, null, 0, false, null), // - new SQLResponse(null, null, 0, false, null), // - temp, // - new SQLResponse(null, null, 0, true, "near 1 syntax error"), // - temp, // - new SQLResponse(null, null, 0, true, "group by 1????"), // - new SQLResponse(null, null, 0, true, "group by 2????"), // - new SQLResponse(null, null, 0, true, "XTableau_C_Connect not exist"), // - new SQLResponse(null, null, 0, true, "XTableau_C_Connect not exist"), new SQLResponse(null, null, 0, true, "XTableau_B_Connect not exist"), }; - - private static ArrayList<HashSet<String>> tableauTestQueriesInToken = new ArrayList<HashSet<String>>(); - - static { - for (String q : tableauTestQueries) { - HashSet<String> temp = new HashSet<String>(); - for (String token : q.split("[\r\n\t \\(\\)]")) { - temp.add(token); - } - temp.add(""); - tableauTestQueriesInToken.add(temp); - } - } - - public static String massageSql(SQLRequest sqlRequest) { - String sql = sqlRequest.getSql(); - sql = sql.trim(); - - while (sql.endsWith(";")) - sql = sql.substring(0, sql.length() - 1); - - int limit = sqlRequest.getLimit(); - if (limit > 0 && !sql.toLowerCase().contains("limit")) { - sql += ("\nLIMIT " + limit); - } - - int offset = sqlRequest.getOffset(); - if (offset > 0 && !sql.toLowerCase().contains("offset")) { - sql += ("\nOFFSET " + offset); - } - - return healSickSql(sql); - } - - // correct sick / invalid SQL - private static String healSickSql(String sql) { - Matcher m; - - // Case fn{ EXTRACT(...) } - // Use non-greedy regrex matching to remove escape functions - while (true) { - m = PTN_HAVING_ESCAPE_FUNCTION.matcher(sql); - if (!m.find()) - break; - sql = sql.substring(0, m.start()) + m.group(1) + sql.substring(m.end()); - } - - // Case: HAVING COUNT(1)>0 without Group By - // Tableau generates: SELECT SUM(1) AS "COL" FROM "VAC_SW" HAVING - // COUNT(1)>0 - m = PTN_HAVING_COUNT_GREATER_THAN_ZERO.matcher(sql); - if (m.find() && PTN_GROUP_BY.matcher(sql).find() == false) { - sql = sql.substring(0, m.start()) + " " + sql.substring(m.end()); - } - - // Case: SUM(1) - // Replace it with COUNT(1) - while (true) { - m = PTN_SUM_1.matcher(sql); - if (!m.find()) - break; - sql = sql.substring(0, m.start()) + " COUNT(1) " + sql.substring(m.end()); - } - - return sql; - } - - public static SQLResponse tableauIntercept(String sql) { - - String[] tokens = sql.split("[\r\n\t \\(\\)]"); - for (int i = 0; i < tableauTestQueries.length; ++i) { - if (isTokenWiseEqual(tokens, tableauTestQueriesInToken.get(i))) { - logger.info("Hit fake response " + i); - return fakeResponses[i]; - } - } - - return null; - } - - public static String makeErrorMsgUserFriendly(Throwable e) { - String msg = e.getMessage(); - - // pick ParseException error message if possible - Throwable cause = e; - while (cause != null) { - if (cause.getClass().getName().contains("ParseException")) { - msg = cause.getMessage(); - break; - } - cause = cause.getCause(); - } - - return makeErrorMsgUserFriendly(msg); - } - - public static String makeErrorMsgUserFriendly(String errorMsg) { - try { - // make one line - errorMsg = errorMsg.replaceAll("\\s", " "); - - // move cause to be ahead of sql, calcite creates the message pattern below - Pattern pattern = Pattern.compile("error while executing SQL \"(.*)\":(.*)"); - Matcher matcher = pattern.matcher(errorMsg); - if (matcher.find()) { - return matcher.group(2).trim() + "\n" + "while executing SQL: \"" + matcher.group(1).trim() + "\""; - } else - return errorMsg; - } catch (Exception e) { - return errorMsg; - } - } - - private static boolean isTokenWiseEqual(String[] tokens, HashSet<String> tokenSet) { - for (String token : tokens) { - if (!tokenSet.contains(token)) { - return false; - } - } - return true; - } - -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/main/java/org/apache/kylin/rest/util/Serializer.java ---------------------------------------------------------------------- diff --git a/server/src/main/java/org/apache/kylin/rest/util/Serializer.java b/server/src/main/java/org/apache/kylin/rest/util/Serializer.java deleted file mode 100644 index d726e06..0000000 --- a/server/src/main/java/org/apache/kylin/rest/util/Serializer.java +++ /dev/null @@ -1,51 +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.util; - -import java.io.IOException; - -import org.apache.kylin.common.util.JsonUtil; - -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; - -public class Serializer<T> { - private final Class<T> type; - - public Serializer(Class<T> type) { - this.type = type; - } - - public T deserialize(byte[] value) throws JsonParseException, JsonMappingException, IOException { - if (null == value) { - return null; - } - - return JsonUtil.readValue(value, type); - } - - public byte[] serialize(T obj) throws JsonProcessingException { - if (null == obj) { - return null; - } - - return JsonUtil.writeValueAsBytes(obj); - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/test/java/org/apache/kylin/rest/bean/BeanTest.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/bean/BeanTest.java b/server/src/test/java/org/apache/kylin/rest/bean/BeanTest.java deleted file mode 100644 index 03d4dad..0000000 --- a/server/src/test/java/org/apache/kylin/rest/bean/BeanTest.java +++ /dev/null @@ -1,74 +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.bean; - -import java.beans.IntrospectionException; - -import org.apache.kylin.rest.constant.Constant; -import org.apache.kylin.rest.model.ColumnMeta; -import org.apache.kylin.rest.model.SelectedColumnMeta; -import org.apache.kylin.rest.model.TableMeta; -import org.apache.kylin.rest.request.AccessRequest; -import org.apache.kylin.rest.request.CubeRequest; -import org.apache.kylin.rest.request.JobListRequest; -import org.apache.kylin.rest.request.SQLRequest; -import org.apache.kylin.rest.response.AccessEntryResponse; -import org.apache.kylin.rest.response.SQLResponse; -import org.junit.Assert; -import org.junit.Test; - -/** - * @author xduo - * - */ -public class BeanTest { - - @Test - public void test() { - try { - BeanValidator.validateAccssor(ColumnMeta.class, new String[0]); - BeanValidator.validateAccssor(TableMeta.class, new String[0]); - BeanValidator.validateAccssor(SelectedColumnMeta.class, new String[0]); - BeanValidator.validateAccssor(AccessRequest.class, new String[0]); - BeanValidator.validateAccssor(CubeRequest.class, new String[0]); - BeanValidator.validateAccssor(JobListRequest.class, new String[0]); - BeanValidator.validateAccssor(SQLRequest.class, new String[0]); - BeanValidator.validateAccssor(AccessEntryResponse.class, new String[0]); - BeanValidator.validateAccssor(SQLResponse.class, new String[0]); - } catch (IntrospectionException e) { - } - - new SQLResponse(null, null, null, 0, true, null); - - SelectedColumnMeta coulmnMeta = new SelectedColumnMeta(false, false, false, false, 0, false, 0, null, null, null, null, null, 0, 0, 0, null, false, false, false); - Assert.assertTrue(!coulmnMeta.isAutoIncrement()); - Assert.assertTrue(!coulmnMeta.isCaseSensitive()); - Assert.assertTrue(!coulmnMeta.isSearchable()); - Assert.assertTrue(!coulmnMeta.isCurrency()); - Assert.assertTrue(coulmnMeta.getIsNullable() == 0); - Assert.assertTrue(!coulmnMeta.isSigned()); - - Assert.assertEquals(Constant.ACCESS_HAS_ROLE_ADMIN, "hasRole('ROLE_ADMIN')"); - Assert.assertEquals(Constant.ACCESS_POST_FILTER_READ, "hasRole('ROLE_ADMIN') or hasPermission(filterObject, 'READ') or hasPermission(filterObject, 'MANAGEMENT') " + "or hasPermission(filterObject, 'OPERATION') or hasPermission(filterObject, 'ADMINISTRATION')"); - Assert.assertEquals(Constant.FakeCatalogName, "defaultCatalog"); - Assert.assertEquals(Constant.FakeSchemaName, "defaultSchema"); - Assert.assertEquals(Constant.IDENTITY_ROLE, "role"); - Assert.assertEquals(Constant.IDENTITY_USER, "user"); - } -} http://git-wip-us.apache.org/repos/asf/kylin/blob/1a124e68/server/src/test/java/org/apache/kylin/rest/bean/BeanValidator.java ---------------------------------------------------------------------- diff --git a/server/src/test/java/org/apache/kylin/rest/bean/BeanValidator.java b/server/src/test/java/org/apache/kylin/rest/bean/BeanValidator.java deleted file mode 100644 index 08010e4..0000000 --- a/server/src/test/java/org/apache/kylin/rest/bean/BeanValidator.java +++ /dev/null @@ -1,160 +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.bean; - -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Array; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.junit.Assert; - -/** - * @author xduo - * - */ -public class BeanValidator { - - /** - * Tests the get/set methods of the specified class. - */ - public static <T> void validateAccssor(final Class<T> clazz, final String... skipThese) throws IntrospectionException { - final PropertyDescriptor[] props = Introspector.getBeanInfo(clazz).getPropertyDescriptors(); - for (PropertyDescriptor prop : props) { - - for (String skipThis : skipThese) { - if (skipThis.equals(prop.getName())) { - continue; - } - } - - findBooleanIsMethods(clazz, prop); - - final Method getter = prop.getReadMethod(); - final Method setter = prop.getWriteMethod(); - - if (getter != null && setter != null) { - final Class<?> returnType = getter.getReturnType(); - final Class<?>[] params = setter.getParameterTypes(); - - if (params.length == 1 && params[0] == returnType) { - try { - Object value = buildValue(returnType); - - T bean = clazz.newInstance(); - - setter.invoke(bean, value); - - Assert.assertEquals(String.format("Failed while testing property %s", prop.getName()), value, getter.invoke(bean)); - - } catch (Exception ex) { - ex.printStackTrace(); - System.err.println(String.format("An exception was thrown while testing the property %s: %s", prop.getName(), ex.toString())); - } - } - } - } - } - - private static Object buildValue(Class<?> clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException { - - final Constructor<?>[] ctrs = clazz.getConstructors(); - for (Constructor<?> ctr : ctrs) { - if (ctr.getParameterTypes().length == 0) { - return ctr.newInstance(); - } - } - - // Specific rules for common classes - if (clazz.isArray()) { - return Array.newInstance(clazz.getComponentType(), 1); - } else if (List.class.isAssignableFrom(clazz)) { - return Collections.emptyList(); - } else if (Set.class.isAssignableFrom(clazz)) { - return Collections.emptySet(); - } else if (Map.class.isAssignableFrom(clazz)) { - return Collections.emptyMap(); - } else if (clazz == String.class) { - return "TEST"; - } else if (clazz == boolean.class || clazz == Boolean.class) { - return true; - } else if (clazz == short.class || clazz == Short.class) { - return (short) 1; - } else if (clazz == int.class || clazz == Integer.class) { - return 1; - } else if (clazz == long.class || clazz == Long.class) { - return 1L; - } else if (clazz == double.class || clazz == Double.class) { - return 1.0D; - } else if (clazz == float.class || clazz == Float.class) { - return 1.0F; - } else if (clazz == char.class || clazz == Character.class) { - return 'T'; - } else if (clazz.isEnum()) { - return clazz.getEnumConstants()[0]; - } else if (clazz.isInterface()) { - return Proxy.newProxyInstance(clazz.getClassLoader(), new java.lang.Class[] { clazz }, new java.lang.reflect.InvocationHandler() { - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if (Object.class.getMethod("equals", Object.class).equals(method)) { - return proxy == args[0]; - } - if (Object.class.getMethod("hashCode", Object.class).equals(method)) { - return Integer.valueOf(System.identityHashCode(proxy)); - } - if (Object.class.getMethod("toString", Object.class).equals(method)) { - return "Bean " + getMockedType(proxy); - } - - return null; - } - - }); - } else { - System.err.println("Unable to build an instance of class " + clazz.getName() + ", please add some code to the " + BeanValidator.class.getName() + " class to do this."); - return null; - } - } - - public static <T> void findBooleanIsMethods(Class<T> clazz, PropertyDescriptor descriptor) throws IntrospectionException { - if (descriptor.getReadMethod() == null && descriptor.getPropertyType() == Boolean.class) { - try { - PropertyDescriptor pd = new PropertyDescriptor(descriptor.getName(), clazz); - descriptor.setReadMethod(pd.getReadMethod()); - } catch (IntrospectionException e) { - } - } - } - - @SuppressWarnings("unchecked") - public static <T, V extends T> Class<T> getMockedType(final V proxy) { - if (Proxy.isProxyClass(proxy.getClass())) { - return (Class<T>) proxy.getClass().getInterfaces()[0]; - } - return (Class<T>) proxy.getClass().getSuperclass(); - } -}
