1
2
3
4
5
6
7
8
9
10
11 package org.mule.api.registry;
12
13 import org.mule.api.MuleContext;
14 import org.mule.api.config.MuleProperties;
15 import org.mule.config.i18n.CoreMessages;
16 import org.mule.model.DefaultModelServiceDescriptor;
17 import org.mule.transport.service.DefaultTransportServiceDescriptor;
18 import org.mule.transport.service.MetaTransportServiceDescriptor;
19 import org.mule.transport.service.TransportServiceDescriptor;
20 import org.mule.util.ClassUtils;
21 import org.mule.util.SpiUtils;
22
23 import java.util.Properties;
24
25 import org.apache.commons.lang.StringUtils;
26
27
28
29
30 public class ServiceDescriptorFactory
31 {
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public static ServiceDescriptor create(ServiceType type, String name, Properties props, Properties overrides, MuleContext muleContext, ClassLoader classLoader) throws ServiceException
46 {
47 if (overrides != null)
48 {
49 props.putAll(overrides);
50 }
51
52 String scheme = name;
53 String metaScheme = null;
54 int i = name.indexOf(":");
55 if (i > -1)
56 {
57 scheme = name.substring(i + 1);
58 metaScheme = name.substring(0, i);
59 }
60
61 if (isFilteredMetaScheme(metaScheme))
62 {
63
64 metaScheme = null;
65 }
66 else if (name.startsWith("jetty:http"))
67 {
68 scheme = "jetty";
69 }
70
71 String serviceFinderClass = (String) props.remove(MuleProperties.SERVICE_FINDER);
72
73 ServiceDescriptor sd;
74 if (type.equals(ServiceType.TRANSPORT))
75 {
76 try
77 {
78 if (metaScheme != null)
79 {
80 sd = new MetaTransportServiceDescriptor(metaScheme, scheme, props, classLoader);
81 }
82 else
83 {
84 sd = new DefaultTransportServiceDescriptor(scheme, props, classLoader);
85 }
86 }
87 catch (ServiceException e)
88 {
89 throw e;
90 }
91 catch (Exception e)
92 {
93 throw new ServiceException(CoreMessages.failedToCreate("Transport: " + name));
94 }
95 Properties exceptionMappingProps = SpiUtils.findServiceDescriptor(ServiceType.EXCEPTION, name + "-exception-mappings");
96 ((TransportServiceDescriptor) sd).setExceptionMappings(exceptionMappingProps);
97 }
98 else if (type.equals(ServiceType.MODEL))
99 {
100 sd = new DefaultModelServiceDescriptor(name, props);
101 }
102 else
103 {
104 throw new ServiceException(CoreMessages.unrecognisedServiceType(type));
105 }
106
107
108 if (StringUtils.isNotBlank(serviceFinderClass))
109 {
110 ServiceFinder finder;
111 try
112 {
113 finder = (ServiceFinder) ClassUtils.instanciateClass(serviceFinderClass);
114 }
115 catch (Exception e)
116 {
117 throw new ServiceException(CoreMessages.cannotInstanciateFinder(serviceFinderClass), e);
118 }
119 String realService = finder.findService(name, sd, props);
120 if (realService != null)
121 {
122
123 return muleContext.getRegistry().lookupServiceDescriptor(
124 ServiceType.TRANSPORT, realService, overrides);
125 }
126 else
127 {
128 throw new ServiceException(CoreMessages.serviceFinderCantFindService(name));
129 }
130 }
131 return sd;
132 }
133
134 protected static boolean isFilteredMetaScheme(String metaScheme)
135 {
136 if ("axis".equals(metaScheme) ||
137 "wsdl-axis".equals(metaScheme) ||
138 "cxf".equals(metaScheme) ||
139 "wsdl-cxf".equals(metaScheme) ||
140 "jms".equals(metaScheme) ||
141 "wmq".equals(metaScheme) ||
142 "ajax".equals(metaScheme))
143 {
144 return true;
145 }
146 return false;
147 }
148 }
149
150