#Signature file v4.1
#Version 2.86

CLSS public java.awt.datatransfer.Clipboard
cons public init(java.lang.String)
fld protected java.awt.datatransfer.ClipboardOwner owner
fld protected java.awt.datatransfer.Transferable contents
meth public boolean isDataFlavorAvailable(java.awt.datatransfer.DataFlavor)
meth public java.awt.datatransfer.DataFlavor[] getAvailableDataFlavors()
meth public java.awt.datatransfer.FlavorListener[] getFlavorListeners()
meth public java.awt.datatransfer.Transferable getContents(java.lang.Object)
meth public java.lang.Object getData(java.awt.datatransfer.DataFlavor) throws java.awt.datatransfer.UnsupportedFlavorException,java.io.IOException
meth public java.lang.String getName()
meth public void addFlavorListener(java.awt.datatransfer.FlavorListener)
meth public void removeFlavorListener(java.awt.datatransfer.FlavorListener)
meth public void setContents(java.awt.datatransfer.Transferable,java.awt.datatransfer.ClipboardOwner)
supr java.lang.Object
hfds currentDataFlavors,flavorListeners,name

CLSS public abstract interface java.awt.datatransfer.FlavorListener
intf java.util.EventListener
meth public abstract void flavorsChanged(java.awt.datatransfer.FlavorEvent)

CLSS public abstract interface java.awt.event.AWTEventListener
intf java.util.EventListener
meth public abstract void eventDispatched(java.awt.AWTEvent)

CLSS public java.io.IOException
cons public init()
cons public init(java.lang.String)
cons public init(java.lang.String,java.lang.Throwable)
cons public init(java.lang.Throwable)
supr java.lang.Exception
hfds serialVersionUID

CLSS public abstract interface java.io.Serializable

CLSS public abstract java.lang.ClassLoader
cons protected init()
cons protected init(java.lang.ClassLoader)
meth protected final java.lang.Class<?> defineClass(byte[],int,int)
 anno 0 java.lang.Deprecated()
meth protected final java.lang.Class<?> defineClass(java.lang.String,byte[],int,int)
meth protected final java.lang.Class<?> defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
meth protected final java.lang.Class<?> defineClass(java.lang.String,java.nio.ByteBuffer,java.security.ProtectionDomain)
meth protected final java.lang.Class<?> findLoadedClass(java.lang.String)
meth protected final java.lang.Class<?> findSystemClass(java.lang.String) throws java.lang.ClassNotFoundException
meth protected final void resolveClass(java.lang.Class<?>)
meth protected final void setSigners(java.lang.Class<?>,java.lang.Object[])
meth protected java.lang.Class<?> findClass(java.lang.String) throws java.lang.ClassNotFoundException
meth protected java.lang.Class<?> loadClass(java.lang.String,boolean) throws java.lang.ClassNotFoundException
meth protected java.lang.Object getClassLoadingLock(java.lang.String)
meth protected java.lang.Package definePackage(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.net.URL)
meth protected java.lang.Package getPackage(java.lang.String)
meth protected java.lang.Package[] getPackages()
meth protected java.lang.String findLibrary(java.lang.String)
meth protected java.net.URL findResource(java.lang.String)
meth protected java.util.Enumeration<java.net.URL> findResources(java.lang.String) throws java.io.IOException
meth protected static boolean registerAsParallelCapable()
meth public final java.lang.ClassLoader getParent()
meth public java.io.InputStream getResourceAsStream(java.lang.String)
meth public java.lang.Class<?> loadClass(java.lang.String) throws java.lang.ClassNotFoundException
meth public java.net.URL getResource(java.lang.String)
meth public java.util.Enumeration<java.net.URL> getResources(java.lang.String) throws java.io.IOException
meth public static java.io.InputStream getSystemResourceAsStream(java.lang.String)
meth public static java.lang.ClassLoader getSystemClassLoader()
meth public static java.net.URL getSystemResource(java.lang.String)
meth public static java.util.Enumeration<java.net.URL> getSystemResources(java.lang.String) throws java.io.IOException
meth public void clearAssertionStatus()
meth public void setClassAssertionStatus(java.lang.String,boolean)
meth public void setDefaultAssertionStatus(boolean)
meth public void setPackageAssertionStatus(java.lang.String,boolean)
supr java.lang.Object
hfds assertionLock,classAssertionStatus,classes,defaultAssertionStatus,defaultDomain,loadedLibraryNames,nativeLibraries,nativeLibraryContext,nocerts,package2certs,packageAssertionStatus,packages,parallelLockMap,parent,scl,sclSet,sys_paths,systemNativeLibraries,usr_paths
hcls NativeLibrary,ParallelLoaders

CLSS public java.lang.Exception
cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
cons public init()
cons public init(java.lang.String)
cons public init(java.lang.String,java.lang.Throwable)
cons public init(java.lang.Throwable)
supr java.lang.Throwable
hfds serialVersionUID

