/*
* 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.aries.subsystem.core.internal;
import java.util.ArrayList;
import java.util.List;
import org.apache.aries.application.modelling.ExportedService;
import org.apache.aries.application.modelling.ImportedService;
import org.apache.aries.application.modelling.ModelledResourceManager;
import org.apache.aries.application.modelling.ModellerException;
import org.apache.aries.application.modelling.ParsedServiceElements;
import org.apache.aries.util.filesystem.IDirectory;
import org.osgi.namespace.service.ServiceNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Namespace;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import org.osgi.service.subsystem.SubsystemException;
public class ApplicationServiceModeller implements ServiceModeller {
private final ModelledResourceManager manager;
public ApplicationServiceModeller(Object manager) {
this.manager = (ModelledResourceManager) manager;
}
@Override
public ServiceModel computeRequirementsAndCapabilities(Resource resource, IDirectory directory) throws SubsystemException {
try {
ServiceModelImpl model = new ServiceModelImpl();
ParsedServiceElements elements = manager.getServiceElements(directory);
for (ExportedService service : elements.getServices()) {
model.capabilities.add(new BasicCapability.Builder()
.namespace(ServiceNamespace.SERVICE_NAMESPACE)
.attribute(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE, new ArrayList<String>(service.getInterfaces()))
.attributes(service.getServiceProperties())
.resource(resource)
.build());
}
for (ImportedService service : elements.getReferences()) {
StringBuilder builder = new StringBuilder();
String serviceInterface = service.getInterface();
String filter = service.getFilter();
if (serviceInterface != null && filter != null) {
builder.append("(&");
}
if (serviceInterface != null) {
builder.append('(')
.append(ServiceNamespace.CAPABILITY_OBJECTCLASS_ATTRIBUTE)
.append('=')
.append(serviceInterface)
.append(')');
}
if (filter != null)
builder.append(filter);
if (serviceInterface != null && filter != null) {
builder.append(')');
}
if (builder.length() > 0) {
model.requirements.add(new BasicRequirement.Builder()
.namespace(ServiceNamespace.SERVICE_NAMESPACE)
.directive(Namespace.REQUIREMENT_FILTER_DIRECTIVE, builder.toString())
.directive(
Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE,
service.isOptional() ? Namespace.RESOLUTION_OPTIONAL : Namespace.RESOLUTION_MANDATORY)
.directive(
Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE,
service.isMultiple() ? Namespace.CARDINALITY_MULTIPLE : Namespace.CARDINALITY_SINGLE)
.resource(resource)
.build());
}
}
return model;
} catch (ModellerException e) {
throw new SubsystemException(e);
}
}
static class ServiceModelImpl implements ServiceModel {
final List<Requirement> requirements = new ArrayList<Requirement>();
final List<Capability> capabilities = new ArrayList<Capability>();
@Override
public List<Requirement> getServiceRequirements() {
return requirements;
}
@Override
public List<Capability> getServiceCapabilities() {
return capabilities;
}
}
}