Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 1cb31fb262126cdf35bff6dcc6e5ccf5483a0dd9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*******************************************************************************
 * Copyright (c) 2005, 2019 Cognos Incorporated, IBM Corporation and others..
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Cognos Incorporated - initial API and implementation
 *     IBM Corporation - bug fixes and enhancements
 *******************************************************************************/
package org.eclipse.equinox.internal.cm;

import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.List;
import org.osgi.framework.*;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;

/**
 * ConfigurationAdminImpl provides the ConfigurationAdmin service implementation 
 */
class ConfigurationAdminImpl implements ConfigurationAdmin {

	private final ConfigurationAdminFactory configurationAdminFactory;
	private final String bundleLocation;
	private final ConfigurationStore configurationStore;

	public ConfigurationAdminImpl(ConfigurationAdminFactory configurationAdminFactory, ConfigurationStore configurationStore, Bundle bundle) {
		this.configurationAdminFactory = configurationAdminFactory;
		this.configurationStore = configurationStore;
		this.bundleLocation = ConfigurationAdminImpl.getLocation(bundle);
	}

	@Override
	public Configuration createFactoryConfiguration(String factoryPid) {
		return internalGetConfiguration(factoryPid, bundleLocation, true, true, null);
	}

	@Override
	public Configuration createFactoryConfiguration(String factoryPid, String location) {
		return internalGetConfiguration(factoryPid, location, true, false, null);
	}

	@Override
	public Configuration getConfiguration(String pid) {
		return internalGetConfiguration(pid, bundleLocation, false, true, null);
	}

	@Override
	public Configuration getConfiguration(String pid, String location) {
		return internalGetConfiguration(pid, location, false, false, null);
	}

	@Override
	public Configuration getFactoryConfiguration(String factoryPid, String name) {
		return internalGetConfiguration(factoryPid, bundleLocation, true, true, name);
	}

	@Override
	public Configuration getFactoryConfiguration(String factoryPid, String name, String location) {
		return internalGetConfiguration(factoryPid, location, true, false, name);
	}

	private Configuration internalGetConfiguration(String pid, String location, boolean factory, boolean bind, String name) {
		checkPID(pid);
		this.configurationAdminFactory.checkConfigurePermission(location, bundleLocation);

		ConfigurationImpl config;
		if (factory) {
			config = configurationStore.getFactoryConfiguration(pid, location, bind, name);
		} else {
			config = configurationStore.getConfiguration(pid, location, bind);
		}

		String configLocation = config.getLocation();
		if (bind) {
			if (configLocation != null) {
				this.configurationAdminFactory.checkConfigurePermission(configLocation, bundleLocation);
			} else {
				config.bind(bundleLocation);
			}
		} else {
			this.configurationAdminFactory.checkConfigurePermission(configLocation, bundleLocation);
		}
		return config;
	}

	@Override
	public Configuration[] listConfigurations(String filterString) throws InvalidSyntaxException {
		if (filterString == null)
			filterString = "(" + Constants.SERVICE_PID + "=*)"; //$NON-NLS-1$ //$NON-NLS-2$

		ConfigurationImpl[] configs = configurationStore.listConfigurations(FrameworkUtil.createFilter(filterString));
		if (configs == null) {
			return null;
		}

		List<Configuration> result = new ArrayList<>(configs.length);
		SecurityManager sm = System.getSecurityManager();
		for (int i = 0; i < configs.length; i++) {
			try {
				if (sm != null) {
					this.configurationAdminFactory.checkConfigurePermission(configs[i].getLocation(), bundleLocation);
				}
				result.add(configs[i]);
			} catch (SecurityException e) {
				// ignore;
			}
		}
		return result.size() == 0 ? null : result.toArray(new Configuration[result.size()]);
	}

	private void checkPID(String pid) {
		if (pid == null)
			throw new IllegalArgumentException("PID cannot be null"); //$NON-NLS-1$
	}

	static String getLocation(final Bundle bundle) {
		return AccessController.doPrivileged(new PrivilegedAction<String>() {
			@Override
			public String run() {
				return bundle.getLocation();
			}
		});
	}
}

Back to the top