/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.activemq.artemis.core.protocol.mqtt;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.activemq.artemis.core.config.WildcardConfiguration;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
import org.apache.activemq.artemis.spi.core.protocol.SessionCallback;
public class MQTTSession {
static Map<String, MQTTSessionState> SESSIONS = new ConcurrentHashMap<>();
private final String id = UUID.randomUUID().toString();
private MQTTProtocolHandler protocolHandler;
private MQTTSubscriptionManager subscriptionManager;
private MQTTSessionCallback sessionCallback;
private ServerSessionImpl serverSession;
private MQTTPublishManager mqttPublishManager;
private MQTTConnectionManager mqttConnectionManager;
private MQTTRetainMessageManager retainMessageManager;
private MQTTConnection connection;
protected MQTTSessionState state;
private boolean stopped = false;
private MQTTLogger log = MQTTLogger.LOGGER;
private MQTTProtocolManager protocolManager;
private boolean isClean;
private WildcardConfiguration wildcardConfiguration;
public MQTTSession(MQTTProtocolHandler protocolHandler,
MQTTConnection connection,
MQTTProtocolManager protocolManager,
WildcardConfiguration wildcardConfiguration) throws Exception {
this.protocolHandler = protocolHandler;
this.protocolManager = protocolManager;
this.wildcardConfiguration = wildcardConfiguration;
this.connection = connection;
mqttConnectionManager = new MQTTConnectionManager(this);
mqttPublishManager = new MQTTPublishManager(this);
sessionCallback = new MQTTSessionCallback(this, connection);
subscriptionManager = new MQTTSubscriptionManager(this);
retainMessageManager = new MQTTRetainMessageManager(this);
log.debug("SESSION CREATED: " + id);
}
// Called after the client has Connected.
synchronized void start() throws Exception {
mqttPublishManager.start();
subscriptionManager.start();
stopped = false;
}
// TODO ensure resources are cleaned up for GC.
synchronized void stop() throws Exception {
if (!stopped) {
protocolHandler.stop(false);
subscriptionManager.stop();
mqttPublishManager.stop();
if (serverSession != null) {
serverSession.stop();
serverSession.close(false);
}
if (state != null) {
state.setAttached(false);
}
if (isClean()) {
clean();
}
}
stopped = true;
}
boolean getStopped() {
return stopped;
}
boolean isClean() {
return isClean;
}
void setIsClean(boolean isClean) throws Exception {
this.isClean = isClean;
if (isClean) {
clean();
}
}
MQTTPublishManager getMqttPublishManager() {
return mqttPublishManager;
}
MQTTSessionState getState() {
return state;
}
MQTTConnectionManager getConnectionManager() {
return mqttConnectionManager;
}
MQTTSessionState getSessionState() {
return state;
}
ServerSessionImpl getServerSession() {
return serverSession;
}
ActiveMQServer getServer() {
return protocolHandler.getServer();
}
MQTTSubscriptionManager getSubscriptionManager() {
return subscriptionManager;
}
MQTTProtocolHandler getProtocolHandler() {
return protocolHandler;
}
SessionCallback getSessionCallback() {
return sessionCallback;
}
void setServerSession(ServerSessionImpl serverSession) {
this.serverSession = serverSession;
}
void setSessionState(MQTTSessionState state) {
this.state = state;
state.setAttached(true);
}
MQTTRetainMessageManager getRetainMessageManager() {
return retainMessageManager;
}
MQTTConnection getConnection() {
return connection;
}
MQTTProtocolManager getProtocolManager() {
return protocolManager;
}
void clean() throws Exception {
subscriptionManager.clean();
mqttPublishManager.clean();
state.clear();
}
public WildcardConfiguration getWildcardConfiguration() {
return wildcardConfiguration;
}
public void setWildcardConfiguration(WildcardConfiguration wildcardConfiguration) {
this.wildcardConfiguration = wildcardConfiguration;
}
}