blob: c6c20b9ce7f9a8e6ffd71b61377be6afa9ea39d1 [file] [log] [blame]
/*
* 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.resolver.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.felix.resolver.Logger;
import org.apache.felix.resolver.ResolverImpl;
import org.apache.felix.resolver.test.util.BundleCapability;
import org.apache.felix.resolver.test.util.BundleRequirement;
import org.apache.felix.resolver.test.util.GenericCapability;
import org.apache.felix.resolver.test.util.GenericRequirement;
import org.apache.felix.resolver.test.util.PackageCapability;
import org.apache.felix.resolver.test.util.PackageRequirement;
import org.apache.felix.resolver.test.util.ResolveContextImpl;
import org.apache.felix.resolver.test.util.ResourceImpl;
import org.osgi.framework.Version;
import org.osgi.framework.namespace.BundleNamespace;
import org.osgi.framework.namespace.HostNamespace;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.framework.namespace.PackageNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Namespace;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import org.osgi.resource.Wire;
import org.osgi.resource.Wiring;
import org.osgi.service.resolver.ResolutionException;
import org.osgi.service.resolver.Resolver;
public class Main
{
public static void main(String[] args) throws ResolutionException
{
Resolver resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG));
Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
List<Resource> mandatory;
ResolveContextImpl rci;
Map<Resource, List<Wire>> wireMap;
System.out.println("\nSCENARIO 1\n");
mandatory = populateScenario1(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
wireMap = resolver.resolve(rci);
System.out.println("RESULT " + wireMap);
System.out.println("\nSCENARIO 2\n");
mandatory = populateScenario2(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
wireMap = resolver.resolve(rci);
System.out.println("RESULT " + wireMap);
System.out.println("\nSCENARIO 3\n");
mandatory = populateScenario3(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
wireMap = resolver.resolve(rci);
System.out.println("RESULT " + wireMap);
System.out.println("\nSCENARIO 4\n");
mandatory = populateScenario4(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
try
{
wireMap = resolver.resolve(rci);
System.err.println("UNEXPECTED RESULT " + wireMap);
}
catch (ResolutionException e)
{
System.out.println("EXPECTED ResolutionException:");
e.printStackTrace(System.out);
}
System.out.println("\nSCENARIO 5\n");
mandatory = populateScenario5(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
try
{
wireMap = resolver.resolve(rci);
System.err.println("UNEXPECTED RESULT " + wireMap);
}
catch (ResolutionException e)
{
System.out.println("EXPECTED ResolutionException:");
e.printStackTrace(System.out);
}
System.out.println("\nSCENARIO 6\n");
mandatory = populateScenario6(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
wireMap = resolver.resolve(rci);
System.out.println("RESULT " + wireMap);
System.out.println("\nSCENARIO 7\n");
mandatory = populateScenario7(wirings, candMap);
rci = new ResolveContextImpl(wirings, candMap, mandatory, Collections.EMPTY_LIST);
wireMap = resolver.resolve(rci);
System.out.println("RESULT " + wireMap);
}
private static List<Resource> populateScenario1(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
ResourceImpl exporter = new ResourceImpl("A");
exporter.addCapability(new PackageCapability(exporter, "foo"));
ResourceImpl importer = new ResourceImpl("B");
importer.addRequirement(new PackageRequirement(importer, "foo"));
candMap.put(
importer.getRequirements(null).get(0),
exporter.getCapabilities(PackageNamespace.PACKAGE_NAMESPACE));
List<Resource> resources = new ArrayList<Resource>();
resources.add(importer);
return resources;
}
private static List<Resource> populateScenario2(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
List<Capability> fooCands = new ArrayList<Capability>();
List<Capability> barCands = new ArrayList<Capability>();
// A
ResourceImpl a = new ResourceImpl("A");
PackageCapability p = new PackageCapability(a, "foo");
a.addCapability(p);
fooCands.add(p);
// B
ResourceImpl b = new ResourceImpl("B");
p = new PackageCapability(b, "foo");
b.addCapability(p);
fooCands.add(p);
p = new PackageCapability(b, "bar");
p.addDirective(PackageNamespace.CAPABILITY_USES_DIRECTIVE, "foo");
b.addCapability(p);
barCands.add(p);
// C
ResourceImpl c = new ResourceImpl("C");
Requirement r = new PackageRequirement(c, "foo");
c.addRequirement(r);
candMap.put(r, fooCands);
r = new PackageRequirement(c, "bar");
c.addRequirement(r);
candMap.put(r, barCands);
// Mandatory resources
List<Resource> resources = new ArrayList<Resource>();
resources.add(c);
return resources;
}
private static List<Resource> populateScenario3(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
List<Capability> resourcesCands = new ArrayList<Capability>();
List<Capability> dResourcesCands = new ArrayList<Capability>();
List<Capability> eBundleDCands = new ArrayList<Capability>();
List<Capability> eResourcesCands = new ArrayList<Capability>();
// B
ResourceImpl b = new ResourceImpl("B");
PackageCapability pc = new PackageCapability(b, "resources");
b.addCapability(pc);
eResourcesCands.add(pc);
// C
ResourceImpl c = new ResourceImpl("C");
pc = new PackageCapability(c, "resources");
c.addCapability(pc);
eResourcesCands.add(pc);
dResourcesCands.add(pc);
// D
ResourceImpl d = new ResourceImpl("D");
pc = new PackageCapability(d, "export");
pc.addDirective(Namespace.CAPABILITY_USES_DIRECTIVE, "resources");
d.addCapability(pc);
BundleCapability bc = new BundleCapability(d, "D");
bc.addDirective(Namespace.CAPABILITY_USES_DIRECTIVE, "resources");
d.addCapability(bc);
eBundleDCands.add(bc);
Requirement r = new PackageRequirement(d, "resources");
d.addRequirement(r);
candMap.put(r, dResourcesCands);
// E
ResourceImpl e = new ResourceImpl("E");
r = new BundleRequirement(e, "D");
e.addRequirement(r);
candMap.put(r, eBundleDCands);
r = new PackageRequirement(e, "resources");
e.addRequirement(r);
candMap.put(r, eResourcesCands);
// Mandatory resources
List<Resource> resources = new ArrayList<Resource>();
resources.add(e);
return resources;
}
private static List<Resource> populateScenario4(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
ResourceImpl a = new ResourceImpl("A");
a.addRequirement(new BundleRequirement(a, "B"));
a.addRequirement(new BundleRequirement(a, "C"));
ResourceImpl b = new ResourceImpl("B");
b.addCapability(new BundleCapability(b, "B"));
b.addCapability(new PackageCapability(b, "p1"));
ResourceImpl c = new ResourceImpl("C");
c.addRequirement(new BundleRequirement(c, "D"));
c.addCapability(new BundleCapability(c, "C"));
PackageCapability p2 = new PackageCapability(c, "p2");
p2.addDirective(Namespace.CAPABILITY_USES_DIRECTIVE, "p1");
c.addCapability(p2);
ResourceImpl d = new ResourceImpl("D");
d.addCapability(new BundleCapability(d, "D"));
d.addCapability(new PackageCapability(d, "p1"));
candMap.put(
a.getRequirements(null).get(0),
b.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
a.getRequirements(null).get(1),
c.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
c.getRequirements(null).get(0),
d.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
List<Resource> resources = new ArrayList<Resource>();
resources.add(a);
return resources;
}
private static List<Resource> populateScenario5(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
ResourceImpl x = new ResourceImpl("X");
x.addRequirement(new BundleRequirement(x, "A"));
ResourceImpl a = new ResourceImpl("A");
a.addCapability(new BundleCapability(a, "A"));
a.addRequirement(new BundleRequirement(a, "B"));
a.addRequirement(new BundleRequirement(a, "C"));
ResourceImpl b = new ResourceImpl("B");
b.addCapability(new BundleCapability(b, "B"));
b.addCapability(new PackageCapability(b, "p1"));
ResourceImpl c = new ResourceImpl("C");
c.addRequirement(new BundleRequirement(c, "D"));
c.addCapability(new BundleCapability(c, "C"));
PackageCapability p2 = new PackageCapability(c, "p2");
p2.addDirective(Namespace.CAPABILITY_USES_DIRECTIVE, "p1");
c.addCapability(p2);
ResourceImpl d = new ResourceImpl("D");
d.addCapability(new BundleCapability(d, "D"));
d.addCapability(new PackageCapability(d, "p1"));
candMap.put(
x.getRequirements(null).get(0),
a.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
a.getRequirements(null).get(0),
b.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
a.getRequirements(null).get(1),
c.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
c.getRequirements(null).get(0),
d.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
List<Resource> resources = new ArrayList<Resource>();
resources.add(x);
return resources;
}
private static List<Resource> populateScenario6(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
ResourceImpl a1 = new ResourceImpl("A");
a1.addRequirement(new PackageRequirement(a1, "p1"));
a1.addRequirement(new PackageRequirement(a1, "p2"));
Requirement a1Req = new GenericRequirement(a1, "generic");
a1Req.getDirectives().put(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE, Namespace.CARDINALITY_MULTIPLE);
a1.addRequirement(a1Req);
ResourceImpl a2 = new ResourceImpl("A");
a2.addRequirement(new BundleRequirement(a2, "B"));
a2.addRequirement(new BundleRequirement(a2, "C"));
Requirement a2Req = new GenericRequirement(a2, "generic");
a2Req.getDirectives().put(Namespace.REQUIREMENT_CARDINALITY_DIRECTIVE, Namespace.CARDINALITY_MULTIPLE);
a2.addRequirement(a2Req);
ResourceImpl b1 = new ResourceImpl("B");
b1.addCapability(new BundleCapability(b1, "B"));
Capability b1_p2 = new PackageCapability(b1, "p2");
b1_p2.getDirectives().put(Namespace.CAPABILITY_USES_DIRECTIVE, "p1");
b1.addCapability(b1_p2);
b1.addRequirement(new PackageRequirement(b1, "p1"));
ResourceImpl b2 = new ResourceImpl("B");
b2.addCapability(new BundleCapability(b2, "B"));
Capability b2_p2 = new PackageCapability(b2, "p2");
b2_p2.getDirectives().put(Namespace.CAPABILITY_USES_DIRECTIVE, "p1");
b2.addCapability(b2_p2);
b2.addRequirement(new PackageRequirement(b2, "p1"));
ResourceImpl c1 = new ResourceImpl("C");
c1.addCapability(new BundleCapability(c1, "C"));
Capability c1_p1 = new PackageCapability(c1, "p1");
ResourceImpl c2 = new ResourceImpl("C");
c2.addCapability(new BundleCapability(c2, "C"));
Capability c2_p1 = new PackageCapability(c2, "p1");
ResourceImpl d1 = new ResourceImpl("D");
GenericCapability d1_generic = new GenericCapability(d1, "generic");
d1_generic.addDirective(Namespace.CAPABILITY_USES_DIRECTIVE, "p1,p2");
d1.addCapability(d1_generic);
d1.addRequirement(new PackageRequirement(d1, "p1"));
d1.addRequirement(new PackageRequirement(d1, "p2"));
ResourceImpl d2 = new ResourceImpl("D");
GenericCapability d2_generic = new GenericCapability(d2, "generic");
d2_generic.addDirective(Namespace.CAPABILITY_USES_DIRECTIVE, "p1,p2");
d2.addCapability(d2_generic);
d2.addRequirement(new PackageRequirement(d2, "p1"));
d2.addRequirement(new PackageRequirement(d2, "p2"));
candMap.put(
a1.getRequirements(null).get(0),
Arrays.asList(c2_p1));
candMap.put(
a1.getRequirements(null).get(1),
Arrays.asList(b2_p2));
candMap.put(
a1.getRequirements(null).get(2),
Arrays.asList((Capability) d1_generic, (Capability) d2_generic));
candMap.put(
a2.getRequirements(null).get(0),
c2.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
a2.getRequirements(null).get(1),
b2.getCapabilities(BundleNamespace.BUNDLE_NAMESPACE));
candMap.put(
a2.getRequirements(null).get(2),
Arrays.asList((Capability) d1_generic, (Capability) d2_generic));
candMap.put(
b1.getRequirements(null).get(0),
Arrays.asList(c1_p1, c2_p1));
candMap.put(
b2.getRequirements(null).get(0),
Arrays.asList(c1_p1, c2_p1));
candMap.put(
d1.getRequirements(null).get(0),
Arrays.asList(c1_p1, c2_p1));
candMap.put(
d1.getRequirements(null).get(1),
Arrays.asList(b1_p2, b2_p2));
candMap.put(
d2.getRequirements(null).get(0),
Arrays.asList(c1_p1, c2_p1));
candMap.put(
d2.getRequirements(null).get(1),
Arrays.asList(b1_p2, b2_p2));
List<Resource> resources = new ArrayList<Resource>();
resources.add(a1);
resources.add(a2);
return resources;
}
private static List<Resource> populateScenario7(
Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap)
{
wirings.clear();
candMap.clear();
ResourceImpl a1 = new ResourceImpl("A");
GenericCapability a1_hostCap = new GenericCapability(a1, HostNamespace.HOST_NAMESPACE);
a1_hostCap.addAttribute(HostNamespace.HOST_NAMESPACE, "A");
a1.addCapability(a1_hostCap);
ResourceImpl f1 = new ResourceImpl("F1", IdentityNamespace.TYPE_FRAGMENT, Version.emptyVersion);
GenericRequirement f1_hostReq = new GenericRequirement(f1, HostNamespace.HOST_NAMESPACE);
f1_hostReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(" + HostNamespace.HOST_NAMESPACE + "=A)");
f1.addRequirement(f1_hostReq);
ResourceImpl f2 = new ResourceImpl("F2", IdentityNamespace.TYPE_FRAGMENT, Version.emptyVersion);
GenericRequirement f2_hostReq = new GenericRequirement(f2, HostNamespace.HOST_NAMESPACE);
f2_hostReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(" + HostNamespace.HOST_NAMESPACE + "=A)");
f2.addRequirement(f2_hostReq);
ResourceImpl b1 = new ResourceImpl("B");
GenericRequirement b1_identityReq = new GenericRequirement(f2, IdentityNamespace.IDENTITY_NAMESPACE);
b1_identityReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(" + IdentityNamespace.IDENTITY_NAMESPACE + "=F2)");
b1.addRequirement(b1_identityReq);
candMap.put(
f1.getRequirements(null).get(0),
a1.getCapabilities(HostNamespace.HOST_NAMESPACE));
candMap.put(
f2.getRequirements(null).get(0),
a1.getCapabilities(HostNamespace.HOST_NAMESPACE));
candMap.put(
b1.getRequirements(null).get(0),
f2.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE));
List<Resource> resources = new ArrayList<Resource>();
resources.add(a1);
resources.add(f1);
resources.add(f2);
resources.add(b1);
return resources;
}
}