com.glaf.dts.web.rest.MxQueryResource.java Source code

Java tutorial

Introduction

Here is the source code for com.glaf.dts.web.rest.MxQueryResource.java

Source

/*
 * 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 com.glaf.dts.web.rest;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONArray;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.glaf.core.base.BaseTree;
import com.glaf.core.base.TreeModel;
import com.glaf.core.domain.ColumnDefinition;
import com.glaf.core.domain.QueryDefinition;
import com.glaf.core.domain.TableDefinition;
import com.glaf.core.query.QueryDefinitionQuery;
import com.glaf.core.query.TableDefinitionQuery;
import com.glaf.core.service.IQueryDefinitionService;
import com.glaf.core.service.ITableDefinitionService;
import com.glaf.core.service.ITreeModelService;
import com.glaf.core.tree.helper.TreeHelper;
import com.glaf.core.util.DBUtils;
import com.glaf.core.util.RequestUtils;
import com.glaf.core.util.ResponseUtils;
import com.glaf.core.util.StringTools;
import com.glaf.core.util.Tools;
import com.glaf.dts.transform.MxTransformManager;
import com.glaf.dts.util.Constants;

@Controller("/rs/dts/query")
@Path("/rs/dts/query")
public class MxQueryResource {
    private static Log logger = LogFactory.getLog(MxQueryResource.class);

    protected ITableDefinitionService tableDefinitionService;

    protected IQueryDefinitionService queryDefinitionService;

    protected ITreeModelService treeModelService;

    @POST
    @Path("/delete")
    @ResponseBody
    @Produces({ MediaType.APPLICATION_OCTET_STREAM })
    public byte[] delete(@Context HttpServletRequest request, @Context UriInfo uriInfo) {
        String queryIds = request.getParameter("queryIds");
        if (StringUtils.isNotEmpty(queryIds)) {
            List<String> ids = StringTools.split(queryIds);
            if (ids != null && !ids.isEmpty()) {
                for (String queryId : ids) {
                    queryDefinitionService.deleteById(queryId);
                }
                return ResponseUtils.responseJsonResult(true);
            }
        }
        return ResponseUtils.responseJsonResult(false);
    }

    @POST
    @Path("/delete/{queryId}")
    @ResponseBody
    @Produces({ MediaType.APPLICATION_OCTET_STREAM })
    public byte[] delete(@PathParam("queryId") String queryId, @Context UriInfo uriInfo) {
        if (queryDefinitionService.hasChildren(queryId)) {
            throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
        }
        queryDefinitionService.deleteById(queryId);
        return ResponseUtils.responseJsonResult(true);
    }

    @GET
    @POST
    @Path("/list")
    @ResponseBody
    @Produces({ MediaType.APPLICATION_OCTET_STREAM })
    public byte[] list(@Context HttpServletRequest request) {
        Map<String, Object> params = RequestUtils.getParameterMap(request);
        QueryDefinitionQuery query = new QueryDefinitionQuery();
        Tools.populate(query, params);
        List<QueryDefinition> queries = queryDefinitionService.list(query);
        ObjectNode responseJSON = new ObjectMapper().createObjectNode();

        ArrayNode arrayJSON = new ObjectMapper().createArrayNode();

        for (QueryDefinition q : queries) {
            ObjectNode json = q.toObjectNode();
            arrayJSON.add(json);
        }

        responseJSON.set("data", arrayJSON);
        responseJSON.set("rows", arrayJSON);
        responseJSON.put("total", queries.size());
        responseJSON.put("totalCount", queries.size());
        responseJSON.put("totalRecords", queries.size());

        try {
            return responseJSON.toString().getBytes("UTF-8");
        } catch (IOException e) {
            return responseJSON.toString().getBytes();
        }
    }

    @POST
    @Path("/saveQuery")
    @ResponseBody
    @Produces({ MediaType.APPLICATION_OCTET_STREAM })
    public byte[] saveQuery(@Context HttpServletRequest request) {
        String queryId = request.getParameter("queryId");
        QueryDefinition query = null;

        if (StringUtils.isNotEmpty(queryId)) {
            query = queryDefinitionService.getQueryDefinition(queryId);
        }

        if (query == null) {
            query = new QueryDefinition();
        }

        Map<String, Object> params = RequestUtils.getParameterMap(request);
        Tools.populate(query, params);

        logger.debug("sql:" + query.getSql());

        logger.debug("targetTableName:" + query.getTargetTableName());

        logger.debug("parentId:" + query.getParentId());

        MxTransformManager manager = new MxTransformManager();
        if (StringUtils.isNotEmpty(query.getSql())) {

            if (!DBUtils.isLegalQuerySql(query.getSql())) {
                return ResponseUtils.responseJsonResult(false, "SQL?????");
            }
            if (!DBUtils.isAllowedSql(query.getSql())) {
                return ResponseUtils.responseJsonResult(false,
                        "SQL?????");
            }

            if (StringUtils.isNotEmpty(query.getTargetTableName())) {
                String tableName = query.getTargetTableName();
                tableName = tableName.toLowerCase();
                if (tableName.length() > 26) {
                    return ResponseUtils.responseJsonResult(false, "?26?");
                }
                if (StringUtils.startsWith(tableName, "mx_") || StringUtils.startsWith(tableName, "sys_")
                        || StringUtils.startsWith(tableName, "jbpm_")
                        || StringUtils.startsWith(tableName, "act_")) {
                    return ResponseUtils.responseJsonResult(false, "??");
                }
            }

            TableDefinition newTable = null;
            try {
                newTable = manager.toTableDefinition(query);
            } catch (Exception ex) {
                ex.printStackTrace();
                return ResponseUtils.responseJsonResult(false, "SQL???");
            }

            if (StringUtils.isNotEmpty(query.getTargetTableName())) {
                newTable.setTableName(query.getTargetTableName());
                TableDefinition table = tableDefinitionService.getTableDefinition(query.getTargetTableName());
                if (table == null) {
                    table = newTable;
                } else {
                    if (newTable != null && newTable.getColumns() != null) {
                        for (ColumnDefinition column : newTable.getColumns()) {
                            if (!table.getColumns().contains(column)) {
                                table.addColumn(column);
                            }
                        }
                    }
                }
                tableDefinitionService.save(table);
            }

            if (newTable != null && newTable.getColumns() != null) {

            }
            query.setType(Constants.DTS_TASK_TYPE);
            queryDefinitionService.save(query);
        }

        return ResponseUtils.responseJsonResult(true);
    }

    @javax.annotation.Resource
    public void setQueryDefinitionService(IQueryDefinitionService queryDefinitionService) {
        this.queryDefinitionService = queryDefinitionService;
    }

    @javax.annotation.Resource
    public void setTableDefinitionService(ITableDefinitionService tableDefinitionService) {
        this.tableDefinitionService = tableDefinitionService;
    }

    @javax.annotation.Resource
    public void setTreeModelService(ITreeModelService treeModelService) {
        this.treeModelService = treeModelService;
    }

    @GET
    @POST
    @Path("/treeJson")
    @ResponseBody
    @Produces({ MediaType.APPLICATION_OCTET_STREAM })
    public byte[] treeJson(@Context HttpServletRequest request) throws IOException {
        JSONArray array = new JSONArray();
        Long nodeId = RequestUtils.getLong(request, "nodeId");
        String nodeCode = request.getParameter("nodeCode");
        String selected = request.getParameter("selected");

        logger.debug(RequestUtils.getParameterMap(request));
        List<TreeModel> treeModels = new java.util.ArrayList<TreeModel>();
        List<String> chooseList = new java.util.ArrayList<String>();
        if (StringUtils.isNotEmpty(selected)) {
            chooseList = StringTools.split(selected);
        }

        TreeModel treeNode = null;

        if (nodeId != null && nodeId > 0) {
            treeNode = treeModelService.getTreeModel(nodeId);
        } else if (StringUtils.isNotEmpty(nodeCode)) {
            treeNode = treeModelService.getTreeModelByCode(nodeCode);
        }
        if (treeNode != null) {
            QueryDefinitionQuery query = new QueryDefinitionQuery();
            List<TreeModel> subTrees = treeModelService.getSubTreeModels(treeNode.getId());
            if (subTrees != null && !subTrees.isEmpty()) {
                for (TreeModel tree : subTrees) {
                    tree.getDataMap().put("nocheck", "true");
                    tree.getDataMap().put("iconSkin", "tree_folder");
                    tree.getDataMap().put("isParent", "true");
                    tree.setIconCls("folder");
                    tree.setLevel(0);
                    treeModels.add(tree);
                    query.nodeId(tree.getId());
                    List<QueryDefinition> queries = queryDefinitionService.list(query);
                    for (QueryDefinition q : queries) {
                        if (StringUtils.isNumeric(q.getId())) {
                            TreeModel t = new BaseTree();
                            t.setId(Long.parseLong(q.getId()));
                            t.setParentId(tree.getId());
                            t.setName(q.getTitle());
                            t.setCode(q.getId());
                            t.setTreeId(q.getId());
                            t.setIconCls("leaf");
                            t.getDataMap().put("iconSkin", "tree_leaf");
                            if (chooseList.contains(q.getId())) {
                                t.setChecked(true);
                            }
                            treeModels.add(t);
                        }
                    }
                }
            }
            TreeHelper treeHelper = new TreeHelper();
            array = treeHelper.getTreeJSONArray(treeModels);
        }

        return array.toJSONString().getBytes("UTF-8");
    }

    @GET
    @POST
    @Path("/view/{queryId}")
    @ResponseBody
    @Produces({ MediaType.APPLICATION_OCTET_STREAM })
    public byte[] view(@PathParam("queryId") String queryId, @Context HttpServletRequest request) {
        Map<String, Object> params = RequestUtils.getParameterMap(request);
        TableDefinitionQuery query = new TableDefinitionQuery();
        Tools.populate(query, params);
        QueryDefinition q = queryDefinitionService.getQueryDefinition(queryId);
        ObjectNode responseJSON = q.toObjectNode();
        try {
            return responseJSON.toString().getBytes("UTF-8");
        } catch (IOException e) {
            return responseJSON.toString().getBytes();
        }
    }

}