/*
* Copyright 2017 OmniFaces
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package org.omnifaces.cdi.push;
import static java.lang.String.format;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.io.Serializable;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.Objects;
import javax.enterprise.event.Observes;
import javax.inject.Qualifier;
import javax.websocket.CloseReason.CloseCode;
/**
* <p>
* This web socket event will be fired by {@link SocketSessionManager} when a new socket has been
* <code>@</code>{@link Opened} or <code>@</code>{@link Closed}. An application scoped CDI bean can
* <code>@</code>{@link Observes} them.
* <p>
* For detailed usage instructions, see {@link Socket} javadoc.
*
* @author Bauke Scholtz
* @see Socket
* @since 2.3
*/
public final class SocketEvent implements Serializable {
private static final long serialVersionUID = 1L;
private final String channel;
private final Serializable user;
private final CloseCode code;
SocketEvent(String channel, Serializable user, CloseCode code) {
this.channel = channel;
this.user = user;
this.code = code;
}
/**
* Returns the <code><o:socket channel></code>.
* @return The web socket channel name.
*/
public String getChannel() {
return channel;
}
/**
* Returns the <code><o:socket user></code>, if any.
* @param <S> The generic type of the user identifier.
* @return The web socket user identifier, if any.
* @throws ClassCastException When <code>S</code> is of wrong type.
*/
@SuppressWarnings("unchecked")
public <S extends Serializable> S getUser() {
return (S) user;
}
/**
* Returns the close code.
* If this returns <code>null</code>, then it was {@link Opened}.
* If this returns non-<code>null</code>, then it was {@link Closed}.
* @return The close code.
*/
public CloseCode getCloseCode() {
return code;
}
@Override
public int hashCode() {
return super.hashCode() + Objects.hash(channel, user, code);
}
@Override
public boolean equals(Object object) {
if (object == null || getClass() != object.getClass()) {
return false;
}
SocketEvent other = (SocketEvent) object;
return Objects.equals(channel, other.channel)
&& Objects.equals(user, other.user)
&& Objects.equals(code, other.code);
}
@Override
public String toString() {
return format("SocketEvent[channel=%s, user=%s, closeCode=%s]", channel, user, code);
}
/**
* <p>
* Indicates that a socket has opened.
* <p>
* For detailed usage instructions, see {@link Socket} javadoc.
*
* @author Bauke Scholtz
* @see Socket
* @since 2.3
*/
@Qualifier
@Target(PARAMETER)
@Retention(RUNTIME)
@Documented
public @interface Opened {
//
}
/**
* <p>
* Indicates that a socket has closed.
* <p>
* For detailed usage instructions, see {@link Socket} javadoc.
*
* @author Bauke Scholtz
* @see Socket
* @since 2.3
*/
@Qualifier
@Target(PARAMETER)
@Retention(RUNTIME)
@Documented
public @interface Closed {
//
}
}