// Path: device-node/src/main/java/com/github/cosysoft/device/node/domain/Result.java
// public class Result<T> {
// 
//     private int code = 0; //0 is success
//     private String message;
//     private T payload;
// 
//     public int getCode() {
//         return code;
//     }
// 
//     public void setCode(int code) {
//         this.code = code;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public void setMessage(String message) {
//         this.message = message;
//     }
// 
// 
//     public T getPayload() {
//         return payload;
//     }
// 
//     public void setPayload(T payload) {
//         this.payload = payload;
//     }
// 
//     @Override
//     public String toString() {
//         return "Result{" +
//                 "code=" + code +
//                 ", message='" + message + '\'' +
//                 ", payload=" + payload +
//                 '}';
//     }
// }
// 
// Path: device-node/src/main/java/com/github/cosysoft/device/node/service/DeviceService.java
// @Service
// public class DeviceService {
// 
//     private DeviceStore deviceStore = AndroidDeviceStore.getInstance();
// 
//     @Autowired
//     NodeService nodeService;
// 
//     @Cacheable(value = "avatars")
//     public byte[] getAvatar(String serialId) {
//         AndroidDevice device = deviceStore.getDeviceBySerial(serialId);
//         BufferedImage image = device.takeScreenshot();
//         return ImageUtils.toByteArray(image);
//     }
// 
//     public byte[] takeScreenShot(String serialId) {
//         AndroidDevice device = deviceStore.getDeviceBySerial(serialId);
//         BufferedImage image = device.takeScreenshot();
//         return ImageUtils.toByteArray(image);
//     }
// 
//     public List<Device> getDevices() {
//         List<Device> devices = new ArrayList<>();
//         for (AndroidDevice device : deviceStore.getDevices()) {
//             Device deviceExtInfo = new Device();
//             DeviceInfo deviceInfo = device.getDeviceInfo();
//             BeanUtils.copyProperties(deviceInfo, deviceExtInfo);
//             deviceExtInfo.setNodeIP(nodeService.getIp());
//             deviceExtInfo.setNodePort(nodeService.getPort());
// 
//             devices.add(deviceExtInfo);
//         }
//         return devices;
//     }
// 
//     public Result<String> runAdbCommand(String serialId, String cmd) {
//         Result<String> result = new Result<>();
//         AndroidDevice device = deviceStore.getDeviceBySerial(serialId);
//         String out = device.runAdbCommand(cmd);
//         result.setPayload(out);
//         return result;
//     }
// }
// 
// Path: device-node/src/main/java/com/github/cosysoft/device/node/domain/Device.java
// public class Device extends DeviceInfo {
// 
//     private String nodeIP;
//     private int nodePort;
//     private Date lastRegisterDate = new Date();
// 
// 
//     public String getNodeIP() {
//         return nodeIP;
//     }
// 
//     public void setNodeIP(String nodeIP) {
//         this.nodeIP = nodeIP;
//     }
// 
//     public int getNodePort() {
//         return nodePort;
//     }
// 
//     public void setNodePort(int nodePort) {
//         this.nodePort = nodePort;
//     }
// 
//     public Date getLastRegisterDate() {
//         return lastRegisterDate;
//     }
// 
//     public void setLastRegisterDate(Date lastRegisterDate) {
//         this.lastRegisterDate = lastRegisterDate;
//     }
// 
//     public String getAvatarUri() {
//         return "hub/device/" + this.getDid() + "/avatar";
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         if (!super.equals(o)) return false;
// 
//         Device device = (Device) o;
// 
//         return getNodeIP().equals(device.getNodeIP());
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = super.hashCode();
//         result = 31 * result + getNodeIP().hashCode();
//         return result;
//     }
// 
//     public String getDid() {
//         return this.getSerial() + "@" + this.getNodeIP();
//     }
// }


import com.github.cosysoft.device.node.domain.Result;
import com.github.cosysoft.device.node.service.DeviceService;
import com.github.cosysoft.device.node.domain.Device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collection;
package com.github.cosysoft.device.node.controller;



/**
 * Created by 兰天 on 2015/4/8.
 */
@RestController
@RequestMapping("/api/device")
public class DeviceController {

    @Autowired
    DeviceService deviceService;

    @RequestMapping
    public Collection<Device> devices() {
        return deviceService.getDevices();
    }

