ScreensManagerImpl.java 8.46 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.adobe.granite.socketio.SocketIOListener
 *  com.adobe.granite.socketio.SocketIOService
 *  com.adobe.granite.socketio.SocketIOSocket
 *  com.adobe.granite.socketio.SocketIOSocketListener
 *  org.apache.felix.scr.annotations.Activate
 *  org.apache.felix.scr.annotations.Component
 *  org.apache.felix.scr.annotations.Deactivate
 *  org.apache.felix.scr.annotations.Reference
 *  org.apache.felix.scr.annotations.Service
 *  org.apache.sling.api.resource.LoginException
 *  org.apache.sling.api.resource.ResourceResolver
 *  org.apache.sling.api.resource.ResourceResolverFactory
 *  org.osgi.service.component.ComponentContext
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.cq.screens.sessions.impl;

import com.adobe.cq.screens.sessions.Device;
import com.adobe.cq.screens.sessions.Display;
import com.adobe.cq.screens.sessions.DisplayListener;
import com.adobe.cq.screens.sessions.ScreensManager;
import com.adobe.cq.screens.sessions.ScreensSession;
import com.adobe.cq.screens.sessions.impl.DeviceImpl;
import com.adobe.cq.screens.sessions.impl.DisplayImpl;
import com.adobe.cq.screens.sessions.impl.ScreensSessionImpl;
import com.adobe.cq.screens.sessions.impl.SocketListener;
import com.adobe.cq.screens.sessions.impl.auth.ScreensTokenProvider;
import com.adobe.granite.socketio.SocketIOListener;
import com.adobe.granite.socketio.SocketIOService;
import com.adobe.granite.socketio.SocketIOSocket;
import com.adobe.granite.socketio.SocketIOSocketListener;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@Service(value={ScreensManager.class, ScreensTokenProvider.class})
public class ScreensManagerImpl
implements ScreensManager,
SocketIOListener,
ScreensTokenProvider {
    private static final Logger log = LoggerFactory.getLogger(ScreensManagerImpl.class);
    private final ConcurrentMap<DisplayListener, Object> listeners = new ConcurrentHashMap<DisplayListener, Object>();
    private final ConcurrentMap<String, DeviceImpl> devices = new ConcurrentHashMap<String, DeviceImpl>();
    private final ConcurrentMap<String, DisplayImpl> displays = new ConcurrentHashMap<String, DisplayImpl>();
    private final ConcurrentMap<String, SocketListener> handlers = new ConcurrentHashMap<String, SocketListener>();
    private final ConcurrentMap<String, ScreensTokenProvider.Token> authTokens = new ConcurrentHashMap<String, ScreensTokenProvider.Token>();
    private final SecureRandom random = new SecureRandom();
    @Reference
    private SocketIOService socketIOService;
    @Reference
    private ResourceResolverFactory factory;

    @Activate
    private void activate() {
        DisplayImpl s0 = new DisplayImpl("display-0", this);
        this.displays.put(s0.getId(), s0);
        this.socketIOService.register((SocketIOListener)this);
    }

    public DeviceImpl registerDevice(String deviceId, String displayId) {
        DisplayImpl display = this.displays.get(displayId);
        if (display == null) {
            log.error("Unable to register device. no such display: {}", (Object)displayId);
            return null;
        }
        if (this.devices.containsKey(deviceId)) {
            log.error("Unable to register device. already exists {}", (Object)deviceId);
            return null;
        }
        DeviceImpl d = new DeviceImpl(deviceId, display);
        this.devices.put(d.getId(), d);
        display.getDevices().add(d);
        log.info("registered device: {}", (Object)deviceId);
        return d;
    }

    public DeviceImpl unregisterDevice(String deviceId) {
        DeviceImpl device = this.devices.remove(deviceId);
        if (device != null) {
            device.getDisplay().getDevices().remove(device);
            log.info("unregistering device: {}", (Object)deviceId);
        }
        return device;
    }

    @Deactivate
    private void deactivate(ComponentContext context) {
        this.socketIOService.unregister((SocketIOListener)this);
        this.handlers.clear();
        for (DisplayImpl display : this.displays.values()) {
            display.close();
        }
        this.displays.clear();
    }

    public boolean handleNamespace(String s) {
        return "/".equals(s);
    }

    public void onConnect(SocketIOSocket socket) {
        SocketListener handler = new SocketListener(socket, this);
        socket.setListener((SocketIOSocketListener)handler);
        this.handlers.put(socket.getId(), handler);
    }

    public void onDisconnect(SocketIOSocket socketIOSocket, String s) {
        SocketListener handler = this.handlers.remove(socketIOSocket.getId());
    }

    @Override
    public Device getDevice(String deviceId) {
        return this.devices.get(deviceId);
    }

    @Override
    public void register(DisplayListener listener) {
        this.listeners.put(listener, listener);
        for (DisplayImpl display : this.displays.values()) {
            ScreensSession session = display.getSession();
            if (session == null) continue;
            listener.onOpen(session);
        }
    }

    @Override
    public void unregister(DisplayListener listener) {
        this.listeners.remove(listener);
    }

    @Override
    public ScreensTokenProvider.Token getInfo(String tokenId) {
        return this.authTokens.get(tokenId);
    }

    public AuthInfo login(String username, String password) throws javax.security.auth.login.LoginException {
        try {
            HashMap<String, String> authenticationInfo = new HashMap<String, String>();
            authenticationInfo.put("user.name", username);
            authenticationInfo.put("user.password", (String)password.toCharArray());
            ResourceResolver resolver = this.factory.getResourceResolver(authenticationInfo);
            AuthInfo info = new AuthInfo(resolver);
            this.authTokens.put(info.tokenId, info);
            return info;
        }
        catch (LoginException e) {
            throw new javax.security.auth.login.LoginException(e.getMessage());
        }
    }

    public void onOpen(ScreensSessionImpl session) {
        for (DisplayListener l : this.listeners.keySet()) {
            l.onOpen(session);
        }
    }

    public void onClose(ScreensSessionImpl session) {
        for (DisplayListener l : this.listeners.keySet()) {
            l.onClose(session);
        }
    }

    protected void bindSocketIOService(SocketIOService socketIOService) {
        this.socketIOService = socketIOService;
    }

    protected void unbindSocketIOService(SocketIOService socketIOService) {
        if (this.socketIOService == socketIOService) {
            this.socketIOService = null;
        }
    }

    protected void bindFactory(ResourceResolverFactory resourceResolverFactory) {
        this.factory = resourceResolverFactory;
    }

    protected void unbindFactory(ResourceResolverFactory resourceResolverFactory) {
        if (this.factory == resourceResolverFactory) {
            this.factory = null;
        }
    }

    public class AuthInfo
    implements ScreensTokenProvider.Token {
        private final ResourceResolver resolver;
        private final String tokenId;

        public AuthInfo(ResourceResolver resolver) {
            this.resolver = resolver;
            this.tokenId = new BigInteger(130, ScreensManagerImpl.this.random).toString(32);
        }

        @Override
        public String getTokenId() {
            return this.tokenId;
        }

        @Override
        public String getUserId() {
            return (String)this.resolver.getAttribute("user.name");
        }

        public ResourceResolver getResolver() {
            return this.resolver;
        }

        public void logout() {
            this.resolver.close();
            ScreensManagerImpl.this.authTokens.remove(this.tokenId);
        }
    }

}