analysis/webservice/NexusHandler.py (91 lines of code) (raw):

# 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. import logging import types AVAILABLE_HANDLERS = [] AVAILABLE_INITIALIZERS = [] def nexus_initializer(clazz): log = logging.getLogger(__name__) try: wrapper = NexusInitializerWrapper(clazz) log.info("Adding initializer '%s'" % wrapper.clazz()) AVAILABLE_INITIALIZERS.append(wrapper) except Exception as ex: log.warn("Initializer '%s' failed to load (reason: %s)" % (clazz, ex.message), exc_info=True) return clazz def nexus_handler(clazz): log = logging.getLogger(__name__) try: clazz.validate() log.info("Adding algorithm module '%s' with path '%s' (%s)" % (clazz.name, clazz.path, clazz)) AVAILABLE_HANDLERS.append(clazz) except Exception as ex: log.warn("Handler '%s' is invalid and will be skipped (reason: %s)" % (clazz, ex.message), exc_info=True) return clazz DEFAULT_PARAMETERS_SPEC = { "ds": { "name": "Dataset", "type": "string", "description": "One or more comma-separated dataset shortnames" }, "minLat": { "name": "Minimum Latitude", "type": "float", "description": "Minimum (Southern) bounding box Latitude" }, "maxLat": { "name": "Maximum Latitude", "type": "float", "description": "Maximum (Northern) bounding box Latitude" }, "minLon": { "name": "Minimum Longitude", "type": "float", "description": "Minimum (Western) bounding box Longitude" }, "maxLon": { "name": "Maximum Longitude", "type": "float", "description": "Maximum (Eastern) bounding box Longitude" }, "startTime": { "name": "Start Time", "type": "long integer", "description": "Starting time in milliseconds since midnight Jan. 1st, 1970 UTC" }, "endTime": { "name": "End Time", "type": "long integer", "description": "Ending time in milliseconds since midnight Jan. 1st, 1970 UTC" }, "lowPassFilter": { "name": "Apply Low Pass Filter", "type": "boolean", "description": "Specifies whether to apply a low pass filter on the analytics results" }, "seasonalFilter": { "name": "Apply Seasonal Filter", "type": "boolean", "description": "Specified whether to apply a seasonal cycle filter on the analytics results" } } class NexusInitializerWrapper: def __init__(self, clazz): self.__log = logging.getLogger(__name__) self.__hasBeenRun = False self.__clazz = clazz self.validate() def validate(self): if "init" not in self.__clazz.__dict__ or not type(self.__clazz.__dict__["init"]) == types.FunctionType: raise Exception("Method 'init' has not been declared") def clazz(self): return self.__clazz def hasBeenRun(self): return self.__hasBeenRun def init(self, config): if not self.__hasBeenRun: self.__hasBeenRun = True instance = self.__clazz() instance.init(config) else: self.log("Initializer '%s' has already been run" % self.__clazz) def executeInitializers(config): [wrapper.init(config) for wrapper in AVAILABLE_INITIALIZERS]