CLSS public java.lang.Object
cons public init()
meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected void finalize() throws java.lang.Throwable
meth public boolean equals(java.lang.Object)
meth public final java.lang.Class<?> getClass()
meth public final void notify()
meth public final void notifyAll()
meth public final void wait() throws java.lang.InterruptedException
meth public final void wait(long) throws java.lang.InterruptedException
meth public final void wait(long,int) throws java.lang.InterruptedException
meth public int hashCode()
meth public java.lang.String toString()

CLSS public java.lang.SecurityManager
cons public init()
fld protected boolean inCheck
 anno 0 java.lang.Deprecated()
meth protected boolean inClass(java.lang.String)
 anno 0 java.lang.Deprecated()
meth protected boolean inClassLoader()
 anno 0 java.lang.Deprecated()
meth protected int classDepth(java.lang.String)
 anno 0 java.lang.Deprecated()
meth protected int classLoaderDepth()
 anno 0 java.lang.Deprecated()
meth protected java.lang.Class<?> currentLoadedClass()
 anno 0 java.lang.Deprecated()
meth protected java.lang.ClassLoader currentClassLoader()
 anno 0 java.lang.Deprecated()
meth protected java.lang.Class[] getClassContext()
meth public boolean checkTopLevelWindow(java.lang.Object)
 anno 0 java.lang.Deprecated()
meth public boolean getInCheck()
 anno 0 java.lang.Deprecated()
meth public java.lang.Object getSecurityContext()
meth public java.lang.ThreadGroup getThreadGroup()
meth public void checkAccept(java.lang.String,int)
meth public void checkAccess(java.lang.Thread)
meth public void checkAccess(java.lang.ThreadGroup)
meth public void checkAwtEventQueueAccess()
 anno 0 java.lang.Deprecated()
meth public void checkConnect(java.lang.String,int)
meth public void checkConnect(java.lang.String,int,java.lang.Object)
meth public void checkCreateClassLoader()
meth public void checkDelete(java.lang.String)
meth public void checkExec(java.lang.String)
meth public void checkExit(int)
meth public void checkLink(java.lang.String)
meth public void checkListen(int)
meth public void checkMemberAccess(java.lang.Class<?>,int)
 anno 0 java.lang.Deprecated()
meth public void checkMulticast(java.net.InetAddress)
meth public void checkMulticast(java.net.InetAddress,byte)
 anno 0 java.lang.Deprecated()
meth public void checkPackageAccess(java.lang.String)
meth public void checkPackageDefinition(java.lang.String)
meth public void checkPermission(java.security.Permission)
meth public void checkPermission(java.security.Permission,java.lang.Object)
meth public void checkPrintJobAccess()
meth public void checkPropertiesAccess()
meth public void checkPropertyAccess(java.lang.String)
meth public void checkRead(java.io.FileDescriptor)
meth public void checkRead(java.lang.String)
meth public void checkRead(java.lang.String,java.lang.Object)
meth public void checkSecurityAccess(java.lang.String)
meth public void checkSetFactory()
meth public void checkSystemClipboardAccess()
 anno 0 java.lang.Deprecated()
meth public void checkWrite(java.io.FileDescriptor)
meth public void checkWrite(java.lang.String)
supr java.lang.Object
hfds initialized,packageAccess,packageAccessLock,packageAccessValid,packageDefinition,packageDefinitionLock,packageDefinitionValid,rootGroup

CLSS public java.lang.Throwable
cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
cons public init()
cons public init(java.lang.String)
cons public init(java.lang.String,java.lang.Throwable)
cons public init(java.lang.Throwable)
intf java.io.Serializable
meth public final java.lang.Throwable[] getSuppressed()
meth public final void addSuppressed(java.lang.Throwable)
meth public java.lang.StackTraceElement[] getStackTrace()
meth public java.lang.String getLocalizedMessage()
meth public java.lang.String getMessage()
meth public java.lang.String toString()
meth public java.lang.Throwable fillInStackTrace()
meth public java.lang.Throwable getCause()
meth public java.lang.Throwable initCause(java.lang.Throwable)
meth public void printStackTrace()
meth public void printStackTrace(java.io.PrintStream)
meth public void printStackTrace(java.io.PrintWriter)
meth public void setStackTrace(java.lang.StackTraceElement[])
supr java.lang.Object
hfds CAUSE_CAPTION,EMPTY_THROWABLE_ARRAY,NULL_CAUSE_MESSAGE,SELF_SUPPRESSION_MESSAGE,SUPPRESSED_CAPTION,SUPPRESSED_SENTINEL,UNASSIGNED_STACK,backtrace,cause,detailMessage,serialVersionUID,stackTrace,suppressedExceptions
hcls PrintStreamOrWriter,SentinelHolder,WrappedPrintStream,WrappedPrintWriter

CLSS public abstract interface java.net.URLStreamHandlerFactory
meth public abstract java.net.URLStreamHandler createURLStreamHandler(java.lang.String)

CLSS public abstract interface java.util.EventListener

CLSS public abstract interface org.netbeans.ArchiveResources
meth public abstract byte[] resource(java.lang.String) throws java.io.IOException
meth public abstract java.lang.String getIdentifier()

