Ctrl K
ComunidadGuías…

extensions/web-chart/web-chart.lua

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
local extension = ...

local class = require('jls.lang.class')
local logger = extension:getLogger()
local RestHttpHandler = require('jls.net.http.handler.RestHttpHandler')
local HttpExchange = require('jls.net.http.HttpExchange')
local strings = require('jls.util.strings')
local tables = require('jls.util.tables')
local Date = require('jls.util.Date')

local webBaseAddons = extension:require('web-base.addons', true)

webBaseAddons.register(extension)

local HistoricalDataHandler = class.create('jls.net.http.HttpHandler', function(tableHandler)

  function tableHandler:initialize(dataHistory)
    self.dataHistory = dataHistory
  end

  function tableHandler:handle(exchange)
    if HttpExchange.methodAllowed(exchange, 'GET') then
      local path = exchange:getRequestArguments()
      local request = exchange:getRequest()
      local toTime = tonumber(request:getHeader("X-TO-TIME"))
      if toTime then
        toTime = toTime * 1000
      end
      local period = tonumber(request:getHeader("X-PERIOD"))
      if not period then
        local t
        local tp = string.gsub(path, '/$', '')
        if toTime then
          t = self.dataHistory:getTableAt(toTime) or {}
        else
          t = self.dataHistory:getLiveTable()
        end
        RestHttpHandler.replyJson(exchange, {
          value = tables.getPath(t, '/'..tp)
        })
        return
      end
      local fromTime = tonumber(request:getHeader("X-FROM-TIME"))
      local subPaths = request:getHeader("X-PATHS")
      if logger:isLoggable(logger.FINE) then
        logger:fine('process data request %s - %s / %s on "%s"', fromTime, toTime, period, path)
      end
      period = period * 1000
      if not toTime then
        toTime = Date.now()
      end
      if fromTime then
        fromTime = fromTime * 1000
      else
        -- use 100 data points by default
        fromTime = toTime - period * 100
      end
      if fromTime < toTime and ((toTime - fromTime) / period) < 10000 then
        local result
        if subPaths then
          local paths = strings.split(subPaths, ',')
          for i = 1, #paths do
            paths[i] = path..paths[i]
          end
          result = self.dataHistory:loadMultiValues(fromTime, toTime, period, paths)
        else
          -- TODO provide property types
          result = self.dataHistory:loadValues(fromTime, toTime, period, path)
        end
        RestHttpHandler.replyJson(exchange, result)
      else
        HttpExchange.badRequest(exchange)
      end
    end
  end
end)

extension:subscribeEvent('startup', function()
  local engine = extension:getEngine()
  extension:addContext('/engine/historicalData/(.*)', HistoricalDataHandler:new(engine.dataHistory))
end)