com.comcast.cats.provider.VideoRecorderRESTProviderImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.comcast.cats.provider.VideoRecorderRESTProviderImpl.java

Source

/**
 * Copyright 2014 Comcast Cable Communications Management, LLC
 *
 * This file is part of CATS.
 *
 * CATS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * CATS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with CATS.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.comcast.cats.provider;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.comcast.cats.info.VideoRecorderResponse;
import com.comcast.cats.info.VideoRecorderServiceConstants;
import com.comcast.cats.info.VideoRecorderState;
import com.comcast.cats.provider.exceptions.VideoRecorderException;
import com.comcast.cats.service.WebServiceReturnEnum;
import com.comcast.cats.service.util.HttpClientUtil;

/**
 * REST implementation of {@link RecorderProvider}.
 * 
 * @author sajayjk
 * 
 */
public class VideoRecorderRESTProviderImpl implements RecorderProvider {
    private static final long serialVersionUID = -8068245325619415851L;
    String videoHostIp;
    int videoPort;
    String serverHost;
    String macID;
    private Object parent;

    private static Logger logger = Logger.getLogger(VideoRecorderRESTProviderImpl.class);

    public VideoRecorderRESTProviderImpl(String videoHostIp, int videoPort, String serverHost, String macID) {
        this.videoHostIp = videoHostIp;
        this.videoPort = videoPort;
        this.serverHost = serverHost;
        this.macID = macID;
    }

    @Override
    public Object getParent() {
        return parent;
    }

    public void setParent(Object parent) {
        this.parent = parent;
    }

    @Override
    public boolean startVideoRecording(String recordingAliasName) throws VideoRecorderException {
        return execute(recordingAliasName, VideoRecorderServiceConstants.REST_REQUEST_SUBMIT);
    }

    @Override
    public boolean startVideoRecording() throws VideoRecorderException {
        return execute(null, VideoRecorderServiceConstants.REST_REQUEST_SUBMIT);
    }

    @Override
    public boolean stopVideoRecording() throws VideoRecorderException {
        return execute(null, VideoRecorderServiceConstants.REST_REQUEST_STOP);
    }

    private boolean execute(String recordingGroupNameAlias, String requestURI) throws VideoRecorderException {
        boolean retVal = false;
        VideoRecorderResponse response = null;
        if (videoHostIp != null && !videoHostIp.isEmpty() && videoPort >= 0 && requestURI != null
                && !requestURI.isEmpty() && macID != null && !macID.isEmpty() && serverHost != null
                && !serverHost.isEmpty()) {
            try {
                response = (VideoRecorderResponse) HttpClientUtil.postForObject(getRequestUri(requestURI),
                        getParamMap(macID, videoHostIp, videoPort, recordingGroupNameAlias));
                logger.debug("webServiceReturn " + response);
            } catch (ClassCastException e) {
                logger.debug("RecorderServer not a valid one. " + " hostServer " + serverHost + " error : "
                        + e.getMessage());
            }

            if (response == null || response.getResult() == WebServiceReturnEnum.FAILURE
                    || (response.getRecording() != null && response.getRecording().getRecordingStatus() != null
                            && (response.getRecording().getRecordingStatus().getState()
                                    .equalsIgnoreCase(VideoRecorderState.ERROR.name())
                                    || response.getRecording().getRecordingStatus().getState()
                                            .equalsIgnoreCase(VideoRecorderState.FORCE_CLOSE.name())))) {
                retVal = false;
            } else {
                retVal = true;
            }
        } else {
            throw new VideoRecorderException("Provider not instantiated properly");
        }
        logger.trace("execute:  videoHostIp " + videoHostIp + " videoPort " + videoPort + " requestURI "
                + requestURI + " response " + response);

        return retVal;
    }

    @Override
    public String getRecordingInfo() throws VideoRecorderException {
        String retVal = "Status could not be retrieved";
        VideoRecorderResponse response = null;
        if (videoHostIp != null && !videoHostIp.isEmpty() && videoPort >= 0 && macID != null && !macID.isEmpty()
                && serverHost != null && !serverHost.isEmpty()) {
            try {
                response = (VideoRecorderResponse) HttpClientUtil.getForObject(
                        getRequestUri(VideoRecorderServiceConstants.REST_REQUEST_STATUS),
                        getParamMap(macID, videoHostIp, videoPort));
            } catch (ClassCastException e) {
                logger.debug("RecorderServer not a valid one. " + " hostServer " + serverHost + " error : "
                        + e.getMessage());
            }

            if (response == null || response.getResult() == WebServiceReturnEnum.FAILURE) {
                String message = (response == null) ? "Error Recording: Cause Unknown" : response.getMessage();
                throw new VideoRecorderException(message);
            } else {
                StringBuilder stringBuilder = new StringBuilder();
                if (response.getRecording() != null) {
                    stringBuilder.append("\n");
                    stringBuilder.append("MAC Address           : " + response.getRecording().getStbMacAddress());
                    stringBuilder.append("\n");
                    stringBuilder.append("Created Time          : " + response.getRecording().getCreatedTime());
                    stringBuilder.append("\n");
                    stringBuilder.append("VideoServerIP         : " + response.getRecording().getVideoServerIp());
                    stringBuilder.append("\n");
                    stringBuilder.append("VideoServer Camera    : " + response.getRecording().getVideoServerPort());
                    stringBuilder.append("\n");
                    if (response.getRecording().getRecordingStatus() != null) {
                        stringBuilder.append("Recording State       : "
                                + response.getRecording().getRecordingStatus().getState());
                        stringBuilder.append("\n");
                        stringBuilder.append("Status Message        : "
                                + response.getRecording().getRecordingStatus().getMessage());
                        stringBuilder.append("\n");
                    }
                    if (response.getRecording().getMediaInfoEntityList() != null
                            && response.getRecording().getMediaInfoEntityList().size() > 0) {
                        String filePath = substituteFilePath(
                                response.getRecording().getMediaInfoEntityList().get(0).getHttpPath());
                        stringBuilder.append("Http Path             : " + filePath);
                        stringBuilder.append("\n");
                    }
                }

                retVal = stringBuilder.toString();
            }
        } else {
            throw new VideoRecorderException("Provider not instantiated properly");
        }

        return retVal;
    }

    private Map<String, String> getParamMap(String macID, String videoServerIp, Integer port, String aliasName) {
        Map<String, String> paramMap = getParamMap(macID, videoServerIp, port);
        if (aliasName != null) {
            paramMap.put("alias", String.valueOf(aliasName));
        }
        return paramMap;
    }

    private Map<String, String> getParamMap(String macId, String videoServerIp, Integer port) {
        Map<String, String> paramMap = getParamMap(macId);
        paramMap.put("videoServerIp", videoServerIp);
        paramMap.put("port", String.valueOf(port));
        return paramMap;
    }

    private Map<String, String> getParamMap(String macId) {
        Map<String, String> paramMap = new HashMap<String, String>();
        paramMap.put("macId", macId);
        return paramMap;
    }

    private String getRequestUri(String restRequest) {
        String requestUri = "http://" + serverHost + VideoRecorderServiceConstants.REST_REQUEST_EXTERNAL_PATH
                + restRequest;

        return requestUri;
    }

    private String substituteFilePath(String filePath) {
        String retVal = filePath;
        try {
            URL filePathURL = new URL(filePath);
            String host = filePathURL.getHost();
            retVal = StringUtils.replaceOnce(filePath, host, serverHost);
        } catch (MalformedURLException e) {
            logger.debug("Provider doesnt know how to parse this syntax");
        }
        return retVal;
    }
}