CLSS public abstract org.netbeans.CLIHandler
cons protected init(int)
fld public final static int WHEN_BOOT = 1
fld public final static int WHEN_EXTRA = 3
fld public final static int WHEN_INIT = 2
innr public final static Args
meth protected abstract int cli(org.netbeans.CLIHandler$Args)
meth protected abstract void usage(java.io.PrintWriter)
meth protected static int notifyHandlers(org.netbeans.CLIHandler$Args,java.util.Collection<? extends org.netbeans.CLIHandler>,int,boolean,boolean)
meth protected static void showHelp(java.io.PrintWriter,java.util.Collection<? extends org.netbeans.CLIHandler>,int)
meth public static void stopServer()
supr java.lang.Object
hfds KEY_LENGTH,OUTPUT,REPLY_AVAILABLE,REPLY_DELAY,REPLY_ERROR,REPLY_EXIT,REPLY_FAIL,REPLY_OK,REPLY_READ,REPLY_VERSION,REPLY_WRITE,VERSION,doLater,secureCLIPort,server,when
hcls Execute,FileAndLock,Server,Status

CLSS public final static org.netbeans.CLIHandler$Args
 outer org.netbeans.CLIHandler
meth public boolean isOpen()
meth public java.io.File getCurrentDirectory()
meth public java.io.InputStream getInputStream()
meth public java.io.OutputStream getErrorStream()
meth public java.io.OutputStream getOutputStream()
meth public java.lang.String[] getArguments()
supr java.lang.Object
hfds args,argsBackup,closed,currentDir,err,is,os

CLSS public final org.netbeans.DuplicateException
meth public org.netbeans.Module getNewModule()
meth public org.netbeans.Module getOldModule()
supr java.lang.Exception
hfds nue,old

CLSS public abstract org.netbeans.Events
cons protected init()
fld public final static java.lang.String CANT_DELETE_ENABLED_AUTOLOAD = "cantDeleteEnabledAutoload"
fld public final static java.lang.String CLOSE = "close"
fld public final static java.lang.String CREATED_MODULE_SYSTEM = "createdModuleSystem"
fld public final static java.lang.String DELETE_MODULE = "deleteModule"
fld public final static java.lang.String EXTENSION_MULTIPLY_LOADED = "extensionMultiplyLoaded"
fld public final static java.lang.String FAILED_INSTALL_NEW = "failedInstallNew"
fld public final static java.lang.String FAILED_INSTALL_NEW_UNEXPECTED = "failedInstallNewUnexpected"
fld public final static java.lang.String FINISH_AUTO_RESTORE = "finishAutoRestore"
fld public final static java.lang.String FINISH_CREATE_BOOT_MODULE = "finishCreateBootModule"
fld public final static java.lang.String FINISH_CREATE_REGULAR_MODULE = "finishCreateRegularModule"
fld public final static java.lang.String FINISH_DEPLOY_TEST_MODULE = "finishDeployTestModule"
fld public final static java.lang.String FINISH_DISABLE_MODULES = "finishDisableModules"
fld public final static java.lang.String FINISH_ENABLE_MODULES = "finishEnableModules"
fld public final static java.lang.String FINISH_LOAD = "finishLoad"
fld public final static java.lang.String FINISH_LOAD_BOOT_MODULES = "finishLoadBootModules"
fld public final static java.lang.String FINISH_READ = "finishRead"
fld public final static java.lang.String FINISH_UNLOAD = "finishUnload"
fld public final static java.lang.String INSTALL = "install"
fld public final static java.lang.String LOAD_LAYERS = "loadLayers"
fld public final static java.lang.String LOAD_SECTION = "loadSection"
fld public final static java.lang.String MISC_PROP_MISMATCH = "miscPropMismatch"
fld public final static java.lang.String MISSING_JAR_FILE = "missingJarFile"
fld public final static java.lang.String MODULES_FILE_PROCESSED = "modulesFileProcessed"
fld public final static java.lang.String MODULES_FILE_SCANNED = "modulesFileScanned"
fld public final static java.lang.String PATCH = "patch"
fld public final static java.lang.String PERF_END = "perfEnd"
fld public final static java.lang.String PERF_START = "perfStart"
fld public final static java.lang.String PERF_TICK = "perfTick"
fld public final static java.lang.String PREPARE = "prepare"
fld public final static java.lang.String RESTORE = "restore"
fld public final static java.lang.String START_AUTO_RESTORE = "startAutoRestore"
fld public final static java.lang.String START_CREATE_BOOT_MODULE = "startCreateBootModule"
fld public final static java.lang.String START_CREATE_REGULAR_MODULE = "startCreateRegularModule"
fld public final static java.lang.String START_DEPLOY_TEST_MODULE = "startDeployTestModule"
fld public final static java.lang.String START_DISABLE_MODULES = "startDisableModules"
fld public final static java.lang.String START_ENABLE_MODULES = "startEnableModules"
fld public final static java.lang.String START_LOAD = "startLoad"
fld public final static java.lang.String START_LOAD_BOOT_MODULES = "startLoadBootModules"
fld public final static java.lang.String START_READ = "startRead"
fld public final static java.lang.String START_UNLOAD = "startUnload"
fld public final static java.lang.String UNINSTALL = "uninstall"
fld public final static java.lang.String UNLOAD_LAYERS = "unloadLayers"
fld public final static java.lang.String UPDATE = "update"
fld public final static java.lang.String WRONG_CLASS_LOADER = "wrongClassLoader"
meth protected abstract void logged(java.lang.String,java.lang.Object[])
meth public !varargs final void log(java.lang.String,java.lang.Object[])
supr java.lang.Object

