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]