/* * Copyright 2002-2011 the original author or authors. * * 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.springframework.flex.messaging; import org.springframework.flex.core.AbstractDestinationFactory; import org.springframework.flex.core.MessageBrokerFactoryBean; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import flex.messaging.Destination; import flex.messaging.MessageBroker; import flex.messaging.MessageDestination; import flex.messaging.config.ConfigMap; import flex.messaging.services.MessageService; import flex.messaging.services.Service; /** * A factory for Flex MessageDestinations that can be configured with a Spring-managed MessagingAdapter instance. * * <p> * The destination will be exposed to the Flex client as a BlazeDS {@link MessageDestination}. By default, the id of the * destination will be the same as the bean name of this factory. This may be overridden using the * {@link #setDestinationId(String) 'destinationId'} property. * </p> * * @see MessageBrokerFactoryBean * * @author Mark Fisher * @author Jeremy Grelle */ public class MessageDestinationFactory extends AbstractDestinationFactory { private final ConfigMap properties; /** * Creates a new MessageDestinationFactory */ public MessageDestinationFactory() { this.properties = new ConfigMap(); } /** * Creates a new MessageDestinationFactory with the specified properties {@link ConfigMap} * * @param properties the properties map for the destination */ public MessageDestinationFactory(ConfigMap properties) { this.properties = properties; } /** * Returns the properties {@link ConfigMap} for the destination * * @return the properties map */ public ConfigMap getProperties() { return this.properties; } public void setAllowSubtopics(String allow) { getServerMap().addProperty("allow-subtopics", allow); } public void setClusterMessageRouting(String routingType) { getServerMap().addProperty("cluster-message-routing", routingType); } public void setClusterRef(String clusterRef) { getClusterMap().addProperty("ref", clusterRef); } public void setDisallowWildcardSubtopics(String disallow) { getServerMap().addProperty("disallow-wildcard-subtopics", disallow); } public void setMessageTimeToLive(String timeToLive) { getServerMap().addProperty("message-time-to-live", timeToLive); } public void setSendSecurityConstraint(String constraint) { ConfigMap constraintMap = new ConfigMap(); constraintMap.addProperty("ref", constraint); getServerMap().addProperty("send-security-constraint", constraintMap); } public void setSubscribeSecurityConstraint(String constraint) { ConfigMap constraintMap = new ConfigMap(); constraintMap.addProperty("ref", constraint); getServerMap().addProperty("subscribe-security-constraint", constraintMap); } public void setSubscriptionTimeoutMinutes(String timeout) { getNetworkMap().addProperty("subscription-timeout-minutes", timeout); } public void setSubtopicSeparator(String separator) { getServerMap().addProperty("subtopic-separator", separator); } public void setThrottleInboundMaxFrequency(String maxFrequency) { getThrottleInboundMap().addProperty("max-frequency", maxFrequency); } public void setThrottleInboundPolicy(String policy) { getThrottleInboundMap().addProperty("policy", policy); } public void setThrottleOutboundMaxFrequency(String maxFrequency) { getThrottleOutboundMap().addProperty("max-frequency", maxFrequency); } public void setThrottleOutboundPolicy(String policy) { getThrottleOutboundMap().addProperty("policy", policy); } /** * * {@inheritDoc} */ @Override protected Destination createDestination(String destinationId, MessageBroker broker) throws Exception { MessageService messageService = (MessageService) broker.getServiceByType(MessageService.class.getName()); Assert.notNull(messageService, "Could not find a proper MessageService in the Flex MessageBroker."); MessageDestination destination = (MessageDestination) messageService.createDestination(destinationId); return destination; } /** * * {@inheritDoc} */ @Override protected void destroyDestination(String destinationId, MessageBroker broker) { MessageService messageService = (MessageService) broker.getServiceByType(MessageService.class.getName()); if (messageService == null) { return; } messageService.removeDestination(destinationId); } /** * * {@inheritDoc} */ @Override protected Service getTargetService(MessageBroker broker) { return broker.getServiceByType(MessageService.class.getName()); } /** * * {@inheritDoc} */ @Override protected void initializeDestination(Destination destination) { String adapterId = StringUtils.hasText(destination.getAdapter().getId()) ? destination.getAdapter().getId() : getDestinationId() + "Adapter"; //As per FLEX-198, we're doing the opposite of the BlazeDS default and defaulting disallow-wildcard-subtopics to "true" if (!getServerMap().containsKey("disallow-wildcard-subtopics")) { getServerMap().addProperty("disallow-wildcard-subtopics", "true"); } destination.getAdapter().initialize(adapterId, getProperties()); destination.initialize(getDestinationId(), getProperties()); destination.start(); } private ConfigMap getNetworkMap() { ConfigMap network = getProperties().getPropertyAsMap("network", null); if (network == null) { network = new ConfigMap(); getProperties().addProperty("network", network); } return network; } private ConfigMap getServerMap() { ConfigMap server = getProperties().getPropertyAsMap("server", null); if (server == null) { server = new ConfigMap(); getProperties().addProperty("server", server); } return server; } private ConfigMap getClusterMap() { ConfigMap cluster = getNetworkMap().getPropertyAsMap("cluster", null); if (cluster == null) { cluster = new ConfigMap(); getNetworkMap().addProperty("cluster", cluster); } return cluster; } private ConfigMap getThrottleInboundMap() { ConfigMap throttleInbound = getNetworkMap().getPropertyAsMap("throttle-inbound", null); if (throttleInbound == null) { throttleInbound = new ConfigMap(); getNetworkMap().addProperty("throttle-inbound", throttleInbound); } return throttleInbound; } private ConfigMap getThrottleOutboundMap() { ConfigMap throttleOutbound = getNetworkMap().getPropertyAsMap("throttle-outbound", null); if (throttleOutbound == null) { throttleOutbound = new ConfigMap(); getNetworkMap().addProperty("throttle-outbound", throttleOutbound); } return throttleOutbound; } }