blob: d724df296855c1bab17eb6b4b3ea19a764440719 [file] [log] [blame]
Pierre De Rop3a00a212015-03-01 09:27:46 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19package org.apache.felix.dm.runtime;
20
21import org.apache.felix.dm.BundleDependency;
22import org.apache.felix.dm.ConfigurationDependency;
23import org.apache.felix.dm.Dependency;
24import org.apache.felix.dm.DependencyManager;
25import org.apache.felix.dm.ResourceDependency;
26import org.apache.felix.dm.ServiceDependency;
27import org.osgi.framework.Bundle;
28
29/**
30 * Class used to build a concrete dependency from meta data.
31 *
32 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
33 */
34public class DependencyBuilder
35{
36 public enum DependencyType
37 {
38 ServiceDependency,
39 TemporalServiceDependency,
40 ConfigurationDependency,
41 BundleDependency,
42 ResourceDependency
43 }
44
45 private MetaData m_metaData;
46
47 public DependencyBuilder(MetaData dependencyMetaData)
48 {
49 m_metaData = dependencyMetaData;
50 }
51
52 public Dependency build(Bundle b, DependencyManager dm)
53 throws Exception
54 {
55 Dependency dp = null;
56 DependencyType type;
57
58 try
59 {
60 type = DependencyType.valueOf(m_metaData.getString(Params.type));
61 }
62 catch (IllegalArgumentException e)
63 {
64 throw new IllegalArgumentException("no \"type\" parameter found from metaData: " + m_metaData);
65 }
66
67 switch (type)
68 {
69 case ServiceDependency:
70 dp = createServiceDependency(b, dm);
71 break;
72
73 case ConfigurationDependency:
Pierre De Rop40ecace2016-02-09 21:44:38 +000074 dp = createConfigurationDependency(b, dm);
Pierre De Rop3a00a212015-03-01 09:27:46 +000075 break;
76
77 case BundleDependency:
78 dp = createBundleDependency(dm);
79 break;
80
81 case ResourceDependency:
82 dp = createResourceDependency(dm);
83 break;
84
85 default:
86 throw new IllegalArgumentException("Can't build service dependency: " + type);
87 }
88 return dp;
89 }
90
91 private Dependency createServiceDependency(Bundle b, DependencyManager dm)
92 throws ClassNotFoundException
93 {
94 String service = m_metaData.getString(Params.service);
95 Class<?> serviceClass = b.loadClass(service);
96 String serviceFilter = m_metaData.getString(Params.filter, null);
97 String defaultServiceImpl = m_metaData.getString(Params.defaultImpl, null);
98 Class<?> defaultServiceImplClass =
99 (defaultServiceImpl != null) ? b.loadClass(defaultServiceImpl) : null;
100 String added = m_metaData.getString(Params.added, null);
101 long timeout = m_metaData.getLong(Params.timeout, -1L);
102 String changed = timeout != -1 ? null : m_metaData.getString(Params.changed, null);
103 String removed = timeout != -1 ? null : m_metaData.getString(Params.removed, null);
104 String autoConfigField = m_metaData.getString(Params.autoConfig, null);
105 boolean required = "true".equals(m_metaData.getString(Params.required, "true"));
106 boolean propagate = "true".equals(m_metaData.getString(Params.propagate, "false"));
107
108 Dependency dp = createServiceDependency(dm, serviceClass,
109 serviceFilter, defaultServiceImplClass, added, changed,
110 removed, autoConfigField, timeout, required, propagate);
111 return dp;
112 }
113
114 private Dependency createServiceDependency(DependencyManager dm, Class<?> serviceClass,
115 String serviceFilter, Class<?> defaultServiceImplClass, String added,
116 String changed, String removed, String autoConfigField, long timeout, boolean required,
117 boolean propagate)
118 {
119 ServiceDependency sd = timeout != -1 ? dm.createTemporalServiceDependency(timeout)
120 : dm.createServiceDependency();
121 sd.setService(serviceClass, serviceFilter);
122 if (defaultServiceImplClass != null)
123 {
124 sd.setDefaultImplementation(defaultServiceImplClass);
125 }
126 sd.setCallbacks(added, changed, removed);
127 if (autoConfigField != null)
128 {
129 sd.setAutoConfig(autoConfigField);
130 }
131 if (timeout == -1)
132 {
133 sd.setRequired(required);
134 }
135
136 sd.setPropagate(propagate);
137 return sd;
138 }
139
Pierre De Rop40ecace2016-02-09 21:44:38 +0000140 private Dependency createConfigurationDependency(Bundle b, DependencyManager dm) throws Exception
Pierre De Rop3a00a212015-03-01 09:27:46 +0000141 {
Pierre De Rop9e5cdba2016-02-17 20:35:16 +0000142 String confProxyType = m_metaData.getString(Params.configType, null);
Pierre De Rop3a00a212015-03-01 09:27:46 +0000143 String pid = m_metaData.getString(Params.pid);
144 boolean propagate = "true".equals(m_metaData.getString(Params.propagate, "false"));
145 String callback = m_metaData.getString(Params.updated, "updated");
Pierre De Rop40ecace2016-02-09 21:44:38 +0000146 return createConfigurationDependency(dm, b, pid, callback, confProxyType, propagate);
Pierre De Rop3a00a212015-03-01 09:27:46 +0000147 }
148
Pierre De Rop40ecace2016-02-09 21:44:38 +0000149 private Dependency createConfigurationDependency(DependencyManager dm, Bundle b, String pid, String callback, String confProxyType, boolean propagate)
150 throws ClassNotFoundException
Pierre De Rop3a00a212015-03-01 09:27:46 +0000151 {
152 if (pid == null)
153 {
154 throw new IllegalArgumentException(
155 "pid attribute not provided in ConfigurationDependency declaration");
156 }
157 ConfigurationDependency cd = dm.createConfigurationDependency();
158 cd.setPid(pid);
Pierre De Rop40ecace2016-02-09 21:44:38 +0000159 if (confProxyType != null)
160 {
161 Class<?> confProxyTypeClass = b.loadClass(confProxyType);
162 cd.setCallback(callback, confProxyTypeClass);
163 }
164 else
165 {
166 cd.setCallback(callback);
167 }
Pierre De Rop3a00a212015-03-01 09:27:46 +0000168 cd.setPropagate(propagate);
169 return cd;
170 }
171
172 /**
173 * Creates a BundleDependency that we parsed from a component descriptor entry.
174 * @param b
175 * @param dm
176 * @param parser
177 * @return
178 */
179 private Dependency createBundleDependency(DependencyManager dm)
180 {
181 String added = m_metaData.getString(Params.added, null);
182 String changed = m_metaData.getString(Params.changed, null);
183 String removed = m_metaData.getString(Params.removed, null);
184 boolean required = "true".equals(m_metaData.getString(Params.required, "true"));
185 String filter = m_metaData.getString(Params.filter, null);
186 int stateMask = m_metaData.getInt(Params.stateMask, -1);
187 boolean propagate = "true".equals(m_metaData.getString(Params.propagate, "false"));
188
189 Dependency dp = createBundleDependency(dm, added, changed, removed, required, propagate, filter,
190 stateMask);
191 return dp;
192 }
193
194 private Dependency createBundleDependency(DependencyManager dm, String added, String changed,
195 String removed, boolean required, boolean propagate, String filter, int stateMask)
196 {
197 BundleDependency bd = dm.createBundleDependency();
198 bd.setCallbacks(added, changed, removed);
199 bd.setRequired(required);
200 bd.setPropagate(propagate);
201 if (filter != null)
202 {
203 bd.setFilter(filter);
204 }
205 if (stateMask != -1)
206 {
207 bd.setStateMask(stateMask);
208 }
209 return bd;
210 }
211
212 private Dependency createResourceDependency(DependencyManager dm)
213 {
214 String added = m_metaData.getString(Params.added, null);
215 String changed = m_metaData.getString(Params.changed, null);
216 String removed = m_metaData.getString(Params.removed, null);
217 String filter = m_metaData.getString(Params.filter, null);
218 boolean required = "true".equals(m_metaData.getString(Params.required, "true"));
219 boolean propagate = "true".equals(m_metaData.getString(Params.propagate, "false"));
220 String autoConfigField = m_metaData.getString(Params.autoConfig, null);
221
222 Dependency dp = createResourceDependency(dm, added, changed, removed, required, filter,
223 propagate, autoConfigField);
224 return dp;
225 }
226
227 private Dependency createResourceDependency(DependencyManager dm, String added,
228 String changed, String removed, boolean required, String filter, boolean propagate,
229 String autoConfigField)
230 {
231 ResourceDependency rd = dm.createResourceDependency();
232 rd.setCallbacks(added, changed, removed);
233 rd.setRequired(required);
234 if (filter != null)
235 {
236 rd.setFilter(filter);
237 }
238 if (autoConfigField != null)
239 {
240 rd.setAutoConfig(autoConfigField);
241 }
242 rd.setPropagate(propagate);
243 return rd;
244 }
245}