CLSS public final org.netbeans.InvalidException
cons public init(java.lang.String)
cons public init(org.netbeans.Module,java.lang.String)
cons public init(org.netbeans.Module,java.lang.String,java.lang.String)
meth public java.lang.String getLocalizedMessage()
meth public java.util.jar.Manifest getManifest()
meth public org.netbeans.Module getModule()
supr java.io.IOException
hfds localizedMessage,m,man

CLSS public org.netbeans.JarClassLoader
cons public init(java.util.List<java.io.File>,java.lang.ClassLoader[])
cons public init(java.util.List<java.io.File>,java.lang.ClassLoader[],boolean)
cons public init(java.util.List<java.io.File>,java.lang.ClassLoader[],boolean,org.netbeans.Module)
meth protected java.lang.Class<?> doLoadClass(java.lang.String,java.lang.String)
meth protected java.lang.Package definePackage(java.lang.String,java.util.jar.Manifest,java.net.URL)
meth protected java.security.PermissionCollection getPermissions(java.security.CodeSource)
meth public java.net.URL findResource(java.lang.String)
meth public java.util.Enumeration<java.net.URL> findResources(java.lang.String)
meth public static boolean isArchivePopulated()
meth public static void saveArchive()
meth public void destroy()
supr org.netbeans.ProxyClassLoader
hfds LOGGER,archive,cache,module,patchingBytecode,sources
hcls DirSource,JarSource,JarURLStreamHandler,NbJarURLConnection,Source

CLSS public final org.netbeans.JaveleonModule
cons public init(org.netbeans.ModuleManager,java.io.File,java.lang.Object,org.netbeans.Events) throws java.io.IOException
fld public final static boolean isJaveleonPresent
meth protected java.lang.ClassLoader createNewClassLoader(java.util.List<java.io.File>,java.util.List<java.lang.ClassLoader>)
meth protected java.lang.ClassLoader getParentLoader(org.netbeans.Module)
meth protected void classLoaderDown()
meth protected void cleanup()
meth public boolean isFixed()
meth public final void reload() throws java.io.IOException
meth public java.io.File getJarFile()
meth public java.lang.Object getLocalizedAttribute(java.lang.String)
meth public java.lang.String toString()
meth public java.util.List<java.io.File> getAllJars()
meth public java.util.jar.Manifest getManifest()
meth public static boolean incrementGlobalId()
meth public void classLoaderUp(java.util.Set<org.netbeans.Module>) throws java.io.IOException
meth public void destroy()
meth public void releaseManifest()
meth public void setReloadable(boolean)
supr org.netbeans.Module
hfds LOG,currentClassLoaders,incrementGlobalId,registerClassLoader

CLSS public final org.netbeans.Main
meth public static void finishInitialization()
meth public static void main(java.lang.String[]) throws java.lang.Exception
supr java.lang.Object

