• Intro Headers Instructions Macros Commands
Fork me on GitHub
    • Getting Started
      • How to install bnd
      • Guided Tour
      • Guided Tour Workspace & Projects
      • FAQ - Frequently Asked Questions
    • Concepts and Practices
      • Introduction
      • Concepts
      • Best practices
    • Build and Development
      • Project Setup
      • Generating JARs
      • Versioning
      • Baselining
      • Service Components
      • Metatype
      • Contracts
      • Bundle Annotations
      • Accessor Properties
      • SPI Annotations
    • Dependency and Launching
      • Resolving Dependencies
      • Launching
      • Startlevels
    • Testing
      • Testing
      • Testing with Launchpad
    • Packaging and Distribution
      • Packaging Applications
      • JPMS Libraries
      • Wrapping Libraries to OSGi Bundles
    • Documentation and Tools
      • Generating Documentation
      • Commands
      • For Developers
      • Templates for Workspaces
      • Tips for Windows users
      • Tools bound to bnd
    • Reference Material
      • Reference
      • Headers
      • Instruction Reference
      • Instruction Index
      • Macro Reference
      • Macro Index
      • Plugins
      • External Plugins
    • Configuration and Troubleshooting
      • Settings
      • Errors
      • Warnings
  • Require-Capability ::= requirement ( ',' requirement )*
    Header

    Specifies that a bundle requires other bundles to provide a capability

    			Parameters requirements = new Parameters(annotationHeaders.getHeader(REQUIRE_CAPABILITY));
    		Parameters capabilities = new Parameters(annotationHeaders.getHeader(PROVIDE_CAPABILITY));
    
    		//
    		// Do any contracts contracts
    		//
    		contracts.addToRequirements(requirements);
    
    		//
    		// We want to add the minimum EE as a requirement
    		// based on the class version
    		//
    
    		if (!isTrue(getProperty(NOEE)) //
    				&& !ees.isEmpty() // no use otherwise
    				&& since(About._2_3) // we want people to not have to
    										// automatically add it
    				&& !requirements.containsKey(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE) // and
    																											// it
    																											// should
    																											// not
    																											// be
    																											// there
    																											// already
    		) {
    
    			JAVA highest = ees.last();
    			Attrs attrs = new Attrs();
    
    			String filter = doEEProfiles(highest);
    
    			attrs.put(Constants.FILTER_DIRECTIVE, filter);
    
    			//
    			// Java 1.8 introduced profiles.
    			// If -eeprofile= auto | (<profile>="...")+ is set then
    			// we add a
    
    			requirements.add(ExecutionEnvironmentNamespace.EXECUTION_ENVIRONMENT_NAMESPACE, attrs);
    		}
    
    		if (!requirements.isEmpty())
    			main.putValue(REQUIRE_CAPABILITY, requirements.toString());
    
    
    	/*
     * Require-Capability header
     */
    private void doRequireCapability(RequireCapability annotation) {
    	StringBuilder sb = new StringBuilder(annotation.ns());
    	if (annotation.filter() != null)
    		sb.append(";filter:='").append(annotation.filter()).append("'");
    	if (annotation.effective() != null)
    		sb.append(";effective:='").append(annotation.effective()).append("'");
    	if (annotation.resolution() != null)
    		sb.append(";resolution:='").append(annotation.resolution()).append("'");
    
    	if (annotation.value() != null)
    		sb.append(";").append(annotation.value());
    
    	add(Constants.REQUIRE_CAPABILITY, sb.toString());
    }
    
    
    package aQute.bnd.annotation.headers;
    
    	import java.lang.annotation.*;
    	
    	/**
    	 * The Bundle’s Require-Capability header
    	 * 
    	 * {@link About}
    	 */
    	@Retention(RetentionPolicy.CLASS)
    	@Target({
    			ElementType.ANNOTATION_TYPE, ElementType.TYPE
    	})
    	public @interface RequireCapability {
    		String value() default "";
    	
    		/**
    		 * The capability namespace. For example: {@code osgi.contract}.
    		 */
    		String ns();
    	
    		/**
    		 * Specifies the time a Requirement is considered, either 'resolve'
    		 * (default) or another name. The OSGi framework resolver only considers
    		 * Requirements without an effective directive or effective:=resolve. Other
    		 * Requirements can be considered by an external agent. Additional names for
    		 * the effective directive should be registered with the OSGi Alliance. See
    		 * <a href="https://www.osgi.org/developer/specifications/reference/">OSGi Reference
    		 * Page</a>
    		 */
    		String effective() default "resolve";
    	
    		/**
    		 * A filter expression that is asserted on the Capabilities belonging to the
    		 * given namespace. The matching of the filter against the Capability is
    		 * done on one Capability at a time. A filter like {@code (&(a=1)(b=2))}
    		 * matches only a Capability that specifies both attributes at the required
    		 * value, not two capabilties that each specify one of the attributes
    		 * correctly. A filter is optional, if no filter directive is specified the
    		 * Requirement always matches.
    		 */
    		String filter();
    	
    		/**
    		 * A mandatory Requirement forbids the bundle to resolve when the
    		 * Requirement is not satisfied; an optional Requirement allows a bundle to
    		 * resolve even if the Requirement is not satisfied. No wirings are created
    		 * when this Requirement cannot be resolved, this can result in Class Not
    		 * Found Exceptions when the bundle attempts to use a package that was not
    		 * resolved because it was optional.
    		 */
    		Resolution resolution() default Resolution.mandatory;
    	
    	}
    	
    	
    		private void verifyRequirements() {
    	Parameters map = parseHeader(manifest.getMainAttributes().getValue(Constants.REQUIRE_CAPABILITY));
    	for (String key : map.keySet()) {
    		Attrs attrs = map.get(key);
    		verify(attrs, "filter:", FILTERPATTERN, false, "Requirement %s filter not correct", key);
    
    		String filter = attrs.get("filter:");
    		if (filter != null) {
    			String verify = new Filter(filter).verify();
    			if (verify != null)
    				error("Invalid filter syntax in requirement %s=%s. Reason %s", key, attrs, verify);
    		}
    		verify(attrs, "cardinality:", CARDINALITY_PATTERN, false, "Requirement %s cardinality not correct", key);
    		verify(attrs, "resolution:", RESOLUTION_PATTERN, false, "Requirement %s resolution not correct", key);
    
    		if (key.equals("osgi.extender")) {
    			// No requirements on extender
    		} else if (key.equals("osgi.serviceloader")) {
    			verify(attrs, "register:", PACKAGEPATTERN, false,
    					"Service Loader extender register: directive not a fully qualified Java name");
    		} else if (key.equals("osgi.contract")) {
    
    		} else if (key.equals("osgi.service")) {
    
    		} else if (key.equals("osgi.ee")) {
    
    		} else if (key.startsWith("osgi.wiring.") || key.startsWith("osgi.identity")) {
    			error("osgi.wiring.* namespaces must not be specified with generic requirements/capabilities");
    		}
    
    		verifyAttrs(attrs);
    
    		if (attrs.containsKey("mandatory:"))
    			error("mandatory: directive is intended for Capabilities, not Requirement %s", key);
    
    		if (attrs.containsKey("uses:"))
    			error("uses: directive is intended for Capabilities, not Requirement %s", key);
    	}
    }
    
Search
    • Home