ParserFactory.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package org.dbsyncer.parser;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.dbsyncer.cache.CacheService;
  4. import org.dbsyncer.common.util.JsonUtil;
  5. import org.dbsyncer.connector.ConnectorFactory;
  6. import org.dbsyncer.connector.config.ConnectorConfig;
  7. import org.dbsyncer.connector.config.MetaInfo;
  8. import org.dbsyncer.connector.enums.ConnectorEnum;
  9. import org.dbsyncer.connector.enums.FilterEnum;
  10. import org.dbsyncer.connector.enums.OperationEnum;
  11. import org.dbsyncer.listener.config.ListenerConfig;
  12. import org.dbsyncer.listener.enums.ListenerEnum;
  13. import org.dbsyncer.parser.enums.ConvertEnum;
  14. import org.dbsyncer.parser.model.ConfigModel;
  15. import org.dbsyncer.parser.model.Connector;
  16. import org.dbsyncer.parser.model.Mapping;
  17. import org.dbsyncer.parser.model.TableGroup;
  18. import org.dbsyncer.storage.SnowflakeIdWorker;
  19. import org.dbsyncer.storage.constant.ConfigConstant;
  20. import org.json.JSONException;
  21. import org.json.JSONObject;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.stereotype.Component;
  26. import org.springframework.util.Assert;
  27. import java.util.Arrays;
  28. import java.util.List;
  29. /**
  30. * @author AE86
  31. * @version 1.0.0
  32. * @date 2019/9/29 22:38
  33. */
  34. @Component
  35. public class ParserFactory implements Parser {
  36. private final Logger logger = LoggerFactory.getLogger(getClass());
  37. @Autowired
  38. private ConnectorFactory connectorFactory;
  39. @Autowired
  40. private CacheService cacheService;
  41. @Autowired
  42. private SnowflakeIdWorker snowflakeIdWorker;
  43. @Override
  44. public boolean alive(String json) {
  45. ConnectorConfig config;
  46. try {
  47. JSONObject configObj = new JSONObject(json);
  48. String connectorType = configObj.getString("connectorType");
  49. Class<?> configClass = ConnectorEnum.getConfigClass(connectorType);
  50. Object obj = JsonUtil.jsonToObj(configObj.toString(), configClass);
  51. Assert.notNull(obj, "ConnectorConfig is invalid.");
  52. config = (ConnectorConfig) obj;
  53. config.setConnectorType(connectorType);
  54. Assert.notNull(config, "ConnectorConfig can not be null.");
  55. return connectorFactory.isAlive(config);
  56. } catch (Exception e) {
  57. logger.error(e.getMessage());
  58. throw new ParserException(e.getMessage());
  59. }
  60. }
  61. @Override
  62. public MetaInfo getMetaInfo(String connectorId, String tableName) {
  63. ConnectorConfig config = getConnectorConfig(connectorId);
  64. return connectorFactory.getMetaInfo(config, tableName);
  65. }
  66. @Override
  67. public Connector parseConnector(String json) {
  68. return parseConnector(json, true);
  69. }
  70. @Override
  71. public Connector parseConnector(String json, boolean checkAlive) {
  72. // 1、Json串转Bean
  73. Connector connector = null;
  74. try {
  75. JSONObject conn = new JSONObject(json);
  76. JSONObject config = (JSONObject) conn.remove("config");
  77. connector = JsonUtil.jsonToObj(conn.toString(), Connector.class);
  78. Assert.notNull(connector, "Connector can not be null.");
  79. String connectorType = config.getString("connectorType");
  80. Class<?> configClass = ConnectorEnum.getConfigClass(connectorType);
  81. ConnectorConfig obj = (ConnectorConfig) JsonUtil.jsonToObj(config.toString(), configClass);
  82. connector.setConfig(obj);
  83. } catch (JSONException e) {
  84. logger.error(e.getMessage());
  85. throw new ParserException(e.getMessage());
  86. }
  87. if (!checkAlive) {
  88. return connector;
  89. }
  90. // 2、验证连接是否可用
  91. ConnectorConfig config = connector.getConfig();
  92. if (!connectorFactory.isAlive(config)) {
  93. throw new ParserException("无法连接,请检查服务是否正常.");
  94. }
  95. // 3、config
  96. List<String> table = connectorFactory.getTable(config);
  97. connector.setTable(table);
  98. setConfigModel(connector, ConfigConstant.CONNECTOR);
  99. return connector;
  100. }
  101. @Override
  102. public Mapping parseMapping(String json) {
  103. return parseMapping(json, true);
  104. }
  105. @Override
  106. public Mapping parseMapping(String json, boolean checkAlive) {
  107. // 1、Json串转Bean
  108. Mapping mapping = null;
  109. try {
  110. JSONObject map = new JSONObject(json);
  111. mapping = JsonUtil.jsonToObj(map.toString(), Mapping.class);
  112. Assert.notNull(mapping, "Mapping can not be null.");
  113. } catch (JSONException e) {
  114. logger.error(e.getMessage());
  115. throw new ParserException(e.getMessage());
  116. }
  117. if (!checkAlive) {
  118. return mapping;
  119. }
  120. // 2、验证连接是否可用
  121. aliveConnector(mapping.getSourceConnectorId());
  122. aliveConnector(mapping.getTargetConnectorId());
  123. // 3、config
  124. setConfigModel(mapping, ConfigConstant.MAPPING);
  125. return mapping;
  126. }
  127. @Override
  128. public TableGroup parseTableGroup(String json) {
  129. return parseTableGroup(json, true);
  130. }
  131. @Override
  132. public TableGroup parseTableGroup(String json, boolean checkAlive) {
  133. // 1、Json串转Bean
  134. TableGroup tableGroup = null;
  135. try {
  136. JSONObject conn = new JSONObject(json);
  137. tableGroup = JsonUtil.jsonToObj(conn.toString(), TableGroup.class);
  138. Assert.notNull(tableGroup, "TableGroup can not be null.");
  139. } catch (JSONException e) {
  140. logger.error(e.getMessage());
  141. throw new ParserException(e.getMessage());
  142. }
  143. if (!checkAlive) {
  144. return tableGroup;
  145. }
  146. // 2、验证驱动配置是否存在
  147. String mappingId = tableGroup.getMappingId();
  148. Assert.hasText(mappingId, "MappingId can not be empty.");
  149. Mapping mapping = cacheService.get(mappingId, Mapping.class);
  150. Assert.notNull(mapping, "Mapping can not be null.");
  151. // 3、config
  152. String name = tableGroup.getName();
  153. tableGroup.setName(StringUtils.isEmpty(name) ? ConfigConstant.TABLE_GROUP : name);
  154. setConfigModel(tableGroup, ConfigConstant.TABLE_GROUP);
  155. return tableGroup;
  156. }
  157. @Override
  158. public List<OperationEnum> getOperationEnumAll() {
  159. return Arrays.asList(OperationEnum.values());
  160. }
  161. @Override
  162. public List<FilterEnum> getFilterEnumAll() {
  163. return Arrays.asList(FilterEnum.values());
  164. }
  165. @Override
  166. public List<ConvertEnum> getConvertEnumAll() {
  167. return Arrays.asList(ConvertEnum.values());
  168. }
  169. /**
  170. * 验证连接器是否可用
  171. *
  172. * @param connectorId
  173. */
  174. private void aliveConnector(String connectorId) {
  175. ConnectorConfig config = getConnectorConfig(connectorId);
  176. if (!connectorFactory.isAlive(config)) {
  177. throw new ParserException("无法连接,请检查服务是否正常.");
  178. }
  179. }
  180. /**
  181. * 获取连接配置
  182. * @param connectorId
  183. * @return
  184. */
  185. private ConnectorConfig getConnectorConfig(String connectorId) {
  186. Assert.hasText(connectorId, "Connector id can not be empty.");
  187. Connector conn = cacheService.get(connectorId, Connector.class);
  188. Assert.notNull(conn, "Connector can not be null.");
  189. return conn.getConfig();
  190. }
  191. private void setConfigModel(ConfigModel model, String type) {
  192. Assert.notNull(model, "ConfigModel can not be null.");
  193. Assert.hasText(type, "ConfigModel type can not be empty.");
  194. Assert.hasText(model.getName(), "ConfigModel name can not be empty.");
  195. model.setId(StringUtils.isEmpty(model.getId()) ? String.valueOf(snowflakeIdWorker.nextId()) : model.getId());
  196. model.setType(type);
  197. long now = System.currentTimeMillis();
  198. model.setCreateTime(null == model.getCreateTime() ? now : model.getCreateTime());
  199. model.setUpdateTime(now);
  200. }
  201. }