CLSS public abstract org.netbeans.Module
cons protected init(org.netbeans.ModuleManager,org.netbeans.Events,java.lang.Object,boolean,boolean,boolean) throws java.io.IOException
cons protected init(org.netbeans.ModuleManager,org.netbeans.Events,java.lang.Object,java.lang.ClassLoader) throws org.netbeans.InvalidException
cons protected init(org.netbeans.ModuleManager,org.netbeans.Events,java.lang.Object,java.lang.ClassLoader,boolean,boolean) throws org.netbeans.InvalidException
fld protected boolean reloadable
fld protected final org.netbeans.Events events
fld protected final org.netbeans.ModuleManager mgr
fld protected java.lang.ClassLoader classloader
fld public final static java.lang.String PROP_CLASS_LOADER = "classLoader"
fld public final static java.lang.String PROP_MANIFEST = "manifest"
fld public final static java.lang.String PROP_PROBLEMS = "problems"
fld public final static java.lang.String PROP_RELOADABLE = "reloadable"
fld public final static java.lang.String PROP_VALID = "valid"
innr public final static PackageExport
meth protected abstract void classLoaderDown()
meth protected abstract void classLoaderUp(java.util.Set<org.netbeans.Module>) throws java.io.IOException
meth protected abstract void cleanup()
meth protected abstract void destroy()
meth protected void parseManifest() throws org.netbeans.InvalidException
meth public abstract boolean isFixed()
meth public abstract java.util.List<java.io.File> getAllJars()
meth public abstract java.util.jar.Manifest getManifest()
meth public abstract void reload() throws java.io.IOException
meth public abstract void setReloadable(boolean)
meth public boolean isAutoload()
meth public boolean isEager()
meth public boolean isEnabled()
meth public boolean isReloadable()
meth public boolean isValid()
meth public boolean owns(java.lang.Class<?>)
meth public final boolean isNetigso()
meth public final boolean provides(java.lang.String)
meth public final int getStartLevel()
meth public final java.lang.Object getHistory()
meth public final org.openide.modules.Dependency[] getDependenciesArray()
meth public int getCodeNameRelease()
meth public java.io.File getJarFile()
meth public java.lang.ClassLoader getClassLoader()
meth public java.lang.Object getAttribute(java.lang.String)
meth public java.lang.String getBuildVersion()
meth public java.lang.String getCodeName()
meth public java.lang.String getCodeNameBase()
meth public java.lang.String getImplementationVersion()
meth public java.lang.String toString()
meth public java.lang.String[] getProvides()
meth public java.util.Enumeration<java.net.URL> findResources(java.lang.String)
meth public java.util.Set<java.lang.Object> getProblems()
meth public java.util.Set<org.openide.modules.Dependency> getDependencies()
meth public org.netbeans.Module$PackageExport[] getPublicPackages()
meth public org.netbeans.ModuleManager getManager()
meth public org.openide.modules.SpecificationVersion getSpecificationVersion()
meth public void releaseManifest()
supr org.openide.modules.ModuleInfo
hfds DATA_LOCK,autoload,data,eager,enabled,findResources,history,instr

CLSS public final static org.netbeans.Module$PackageExport
 outer org.netbeans.Module
cons public init(java.lang.String,boolean)
fld public final boolean recursive
fld public final java.lang.String pkg
meth public boolean equals(java.lang.Object)
meth public int hashCode()
meth public java.lang.String toString()
supr java.lang.Object

CLSS public org.netbeans.ModuleFactory
cons public init()
meth public boolean removeBaseClassLoader()
meth public java.lang.ClassLoader getClasspathDelegateClassLoader(org.netbeans.ModuleManager,java.lang.ClassLoader)
meth public org.netbeans.Module create(java.io.File,java.lang.Object,boolean,boolean,boolean,org.netbeans.ModuleManager,org.netbeans.Events) throws java.io.IOException
meth public org.netbeans.Module createFixed(java.util.jar.Manifest,java.lang.Object,java.lang.ClassLoader,boolean,boolean,org.netbeans.ModuleManager,org.netbeans.Events) throws org.netbeans.InvalidException
supr java.lang.Object

CLSS public abstract org.netbeans.ModuleInstaller
cons protected init()
meth protected java.util.Set<org.openide.modules.Dependency> loadDependencies(java.lang.String)
meth protected void classLoaderUp(java.lang.ClassLoader)
meth public abstract boolean closing(java.util.List<org.netbeans.Module>)
meth public abstract void close(java.util.List<org.netbeans.Module>)
meth public abstract void dispose(org.netbeans.Module)
meth public abstract void load(java.util.List<org.netbeans.Module>)
meth public abstract void prepare(org.netbeans.Module) throws org.netbeans.InvalidException
meth public abstract void unload(java.util.List<org.netbeans.Module>)
meth public boolean shouldDelegateClasspathResource(java.lang.String)
meth public boolean shouldDelegateResource(org.netbeans.Module,org.netbeans.Module,java.lang.String)
meth public java.lang.String[] refineProvides(org.netbeans.Module)
meth public java.util.jar.Manifest loadManifest(java.io.File) throws java.io.IOException
meth public org.openide.util.Task closeAsync(java.util.List<org.netbeans.Module>)
meth public void refineClassLoader(org.netbeans.Module,java.util.List<? extends java.lang.ClassLoader>)
meth public void refineDependencies(org.netbeans.Module,java.util.Set<org.openide.modules.Dependency>)
supr java.lang.Object

CLSS public final org.netbeans.ModuleManager
cons public init(org.netbeans.ModuleInstaller,org.netbeans.Events)
fld public final static java.lang.String PROP_CLASS_LOADER = "classLoader"
fld public final static java.lang.String PROP_ENABLED_MODULES = "enabledModules"
fld public final static java.lang.String PROP_MODULES = "modules"
meth public boolean hasToEnableCompatModules(java.util.Set<org.netbeans.Module>)
meth public boolean shouldDelegateResource(org.netbeans.Module,org.netbeans.Module,java.lang.String)
 anno 0 java.lang.Deprecated()
