diff --git a/README.org b/README.org index 12c0116..df5b39a 100644 --- a/README.org +++ b/README.org @@ -154,6 +154,19 @@ is provided, all workspaces matching the regex will be deleted. "responsePort": 5555} #+end_src +1. Remove a single layer and it's associated store under a Workspace from Geoserver + +Both ~geoserverWorkspace~ and ~geoserverLayer~ are plain texts that must +match the exact entries in Geoserver. + +#+begin_src js +{"action": "remove", + "geoserverWorkspace": "demo", + "geoserverLayer": "demo-layer", + "responseHost": "my.server.org", + "responsePort": 5555} +#+end_src + Because GeoServer updates can take awhile to complete, these requests are processed asynchronously. This means that the network connection will be closed as soon as the incoming request is read from the diff --git a/src/geosync/core.clj b/src/geosync/core.clj index 037508a..5f7b251 100644 --- a/src/geosync/core.clj +++ b/src/geosync/core.clj @@ -484,3 +484,16 @@ (and acc))) true workspaces))) + +(defn remove-layer! + [{:keys [geoserver-workspace geoserver-layer] :as config-params}] + (when (workspace-exists? config-params) + (reduce (fn [acc f] + (->> (f geoserver-workspace geoserver-layer true) + (make-rest-request config-params) + (:status) + (success-code?) + (or acc))) + false + [rest/delete-data-store + rest/delete-coverage-store]))) diff --git a/src/geosync/rest_api.clj b/src/geosync/rest_api.clj index 776ef6a..28fe33c 100644 --- a/src/geosync/rest_api.clj +++ b/src/geosync/rest_api.clj @@ -155,10 +155,14 @@ [:entry {:key "memory mapped buffer"} true] [:entry {:key "cache and reuse memory maps"} true]]])]) -(defn delete-data-store [workspace store] - ["DELETE" - (str "/workspaces/" workspace "/datastores/" store) - nil]) +(defn delete-data-store + ([workspace store] + (delete-data-store workspace store false)) + + ([workspace store recurse?] + ["DELETE" + (str "/workspaces/" workspace "/datastores/" store "?recurse=" recurse?) + nil])) ;;================================================================================= ;; @@ -211,10 +215,14 @@ file-url "text/plain"]) -(defn delete-coverage-store [workspace store] - ["DELETE" - (str "/workspaces/" workspace "/coveragestores/" store) - nil]) +(defn delete-coverage-store + ([workspace store] + (delete-coverage-store workspace store false)) + + ([workspace store recurse?] + ["DELETE" + (str "/workspaces/" workspace "/coveragestores/" store "?recurse=" recurse?) + nil])) ;;================================================================================= ;; diff --git a/src/geosync/server.clj b/src/geosync/server.clj index eca4df5..644f7aa 100644 --- a/src/geosync/server.clj +++ b/src/geosync/server.clj @@ -6,6 +6,7 @@ [clojure.spec.alpha :as spec] [geosync.action-hooks :refer [run-action-hooks!]] [geosync.core :refer [add-directory-to-workspace! + remove-layer! remove-workspace!]] [geosync.file-watcher :as file-watcher] [geosync.simple-sockets :as sockets] @@ -33,6 +34,7 @@ ::action ::geoserver-workspace] :opt-un [::data-dir + ::geoserver-layer ::prioritize]) (fn [{:keys [action data-dir]}] (or (and (= action "add") (string? data-dir)) @@ -67,10 +69,14 @@ [1 "GeoSync: Errors encountered during layer registration."])) (defmethod process-request! :remove - [config-params _] - (if (remove-workspace! config-params) - [0 "GeoSync: Workspace(s) removed."] - [1 "GeoSync: Errors encountered during workspace removal."])) + [{:keys [geoserver-layer] :as config-params} _] + (if geoserver-layer + (if (remove-layer! config-params) + [0 "GeoSync: Layer removed."] + [1 "GeoSync: Errors encountered during layer removal."]) + (if (remove-workspace! config-params) + [0 "GeoSync: Workspace(s) removed."] + [1 "GeoSync: Errors encountered during workspace removal."]))) (defn process-requests! [{:keys [geosync-server-host geosync-server-port action-hooks] :as config-params}] @@ -79,15 +85,18 @@ [response-host response-port geoserver-workspace + geoserver-layer data-dir] :as request} @(first (alts! [job-queue stand-by-queue] :priority true))] (log-str "Processing Request: " request) (let [config-params (-> config-params (dissoc :geosync-server-host :geosync-server-port) - (assoc :geoserver-workspace geoserver-workspace :data-dir data-dir)) + (assoc :geoserver-workspace geoserver-workspace + :geoserver-layer geoserver-layer + :data-dir data-dir)) [status-num status-msg] (try (let [_ (run-action-hooks! action-hooks request :before) - status (process-request! config-params request) + status (process-request! config-params) _ (run-action-hooks! action-hooks request :after)] status) (catch Exception e