All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.osgi.service.indexer.impl.KnownBundleAnalyzer Maven / Gradle / Ivy

package org.osgi.service.indexer.impl;

import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

import org.osgi.framework.Version;
import org.osgi.service.indexer.Builder;
import org.osgi.service.indexer.Capability;
import org.osgi.service.indexer.Requirement;
import org.osgi.service.indexer.Resource;
import org.osgi.service.indexer.ResourceAnalyzer;
import org.osgi.service.indexer.impl.types.SymbolicName;
import org.osgi.service.indexer.impl.types.VersionRange;
import org.osgi.service.indexer.impl.util.OSGiHeader;

public class KnownBundleAnalyzer implements ResourceAnalyzer {

	private final Properties	defaultProperties;
	private Properties			extraProperties	= null;

	public KnownBundleAnalyzer() {
		defaultProperties = new Properties();
		InputStream stream = KnownBundleAnalyzer.class.getResourceAsStream("known-bundles.properties");
		if (stream != null) {
			try {
				defaultProperties.load(stream);
			} catch (IOException e) {
				// ignore
			} finally {
				try {
					stream.close();
				} catch (IOException e) {}
			}
		}
	}

	public KnownBundleAnalyzer(Properties properties) {
		this.defaultProperties = properties;
	}

	public void setKnownBundlesExtra(Properties extras) {
		this.extraProperties = extras;
	}

	public void analyzeResource(Resource resource, List caps, List reqs) throws Exception {
		SymbolicName resourceName;
		try {
			resourceName = Util.getSymbolicName(resource);
		} catch (IllegalArgumentException e) {
			// not a bundle, so return without analyzing
			return;
		}

		for (Enumeration< ? > names = defaultProperties.propertyNames(); names.hasMoreElements();) {
			String propName = (String) names.nextElement();
			processPropertyName(resource, caps, reqs, resourceName, propName, defaultProperties);
		}

		if (extraProperties != null)
			for (Enumeration< ? > names = extraProperties.propertyNames(); names.hasMoreElements();) {
				String propName = (String) names.nextElement();
				processPropertyName(resource, caps, reqs, resourceName, propName, extraProperties, defaultProperties);
			}
	}

	private static void processPropertyName(Resource resource, List caps, List reqs,
			SymbolicName resourceName, String name, Properties... propertiesList) throws IOException {
		String[] bundleRef = name.split(";");
		String bsn = bundleRef[0];

		if (resourceName.getName().equals(bsn)) {
			VersionRange versionRange = null;
			if (bundleRef.length > 1)
				versionRange = new VersionRange(bundleRef[1]);

			Version version = Util.getVersion(resource);
			if (versionRange == null || versionRange.match(version)) {
				processClause(name, Util.readProcessedProperty(name, propertiesList), caps, reqs);
			}
		}
	}

	private static enum IndicatorType {
		Capability("cap="), Requirement("req=");

		String prefix;

		IndicatorType(String prefix) {
			this.prefix = prefix;
		}

		public String getPrefix() {
			return prefix;
		}
	}

	private static void processClause(String bundleRef, String clauseStr, List caps,
			List reqs) {
		Map> header = OSGiHeader.parseHeader(clauseStr);

		for (Entry> entry : header.entrySet()) {
			String indicator = OSGiHeader.removeDuplicateMarker(entry.getKey());
			IndicatorType type;

			String namespace;
			if (indicator.startsWith(IndicatorType.Capability.getPrefix())) {
				type = IndicatorType.Capability;
				namespace = indicator.substring(IndicatorType.Capability.getPrefix().length());
			} else if (indicator.startsWith(IndicatorType.Requirement.getPrefix())) {
				type = IndicatorType.Requirement;
				namespace = indicator.substring(IndicatorType.Requirement.getPrefix().length());
			} else {
				throw new IllegalArgumentException(MessageFormat.format(
						"Invalid indicator format in known-bundle parsing for bundle  \"{0}\", expected cap=namespace or req=namespace, found \"{1}\".",
						bundleRef, indicator));
			}

			Builder builder = new Builder().setNamespace(namespace);

			Map attribs = entry.getValue();
			Util.copyAttribsToBuilder(builder, attribs);

			if (type == IndicatorType.Capability)
				caps.add(builder.buildCapability());
			else if (type == IndicatorType.Requirement)
				reqs.add(builder.buildRequirement());
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy