messagebrokerbeandefinitionparser.java

来自「java 和flex的整合,主要是spring和flex的整合,不可多得啊」· Java 代码 · 共 505 行 · 第 1/2 页

JAVA
505
字号
/* * Copyright 2002-2009 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.config.xml;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Set;import org.springframework.beans.factory.config.RuntimeBeanReference;import org.springframework.beans.factory.parsing.CompositeComponentDefinition;import org.springframework.beans.factory.support.BeanDefinitionBuilder;import org.springframework.beans.factory.support.ManagedList;import org.springframework.beans.factory.support.ManagedMap;import org.springframework.beans.factory.support.ManagedSet;import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;import org.springframework.beans.factory.xml.BeanDefinitionParser;import org.springframework.beans.factory.xml.ParserContext;import org.springframework.flex.config.BeanIds;import org.springframework.flex.config.FlexConfigurationManager;import org.springframework.flex.security.LoginMessageInterceptor;import org.springframework.flex.security.PerClientAuthenticationInterceptor;import org.springframework.flex.security.SecurityExceptionTranslator;import org.springframework.security.ConfigAttributeDefinition;import org.springframework.security.intercept.web.RequestKey;import org.springframework.security.util.AntUrlPathMatcher;import org.springframework.util.CollectionUtils;import org.springframework.util.StringUtils;import org.springframework.util.xml.DomUtils;import org.w3c.dom.Element;/** * {@link BeanDefinitionParser} implementation for the <code>message-broker</code> tag that configures a Spring-managed * MessageBroker *  * @author Jeremy Grelle */public class MessageBrokerBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {    // --------------------------- Full qualified class names ----------------//    private static final String MESSAGE_BROKER_FACTORY_BEAN_CLASS_NAME = "org.springframework.flex.core.MessageBrokerFactoryBean";    private static final String MESSAGE_BROKER_HANDLER_ADAPTER_CLASS_NAME = "org.springframework.flex.servlet.MessageBrokerHandlerAdapter";    private static final String DEFAULT_HANDLER_MAPPING_CLASS_NAME = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping";    private static final String LOGIN_COMMAND_CLASS_NAME = "org.springframework.flex.security.SpringSecurityLoginCommand";    private static final String ENDPOINT_PROCESSOR_CLASS_NAME = "org.springframework.flex.core.EndpointConfigProcessor";    private static final String EXCEPTION_TRANSLATION_CLASS_NAME = "org.springframework.flex.core.ExceptionTranslationAdvice";    private static final String MESSAGE_INTERCEPTION_CLASS_NAME = "org.springframework.flex.core.MessageInterceptionAdvice";    private static final String ENDPOINT_INTERCEPTOR_CLASS_NAME = "org.springframework.flex.security.EndpointInterceptor";    private static final String SERVICE_MESSAGE_ADVISOR_CLASS_NAME = "org.springframework.flex.core.EndpointServiceMessagePointcutAdvisor";    private static final String ENDPOINT_DEFINITION_SOURCE_CLASS_NAME = "org.springframework.flex.security.EndpointDefinitionSource";    private static final String REMOTING_PROCESSOR_CLASS_NAME = "org.springframework.flex.remoting.RemotingServiceConfigProcessor";    private static final String MESSAGING_PROCESSOR_CLASS_NAME = "org.springframework.flex.messaging.MessageServiceConfigProcessor";    private static final String SESSION_FIXATION_CONFIGURER_CLASS_NAME = "org.springframework.flex.config.SessionFixationProtectionConfigurer";    private static final String REMOTING_ANNOTATION_PROCESSOR_CLASS_NAME = "org.springframework.flex.config.RemotingAnnotationPostProcessor";    private static final String CUSTOM_EDITOR_CONFIGURER_CLASS_NAME = "org.springframework.beans.factory.config.CustomEditorConfigurer";    private static final String JSON_CONFIG_MAP_EDITOR_CLASS_NAME = "org.springframework.flex.config.json.JsonConfigMapPropertyEditor";    private static final String CONFIG_MAP_CLASS_NAME = "flex.messaging.config.ConfigMap";    // --------------------------- XML Config Attributes ---------------------//    private static final String CONFIGURATION_MANAGER_ATTR = "configuration-manager";    private static final String SERVICES_CONFIG_PATH_ATTR = "services-config-path";    private static final String MAPPING_ORDER_ATTR = "mapping-order";    private static final String DISABLE_DEFAULT_MAPPING_ATTR = "disable-default-mapping";    private static final String PATTERN_ATTR = "pattern";    private static final String REF_ATTR = "ref";    private static final String AUTH_MANAGER_ATTR = "authentication-manager";    private static final String ACCESS_MANAGER_ATTR = "access-decision-manager";    private static final String PER_CLIENT_AUTHENTICATION_ATTR = "per-client-authentication";    private static final String ACCESS_ATTR = "access";    private static final String CHANNEL_ATTR = "channel";    // --------------------------- Bean Configuration Properties -------------//    private static final String URL_MAP_PROPERTY = "urlMap";    private static final String ORDER_PROPERTY = "order";    private static final String CONFIG_PROCESSORS_PROPERTY = "configProcessors";    private static final String PER_CLIENT_AUTHENTICATION_PROPERTY = "perClientAuthentication";    private static final String AUTH_MANAGER_PROPERTY = "authenticationManager";    private static final String ACCESS_MANAGER_PROPERTY = "accessDecisionManager";    private static final String OBJECT_DEF_SOURCE_PROPERTY = "objectDefinitionSource";    private static final String EXCEPTION_TRANSLATORS_PROPERTY = "exceptionTranslators";    private static final String MESSAGE_INTERCEPTORS_PROPERTY = "messageInterceptors";    private static final String CUSTOM_EDITORS_PROPERTY = "customEditors";    // --------------------------- XML Child Elements ------------------------//    private static final String MAPPING_PATTERN_ELEMENT = "mapping";    private static final String CONFIG_PROCESSOR_ELEMENT = "config-processor";    private static final String EXCEPTION_TRANSLATOR_ELEMENT = "exception-translator";    private static final String MESSAGE_INTERCEPTOR_ELEMENT = "message-interceptor";    private static final String SECURED_ELEMENT = "secured";    private static final String SECURED_CHANNEL_ELEMENT = "secured-channel";    private static final String SECURED_ENDPOINT_PATH_ELEMENT = "secured-endpoint-path";    private static final String REMOTING_SERVICE_ELEMENT = "remoting-service";    private static final String MESSAGE_SERVICE_ELEMENT = "message-service";    // --------------------------- Default Values ----------------------------//    private static final String DEFAULT_MAPPING_PATH = "/*";    @Override    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {        CompositeComponentDefinition componentDefinition = new CompositeComponentDefinition(element.getLocalName(),            parserContext.extractSource(element));        parserContext.pushContainingComponent(componentDefinition);        Object source = parserContext.extractSource(element);        // Initialize the config processors set        ManagedSet configProcessors = new ManagedSet();        configProcessors.setSource(source);        // Initialize the AOP advisors list        ManagedList advisors = new ManagedList();        advisors.setSource(source);        // Initialize the exception translators set        ManagedSet translators = new ManagedSet();        translators.setSource(source);        // Initialize the message interceptors set        ManagedSet interceptors = new ManagedSet();        interceptors.setSource(source);        // Set the default ID if necessary        if (!StringUtils.hasText(element.getAttribute(ID_ATTRIBUTE))) {            element.setAttribute(ID_ATTRIBUTE, BeanIds.MESSAGE_BROKER);        }        validateMessageBroker(element, parserContext);        ParsingUtils.mapOptionalAttributes(element, builder, SERVICES_CONFIG_PATH_ATTR);        ParsingUtils.mapOptionalBeanRefAttributes(element, builder, CONFIGURATION_MANAGER_ATTR);        registerHandlerAdapterIfNecessary(element, parserContext);        if (!Boolean.parseBoolean(element.getAttribute(DISABLE_DEFAULT_MAPPING_ATTR))) {            registerHandlerMappings(element, parserContext, DomUtils.getChildElementsByTagName(element, MAPPING_PATTERN_ELEMENT));        }        registerCustomConfigProcessors(parserContext, configProcessors, DomUtils.getChildElementsByTagName(element, CONFIG_PROCESSOR_ELEMENT));        registerConfigMapEditorIfNecessary(element, parserContext);        configureMessageService(element, parserContext, configProcessors, DomUtils.getChildElementByTagName(element, MESSAGE_SERVICE_ELEMENT));        configureRemotingService(element, parserContext, configProcessors, DomUtils.getChildElementByTagName(element, REMOTING_SERVICE_ELEMENT));        registerExceptionTranslation(element, parserContext, advisors, translators, DomUtils.getChildElementsByTagName(element,            EXCEPTION_TRANSLATOR_ELEMENT));        registerMessageInterception(element, parserContext, advisors, interceptors, DomUtils.getChildElementsByTagName(element,            MESSAGE_INTERCEPTOR_ELEMENT));        configureSecurity(element, parserContext, configProcessors, advisors, translators, interceptors, DomUtils.getChildElementByTagName(element,            SECURED_ELEMENT));        registerEndpointProcessor(parserContext, configProcessors, advisors, element, element.getAttribute(ID_ATTRIBUTE));        if (!configProcessors.isEmpty()) {            builder.addPropertyValue(CONFIG_PROCESSORS_PROPERTY, configProcessors);        }        parserContext.popAndRegisterContainingComponent();    }    @Override    protected String getBeanClassName(Element element) {        return MESSAGE_BROKER_FACTORY_BEAN_CLASS_NAME;    }    @SuppressWarnings("unchecked")    private void configureMessageService(Element parent, ParserContext parserContext, ManagedSet configProcessors, Element messageServiceElement) {        Element source = messageServiceElement != null ? messageServiceElement : parent;        BeanDefinitionBuilder messagingProcessorBuilder = BeanDefinitionBuilder.genericBeanDefinition(MESSAGING_PROCESSOR_CLASS_NAME);        if (messageServiceElement != null) {            ParsingUtils.mapAllAttributes(messageServiceElement, messagingProcessorBuilder);        }        String brokerId = parent.getAttribute(ID_ATTRIBUTE);        ParsingUtils.registerInfrastructureComponent(source, parserContext, messagingProcessorBuilder, brokerId + BeanIds.MESSAGING_PROCESSOR_SUFFIX);        configProcessors.add(new RuntimeBeanReference(brokerId + BeanIds.MESSAGING_PROCESSOR_SUFFIX));        registerFlexRemotingAnnotationPostProcessorIfNecessary(source, parserContext);    }    @SuppressWarnings("unchecked")    private void configureRemotingService(Element parent, ParserContext parserContext, ManagedSet configProcessors, Element remotingServiceElement) {        Element source = remotingServiceElement != null ? remotingServiceElement : parent;        BeanDefinitionBuilder remotingProcessorBuilder = BeanDefinitionBuilder.genericBeanDefinition(REMOTING_PROCESSOR_CLASS_NAME);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?