blob: a69f02a989a650476a3e9f0ffa69934da5bfd320 [file] [log] [blame]
/*
* Copyright 2006 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.felix.ipojo.handlers.configuration;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Properties;
import java.util.logging.Level;
import org.apache.felix.ipojo.ComponentManager;
import org.apache.felix.ipojo.Handler;
import org.apache.felix.ipojo.Activator;
import org.apache.felix.ipojo.metadata.Element;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedService;
/**
* Handler managing the Configuration Admin.
* @author Clement Escoffier
*/
public class ConfigurationHandler implements Handler, ManagedService {
/**
* Reference on the component manager.
*/
private ComponentManager m_manager;
/**
* List of the configurable fields.
*/
private ConfigurableProperty[] m_configurableProperties = new ConfigurableProperty[0];
/**
* PID of the component.
*/
private String m_pid;
/**
* Service registration of the ManagedService provided by this handler.
*/
private ServiceRegistration m_sr;
/**
* @return component manager of this handler.
*/
protected ComponentManager getComponentManager() { return m_manager; }
/**
* @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.ComponentManager, org.apache.felix.ipojo.metadata.Element)
*/
public void configure(ComponentManager cm, Element metadata) {
// Store the component manager
m_manager = cm;
m_configurableProperties = new ConfigurableProperty[0];
// Build the hashmap
Element[] configurables = metadata.getElements("ConfigurableProperty");
if (configurables.length > 0) { m_manager.register(this); }
else { return; }
for (int i = 0; i < configurables.length; i++) {
String fieldName = configurables[i].getAttribute("field");
String name = null;
if (configurables[i].containsAttribute("name")) { name = configurables[i].getAttribute("name"); }
else { name = fieldName; }
String value = null;
if (configurables[i].containsAttribute("value")) {
value = configurables[i].getAttribute("value");
}
ConfigurableProperty cp = new ConfigurableProperty(name, fieldName, value, this);
addProperty(cp);
}
// Get the PID :
if (metadata.containsAttribute("name")) { m_pid = metadata.getAttribute("name"); }
else { m_pid = metadata.getAttribute("className"); }
}
/**
* @see org.apache.felix.ipojo.Handler#stop()
*/
public void stop() {
// Unregister the service
if (m_sr != null) {
Activator.getLogger().log(Level.INFO, "[" + m_manager.getComponentMetatada().getClassName() + "] Unregister Managed Service");
m_sr.unregister();
m_sr = null;
}
}
/**
* @see org.apache.felix.ipojo.Handler#start()
*/
public void start() {
// Unregister the service if already registred (it should not happen )
if (m_sr != null) { m_sr.unregister(); }
// Register the ManagedService
BundleContext bc = m_manager.getContext();
Dictionary properties = new Properties();
properties.put(Constants.SERVICE_PID, m_pid);
Activator.getLogger().log(Level.INFO, "[" + m_manager.getComponentMetatada().getClassName() + "] Register Managed Service");
m_sr = bc.registerService(ManagedService.class.getName(), this, properties);
}
/**
* @see org.apache.felix.ipojo.Handler#setterCallback(java.lang.String, java.lang.Object)
*/
public void setterCallback(String fieldName, Object value) {
// Nothing to do
}
/**
* @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String, java.lang.Object)
*/
public Object getterCallback(String fieldName, Object value) {
// Check if the field is a configurable property
for (int i = 0; i < m_configurableProperties.length; i++) {
if (m_configurableProperties[i].getField().equals(fieldName)) {
return m_configurableProperties[i].getValue();
}
}
return value;
}
/**
* @see org.apache.felix.ipojo.Handler#isValid()
*/
public boolean isValid() {
return true;
}
/**
* @see org.apache.felix.ipojo.Handler#stateChanged(int)
*/
public void stateChanged(int state) {
if (state == ComponentManager.VALID) {
if (m_sr == null) { start(); }
return;
}
if (state == ComponentManager.INVALID) {
if (m_sr != null) { stop(); }
return;
}
}
/**
* @see org.osgi.service.cm.ManagedService#updated(java.util.Dictionary)
*/
public void updated(Dictionary np) throws ConfigurationException {
if (np != null) {
Enumeration keysEnumeration = np.keys();
while (keysEnumeration.hasMoreElements()) {
String name = (String)keysEnumeration.nextElement();
Object value = np.get(name);
boolean find = false;
// Check if the field is a configurable property
for (int i = 0; !find && i < m_configurableProperties.length; i++) {
if (m_configurableProperties[i].getName().equals(name)) {
// Check if the value has change
if (m_configurableProperties[i].getValue() == null || !m_configurableProperties[i].getValue().equals(value)) {
m_configurableProperties[i].setValue(value); // Change the value
m_manager.setterCallback(m_configurableProperties[i].getField(), value); // says that the value has change
}
find = true;
// Else do nothing
}
}
if (!find) {
Activator.getLogger().log(Level.WARNING, "[" + m_manager.getComponentMetatada().getClassName() + "] The configuration is not valid, the property " + name + " is not a configurable property");
}
}
}
else { Activator.getLogger().log(Level.WARNING, "[" + m_manager.getComponentMetatada().getClassName() + "] The pushed configuration is null for " + m_pid); }
}
/**
* Add the given property metadata to the property metadata list.
* @param p : property metdata to add
*/
protected void addProperty(ConfigurableProperty p) {
for (int i = 0; (m_configurableProperties != null) && (i < m_configurableProperties.length); i++) {
if (m_configurableProperties[i] == p) { return; }
}
if (m_configurableProperties.length > 0) {
ConfigurableProperty[] newProp = new ConfigurableProperty[m_configurableProperties.length + 1];
System.arraycopy(m_configurableProperties, 0, newProp, 0, m_configurableProperties.length);
newProp[m_configurableProperties.length] = p;
m_configurableProperties = newProp;
}
else {
m_configurableProperties = new ConfigurableProperty[] {p};
}
}
/**
* Check if the liste contains the property.
* @param name : name of the property
* @return true if the property exist in the list
*/
protected boolean containsProperty(String name) {
for (int i = 0; (m_configurableProperties != null) && (i < m_configurableProperties.length); i++) {
if (m_configurableProperties[i].getName() == name) { return true; }
}
return false;
}
}