/* * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software;Designed and Developed mainly by many Chinese * opensource volunteers. you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 only, as published by the * Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Any questions about this component can be directed to it's project Web address * https://code.google.com/p/opencloudb/. * */ package org.hx.rainbow.server.oc.manage.service; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.hx.rainbow.common.context.RainbowContext; import org.hx.rainbow.common.util.ObjectId; import org.hx.rainbow.common.core.service.BaseService; import org.hx.rainbow.common.web.session.RainbowSession; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @Lazy @Service public class SchemaService extends BaseService { private static final String SCHEMANAMESPACE = "OCSCHEMA"; private static final String SCHEMAMAPNAMESPACE = "OCSCHEMAMAP"; private static final String SCHEMATABLENAMESPACE = "OCTABLE"; private static final String SCHEMADATANODENAMESPACE = "OCDATANODE"; private static final String SCHEMADATAHOSTNAMESPACE = "OCDATAHOST"; private static final String SCHEMADATAHOSTMAPNAMESPACE = "OCDATAHOSTMAP"; private static final String SCHEMAOCHOSTNAMESPACE = "OCHOST"; private String statement="querySchemaTableList"; public RainbowContext querySchema(RainbowContext context) { Map<String, Object> schema = new HashMap<String, Object>(); List<Map<String, Object>> schemaList = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> dataNodelist = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> dataHostlist = new ArrayList<Map<String, Object>>(); /** find schema name */ super.query(context, SCHEMANAMESPACE); schemaList.addAll(context.getRows()); /** find table */ clear(context); for (Map<String, Object> map : schemaList) { context.addAttr("schemaName", map.get("name")); super.query(context, SCHEMAMAPNAMESPACE,statement); /** find table child */ List<Map<String, Object>> tableList = new ArrayList<Map<String, Object>>(); tableList.addAll(context.getRows()); for (Map<String, Object> table : tableList) { searchTableChildList(table, context); } map.put("tableList", tableList); } schema.put("schemaList", schemaList); /** find dataNode */ clear(context); super.query(context, SCHEMADATANODENAMESPACE); dataNodelist.addAll(context.getRows()); schema.put("dataNode", dataNodelist); clear(context); /** find datahost */ super.query(context, SCHEMADATAHOSTNAMESPACE); dataHostlist.addAll(context.getRows()); searchHostChildList(dataHostlist, context); schema.put("dataHost", dataHostlist); clear(context); List<Map<String, Object>> params = new ArrayList<Map<String, Object>>(); params.add(schema); context.setRows(params); return context; } /** * 递归查询子节点 * * @param table */ private void searchTableChildList(Map<String, Object> table, RainbowContext context) { String guid = table.get("guid") == null ? "" : table.get("guid") .toString(); if (guid != null && !"".equals(guid)) { clear(context); List<Map<String, Object>> childList = new ArrayList<Map<String, Object>>(); context.addAttr("parentName", guid); super.query(context, SCHEMATABLENAMESPACE); childList.addAll(context.getRows()); table.put("childlist", childList); for (Map<String, Object> child : childList) { searchTableChildList(child, context); } } } /** * 查询主机关联主从库 * * @param host * @param context */ private void searchHostChildList(List<Map<String, Object>> host, RainbowContext context) { if (host != null && host.size() > 0) { for (Map<String, Object> map : host) { clear(context); context.addAttr("dataHost", map.get("name")); super.query(context, SCHEMADATAHOSTMAPNAMESPACE); if (context.getRows() != null && context.getRows().size() > 0) { List<Map<String, Object>> writeTable = new ArrayList<Map<String, Object>>(); writeTable.addAll(context.getRows()); clear(context); searchWriteChildList(writeTable, context); map.put("writeList", writeTable); } } } } /** * 查询只读节点 * * @param writeList * @param context */ private void searchWriteChildList(List<Map<String, Object>> writeList, RainbowContext context) { if (writeList != null && writeList.size() > 0) { for (Map<String, Object> map : writeList) { clear(context); context.addAttr("parentHost", map.get("guid")); super.query(context, SCHEMAOCHOSTNAMESPACE); if (context.getRows() != null && context.getRows().size() > 0) { List<Map<String, Object>> readList = new ArrayList<Map<String, Object>>(); readList.addAll(context.getRows()); map.put("readList", readList); } } } } private void clear(RainbowContext context) { if (context.getRows().size() > 0) { context.clearRows(); } if (context.getAttr().size() > 0) { context.clearAttr(); } } public RainbowContext query(RainbowContext context) { super.query(context, SCHEMANAMESPACE); return context; } public RainbowContext queryByPage(RainbowContext context) { super.queryByPage(context, SCHEMANAMESPACE); return context; } public RainbowContext insert(RainbowContext context) { context.addAttr("guid", new ObjectId().toString()); context.addAttr("createTime", new Date()); context.addAttr("createUser", RainbowSession.getUserName()); super.insert(context, SCHEMANAMESPACE); context.getAttr().clear(); return context; } public RainbowContext update(RainbowContext context) { super.update(context, SCHEMANAMESPACE); context.getAttr().clear(); return context; } public RainbowContext delete(RainbowContext context) { super.delete(context, SCHEMANAMESPACE); context.getAttr().clear(); return context; } }