All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.dddspring.common.port.adapter.messaging.slothmq.SlothServer Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
//   Copyright 2012,2013 Vaughn Vernon
//
//   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 io.dddspring.common.port.adapter.messaging.slothmq;

import java.util.HashMap;
import java.util.Map;

/**
 * I am a simple messaging server.
 *
 * @author Vaughn Vernon
 */
public class SlothServer extends SlothWorker {

	private Map clientRegistrations;

	public static void executeInProcessDetachedServer() {
		Thread serverThread = new Thread() {
			@Override
			public void run() {
				SlothServer.executeNewServer();
			}
		};

		serverThread.start();
	}

	public static void executeNewServer() {
		SlothServer slothServer = new SlothServer();

		slothServer.execute();
	}

	public static void main(String anArguments[]) throws Exception {
		SlothServer.executeNewServer();
	}

	public SlothServer() {
		super();

		this.clientRegistrations = new HashMap();
	}

	public void execute() {

		while (!this.isClosed()) {
		    String receivedData = this.receive();

		    if (receivedData != null) {
		        this.handleMessage(receivedData);
		    }
		}
	}

	@Override
	protected boolean slothHub() {
	    return true;
	}

	private ClientRegistration attach(String aReceivedData) {
		int port = Integer.parseInt(aReceivedData.substring(7));

		return this.attach(port);
	}

    private ClientRegistration attach(int aPort) {
        ClientRegistration clientRegistration = this.clientRegistrations.get(aPort);

        if (clientRegistration == null) {
            clientRegistration = new ClientRegistration(aPort);
            this.clientRegistrations.put(aPort, clientRegistration);
        }

        return clientRegistration;
    }

	private void handleMessage(String aReceivedData) {
		System.out.println("SLOTH SERVER: Handling: " + aReceivedData);

		if (aReceivedData.startsWith("ATTACH:")) {
			this.attach(aReceivedData);
		} else if (aReceivedData.startsWith("CLOSE:")) {
			this.close();
		} else if (aReceivedData.startsWith("PUBLISH:")) {
			this.publishToClients(aReceivedData);
		} else if (aReceivedData.startsWith("SUBSCRIBE:")) {
			this.subscribeClientTo(aReceivedData.substring(10));
		} else if (aReceivedData.startsWith("UNSUBSCRIBE:")) {
			this.unsubscribeClientFrom(aReceivedData.substring(12));
		} else {
			System.out.println("SLOTH SERVER: Does not understand: " + aReceivedData);
		}
	}

	private void publishToClients(String anExchangeMessage) {

		int exchangeDivider = anExchangeMessage.indexOf("PUBLISH:");
		int typeDivider = anExchangeMessage.indexOf("TYPE:", exchangeDivider + 8);

		if (exchangeDivider == -1) {
			System.out.println("SLOTH SERVER: PUBLISH: No exchange name; ignoring: " + anExchangeMessage);
		} else if (typeDivider == -1) {
			System.out.println("SLOTH SERVER: PUBLISH: No TYPE; ignoring: " + anExchangeMessage);
		} else {
			String exchangeName = anExchangeMessage.substring(exchangeDivider + 8, typeDivider);

			for (ClientRegistration clientSubscriptions : this.clientRegistrations.values()) {
				if (clientSubscriptions.isSubscribedTo(exchangeName)) {
					this.sendTo(clientSubscriptions.port(), anExchangeMessage);
				}
			}
		}
	}

	private void subscribeClientTo(String aPortWithExchangeName) {
	    String[] parts = aPortWithExchangeName.split(":");
		int port = Integer.parseInt(parts[0]);
		String exchangeName = parts[1];

		ClientRegistration clientRegistration = this.clientRegistrations.get(port);

		if (clientRegistration == null) {
			clientRegistration = this.attach(port);
		}

		clientRegistration.addSubscription(exchangeName);

		System.out.println("SLOTH SERVER: Subscribed: " + clientRegistration + " TO: " + exchangeName);
	}

	private void unsubscribeClientFrom(String aPortWithExchangeName) {
        String[] parts = aPortWithExchangeName.split(":");
        int port = Integer.parseInt(parts[0]);
        String exchangeName = parts[1];

		ClientRegistration clientRegistration = this.clientRegistrations.get(port);

		if (clientRegistration != null) {
			clientRegistration.removeSubscription(exchangeName);

			System.out.println("SLOTH SERVER: Unsubscribed: " + clientRegistration + " FROM: " + exchangeName);
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy