/*
* Copyright 2009 Toni Menzel.
*
* 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.ops4j.pax.exam.raw.extender.intern;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.ops4j.pax.exam.ProbeInvoker;
import org.ops4j.pax.exam.ProbeInvokerFactory;
import org.ops4j.pax.swissbox.extender.ManifestEntry;
import org.ops4j.pax.swissbox.tracker.ServiceLookup;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Toni Menzel
* @since Jan 10, 2010
*/
public class Parser {
private static final Logger LOG = LoggerFactory.getLogger(Probe.class);
private final Probe[] probes;
public Parser(BundleContext ctx, String sigs, List<ManifestEntry> manifestEntries) {
List<String> signatures = new ArrayList<String>();
List<Probe> probeList = new ArrayList<Probe>();
signatures.addAll(Arrays.asList(sigs.split(",")));
for (ManifestEntry manifestEntry : manifestEntries) {
LOG.debug("Test " + manifestEntry.getKey() + " to be in " + sigs);
if (signatures.contains(manifestEntry.getKey())) {
probeList.add(make(ctx, manifestEntry.getKey(), manifestEntry.getValue()));
}
}
this.probes = probeList.toArray(new Probe[probeList.size()]);
}
private Probe make(BundleContext ctx, String sig, String expr) {
// should be a service really
// turn this expression into a service detail later
LOG.debug("Registering Service: " + ProbeInvoker.class.getName()
+ " with Probe-Signature=\"" + sig + "\" and expression=\"" + expr + "\"");
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("Probe-Signature", sig);
return new Probe(ProbeInvoker.class.getName(), createInvoker(ctx, expr), props);
}
private ProbeInvoker createInvoker(BundleContext ctx, String expr) {
String invokerType = System.getProperty("pax.exam.invoker");
if (invokerType == null) {
return new ProbeInvokerImpl(expr, ctx);
}
else {
Map<String, String> props = new HashMap<String, String>();
props.put("driver", invokerType);
ProbeInvokerFactory factory = ServiceLookup.getService(ctx, ProbeInvokerFactory.class,
props);
return factory.createProbeInvoker(ctx, expr);
}
}
public Probe[] getProbes() {
return probes;
}
}