/*
* 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.karaf.features.internal.resolver;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.felix.utils.version.VersionRange;
import org.apache.felix.utils.version.VersionTable;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.resource.Capability;
import org.osgi.resource.Resource;
import static org.osgi.framework.namespace.IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE;
import static org.osgi.framework.namespace.IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE;
import static org.osgi.framework.namespace.IdentityNamespace.IDENTITY_NAMESPACE;
import static org.osgi.resource.Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE;
import static org.osgi.resource.Namespace.RESOLUTION_MANDATORY;
import static org.osgi.resource.Namespace.RESOLUTION_OPTIONAL;
import static org.osgi.service.repository.ContentNamespace.CAPABILITY_URL_ATTRIBUTE;
import static org.osgi.service.repository.ContentNamespace.CONTENT_NAMESPACE;
public final class ResourceUtils {
public static final String TYPE_SUBSYSTEM = "karaf.subsystem";
public static final String TYPE_FEATURE = "karaf.feature";
private ResourceUtils() {
}
public static String getType(Resource resource) {
List<Capability> caps = resource.getCapabilities(null);
for (Capability cap : caps) {
if (cap.getNamespace().equals(IDENTITY_NAMESPACE)) {
return cap.getAttributes().get(CAPABILITY_TYPE_ATTRIBUTE).toString();
}
}
return null;
}
// TODO: Correct name should probably be toUrl
public static String getUri(Resource resource) {
List<Capability> caps = resource.getCapabilities(null);
for (Capability cap : caps) {
if (cap.getNamespace().equals(CONTENT_NAMESPACE)) {
return cap.getAttributes().get(CAPABILITY_URL_ATTRIBUTE).toString();
}
}
return null;
}
public static String getFeatureId(Resource resource) {
List<Capability> caps = resource.getCapabilities(null);
for (Capability cap : caps) {
if (cap.getNamespace().equals(IDENTITY_NAMESPACE)) {
Map<String, Object> attributes = cap.getAttributes();
if (TYPE_FEATURE.equals(attributes.get(CAPABILITY_TYPE_ATTRIBUTE))) {
String name = (String) attributes.get(IDENTITY_NAMESPACE);
Version version = (Version) attributes.get(CAPABILITY_VERSION_ATTRIBUTE);
return version != null ? name + "/" + version : name;
}
}
}
return null;
}
public static RequirementImpl addIdentityRequirement(ResourceImpl resource, String name, String type, String range) {
return addIdentityRequirement(resource, name, type, range, true);
}
public static RequirementImpl addIdentityRequirement(ResourceImpl resource, String name, String type, String range, boolean mandatory) {
return addIdentityRequirement(resource, name, type, range != null ? new VersionRange(range) : null, mandatory);
}
public static RequirementImpl addIdentityRequirement(ResourceImpl resource, String name, String type, VersionRange range) {
return addIdentityRequirement(resource, name, type, range, true);
}
public static RequirementImpl addIdentityRequirement(ResourceImpl resource, String name, String type, VersionRange range, boolean mandatory) {
Map<String, String> dirs = new HashMap<>();
Map<String, Object> attrs = new HashMap<>();
if (!mandatory) {
dirs.put(REQUIREMENT_RESOLUTION_DIRECTIVE, RESOLUTION_OPTIONAL);
}
if (name != null) {
attrs.put(IDENTITY_NAMESPACE, name);
}
if (type != null) {
attrs.put(CAPABILITY_TYPE_ATTRIBUTE, type);
}
if (range != null) {
attrs.put(CAPABILITY_VERSION_ATTRIBUTE, range);
}
RequirementImpl requirement = new RequirementImpl(resource, IDENTITY_NAMESPACE, dirs, attrs);
resource.addRequirement(requirement);
return requirement;
}
public static void addIdentityRequirement(ResourceImpl resource, Resource required) {
addIdentityRequirement(resource, required, true);
}
public static void addIdentityRequirement(ResourceImpl resource, Resource required, boolean mandatory) {
for (Capability cap : required.getCapabilities(null)) {
if (cap.getNamespace().equals(IDENTITY_NAMESPACE)) {
Map<String, Object> attributes = cap.getAttributes();
Map<String, String> dirs = new HashMap<>();
dirs.put(REQUIREMENT_RESOLUTION_DIRECTIVE, mandatory ? RESOLUTION_MANDATORY : RESOLUTION_OPTIONAL);
Map<String, Object> attrs = new HashMap<>();
attrs.put(IDENTITY_NAMESPACE, attributes.get(IDENTITY_NAMESPACE));
attrs.put(CAPABILITY_TYPE_ATTRIBUTE, attributes.get(CAPABILITY_TYPE_ATTRIBUTE));
Version version = (Version) attributes.get(CAPABILITY_VERSION_ATTRIBUTE);
if (version != null) {
attrs.put(CAPABILITY_VERSION_ATTRIBUTE, new VersionRange(version, true));
}
resource.addRequirement(new RequirementImpl(resource, IDENTITY_NAMESPACE, dirs, attrs));
}
}
}
public static String toFeatureRequirement(String feature) {
String[] parts = feature.split("/");
Map<String, Object> attrs = new HashMap<>();
attrs.put(IDENTITY_NAMESPACE, parts[0]);
attrs.put(CAPABILITY_TYPE_ATTRIBUTE, TYPE_FEATURE);
if (parts.length > 1) {
attrs.put(CAPABILITY_VERSION_ATTRIBUTE, new VersionRange(parts[1]));
}
Map<String, String> dirs = new HashMap<>();
dirs.put(Constants.FILTER_DIRECTIVE, SimpleFilter.convert(attrs).toString());
return new RequirementImpl(null, IDENTITY_NAMESPACE, dirs, attrs).toString();
}
public static String toFeatureCapability(String feature) {
String[] parts = feature.split("/");
Map<String, String> dirs = new HashMap<>();
Map<String, Object> attrs = new HashMap<>();
attrs.put(IDENTITY_NAMESPACE, parts[0]);
attrs.put(CAPABILITY_TYPE_ATTRIBUTE, TYPE_FEATURE);
if (parts.length > 1) {
attrs.put(CAPABILITY_VERSION_ATTRIBUTE, VersionTable.getVersion(parts[1]));
}
return new CapabilityImpl(null, IDENTITY_NAMESPACE, dirs, attrs).toString();
}
}