/**
  * Undeploys a contribution from a given bundle.
  *
  * <p>The path will be relative to the bundle root. Example: <code>
  * undeployContrib("org.nuxeo.ecm.core", "OSGI-INF/CoreExtensions.xml")
  * </code>
  *
  * @param name the bundle
  * @param contrib the contribution
  */
 @Override
 public void undeployContrib(String name, String contrib) throws Exception {
   RuntimeContext context = runtime.getContext(name);
   if (context == null) {
     context = runtime.getContext();
   }
   context.undeploy(contrib);
 }
 protected URL getUrlFromPath(String path, RuntimeContext extensionContext) {
   if (path == null) {
     return null;
   }
   URL url = null;
   try {
     url = new URL(path);
   } catch (MalformedURLException e) {
     url = extensionContext.getLocalResource(path);
     if (url == null) {
       url = extensionContext.getResource(path);
     }
   }
   return url;
 }
 /**
  * Deploys a contribution from a given bundle.
  *
  * <p>The path will be relative to the bundle root. Example: <code>
  * deployContrib("org.nuxeo.ecm.core", "OSGI-INF/CoreExtensions.xml")
  * </code>
  *
  * <p>For compatibility reasons the name of the bundle may be a jar name, but this use is
  * discouraged and deprecated.
  *
  * @param name the name of the bundle to peek the contrib in
  * @param contrib the path to contrib in the bundle.
  */
 @Override
 public void deployContrib(String name, String contrib) throws Exception {
   RuntimeContext context = runtime.getContext(name);
   if (context == null) {
     context = runtime.getContext();
     BundleFile file = lookupBundle(name);
     URL location = file.getEntry(contrib);
     if (location == null) {
       throw new AssertionError("Cannot locate " + contrib + " in " + name);
     }
     context.deploy(location);
     return;
   }
   context.deploy(contrib);
 }
 protected void loadComponents(Bundle bundle, RuntimeContext ctx) throws Exception {
   String list = getComponentsList(bundle);
   String name = bundle.getSymbolicName();
   log.debug("Bundle: " + name + " components: " + list);
   if (list == null) {
     return;
   }
   StringTokenizer tok = new StringTokenizer(list, ", \t\n\r\f");
   while (tok.hasMoreTokens()) {
     String path = tok.nextToken();
     URL url = bundle.getEntry(path);
     log.debug("Loading component for: " + name + " path: " + path + " url: " + url);
     if (url != null) {
       try {
         ctx.deploy(url);
       } catch (Exception e) {
         // just log error to know where is the cause of the
         // exception
         log.error("Error deploying resource: " + url);
         Framework.handleDevError(e);
         throw e;
       }
     } else {
       String message = "Unknown component '" + path + "' referenced by bundle '" + name + "'";
       log.error(message + ". Check the MANIFEST.MF");
       Framework.handleDevError(null);
       warnings.add(message);
     }
   }
 }
 public Script getScript() throws Exception {
   if (rc != null) {
     URL url = rc.getBundle().getEntry(script);
     if (url == null) {
       // if not found using bundle entries try using classloader
       // in a test environment bundle entries may not work
       url = rc.getResource(script);
       if (url == null) {
         throw new Exception("Script Not found: " + script);
       }
     }
     return Script.newScript(url);
   } else {
     return Script.newScript(script);
   }
 }
 public Bundle findHostBundle(Bundle bundle) {
   String hostId = (String) bundle.getHeaders().get(Constants.FRAGMENT_HOST);
   log.debug("Looking for host bundle: " + bundle.getSymbolicName() + " host id: " + hostId);
   if (hostId != null) {
     int p = hostId.indexOf(';');
     if (p > -1) { // remove version or other extra information if any
       hostId = hostId.substring(0, p);
     }
     RuntimeContext ctx = contexts.get(hostId);
     if (ctx != null) {
       log.debug("Context was found for host id: " + hostId);
       return ctx.getBundle();
     } else {
       log.warn("No context found for host id: " + hostId);
     }
   }
   return null;
 }
 @Override
 public boolean uninstallContribution(Contribution contrib) {
   boolean ret = isInstalled(contrib);
   try {
     ctx.undeploy(contrib);
   } catch (IOException e) {
     throw new RuntimeServiceException(e);
   }
   return ret;
 }
 @Override
 public synchronized boolean installContribution(Contribution contrib) {
   RegistrationInfo ri;
   try {
     ri = ctx.deploy(contrib);
   } catch (IOException e) {
     throw new RuntimeServiceException(e);
   }
   if (ri == null) {
     return false;
   }
   ri.setPersistent(true);
   return true;
 }
 public synchronized void destroyContext(Bundle bundle) {
   RuntimeContext ctx = contexts.remove(bundle.getSymbolicName());
   if (ctx != null) {
     ctx.destroy();
   }
 }
 @Override
 public boolean isInstalled(Contribution contrib) {
   return ctx.isDeployed(contrib);
 }
 protected void deploy(String path) throws Exception {
   URL location = TestService.class.getResource("/".concat(path));
   rc.deploy(location);
 }
 @After
 public void undeploy() {
   rc.destroy();
   rc = null;
 }