meth public boolean shouldDelegateResource(org.netbeans.Module,org.netbeans.Module,java.lang.String,java.lang.ClassLoader)
meth public boolean shutDown()
meth public boolean shutDown(java.lang.Runnable)
meth public final java.util.Set<org.netbeans.Module> getEnabledModules()
meth public final org.netbeans.Events getEvents()
meth public final org.netbeans.Module get(java.lang.String)
meth public final org.openide.util.Mutex mutex()
meth public final org.openide.util.Mutex$Privileged mutexPrivileged()
meth public final void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public final void disable(org.netbeans.Module)
meth public final void enable(org.netbeans.Module) throws org.netbeans.InvalidException
meth public final void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public java.lang.ClassLoader getClassLoader()
meth public java.lang.ClassLoader refineClassLoader(org.netbeans.Module,java.util.List<? extends java.lang.ClassLoader>)
meth public java.util.Collection<org.netbeans.Module> getAttachedFragments(org.netbeans.Module)
meth public java.util.List<org.netbeans.Module> simulateDisable(java.util.Set<org.netbeans.Module>)
meth public java.util.List<org.netbeans.Module> simulateEnable(java.util.Set<org.netbeans.Module>)
meth public java.util.List<org.netbeans.Module> simulateJaveleonReload(org.netbeans.Module)
meth public java.util.Set<org.netbeans.Module> getModuleInterdependencies(org.netbeans.Module,boolean,boolean)
 anno 0 java.lang.Deprecated()
meth public java.util.Set<org.netbeans.Module> getModuleInterdependencies(org.netbeans.Module,boolean,boolean,boolean)
meth public java.util.Set<org.netbeans.Module> getModules()
meth public java.util.concurrent.Future<java.lang.Boolean> shutDownAsync(java.lang.Runnable)
meth public org.netbeans.Module create(java.io.File,java.lang.Object,boolean,boolean) throws java.io.IOException,org.netbeans.DuplicateException
 anno 0 java.lang.Deprecated()
meth public org.netbeans.Module create(java.io.File,java.lang.Object,boolean,boolean,boolean) throws java.io.IOException,org.netbeans.DuplicateException
meth public org.netbeans.Module createBundle(java.io.File,java.lang.Object,boolean,boolean,boolean,int) throws java.io.IOException,org.netbeans.DuplicateException
meth public org.netbeans.Module createFixed(java.util.jar.Manifest,java.lang.Object,java.lang.ClassLoader) throws org.netbeans.DuplicateException,org.netbeans.InvalidException
meth public org.netbeans.Module createFixed(java.util.jar.Manifest,java.lang.Object,java.lang.ClassLoader,boolean,boolean) throws org.netbeans.DuplicateException,org.netbeans.InvalidException
meth public org.openide.modules.ModuleInfo findCodeNameBase(java.lang.String)
meth public org.openide.modules.ModuleInfo ownerOf(java.lang.Class<?>)
meth public org.openide.util.Lookup getModuleLookup()
meth public void delete(org.netbeans.Module)
meth public void disable(java.util.Set<org.netbeans.Module>)
meth public void enable(java.util.Set<org.netbeans.Module>) throws org.netbeans.InvalidException
meth public void releaseModuleManifests()
meth public void reload(org.netbeans.Module) throws java.io.IOException
meth public void replaceJaveleonModule(org.netbeans.Module,org.netbeans.Module)
supr org.openide.modules.Modules
hfds EMPTY_COLLECTION,MODULE_PROBLEMS_LOCK,MUTEX,MUTEX_PRIVILEGED,PRINT_TOPOLOGICAL_EXCEPTION_STACK_TRACES,PROBING_IN_PROCESS,bootstrapModules,changeSupport,classLoader,classLoaderLock,classLoaderPatches,completeLookup,ev,firer,fragmentModules,installer,lookup,mdc,moduleFactory,moduleProblemsWithNeeds,moduleProblemsWithoutNeeds,modules,modulesByName,netigso,providersOf,readOnly
hcls CodeNameBaseComparator,ModuleDataCache,ProvidersOf,SystemClassLoader

CLSS public final org.netbeans.NbClipboard
cons public init()
intf java.awt.datatransfer.FlavorListener
intf java.awt.event.AWTEventListener
intf org.openide.util.LookupListener
meth protected org.openide.util.datatransfer.ExClipboard$Convertor[] getConvertors()
meth public java.awt.datatransfer.FlavorListener[] getFlavorListeners()
meth public java.awt.datatransfer.Transferable getContents(java.lang.Object)
meth public void addFlavorListener(java.awt.datatransfer.FlavorListener)
meth public void eventDispatched(java.awt.AWTEvent)
meth public void flavorsChanged(java.awt.datatransfer.FlavorEvent)
meth public void resultChanged(org.openide.util.LookupEvent)
meth public void setContents(java.awt.datatransfer.Transferable,java.awt.datatransfer.ClipboardOwner)
supr org.openide.util.datatransfer.ExClipboard
hfds FIRING,RP,anyWindowIsActivated,convertors,getContentsTask,last,lastWindowActivated,lastWindowDeactivated,lastWindowDeactivatedSource,log,result,setContentsTask,slowSystemClipboard,systemClipboard
hcls GetContents,LoggableTransferable,SetContents

CLSS public org.netbeans.NbExecJavaStartTry
cons public init()
meth public static void main(java.lang.String[])
supr java.lang.Object

