ScreensServiceServlet.java 7.06 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.servlet.ServletException
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.sling.SlingServlet
 *  org.apache.sling.api.SlingHttpServletRequest
 *  org.apache.sling.api.SlingHttpServletResponse
 *  org.apache.sling.api.request.RequestPathInfo
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.servlets.SlingAllMethodsServlet
 *  org.apache.sling.commons.json.JSONException
 *  org.apache.sling.commons.json.io.JSONWriter
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.screens.impl;

import com.adobe.cq.screens.DeviceMessageQueue;
import com.adobe.cq.screens.device.Device;
import com.adobe.cq.screens.device.DeviceConfig;
import com.adobe.cq.screens.device.DeviceManager;
import com.adobe.cq.screens.device.DeviceStatus;
import com.adobe.cq.screens.device.impl.DeviceService;
import com.adobe.cq.screens.impl.DeviceStatusWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import javax.servlet.ServletException;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestPathInfo;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.io.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SlingServlet(resourceTypes={"screens/core/components/service"}, methods={"GET", "POST"})
public class ScreensServiceServlet
extends SlingAllMethodsServlet {
    private static final Logger log = LoggerFactory.getLogger(ScreensServiceServlet.class);
    private static final String HEADER_SET_HEARTBEAT = "X-SET-HEARTBEAT";
    private static final String HEADER_REQUEST_COMMAND = "X-REQUEST-COMMAND";
    @Reference
    private DeviceMessageQueue queue = null;
    @Reference
    private DeviceService deviceSvc = null;

    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String[] selectors = request.getRequestPathInfo().getSelectors();
        if (selectors.length == 1 && "ping".equals(selectors[0])) {
            this.handlePing(request, response);
        } else {
            response.getWriter().write("ok");
        }
    }

    private void handlePing(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        String deviceId = request.getParameter("id");
        if (deviceId == null) {
            log.error("ping needs id parameter.");
            response.sendError(500);
            return;
        }
        ResourceResolver resolver = request.getResourceResolver();
        DeviceManager dm = (DeviceManager)resolver.adaptTo(DeviceManager.class);
        Device device = dm.getDevice(deviceId);
        if (device == null) {
            log.error("Unable to find device: {} for user {}", (Object)deviceId, (Object)request.getRemoteUser());
            response.sendError(404);
            return;
        }
        DeviceStatus status = dm.getDeviceStatus(deviceId);
        if (status == null) {
            log.error("Something went wrong. No device status for device {}", (Object)deviceId);
            response.setStatus(404);
            return;
        }
        DeviceConfig config = device.getDeviceConfig();
        String version = request.getParameter("v");
        if (version == null || version.length() == 0) {
            version = "n/a";
        }
        long timestamp = -1;
        try {
            timestamp = Long.parseLong(request.getParameter("t"));
        }
        catch (NumberFormatException e) {
            // empty catch block
        }
        this.deviceSvc.updateFirmwareVersion(resolver, device.getId(), version, timestamp);
        String heartbeat = request.getHeader("X-SET-HEARTBEAT");
        if (heartbeat != null) {
            this.deviceSvc.updatePing(resolver, device.getId());
        }
        try {
            response.setContentType("application/json");
            DeviceStatusWriter w = new DeviceStatusWriter(resolver, new JSONWriter((Writer)response.getWriter()));
            if (request.getHeader("X-REQUEST-COMMAND") != null) {
                w.setMessageQueue(this.queue);
            }
            w.writeDevice(device, status, config);
        }
        catch (JSONException jex) {
            log.error("Error creating JSON output for device", (Throwable)jex);
            throw new IOException((Throwable)jex);
        }
    }

    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        String deviceId = request.getParameter("id");
        String cmd = request.getParameter("cmd");
        if ("send".equals(cmd)) {
            String msg = request.getParameter("msg");
            if (msg == null) {
                log.error("send command needs 'msg' parameter");
                response.sendError(500);
                return;
            }
            if (deviceId == null) {
                log.error("send command needs 'id' parameter");
                response.sendError(500);
                return;
            }
            DeviceManager dm = (DeviceManager)request.getResourceResolver().adaptTo(DeviceManager.class);
            Device device = dm.getDevice(deviceId);
            if (device == null) {
                log.error("send command failed. no such device: {}", (Object)deviceId);
                response.sendError(500);
                return;
            }
            this.queue.queue(device.getId(), msg);
            JSONWriter w = new JSONWriter((Writer)response.getWriter());
            response.setContentType("application/json");
            try {
                w.object();
                w.key("success").value(true);
                w.key("message").value((Object)"added message to device");
                w.key("deviceId").value((Object)device.getId());
                w.key("devicePath").value((Object)device.getPath());
                w.endObject();
            }
            catch (JSONException e) {
                log.error("Error creating JSON", (Throwable)e);
                response.sendError(500);
            }
        } else {
            log.error("invalid command: {}", (Object)cmd);
            response.sendError(500);
        }
    }

    protected void bindQueue(DeviceMessageQueue deviceMessageQueue) {
        this.queue = deviceMessageQueue;
    }

    protected void unbindQueue(DeviceMessageQueue deviceMessageQueue) {
        if (this.queue == deviceMessageQueue) {
            this.queue = null;
        }
    }

    protected void bindDeviceSvc(DeviceService deviceService) {
        this.deviceSvc = deviceService;
    }

    protected void unbindDeviceSvc(DeviceService deviceService) {
        if (this.deviceSvc == deviceService) {
            this.deviceSvc = null;
        }
    }
}