1
2
3
4
5
6
7
8
9
10 package org.mule.transport.jdbc.config;
11
12 import org.mule.config.spring.handlers.AbstractMuleNamespaceHandler;
13 import org.mule.config.spring.parsers.ClassOrRefDefinitionParser;
14 import org.mule.config.spring.parsers.MuleDefinitionParser;
15 import org.mule.config.spring.parsers.collection.ChildSingletonMapDefinitionParser;
16 import org.mule.config.spring.parsers.delegate.ParentContextDefinitionParser;
17 import org.mule.config.spring.parsers.generic.ChildDefinitionParser;
18 import org.mule.config.spring.parsers.generic.ParentDefinitionParser;
19 import org.mule.config.spring.parsers.processors.CheckExclusiveAttributes;
20 import org.mule.config.spring.parsers.specific.ObjectFactoryWrapper;
21 import org.mule.config.spring.parsers.specific.TransactionDefinitionParser;
22 import org.mule.config.spring.parsers.specific.properties.NestedMapDefinitionParser;
23 import org.mule.endpoint.URIBuilder;
24 import org.mule.transport.jdbc.JdbcConnector;
25 import org.mule.transport.jdbc.JdbcTransactionFactory;
26 import org.mule.transport.jdbc.store.JdbcObjectStore;
27
28
29
30
31 public class JdbcNamespaceHandler extends AbstractMuleNamespaceHandler
32 {
33 public static final String QUERY_KEY = "queryKey";
34 public static final String[] ADDRESS_ATTRIBUTES = new String[]{QUERY_KEY};
35 public static final String SQL_STATEMENT_FACTORY_PROPERTY = "sqlStatementStrategyFactory";
36
37 @Override
38 public void init()
39 {
40 registerStandardTransportEndpoints(JdbcConnector.JDBC, ADDRESS_ATTRIBUTES).addAlias(QUERY_KEY, URIBuilder.PATH);
41 registerConnectorDefinitionParser(JdbcConnector.class, JdbcConnector.JDBC);
42 registerBeanDefinitionParser("dataSource", new ObjectFactoryWrapper("dataSourceFactory"));
43 registerBeanDefinitionParser(SQL_STATEMENT_FACTORY_PROPERTY, new ClassOrRefDefinitionParser(SQL_STATEMENT_FACTORY_PROPERTY));
44 MuleDefinitionParser connectorQuery = new ChildSingletonMapDefinitionParser("query");
45 MuleDefinitionParser endpointQuery = new NestedMapDefinitionParser("properties", "queries");
46 endpointQuery.addCollection("properties");
47 registerMuleBeanDefinitionParser("query", new ParentContextDefinitionParser("connector", connectorQuery).otherwise(endpointQuery));
48 registerBeanDefinitionParser("extractors", new ParentDefinitionParser());
49 registerBeanDefinitionParser("transaction", new TransactionDefinitionParser(JdbcTransactionFactory.class));
50 registerBeanDefinitionParser("object-store", new ChildDefinitionParser("store", JdbcObjectStore.class));
51 registerDataSourceDefinitionParsers();
52 }
53
54 protected void registerDataSourceDefinitionParsers()
55 {
56 registerDerbyDataSourceDefinitionParser();
57 registerMysqlDataSourceDefinitionParser();
58 registerOracleDataSourceDefinitionParser();
59 registerPostgresqlDataSourceDefinitionParser();
60 }
61
62 protected void registerDerbyDataSourceDefinitionParser()
63 {
64 DataSourceDefinitionParser parser = new DataSourceDefinitionParser(DerbyDataSourceFactoryBean.class);
65
66
67 parser.registerPreProcessor(new CheckDatabaseOrUrl());
68
69 registerBeanDefinitionParser("derby-data-source", parser);
70 }
71
72 protected void registerMysqlDataSourceDefinitionParser()
73 {
74 registerHostAndPortTypeDefinitionParser(MysqlDataSourceFactoryBean.class,
75 "mysql-data-source");
76 }
77
78 protected void registerOracleDataSourceDefinitionParser()
79 {
80 DataSourceDefinitionParser parser = new DataSourceDefinitionParser(OracleDataSourceFactoryBean.class);
81
82 String[][] attributeGroups = new String[][] {
83 new String[] { "url" },
84 new String[] { "host", "port", "instance" }
85 };
86 CheckExclusiveAttributes attributeCheck = new CheckExclusiveAttributes(attributeGroups);
87 parser.registerPreProcessor(attributeCheck);
88
89 registerBeanDefinitionParser("oracle-data-source", parser);
90 }
91
92 protected void registerPostgresqlDataSourceDefinitionParser()
93 {
94 registerHostAndPortTypeDefinitionParser(PostgresqlDataSourceFactoryBean.class,
95 "postgresql-data-source");
96 }
97
98 protected void registerHostAndPortTypeDefinitionParser(Class<? extends AbstractDataSourceFactoryBean> poolFactoryClass,
99 String elementName)
100 {
101 DataSourceDefinitionParser parser = new DataSourceDefinitionParser(poolFactoryClass);
102
103
104 String[][] attributeGroups = new String[][] {
105 new String[] { "url" },
106 new String[] { "host", "port" }
107 };
108 CheckExclusiveAttributes attributeCheck = new CheckExclusiveAttributes(attributeGroups);
109 parser.registerPreProcessor(attributeCheck);
110
111
112 parser.registerPreProcessor(new CheckDatabaseOrUrl());
113
114 registerBeanDefinitionParser(elementName, parser);
115
116 }
117 }