// Path: src/main/java/org/nextrtc/signalingserver/api/NextRTCEvents.java
// public enum NextRTCEvents {
//     SESSION_OPENED,
//     SESSION_CLOSED,
//     CONVERSATION_CREATED,
//     CONVERSATION_DESTROYED,
//     UNEXPECTED_SITUATION,
//     MEMBER_JOINED,
//     MEMBER_LEFT,
//     MEDIA_LOCAL_STREAM_REQUESTED,
//     MEDIA_LOCAL_STREAM_CREATED,
//     MEDIA_STREAMING,
//     TEXT,
//     MESSAGE;
// 
//     public NextRTCEvent basedOn(InternalMessage message, Conversation conversation) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .conversation(conversation)
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(EventContext.EventContextBuilder builder) {
//         return builder
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection, String reason) {
//         return EventContext.builder()
//                 .from(new InternalMember(connection))
//                 .type(this)
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .content(reason)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection) {
//         return EventContext.builder()
//                 .type(this)
//                 .from(new InternalMember(connection))
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(InternalMessage message) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .content(message.getContent())
//                 .conversation(message.getFrom().getConversation().orElse(null))
//                 .type(this)
//                 .build();
//     }
// 
//     private static class InternalMember implements NextRTCMember {
// 
//         private final Connection connection;
// 
//         InternalMember(Connection connection) {
//             this.connection = connection;
//         }
// 
//         @Override
//         public Connection getConnection() {
//             return connection;
//         }
// 
//         @Override
//         public String getId() {
//             if (connection == null) {
//                 return null;
//             }
//             return connection.getId();
//         }
// 
//         @Override
//         public String toString() {
//             return getId();
//         }
//     }
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/dto/NextRTCConversation.java
// public interface NextRTCConversation extends Closeable {
//     String getId();
// 
//     NextRTCMember getCreator();
// 
//     Set<NextRTCMember> getMembers();
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/dto/NextRTCEvent.java
// public interface NextRTCEvent {
// 
//     NextRTCEvents type();
// 
//     ZonedDateTime published();
// 
//     Optional<NextRTCMember> from();
// 
//     Optional<NextRTCMember> to();
// 
//     Optional<NextRTCConversation> conversation();
// 
//     Optional<SignalingException> exception();
// 
//     Map<String, String> custom();
// 
//     String content();
// 
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/dto/NextRTCMember.java
// public interface NextRTCMember {
//     default String getId() {
//         return getConnection().getId();
//     }
// 
//     Connection getConnection();
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/exception/SignalingException.java
// public class SignalingException extends RuntimeException {
// 
//     private static final long serialVersionUID = 4171073365651049929L;
// 
//     private String customMessage;
// 
//     public SignalingException(Exceptions exception) {
//         super(exception.name());
//     }
// 
//     public SignalingException(Exceptions exception, Throwable t) {
//         super(exception.name(), t);
//     }
// 
//     public SignalingException(Exceptions exception, String customMessage) {
//         super(exception.name());
//         this.customMessage = customMessage;
//     }
// 
// 
//     public String getCustomMessage() {
//         return StringUtils.defaultString(customMessage);
//     }
// 
//     public void throwException() {
//         throw this;
//     }
// 
//     @Override
//     public String toString() {
//         return format("Signaling Exception %s [%s]", getMessage(), getCustomMessage());
//     }
// 
// }


import com.google.common.collect.Maps;
import org.nextrtc.signalingserver.api.NextRTCEvents;
import org.nextrtc.signalingserver.api.dto.NextRTCConversation;
import org.nextrtc.signalingserver.api.dto.NextRTCEvent;
import org.nextrtc.signalingserver.api.dto.NextRTCMember;
import org.nextrtc.signalingserver.exception.SignalingException;
import java.time.ZonedDateTime;
import java.util.Map;
import java.util.Optional;
import static java.util.Collections.unmodifiableMap;
import static java.util.Optional.ofNullable;
import static org.apache.commons.lang3.StringUtils.defaultString;
package org.nextrtc.signalingserver.domain;




public class EventContext implements NextRTCEvent {

    private final NextRTCEvents type;
    private final ZonedDateTime published = ZonedDateTime.now();
    private final Map<String, String> custom = Maps.newHashMap();
    private final NextRTCMember from;
    private final NextRTCMember to;
// Path: src/main/java/org/nextrtc/signalingserver/api/NextRTCEvents.java
// public enum NextRTCEvents {
//     SESSION_OPENED,
//     SESSION_CLOSED,
//     CONVERSATION_CREATED,
//     CONVERSATION_DESTROYED,
//     UNEXPECTED_SITUATION,
//     MEMBER_JOINED,
//     MEMBER_LEFT,
//     MEDIA_LOCAL_STREAM_REQUESTED,
//     MEDIA_LOCAL_STREAM_CREATED,
//     MEDIA_STREAMING,
//     TEXT,
//     MESSAGE;
// 
//     public NextRTCEvent basedOn(InternalMessage message, Conversation conversation) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .conversation(conversation)
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(EventContext.EventContextBuilder builder) {
//         return builder
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection, String reason) {
//         return EventContext.builder()
//                 .from(new InternalMember(connection))
//                 .type(this)
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .content(reason)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection) {
//         return EventContext.builder()
//                 .type(this)
//                 .from(new InternalMember(connection))
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(InternalMessage message) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .content(message.getContent())
//                 .conversation(message.getFrom().getConversation().orElse(null))
//                 .type(this)
//                 .build();
//     }
// 
//     private static class InternalMember implements NextRTCMember {
// 
//         private final Connection connection;
// 
//         InternalMember(Connection connection) {
//             this.connection = connection;
//         }
// 
//         @Override
//         public Connection getConnection() {
//             return connection;
//         }
// 
//         @Override
//         public String getId() {
//             if (connection == null) {
//                 return null;
//             }
//             return connection.getId();
//         }
// 
//         @Override
//         public String toString() {
//             return getId();
//         }
//     }
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/dto/NextRTCConversation.java
// public interface NextRTCConversation extends Closeable {
//     String getId();
// 
//     NextRTCMember getCreator();
// 
//     Set<NextRTCMember> getMembers();
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/dto/NextRTCEvent.java
// public interface NextRTCEvent {
// 
//     NextRTCEvents type();
// 
//     ZonedDateTime published();
// 
//     Optional<NextRTCMember> from();
// 
//     Optional<NextRTCMember> to();
// 
//     Optional<NextRTCConversation> conversation();
// 
//     Optional<SignalingException> exception();
// 
//     Map<String, String> custom();
// 
//     String content();
// 
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/dto/NextRTCMember.java
// public interface NextRTCMember {
//     default String getId() {
//         return getConnection().getId();
//     }
// 
//     Connection getConnection();
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/exception/SignalingException.java
// public class SignalingException extends RuntimeException {
// 
//     private static final long serialVersionUID = 4171073365651049929L;
// 
//     private String customMessage;
// 
//     public SignalingException(Exceptions exception) {
//         super(exception.name());
//     }
// 
//     public SignalingException(Exceptions exception, Throwable t) {
//         super(exception.name(), t);
//     }
// 
//     public SignalingException(Exceptions exception, String customMessage) {
//         super(exception.name());
//         this.customMessage = customMessage;
//     }
// 
// 
//     public String getCustomMessage() {
//         return StringUtils.defaultString(customMessage);
//     }
// 
//     public void throwException() {
//         throw this;
//     }
// 
//     @Override
//     public String toString() {
//         return format("Signaling Exception %s [%s]", getMessage(), getCustomMessage());
//     }
// 
// }


// Path: src/main/java/org/nextrtc/signalingserver/domain/EventContext.java
import com.google.common.collect.Maps;
import org.nextrtc.signalingserver.api.NextRTCEvents;
import org.nextrtc.signalingserver.api.dto.NextRTCConversation;
import org.nextrtc.signalingserver.api.dto.NextRTCEvent;
import org.nextrtc.signalingserver.api.dto.NextRTCMember;
import org.nextrtc.signalingserver.exception.SignalingException;
import java.time.ZonedDateTime;
import java.util.Map;
import java.util.Optional;
import static java.util.Collections.unmodifiableMap;
import static java.util.Optional.ofNullable;
import static org.apache.commons.lang3.StringUtils.defaultString;

package org.nextrtc.signalingserver.domain;




public class EventContext implements NextRTCEvent {

    private final NextRTCEvents type;
    private final ZonedDateTime published = ZonedDateTime.now();
    private final Map<String, String> custom = Maps.newHashMap();
    private final NextRTCMember from;
    private final NextRTCMember to;
    private final NextRTCConversation conversation;