// Path: src/main/java/io/hosuaby/restful/domain/Teapot.java
// @Document(collection = "teapots")
// public class Teapot {
// 
//     /** 0.3 L */
//     public static final float L0_3 = (float)  0.3;
// 
//     /** 0.5 L */
//     public static final float L0_5 = (float)  0.5;
// 
//     /** 1 L */
//     public static final float L1   = (float)  1.0;
// 
//     /** 1.5 L */
//     public static final float L1_5 = (float)  1.5;
// 
//     /** 3 L */
//     public static final float L3   = (float)  3.0;
// 
//     /** 5 L */
//     public static final float L5   = (float)  5.0;
// 
//     /** 8 L */
//     public static final float L8   = (float)  8.0;
// 
//     /** 10 L */
//     public static final float L10  = (float) 10.0;
// 
//     /** Id: valid id */
//     private String id;
// 
//     /** Name: any String */
//     private String name;
// 
//     /** Brand: any String */
//     private String brand;
// 
//     /** Volume: from defined values */
//     private float volume;
// 
//     /** Current IP address. Must be hidden from the web user */
//     private Inet4Address ip;
// 
//     public Teapot() {
//         super();
//     }
// 
//     public Teapot(String id, String name, String brand, float volume) {
//         super();
//         this.id = id;
//         this.name = name;
//         this.brand = brand;
//         this.volume = volume;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getBrand() {
//         return brand;
//     }
// 
//     public void setBrand(String brand) {
//         this.brand = brand;
//     }
// 
//     public float getVolume() {
//         return volume;
//     }
// 
//     public void setVolume(float volume) {
//         this.volume = volume;
//     }
// 
//     public Inet4Address getIp() {
//         return ip;
//     }
// 
//     public void setIp(Inet4Address ip) {
//         this.ip = ip;
//     }
// 
// }
// 
// Path: src/main/java/io/hosuaby/restful/domain/TeapotMessage.java
// public class TeapotMessage {
// 
//     /** Client id */
//     private String clientId;
// 
//     /** Message payload */
//     private String payload;
// 
//     public TeapotMessage() {
//         super();
//     }
// 
//     public TeapotMessage(String clientId, String payload) {
//         super();
//         this.clientId = clientId;
//         this.payload = payload;
//     }
// 
//     public String getClientId() {
//         return clientId;
//     }
// 
//     public void setClientId(String clientId) {
//         this.clientId = clientId;
//     }
// 
//     public String getPayload() {
//         return payload;
//     }
// 
//     public void setPayload(String payload) {
//         this.payload = payload;
//     }
// 
// }


import io.hosuaby.restful.domain.Teapot;
import io.hosuaby.restful.domain.TeapotMessage;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.websocket.ClientEndpointConfig;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.DeploymentException;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import com.fasterxml.jackson.databind.ObjectMapper;

    /**
     * Handler for incoming messages.
     */
    private static class TeapotSimulatorMessageHandler
            implements MessageHandler.Whole<String> {

        /** Teapot simulator object */
        private TeapotSimulator simulator;

        /** Websocket session */
        private Session session;

        /**
         * Constructor from simulator and websocket session.
         *
         * @param simulator    simulator object
         * @param session      websocket object
         */
        public TeapotSimulatorMessageHandler(TeapotSimulator simulator,
                Session session) {
            this.simulator = simulator;
            this.session = session;
        }

        /**
         * Handler for incoming messages.
         */
        @Override
        public void onMessage(String message) {
// Path: src/main/java/io/hosuaby/restful/domain/Teapot.java
// @Document(collection = "teapots")
// public class Teapot {
// 
//     /** 0.3 L */
//     public static final float L0_3 = (float)  0.3;
// 
//     /** 0.5 L */
//     public static final float L0_5 = (float)  0.5;
// 
//     /** 1 L */
//     public static final float L1   = (float)  1.0;
// 
//     /** 1.5 L */
//     public static final float L1_5 = (float)  1.5;
// 
//     /** 3 L */
//     public static final float L3   = (float)  3.0;
// 
//     /** 5 L */
//     public static final float L5   = (float)  5.0;
// 
//     /** 8 L */
//     public static final float L8   = (float)  8.0;
// 
//     /** 10 L */
//     public static final float L10  = (float) 10.0;
// 
//     /** Id: valid id */
//     private String id;
// 
//     /** Name: any String */
//     private String name;
// 
//     /** Brand: any String */
//     private String brand;
// 
//     /** Volume: from defined values */
//     private float volume;
// 
//     /** Current IP address. Must be hidden from the web user */
//     private Inet4Address ip;
// 
//     public Teapot() {
//         super();
//     }
// 
//     public Teapot(String id, String name, String brand, float volume) {
//         super();
//         this.id = id;
//         this.name = name;
//         this.brand = brand;
//         this.volume = volume;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getBrand() {
//         return brand;
//     }
// 
//     public void setBrand(String brand) {
//         this.brand = brand;
//     }
// 
//     public float getVolume() {
//         return volume;
//     }
// 
//     public void setVolume(float volume) {
//         this.volume = volume;
//     }
// 
//     public Inet4Address getIp() {
//         return ip;
//     }
// 
//     public void setIp(Inet4Address ip) {
//         this.ip = ip;
//     }
// 
// }
// 
// Path: src/main/java/io/hosuaby/restful/domain/TeapotMessage.java
// public class TeapotMessage {
// 
//     /** Client id */
//     private String clientId;
// 
//     /** Message payload */
//     private String payload;
// 
//     public TeapotMessage() {
//         super();
//     }
// 
//     public TeapotMessage(String clientId, String payload) {
//         super();
//         this.clientId = clientId;
//         this.payload = payload;
//     }
// 
//     public String getClientId() {
//         return clientId;
//     }
// 
//     public void setClientId(String clientId) {
//         this.clientId = clientId;
//     }
// 
//     public String getPayload() {
//         return payload;
//     }
// 
//     public void setPayload(String payload) {
//         this.payload = payload;
//     }
// 
// }


// Path: src/main/java/io/hosuaby/restful/simulators/TeapotSimulator.java
import io.hosuaby.restful.domain.Teapot;
import io.hosuaby.restful.domain.TeapotMessage;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.websocket.ClientEndpointConfig;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.DeploymentException;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
import com.fasterxml.jackson.databind.ObjectMapper;


    /**
     * Handler for incoming messages.
     */
    private static class TeapotSimulatorMessageHandler
            implements MessageHandler.Whole<String> {

        /** Teapot simulator object */
        private TeapotSimulator simulator;

        /** Websocket session */
        private Session session;

        /**
         * Constructor from simulator and websocket session.
         *
         * @param simulator    simulator object
         * @param session      websocket object
         */
        public TeapotSimulatorMessageHandler(TeapotSimulator simulator,
                Session session) {
            this.simulator = simulator;
            this.session = session;
        }

        /**
         * Handler for incoming messages.
         */
        @Override
        public void onMessage(String message) {
            TeapotMessage msg;