| /* |
| * Copyright 2000-2009 JetBrains s.r.o. |
| * |
| * 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. |
| */ |
| |
| /* |
| * Created by IntelliJ IDEA. |
| * User: max |
| * Date: Oct 22, 2006 |
| * Time: 9:49:16 PM |
| */ |
| package com.intellij.util.messages; |
| |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| |
| /** |
| * Defines messaging endpoint within particular {@link MessageBus bus}. |
| * |
| * @param <L> type of the interface that defines contract for working with the particular topic instance |
| */ |
| public class Topic<L> { |
| private final String myDisplayName; |
| private final Class<L> myListenerClass; |
| private final BroadcastDirection myBroadcastDirection; |
| |
| public Topic(@NonNls @NotNull String displayName, @NotNull Class<L> listenerClass) { |
| this(displayName, listenerClass, BroadcastDirection.TO_CHILDREN); |
| } |
| |
| public Topic(@NonNls @NotNull String displayName, @NotNull Class<L> listenerClass, final BroadcastDirection broadcastDirection) { |
| myDisplayName = displayName; |
| myListenerClass = listenerClass; |
| myBroadcastDirection = broadcastDirection; |
| } |
| |
| /** |
| * @return human-readable name of the current topic. Is intended to be used in informational/logging purposes only |
| */ |
| @NotNull |
| @NonNls |
| public String getDisplayName() { |
| return myDisplayName; |
| } |
| |
| /** |
| * Allows to retrieve class that defines contract for working with the current topic. Either publishers or subscribers use it: |
| * <ul> |
| * <li> |
| * publisher {@link MessageBus#syncPublisher(Topic) receives} object that IS-A target interface from the messaging infrastructure. |
| * It calls target method with the target arguments on it then (method of the interface returned by the current method); |
| * </li> |
| * <li> |
| * the same method is called on handlers of all {@link MessageBusConnection#subscribe(Topic, Object) subscribers} that |
| * should receive the message; |
| * </li> |
| * </ul> |
| * |
| * @return class of the interface that defines contract for working with the current topic |
| */ |
| @NotNull |
| public Class<L> getListenerClass() { |
| return myListenerClass; |
| } |
| |
| public String toString() { |
| return myDisplayName; |
| } |
| |
| public static <L> Topic<L> create(@NonNls @NotNull String displayName, @NotNull Class<L> listenerClass) { |
| return new Topic<L>(displayName, listenerClass); |
| } |
| |
| public static <L> Topic<L> create(@NonNls @NotNull String displayName, @NotNull Class<L> listenerClass, BroadcastDirection direction) { |
| return new Topic<L>(displayName, listenerClass, direction); |
| } |
| |
| /** |
| * @return broadcasting strategy configured for the current topic. Default value is {@link BroadcastDirection#TO_CHILDREN} |
| * @see BroadcastDirection |
| */ |
| public BroadcastDirection getBroadcastDirection() { |
| return myBroadcastDirection; |
| } |
| |
| /** |
| * {@link MessageBus Message buses} may be organised into {@link MessageBus#getParent() hierarchies}. That allows to provide |
| * additional messaging features like <code>'broadcasting'</code>. Here it means that messages sent to particular topic within |
| * particular message bus may be dispatched to subscribers of the same topic within another message buses. |
| * <p/> |
| * Current enum holds available broadcasting options. |
| */ |
| public enum BroadcastDirection { |
| |
| /** |
| * The message is dispatched to all subscribers of the target topic registered within the child message buses. |
| * <p/> |
| * Example: |
| * <pre> |
| * parent-bus <--- topic1 |
| * / \ |
| * / \ |
| * topic1 ---> child-bus1 child-bus2 <--- topic1 |
| * </pre> |
| * <p/> |
| * Here subscribers of the <code>'topic1'</code> registered within the <code>'child-bus1'</code> and <code>'child-bus2'</code> |
| * will receive the message sent to the <code>'topic1'</code> topic at the <code>'parent-bus'</code>. |
| */ |
| TO_CHILDREN, |
| |
| /** |
| * No broadcasting is performed for the |
| */ |
| NONE, |
| |
| /** |
| * The message send to particular topic at particular bus is dispatched to all subscribers of the same topic within the parent bus. |
| * <p/> |
| * Example: |
| * <pre> |
| * parent-bus <--- topic1 |
| * | |
| * child-bus <--- topic1 |
| * </pre> |
| * <p/> |
| * Here subscribers of the <code>topic1</code> registered within <code>'parent-bus'</code> will receive messages posted |
| * to the same topic within <code>'child-bus'</code>. |
| */ |
| TO_PARENT |
| } |
| } |