Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2006, 2009 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: IBM Corporation - initial API and implementation /
 
 
 package org.eclipse.core.runtime.internal.adaptor;
 
 import java.net.URL;
 import java.util.*;
 
 	private static final boolean throwErrorOnFailedStart = "true".equals(FrameworkProperties.getProperty("osgi.compatibility.errorOnFailedStart""true")); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
 	private BaseAdaptor adaptor;
 	// holds the current activation trigger class and the ClasspathManagers that need to be activated
 	private ThreadLocal activationStack = new ThreadLocal();
 	// used to store exceptions that occurred while activating a bundle
 	// keyed by ClasspathManager->Exception
 	// WeakHashMap is used to prevent pinning the ClasspathManager objects.
 	private final Map errors = Collections.synchronizedMap(new WeakHashMap());
 
 	public void preFindLocalClass(String nameClasspathManager managerthrows ClassNotFoundException {
 		AbstractBundle bundle = (AbstractBundlemanager.getBaseData().getBundle();
 		// If the bundle is active, uninstalled or stopping then the bundle has already
 		// been initialized (though it may have been destroyed) so just return the class.
 		if ((bundle.getState() & (. | . | .)) != 0)
 			return;
 		// The bundle is not active and does not require activation, just return the class
 		if (!shouldActivateFor(namemanager.getBaseData(), storageHookmanager))
 			return;
 		if (stack == null) {
 			stack = new ArrayList(6);
 		}
 		// the first element in the stack is the name of the trigger class, 
 		// each element after the trigger class is a classpath manager 
 		// that must be activated after the trigger class has been defined (see postFindLocalClass)
 		int size = stack.size();
 		if (size > 1) {
 			for (int i = size - 1; i >= 1; i--)
 				if (manager == stack.get(i))
 					// the manager is already on the stack in which case we are already in the process of loading the trigger class
 					return;
 		}
 		Thread threadChangingState = bundle.getStateChanging();
 		if (bundle.getState() == . && threadChangingState == Thread.currentThread())
 			return// this thread is starting the bundle already
 		if (size == 0)
 			stack.add(name);
 		stack.add(manager);
 	}
 
 	public void postFindLocalClass(String nameClass clazzClasspathManager managerthrows ClassNotFoundException {
 		if (stack == null)
 			return;
 		int size = stack.size();
 		if (size <= 1 || stack.get(0) != name)
 			return;
 		// if we have a stack we must clear it even if (clazz == null)
 		ClasspathManager[] managers = null;
 		managers = new ClasspathManager[size - 1];
 		for (int i = 1; i < sizei++)
 			managers[i - 1] = (ClasspathManagerstack.get(i);
 		stack.clear();
 		if (clazz == null)
 			return;
 		for (int i = managers.length - 1; i >= 0; i--) {
 			if (.get(managers[i]) != null) {
 				continue;
 			}
			// The bundle must be started.
			// Note that another thread may already be starting this bundle;
			// In this case we will timeout after 5 seconds and record the BundleException
			try {
				// do not persist the start of this bundle
catch (BundleException e) {
				Bundle bundle = managers[i].getBaseData().getBundle();
				Throwable cause = e.getCause();
				if (cause != null && cause instanceof StatusException) {
					StatusException status = (StatusExceptioncause;
					if ((status.getStatusCode() & .) == 0) {
						if (status.getStatus() instanceof Thread) {
							String message = NLS.bind(.new Object[] {Thread.currentThread(), namestatus.getStatus(), bundlenew Integer(5000)});
						}
						continue;
					}
				}
				.put(managers[i], error);
					throw error;
				}
			}
		}
	}
	public void preFindLocalResource(String nameClasspathManager manager) {
		// do nothing
	}
	public void postFindLocalResource(String nameURL resourceClasspathManager manager) {
		// do nothing
	}
	public void recordClassDefine(String nameClass clazzbyte[] classbytesClasspathEntry classpathEntryBundleEntry entryClasspathManager manager) {
		// do nothing
	}
	private boolean shouldActivateFor(String classNameBaseData bundledataEclipseStorageHook storageHookClasspathManager managerthrows ClassNotFoundException {
		if (!isLazyStartable(classNamebundledatastorageHook))
			return false;
		//if (manager.getBaseClassLoader().getDelegate().isLazyTriggerSet())
		//	return false;
		// Don't activate non-starting bundles
		if (bundledata.getBundle().getState() == .) {
				if (error != null)
					throw error;
			}
			return (bundledata.getStatus() & .) != 0;
		}
		return true;
	}
	private boolean isLazyStartable(String classNameBaseData bundledataEclipseStorageHook storageHook) {
		if (storageHook == null)
			return false;
		boolean lazyStart = storageHook.isLazyStart();
		String[] excludes = storageHook.getLazyStartExcludes();
		String[] includes = storageHook.getLazyStartIncludes();
		// no exceptions, it is easy to figure it out
		if (excludes == null && includes == null)
			return lazyStart;
		// otherwise, we need to check if the package is in the exceptions list
		int dotPosition = className.lastIndexOf('.');
		// the class has no package name... no exceptions apply
		if (dotPosition == -1)
			return lazyStart;
		String packageName = className.substring(0, dotPosition);
		if (lazyStart)
			return ((includes == null || contains(includespackageName)) && (excludes == null || !contains(excludespackageName)));
		return (excludes != null && contains(excludespackageName));
	}
	private boolean contains(String[] arrayString element) {
		for (int i = 0; i < array.lengthi++)
			if (array[i].equals(element))
				return true;
		return false;
	}
	public void addHooks(HookRegistry hookRegistry) {
		hookRegistry.addClassLoadingStatsHook(this);
		hookRegistry.addAdaptorHook(this);
	}
	public void addProperties(Properties properties) {
		// do nothing
	}
		// do nothing
		return null;
	}
	public void frameworkStart(BundleContext contextthrows BundleException {
		// nothing
	}
	public void frameworkStop(BundleContext contextthrows BundleException {
		// nothing
	}
	public void frameworkStopping(BundleContext context) {
			return;
		Object[][] cycles = stateHelper.sortBundles(allBundles);
		logCycles(cycles);
	}
	public void handleRuntimeError(Throwable error) {
		// do nothing
	}
	public void initialize(BaseAdaptor baseAdaptor) {
		this. = baseAdaptor;
	}
		// do nothing
		return null;
	}
	private void logCycles(Object[][] cycles) {
		// log cycles
		if (cycles.length > 0) {
			StringBuffer cycleText = new StringBuffer("["); //$NON-NLS-1$			
			for (int i = 0; i < cycles.lengthi++) {
				cycleText.append('[');
				for (int j = 0; j < cycles[i].lengthj++) {
					cycleText.append(((BundleDescriptioncycles[i][j]).getSymbolicName());
					cycleText.append(',');
				}
				cycleText.insert(cycleText.length() - 1, ']');
			}
			cycleText.setCharAt(cycleText.length() - 1, ']');
		}
	}
	private static class TerminatingClassNotFoundException extends ClassNotFoundException implements StatusException {
		private static final long serialVersionUID = -6730732895632169173L;
		private Object cause;
			super(messagecause);
			this. = cause;
		}
		public Object getStatus() {
			return ;
		}
		public int getStatusCode() {
		}
	}
New to GrepCode? Check out our FAQ X