CLSS public abstract org.netbeans.NetigsoFramework
cons protected init()
meth protected abstract java.util.Set<java.lang.String> createLoader(org.openide.modules.ModuleInfo,org.netbeans.ProxyClassLoader,java.io.File) throws java.io.IOException
meth protected abstract java.util.Set<java.lang.String> start(java.util.Collection<? extends org.netbeans.Module>)
meth protected abstract void prepare(org.openide.util.Lookup,java.util.Collection<? extends org.netbeans.Module>)
meth protected abstract void reload(org.netbeans.Module) throws java.io.IOException
meth protected abstract void shutdown()
meth protected abstract void start()
meth protected abstract void stopLoader(org.openide.modules.ModuleInfo,java.lang.ClassLoader)
meth protected final byte[] fromArchive(org.netbeans.ArchiveResources,java.lang.String) throws java.io.IOException
meth protected final byte[] patchByteCode(java.lang.ClassLoader,java.lang.String,java.security.ProtectionDomain,byte[])
meth protected final java.lang.ClassLoader createClassLoader(java.lang.String)
meth protected final org.netbeans.Module findModule(java.lang.String)
meth protected int defaultStartLevel()
meth protected java.lang.ClassLoader findFrameworkClassLoader()
meth protected java.util.Enumeration<java.net.URL> findResources(org.netbeans.Module,java.lang.String)
supr java.lang.Object
hfds mgr

CLSS public final org.netbeans.PatchByteCode
meth public static byte[] patch(byte[])
supr java.lang.Object
hfds CONSTRUCTOR_NAME,DESC_CTOR_ANNOTATION,DESC_DEFAULT_CTOR,DESC_PATCHED_PUBLIC_ANNOTATION,DISABLE_PATCHING,LOG,NOP,PATCHED_PUBLIC,PREFIX_EXTEND,PUBLIC_ONLY,RUNTIME_INVISIBLE_ANNOTATIONS,classToExtend,patchAsmMethod,patchPublic,theClassLoader

CLSS public org.netbeans.ProxyClassLoader
cons public init(java.lang.ClassLoader[],boolean)
meth protected boolean shouldDelegateResource(java.lang.String,java.lang.ClassLoader)
meth protected final void addCoveredPackages(java.lang.Iterable<java.lang.String>)
meth protected final void setSystemClassLoader(java.lang.ClassLoader)
meth protected java.lang.Class<?> doLoadClass(java.lang.String,java.lang.String)
meth protected java.lang.Class<?> findClass(java.lang.String) throws java.lang.ClassNotFoundException
meth protected java.lang.Class<?> loadClass(java.lang.String,boolean) throws java.lang.ClassNotFoundException
meth protected java.lang.Package definePackage(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.net.URL)
meth protected java.lang.Package getPackage(java.lang.String)
meth protected java.lang.Package getPackageFast(java.lang.String,boolean)
meth protected java.lang.Package[] getPackages()
meth public final java.net.URL getResource(java.lang.String)
meth public final java.util.Enumeration<java.net.URL> getResources(java.lang.String) throws java.io.IOException
meth public java.net.URL findResource(java.lang.String)
meth public java.util.Enumeration<java.net.URL> findResources(java.lang.String) throws java.io.IOException
meth public void append(java.lang.ClassLoader[])
meth public void destroy()
supr java.lang.ClassLoader
hfds LOGGER,LOG_LOADING,TOP_CL,arbitraryLoadWarnings,packages,parents,sclPackages

CLSS public org.netbeans.ProxyURLStreamHandlerFactory
intf java.net.URLStreamHandlerFactory
intf org.openide.util.LookupListener
meth public java.net.URLStreamHandler createURLStreamHandler(java.lang.String)
meth public static void register()
meth public void resultChanged(org.openide.util.LookupEvent)
supr java.lang.Object
hfds LOG,delegate,handlers,originalJarHandler,proxyFactoryInitialized,r

CLSS public final org.netbeans.Stamps
innr public abstract interface static Updater
meth public boolean exists(java.lang.String)
meth public java.io.InputStream asStream(java.lang.String)
meth public java.nio.ByteBuffer asByteBuffer(java.lang.String)
meth public java.nio.MappedByteBuffer asMappedByteBuffer(java.lang.String)
meth public long lastModified()
meth public static org.netbeans.Stamps getModulesJARs()
meth public void discardCaches()
meth public void flush(int)
meth public void scheduleSave(org.netbeans.Stamps$Updater,java.lang.String,boolean)
meth public void shutdown()
supr java.lang.Object
hfds LOG,MODULES_JARS,clustersChanged,fallbackCache,moduleJARs,moduleNewestFile,populated,worker
hcls Store,Worker

CLSS public abstract interface static org.netbeans.Stamps$Updater
 outer org.netbeans.Stamps
meth public abstract void cacheReady()
meth public abstract void flushCaches(java.io.DataOutputStream) throws java.io.IOException

