/src/community/taskmanager/core/src/main/java/org/geoserver/taskmanager/tasks/DbLocalPublicationTaskTypeImpl.java

https://github.com/geoserver/geoserver · Java · 249 lines · 215 code · 30 blank · 4 comment · 23 complexity · e50fdcabcacb17267be62ed97535539b MD5 · raw file

  1. /* (c) 2018 Open Source Geospatial Foundation - all rights reserved
  2. * This code is licensed under the GPL 2.0 license, available at the root
  3. * application directory.
  4. */
  5. package org.geoserver.taskmanager.tasks;
  6. import java.io.IOException;
  7. import java.util.LinkedHashMap;
  8. import java.util.Map;
  9. import javax.annotation.PostConstruct;
  10. import org.geoserver.catalog.Catalog;
  11. import org.geoserver.catalog.CatalogBuilder;
  12. import org.geoserver.catalog.CatalogFactory;
  13. import org.geoserver.catalog.DataStoreInfo;
  14. import org.geoserver.catalog.FeatureTypeInfo;
  15. import org.geoserver.catalog.LayerInfo;
  16. import org.geoserver.catalog.NamespaceInfo;
  17. import org.geoserver.catalog.ResourceInfo;
  18. import org.geoserver.catalog.WorkspaceInfo;
  19. import org.geoserver.catalog.impl.CatalogFactoryImpl;
  20. import org.geoserver.taskmanager.external.DbSource;
  21. import org.geoserver.taskmanager.external.DbTable;
  22. import org.geoserver.taskmanager.external.ExtTypes;
  23. import org.geoserver.taskmanager.schedule.BatchContext;
  24. import org.geoserver.taskmanager.schedule.ParameterInfo;
  25. import org.geoserver.taskmanager.schedule.TaskContext;
  26. import org.geoserver.taskmanager.schedule.TaskException;
  27. import org.geoserver.taskmanager.schedule.TaskResult;
  28. import org.geoserver.taskmanager.schedule.TaskType;
  29. import org.geoserver.taskmanager.util.SqlUtil;
  30. import org.geotools.feature.NameImpl;
  31. import org.geotools.jdbc.JDBCDataStoreFactory;
  32. import org.geotools.util.decorate.Wrapper;
  33. import org.opengis.feature.type.Name;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.stereotype.Component;
  36. @Component
  37. public class DbLocalPublicationTaskTypeImpl implements TaskType {
  38. public static final String NAME = "LocalDbPublication";
  39. public static final String PARAM_WORKSPACE = "workspace";
  40. public static final String PARAM_LAYER = "layer";
  41. public static final String PARAM_DB_NAME = "database";
  42. public static final String PARAM_TABLE_NAME = "table-name";
  43. protected final Map<String, ParameterInfo> paramInfo =
  44. new LinkedHashMap<String, ParameterInfo>();
  45. @Autowired protected ExtTypes extTypes;
  46. @Autowired protected Catalog catalog;
  47. @Override
  48. public String getName() {
  49. return NAME;
  50. }
  51. @PostConstruct
  52. public void initParamInfo() {
  53. ParameterInfo dbInfo = new ParameterInfo(PARAM_DB_NAME, extTypes.dbName, true);
  54. paramInfo.put(PARAM_DB_NAME, dbInfo);
  55. paramInfo.put(
  56. PARAM_TABLE_NAME,
  57. new ParameterInfo(PARAM_TABLE_NAME, extTypes.tableName, true).dependsOn(dbInfo));
  58. ParameterInfo paramWorkspace =
  59. new ParameterInfo(PARAM_WORKSPACE, extTypes.workspace, false);
  60. paramInfo.put(PARAM_WORKSPACE, paramWorkspace);
  61. paramInfo.put(
  62. PARAM_LAYER,
  63. new ParameterInfo(PARAM_LAYER, extTypes.name, true)
  64. .dependsOn(false, paramWorkspace));
  65. }
  66. @Override
  67. public Map<String, ParameterInfo> getParameterInfo() {
  68. return paramInfo;
  69. }
  70. @Override
  71. public TaskResult run(TaskContext ctx) throws TaskException {
  72. final Name layerName = (Name) ctx.getParameterValues().get(PARAM_LAYER);
  73. final DbSource db = (DbSource) ctx.getParameterValues().get(PARAM_DB_NAME);
  74. final DbTable table =
  75. (DbTable)
  76. ctx.getBatchContext()
  77. .get(
  78. ctx.getParameterValues().get(PARAM_TABLE_NAME),
  79. new BatchContext.Dependency() {
  80. @Override
  81. public void revert() throws TaskException {
  82. FeatureTypeInfo resource =
  83. catalog.getResourceByName(
  84. layerName, FeatureTypeInfo.class);
  85. DbTable table =
  86. (DbTable)
  87. ctx.getBatchContext()
  88. .get(
  89. ctx.getParameterValues()
  90. .get(
  91. PARAM_TABLE_NAME));
  92. resource.setNativeName(
  93. SqlUtil.notQualified(table.getTableName()));
  94. catalog.save(resource);
  95. }
  96. });
  97. CatalogFactory catalogFac = new CatalogFactoryImpl(catalog);
  98. final NamespaceInfo ns = catalog.getNamespaceByURI(layerName.getNamespaceURI());
  99. final WorkspaceInfo ws = catalog.getWorkspaceByName(ns.getName());
  100. final boolean createLayer = catalog.getLayerByName(layerName) == null;
  101. final boolean createStore;
  102. final boolean createResource;
  103. final LayerInfo layer;
  104. final DataStoreInfo store;
  105. final FeatureTypeInfo resource;
  106. if (createLayer) {
  107. String schema = SqlUtil.schema(table.getTableName());
  108. String dbName = schema == null ? db.getName() : (db.getName() + "_" + schema);
  109. final DataStoreInfo _store = catalog.getStoreByName(ws, dbName, DataStoreInfo.class);
  110. final FeatureTypeInfo _resource =
  111. catalog.getResourceByName(layerName, FeatureTypeInfo.class);
  112. createStore = _store == null;
  113. createResource = _resource == null;
  114. if (createStore) {
  115. store = catalogFac.createDataStore();
  116. store.setWorkspace(ws);
  117. store.setName(dbName);
  118. store.getConnectionParameters()
  119. .put(JDBCDataStoreFactory.NAMESPACE.getName(), ns.getURI());
  120. store.getConnectionParameters().putAll(db.getParameters());
  121. if (schema != null) {
  122. store.getConnectionParameters()
  123. .put(JDBCDataStoreFactory.SCHEMA.getName(), schema);
  124. }
  125. store.setEnabled(true);
  126. catalog.add(store);
  127. } else {
  128. store = unwrap(_store, DataStoreInfo.class);
  129. }
  130. CatalogBuilder builder = new CatalogBuilder(catalog);
  131. if (createResource) {
  132. builder.setStore(store);
  133. try {
  134. resource =
  135. builder.buildFeatureType(
  136. new NameImpl(SqlUtil.notQualified(table.getTableName())));
  137. builder.setupBounds(resource);
  138. } catch (Exception e) {
  139. if (createStore) {
  140. catalog.remove(store);
  141. }
  142. throw new TaskException(e);
  143. }
  144. resource.setName(layerName.getLocalPart());
  145. resource.setTitle(layerName.getLocalPart());
  146. resource.setAdvertised(false);
  147. catalog.add(resource);
  148. } else {
  149. resource = unwrap(_resource, FeatureTypeInfo.class);
  150. }
  151. try {
  152. layer = builder.buildLayer(resource);
  153. catalog.add(layer);
  154. } catch (IOException e) {
  155. if (createStore) {
  156. catalog.remove(store);
  157. }
  158. if (createResource) {
  159. catalog.remove(resource);
  160. }
  161. throw new TaskException(e);
  162. }
  163. } else {
  164. layer = null;
  165. resource = null;
  166. store = null;
  167. createStore = false;
  168. createResource = false;
  169. }
  170. return new TaskResult() {
  171. @Override
  172. public void commit() throws TaskException {
  173. if (createLayer) {
  174. ResourceInfo editResource =
  175. catalog.getResource(resource.getId(), ResourceInfo.class);
  176. editResource.setAdvertised(true);
  177. catalog.save(editResource);
  178. }
  179. }
  180. @Override
  181. public void rollback() throws TaskException {
  182. if (createLayer) {
  183. catalog.remove(layer);
  184. if (createResource) {
  185. catalog.remove(resource);
  186. }
  187. if (createStore) {
  188. catalog.remove(store);
  189. }
  190. }
  191. }
  192. };
  193. }
  194. @Override
  195. public void cleanup(TaskContext ctx) throws TaskException {
  196. final DbSource db = (DbSource) ctx.getParameterValues().get(PARAM_DB_NAME);
  197. final Name layerName = (Name) ctx.getParameterValues().get(PARAM_LAYER);
  198. final String workspace = catalog.getNamespaceByURI(layerName.getNamespaceURI()).getPrefix();
  199. final DbTable table = (DbTable) ctx.getParameterValues().get(PARAM_TABLE_NAME);
  200. String schema = SqlUtil.schema(table.getTableName());
  201. String dbName = schema == null ? db.getName() : (db.getName() + "_" + schema);
  202. final LayerInfo layer = catalog.getLayerByName(layerName);
  203. final DataStoreInfo store = catalog.getStoreByName(workspace, dbName, DataStoreInfo.class);
  204. final FeatureTypeInfo resource =
  205. catalog.getResourceByName(layerName, FeatureTypeInfo.class);
  206. catalog.remove(layer);
  207. catalog.remove(resource);
  208. if (catalog.getResourcesByStore(store, ResourceInfo.class).isEmpty()) {
  209. catalog.remove(store);
  210. }
  211. }
  212. private static <T> T unwrap(T o, Class<T> clazz) {
  213. if (o instanceof Wrapper) {
  214. return ((Wrapper) o).unwrap(clazz);
  215. } else {
  216. return o;
  217. }
  218. }
  219. }