blob: 761c87710ada243eae7a28d4df6d8b14ee2b309c [file] [log] [blame]
Pierre De Rop34231582010-05-23 20:05:16 +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.impl;
20import java.util.Enumeration;
21import java.util.List;
22import java.util.Properties;
23
Marcel Offermans8b93efa2010-07-02 18:27:21 +000024import org.apache.felix.dm.Dependency;
Pierre De Rop34231582010-05-23 20:05:16 +000025import org.apache.felix.dm.DependencyManager;
Marcel Offermans8b93efa2010-07-02 18:27:21 +000026import org.apache.felix.dm.Service;
27import org.apache.felix.dm.ServiceStateListener;
Marcel Offermans5dd22112010-08-24 14:53:43 +000028import org.osgi.framework.Constants;
Pierre De Rop34231582010-05-23 20:05:16 +000029import org.osgi.framework.ServiceReference;
30
31/**
32 * Adapter Service implementation. This class extends the FilterService in order to catch
33 * some Service methods for configuring actual adapter service implementation.
34 */
35public class AdapterServiceImpl extends FilterService
36{
37 /**
38 * Creates a new Adapter Service implementation.
39 * @param dm the dependency manager used to create our internal adapter service
40 * @param adapteeInterface the service interface to apply the adapter to
41 * @param adapteeFilter the filter condition to use with the service interface
42 */
43 public AdapterServiceImpl(DependencyManager dm, Class adapteeInterface, String adapteeFilter)
44 {
45 super(dm.createService()); // This service will be filtered by our super class, allowing us to take control.
46 m_service.setImplementation(new AdapterImpl(adapteeInterface, adapteeFilter))
47 .add(dm.createServiceDependency()
Marcel Offermans77bcf442010-06-24 11:15:42 +000048 .setService(adapteeInterface, adapteeFilter)
Pierre De Rop34231582010-05-23 20:05:16 +000049 .setAutoConfig(false)
50 .setCallbacks("added", "removed"));
51 }
52
53 public class AdapterImpl extends AbstractDecorator {
54 private final Class m_adapteeInterface;
55 private final String m_adapteeFilter;
56
57 public AdapterImpl(Class adapteeInterface, String adapteeFilter) {
58 m_adapteeInterface = adapteeInterface;
59 m_adapteeFilter = adapteeFilter;
60 }
61
62 public Service createService(Object[] properties) {
63 ServiceReference ref = (ServiceReference) properties[0];
Pierre De Rop34231582010-05-23 20:05:16 +000064 Properties props = new Properties();
65 String[] keys = ref.getPropertyKeys();
66 for (int i = 0; i < keys.length; i++) {
Marcel Offermans5dd22112010-08-24 14:53:43 +000067 String key = keys[i];
68 if (key.equals(Constants.SERVICE_ID) || key.equals(Constants.SERVICE_RANKING) || key.equals(DependencyManager.ASPECT) || key.equals(Constants.OBJECTCLASS)) {
69 // do not copy these
70 }
71 else {
72 props.put(key, ref.getProperty(key));
73 }
Pierre De Rop34231582010-05-23 20:05:16 +000074 }
75 if (m_serviceProperties != null) {
76 Enumeration e = m_serviceProperties.keys();
77 while (e.hasMoreElements()) {
78 Object key = e.nextElement();
79 props.put(key, m_serviceProperties.get(key));
80 }
81 }
82 List dependencies = m_service.getDependencies();
83 dependencies.remove(0);
Pierre De Ropc128b172010-05-23 21:28:15 +000084 Service service = m_manager.createService()
Pierre De Rop34231582010-05-23 20:05:16 +000085 .setInterface(m_serviceInterfaces, props)
86 .setImplementation(m_serviceImpl)
87 .setFactory(m_factory, m_factoryCreateMethod) // if not set, no effect
88 .setComposition(m_compositionInstance, m_compositionMethod) // if not set, no effect
89 .setCallbacks(m_callbackObject, m_init, m_start, m_stop, m_destroy) // if not set, no effect
Marcel Offermansb1959f42010-07-01 12:23:51 +000090// .add(dependencies)
Pierre De Rop34231582010-05-23 20:05:16 +000091 .add(m_manager.createServiceDependency()
92 .setService(m_adapteeInterface, ref)
93 .setRequired(true));
Marcel Offermansb1959f42010-07-01 12:23:51 +000094
Marcel Offermans3d921212010-08-09 13:37:02 +000095 configureAutoConfigState(service, m_service);
96
Marcel Offermanse9c13d92010-07-01 14:01:02 +000097 for (int i = 0; i < dependencies.size(); i++) {
98 service.add(((Dependency) dependencies.get(i)).createCopy());
Marcel Offermansb1959f42010-07-01 12:23:51 +000099 }
100
Pierre De Ropc128b172010-05-23 21:28:15 +0000101 for (int i = 0; i < m_stateListeners.size(); i ++) {
102 service.addStateListener((ServiceStateListener) m_stateListeners.get(i));
103 }
104 return service;
Pierre De Rop34231582010-05-23 20:05:16 +0000105 }
106 }
107}