001 /** 002 * 003 * Copyright 2004 Protique Ltd 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.activemq.spring; 019 020 import org.springframework.beans.BeansException; 021 import org.springframework.beans.factory.support.BeanDefinitionRegistry; 022 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; 023 import org.springframework.core.io.ClassPathResource; 024 import org.springframework.core.io.Resource; 025 import org.w3c.dom.Document; 026 import org.xml.sax.EntityResolver; 027 028 import javax.xml.transform.Source; 029 import javax.xml.transform.Transformer; 030 import javax.xml.transform.TransformerConfigurationException; 031 import javax.xml.transform.TransformerException; 032 import javax.xml.transform.TransformerFactory; 033 import javax.xml.transform.URIResolver; 034 import javax.xml.transform.dom.DOMResult; 035 import javax.xml.transform.dom.DOMSource; 036 import javax.xml.transform.stream.StreamSource; 037 import java.io.IOException; 038 039 /** 040 * @version $Revision$ 041 */ 042 public class ActiveMQBeanDefinitionReader extends XmlBeanDefinitionReader { 043 private String brokerName; 044 045 public ActiveMQBeanDefinitionReader(BeanDefinitionRegistry beanDefinitionRegistry, String brokerName) { 046 super(beanDefinitionRegistry); 047 this.brokerName = brokerName; 048 setEntityResolver(createEntityResolver()); 049 } 050 051 public int registerBeanDefinitions(Document document, Resource resource) throws BeansException { 052 try { 053 Document newDocument = transformDocument(document); 054 return super.registerBeanDefinitions(newDocument, resource); 055 } 056 catch (Exception e) { 057 throw new ConfigurationParseException(resource, e); 058 } 059 } 060 061 public static Transformer createTransformer(Source source) throws TransformerConfigurationException { 062 TransformerFactory factory = TransformerFactory.newInstance(); 063 Transformer transformer = factory.newTransformer(source); 064 transformer.setURIResolver(new URIResolver() { 065 public Source resolve(String href, String base) { 066 System.out.println("Called with href: " + href + " base: " + base); 067 return null; 068 } 069 }); 070 return transformer; 071 } 072 073 074 // Properties 075 //------------------------------------------------------------------------- 076 public String getBrokerName() { 077 return brokerName; 078 } 079 080 public void setBrokerName(String brokerName) { 081 this.brokerName = brokerName; 082 } 083 084 // Implementation methods 085 //------------------------------------------------------------------------- 086 087 /** 088 * A hook to transform the source document into a default Spring XML configuration 089 * 090 * @param document 091 * @return 092 */ 093 protected Document transformDocument(Document document) throws IOException, TransformerException { 094 Transformer transformer = createTransformer(createXslSource()); 095 transformer.setParameter("brokerName", getBrokerName()); 096 DOMResult result = new DOMResult(); 097 transformer.transform(new DOMSource(document), result); 098 return (Document) result.getNode(); 099 } 100 101 /** 102 * Creates the XSL resource for the transformation 103 * 104 * @return 105 */ 106 protected Source createXslSource() throws IOException { 107 return new StreamSource(getXslResource().getInputStream(), getXslResource().getURL().toString()); 108 } 109 110 /** 111 * @return the resource to use for the XSLT 112 */ 113 protected ClassPathResource getXslResource() { 114 return new ClassPathResource("org/activemq/activemq-to-spring.xsl"); 115 } 116 117 /** 118 * @return a new EnittyResolver 119 */ 120 protected EntityResolver createEntityResolver() { 121 return new ActiveMQDtdResolver(); 122 } 123 }