/* | |
* 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.context; | |
import java.util.Dictionary; | |
import org.apache.felix.ipojo.ComponentInstance; | |
import org.osgi.framework.Bundle; | |
import org.osgi.framework.Constants; | |
import org.osgi.framework.ServiceReference; | |
/** | |
* Internal service reference implementation. This class is used for in the | |
* composition. | |
* | |
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> | |
*/ | |
public class ServiceReferenceImpl implements ServiceReference { | |
/** | |
* Service Registration attached to the service reference. | |
*/ | |
private ServiceRegistrationImpl m_registration = null; | |
/** | |
* Component Instance. | |
*/ | |
private ComponentInstance m_cm; | |
/** | |
* Constructor. | |
* | |
* @param instance : component instance publishing the service. | |
* @param ref : registration attached to this service reference. | |
*/ | |
public ServiceReferenceImpl(ComponentInstance instance, ServiceRegistrationImpl ref) { | |
m_registration = ref; | |
m_cm = instance; | |
} | |
/** | |
* Not supported in composite. | |
* @return null | |
* @see org.osgi.framework.ServiceReference#getBundle() | |
*/ | |
public Bundle getBundle() { | |
return m_cm.getContext().getBundle(); | |
} | |
/** | |
* Get the service registration for this reference. | |
* @return the service registration for this service reference. | |
*/ | |
public ServiceRegistrationImpl getServiceRegistration() { | |
return m_registration; | |
} | |
/** | |
* Get a property value. | |
* @param name : the key of the required property. | |
* @return the property value or null if no property for the given key. | |
* @see org.osgi.framework.ServiceReference#getProperty(java.lang.String) | |
*/ | |
public Object getProperty(String name) { | |
return m_registration.getProperty(name); | |
} | |
/** | |
* Get the String arrays of service property keys. | |
* @return : the list of property keys. | |
* @see org.osgi.framework.ServiceReference#getPropertyKeys() | |
*/ | |
public String[] getPropertyKeys() { | |
return m_registration.getPropertyKeys(); | |
} | |
public Dictionary getProperties() { | |
return m_registration.getProperties(); | |
} | |
/** | |
* Unsupported Operation inside composite. | |
* @return bundles using this reference. | |
* @see org.osgi.framework.ServiceReference#getUsingBundles() | |
*/ | |
public Bundle[] getUsingBundles() { | |
throw new UnsupportedOperationException("getUsingBundles is not supported in service context"); | |
} | |
/** | |
* Check if the current service reference is assignable to the given bundle. | |
* @param arg0 : the bundle to check | |
* @param arg1 : the class name to check. | |
* @return true in the case of composite | |
* @see org.osgi.framework.ServiceReference#isAssignableTo(org.osgi.framework.Bundle, java.lang.String) | |
*/ | |
public boolean isAssignableTo(Bundle arg0, String arg1) { | |
return true; | |
} | |
/** | |
* Service Reference compare method. | |
* @param reference the service reference | |
* @return this methods is not yet supported, and throws an | |
* {@link UnsupportedOperationException}. | |
* @see org.osgi.framework.ServiceReference#compareTo(java.lang.Object) | |
*/ | |
public int compareTo(Object reference) { | |
ServiceReference other = (ServiceReference) reference; | |
Long id = (Long) getProperty(Constants.SERVICE_ID); | |
Long otherId = (Long) other.getProperty(Constants.SERVICE_ID); | |
if (id.equals(otherId)) { | |
return 0; // same service | |
} | |
Integer rank = (Integer) getProperty(Constants.SERVICE_RANKING); | |
Integer otherRank = (Integer) other | |
.getProperty(Constants.SERVICE_RANKING); | |
// If no rank, then spec says it defaults to zero. | |
rank = (rank == null) ? new Integer(0) : rank; | |
otherRank = (otherRank == null) ? new Integer(0) : otherRank; | |
// Sort by rank in ascending order. | |
if (rank.compareTo(otherRank) < 0) { | |
return -1; // lower rank | |
} else if (rank.compareTo(otherRank) > 0) { | |
return 1; // higher rank | |
} | |
// If ranks are equal, then sort by service id in descending order. | |
return (id.compareTo(otherId) < 0) ? 1 : -1; | |
} | |
} |