    @RequestMapping(value = "/{serialId}/avatar", produces = MediaType.IMAGE_PNG_VALUE)
    public byte[] avatar(@PathVariable String serialId) {
// Path: device-node/src/main/java/com/github/cosysoft/device/node/domain/Result.java
// public class Result<T> {
// 
//     private int code = 0; //0 is success
//     private String message;
//     private T payload;
// 
//     public int getCode() {
//         return code;
//     }
// 
//     public void setCode(int code) {
//         this.code = code;
//     }
// 
//     public String getMessage() {
//         return message;
//     }
// 
//     public void setMessage(String message) {
//         this.message = message;
//     }
// 
// 
//     public T getPayload() {
//         return payload;
//     }
// 
//     public void setPayload(T payload) {
//         this.payload = payload;
//     }
// 
//     @Override
//     public String toString() {
//         return "Result{" +
//                 "code=" + code +
//                 ", message='" + message + '\'' +
//                 ", payload=" + payload +
//                 '}';
//     }
// }
// 
// Path: device-node/src/main/java/com/github/cosysoft/device/node/service/DeviceService.java
// @Service
// public class DeviceService {
// 
//     private DeviceStore deviceStore = AndroidDeviceStore.getInstance();
// 
//     @Autowired
//     NodeService nodeService;
// 
//     @Cacheable(value = "avatars")
//     public byte[] getAvatar(String serialId) {
//         AndroidDevice device = deviceStore.getDeviceBySerial(serialId);
//         BufferedImage image = device.takeScreenshot();
//         return ImageUtils.toByteArray(image);
//     }
// 
//     public byte[] takeScreenShot(String serialId) {
//         AndroidDevice device = deviceStore.getDeviceBySerial(serialId);
//         BufferedImage image = device.takeScreenshot();
//         return ImageUtils.toByteArray(image);
//     }
// 
//     public List<Device> getDevices() {
//         List<Device> devices = new ArrayList<>();
//         for (AndroidDevice device : deviceStore.getDevices()) {
//             Device deviceExtInfo = new Device();
//             DeviceInfo deviceInfo = device.getDeviceInfo();
//             BeanUtils.copyProperties(deviceInfo, deviceExtInfo);
//             deviceExtInfo.setNodeIP(nodeService.getIp());
//             deviceExtInfo.setNodePort(nodeService.getPort());
// 
//             devices.add(deviceExtInfo);
//         }
//         return devices;
//     }
// 
//     public Result<String> runAdbCommand(String serialId, String cmd) {
//         Result<String> result = new Result<>();
//         AndroidDevice device = deviceStore.getDeviceBySerial(serialId);
//         String out = device.runAdbCommand(cmd);
//         result.setPayload(out);
//         return result;
//     }
// }
// 
// Path: device-node/src/main/java/com/github/cosysoft/device/node/domain/Device.java
// public class Device extends DeviceInfo {
// 
//     private String nodeIP;
//     private int nodePort;
//     private Date lastRegisterDate = new Date();
// 
// 
//     public String getNodeIP() {
//         return nodeIP;
//     }
// 
//     public void setNodeIP(String nodeIP) {
//         this.nodeIP = nodeIP;
//     }
// 
//     public int getNodePort() {
//         return nodePort;
//     }
// 
//     public void setNodePort(int nodePort) {
//         this.nodePort = nodePort;
//     }
// 
//     public Date getLastRegisterDate() {
//         return lastRegisterDate;
//     }
// 
//     public void setLastRegisterDate(Date lastRegisterDate) {
//         this.lastRegisterDate = lastRegisterDate;
//     }
// 
//     public String getAvatarUri() {
//         return "hub/device/" + this.getDid() + "/avatar";
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         if (!super.equals(o)) return false;
// 
//         Device device = (Device) o;
// 
//         return getNodeIP().equals(device.getNodeIP());
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = super.hashCode();
//         result = 31 * result + getNodeIP().hashCode();
//         return result;
//     }
// 
//     public String getDid() {
//         return this.getSerial() + "@" + this.getNodeIP();
//     }
// }


// Path: device-node/src/main/java/com/github/cosysoft/device/node/controller/DeviceController.java
import com.github.cosysoft.device.node.domain.Result;
import com.github.cosysoft.device.node.service.DeviceService;
import com.github.cosysoft.device.node.domain.Device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collection;

package com.github.cosysoft.device.node.controller;



/**
 * Created by 兰天 on 2015/4/8.
 */
@RestController
@RequestMapping("/api/device")
public class DeviceController {

    @Autowired
    DeviceService deviceService;

    @RequestMapping
    public Collection<Device> devices() {
        return deviceService.getDevices();
    }

    @RequestMapping(value = "/{serialId}/avatar", produces = MediaType.IMAGE_PNG_VALUE)
    public byte[] avatar(@PathVariable String serialId) {
        return deviceService.getAvatar(serialId);