CLSS public org.netbeans.TopSecurityManager
cons public init()
meth public boolean checkTopLevelWindow(java.lang.Object)
meth public final void checkPropertyAccess(java.lang.String)
meth public static void exit(int)
meth public static void install()
meth public static void makeSwingUseSpecialClipboard(java.awt.datatransfer.Clipboard)
meth public static void register(java.lang.SecurityManager)
meth public static void unregister(java.lang.SecurityManager)
meth public void checkConnect(java.lang.String,int)
meth public void checkConnect(java.lang.String,int,java.lang.Object)
meth public void checkDelete(java.lang.String)
meth public void checkExit(int)
meth public void checkMemberAccess(java.lang.Class<?>,int)
meth public void checkPermission(java.security.Permission)
meth public void checkPermission(java.security.Permission,java.lang.Object)
meth public void checkRead(java.io.FileDescriptor)
meth public void checkRead(java.lang.String)
meth public void checkWrite(java.io.FileDescriptor)
meth public void checkWrite(java.lang.String)
supr java.lang.SecurityManager
hfds CLIPBOARD_FORBIDDEN,LOG,URLClass,accessControllerClass,allPermission,awtPermissionClass,callerWhiteList,check,classLoaderClass,delegates,fsSecManager,officialExit,runtimePermissionClass,urlField,warnedClassesNDE,warnedClassesNH,warnedSunMisc
hcls PrivilegedCheck

CLSS public final org.netbeans.Util
fld public final static java.util.logging.Logger err
innr public abstract interface static ModuleProvider
meth public static boolean checkPackageDependency(org.openide.modules.Dependency,java.lang.ClassLoader)
meth public static java.lang.Object[] parseCodeName(java.lang.String)
meth public static java.lang.String createPackageName(java.lang.String)
meth public static java.lang.String[] getLocalizingSuffixesFast()
meth public static java.util.Map<org.netbeans.Module,java.util.List<org.netbeans.Module>> moduleDependencies(java.util.Collection<org.netbeans.Module>,java.util.Map<java.lang.String,org.netbeans.Module>,java.util.Map<java.lang.String,java.util.Set<org.netbeans.Module>>)
meth public static org.openide.modules.SpecificationVersion getModuleDep(java.util.Set<org.openide.modules.Dependency>,java.lang.String)
meth public static void transitiveClosureModuleDependencies(org.netbeans.ModuleManager,java.util.Set<org.netbeans.Module>)
supr java.lang.Object
hfds codeNameParseCache
hcls JarFilter,ModuleLookup

CLSS public abstract interface static org.netbeans.Util$ModuleProvider
 outer org.netbeans.Util
meth public abstract org.netbeans.Module getModule()

CLSS public abstract org.openide.modules.ModuleInfo
cons protected init()
fld public final static java.lang.String PROP_ENABLED = "enabled"
meth protected final void firePropertyChange(java.lang.String,java.lang.Object,java.lang.Object)
meth public abstract boolean isEnabled()
meth public abstract boolean owns(java.lang.Class<?>)
meth public abstract int getCodeNameRelease()
meth public abstract java.lang.Object getAttribute(java.lang.String)
meth public abstract java.lang.Object getLocalizedAttribute(java.lang.String)
meth public abstract java.lang.String getCodeName()
meth public abstract java.lang.String getCodeNameBase()
meth public abstract java.util.Set<org.openide.modules.Dependency> getDependencies()
meth public abstract org.openide.modules.SpecificationVersion getSpecificationVersion()
meth public final void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public final void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public java.lang.ClassLoader getClassLoader()
meth public java.lang.String getBuildVersion()
meth public java.lang.String getDisplayName()
meth public java.lang.String getImplementationVersion()
meth public java.lang.String[] getProvides()
supr java.lang.Object
hfds changeSupport

CLSS public org.openide.modules.Modules
cons protected init()
meth public org.openide.modules.ModuleInfo findCodeNameBase(java.lang.String)
meth public org.openide.modules.ModuleInfo ownerOf(java.lang.Class<?>)
meth public static org.openide.modules.Modules getDefault()
supr java.lang.Object

CLSS public abstract interface org.openide.util.LookupListener
intf java.util.EventListener
meth public abstract void resultChanged(org.openide.util.LookupEvent)

CLSS public abstract org.openide.util.datatransfer.ExClipboard
cons public init(java.lang.String)
innr public abstract interface static Convertor
meth protected abstract org.openide.util.datatransfer.ExClipboard$Convertor[] getConvertors()
meth protected final void fireClipboardChange()
meth public final void addClipboardListener(org.openide.util.datatransfer.ClipboardListener)
meth public final void removeClipboardListener(org.openide.util.datatransfer.ClipboardListener)
meth public java.awt.datatransfer.Transferable convert(java.awt.datatransfer.Transferable)
meth public static void transferableAccepted(java.awt.datatransfer.Transferable,int)
meth public static void transferableOwnershipLost(java.awt.datatransfer.Transferable)
meth public static void transferableRejected(java.awt.datatransfer.Transferable)
meth public void setContents(java.awt.datatransfer.Transferable,java.awt.datatransfer.ClipboardOwner)
supr java.awt.datatransfer.Clipboard
hfds listeners

