blob: eb2d93b8d2d6774b476b7753af57128614cccd46 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.api;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.PrimitiveInstanceDescription;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceDescription;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
/**
* Allows configuring a service property.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ServiceProperty {
/**
* The property name.
*/
private String m_name;
/**
* The property field.
*/
private String m_field;
/**
* The property type.
*/
private String m_type;
/**
* The property value.
*/
private String m_value;
/**
* Is the property mandatory.
*/
private boolean m_mandatory;
/**
* Is the property immutable.
*/
private boolean m_immutable;
/**
* Sets the property name.
* @param name the property name
* @return the current property object
*/
public ServiceProperty setName(String name) {
m_name = name;
return this;
}
/**
* Sets the property field.
* @param name the property field
* @return the current property object
*/
public ServiceProperty setField(String name) {
m_field = name;
return this;
}
/**
* Sets the property type.
* @param name the property type
* @return the current property object
*/
public ServiceProperty setType(String name) {
m_type = name;
return this;
}
/**
* Sets the property value.
* @param name the property value
* @return the current property object
*/
public ServiceProperty setValue(String name) {
m_value = name;
return this;
}
/**
* Sets if the property is immutable.
* @param immutable <code>true</code> if the dependency is immutable.
* @return the current property object
*/
public ServiceProperty setImmutable(boolean immutable) {
m_immutable = immutable;
return this;
}
/**
* Sets if the property is mandatory.
* @param mandatory <code>true</code> if the dependency is mandatory.
* @return the current property object
*/
public ServiceProperty setMandatory(boolean mandatory) {
m_mandatory = mandatory;
return this;
}
/**
* Gets the 'property' element.
* @return the element describing the current property.
*/
public Element getElement() {
ensureValidity();
Element element = new Element("property", "");
if (m_name != null) {
element.addAttribute(new Attribute("name", m_name));
}
if (m_type != null) {
element.addAttribute(new Attribute("type", m_type));
}
if (m_value != null) {
element.addAttribute(new Attribute("value", m_value));
}
if (m_field != null) {
element.addAttribute(new Attribute("field", m_field));
}
if (m_mandatory) {
element.addAttribute(new Attribute("mandatory", new Boolean(m_mandatory).toString()));
}
if (m_immutable) {
element.addAttribute(new Attribute("immutable", new Boolean(m_immutable).toString()));
}
return element;
}
/**
* Checks the configuration validity.
*/
private void ensureValidity() {
// Two cases
// Field or type
if (m_field == null && m_type == null) {
throw new IllegalStateException("A service property must have either a field or a type");
}
if (m_immutable && m_value == null) {
throw new IllegalStateException("A immutable service property must have a value");
}
}
/**
* Gets the property value of the current property
* on the given instance.
* @param instance the instance on which looking for
* the property value
* @return the property value or <code>null</code>
* if not found.
*/
public Object getPropertyValue(ComponentInstance instance) {
PrimitiveInstanceDescription desc = (PrimitiveInstanceDescription) instance.getInstanceDescription();
ProvidedServiceDescription[] pss = desc.getProvidedServices();
for (int i = 0; i < pss.length; i++) {
// Check with the name
if (m_name != null && pss[i].getProperties().containsKey(m_name)) {
return pss[i].getProperties().get(m_name);
}
// Check with the field
if (m_field != null && pss[i].getProperties().containsKey(m_field)) {
return pss[i].getProperties().get(m_field);
}
}
// Not found.
return null;
}
}