blob: 34ec518b707bfaec47462e8954d79690cd7cade5 [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.netbeans;
import java.io.File;
import java.io.IOException;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.*;
import java.util.logging.Level;
import org.openide.modules.ModuleInfo;
import org.openide.util.Enumerations;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
/** This class contains abstracted calls to OSGi provided by core.netigso
* module. No other module can implement this class, except core.netigso.
*
* @author Jaroslav Tulach <jtulach@netbeans.org>
*/
public abstract class NetigsoFramework {
private ModuleManager mgr;
protected NetigsoFramework() {
if (!getClass().getName().equals("org.netbeans.core.netigso.Netigso")) { // NOI18N
throw new IllegalStateException();
}
}
final NetigsoFramework bindTo(ModuleManager mgr) {
try {
NetigsoFramework nf = (NetigsoFramework)clone();
assert nf != this;
nf.mgr = mgr;
return nf;
} catch (CloneNotSupportedException ex) {
Util.err.log(Level.INFO, null, ex);
this.mgr = mgr;
return this;
}
}
/** Starts the framework.
*/
protected abstract void prepare(
Lookup loadFrameworkFrom,
Collection<? extends Module> preregister
);
/** Get's ready for start of the OSGi framework.
* @param allModules the modules that are in the system
* @return returns set of additional modules (usually autoloads that need to be turned on)
* @since 2.31 it returns set of module code name bases
*/
protected abstract Set<String> start(Collection<? extends Module> allModules);
/** Starts the OSGi framework by activating all bundles that shall be activated.
* @since 2.35
*/
protected abstract void start();
/** Shutdowns the framework */
protected abstract void shutdown();
/** Initializes a classloader for given module.
* @parma m the module description
* @param pcl proxy classloader that shall be configured
* @param jar the module JAR file
* @return set of covered packages
*/
protected abstract Set<String> createLoader(
ModuleInfo m, ProxyClassLoader pcl, File jar
) throws IOException;
/**
* Find given resource inside provide module representing an OSGi bundle.
* The search should happen without resolving the bundle, if possible. E.g.
* by using <code>Bundle.getEntry</code>.
* @param resName name of the resource to seek for
* @return empty enumeration or enumeration with one element.
* @since 2.49
*/
protected Enumeration<URL> findResources(Module module, String resName) {
return Enumerations.empty();
}
/** Reloads one module
* @since 2.27
*/
protected abstract void reload(Module m) throws IOException;
/** Deinitializes a classloader for given module */
protected abstract void stopLoader(ModuleInfo m, ClassLoader loader);
/** Allows the OSGi support to identify the classloader that loads
* all OSGi framework classes.
*
* @since 2.37
*/
protected ClassLoader findFrameworkClassLoader() {
return getClass().getClassLoader();
}
/** Default start level for all bundles that don't specify any own.
*
* @since 2.44.2
* @return
*/
protected int defaultStartLevel() {
return 0;
}
//
// Access to Archive
//
/** Get an array of bytes from archive. If not found, it remembers the
* request and later calls {@link #toArchive(java.lang.String, java.lang.String)}
* method to store it for next time.
*
* @param name name of the resource inside the JAR
* @parma resources the provider of the real resources
* @return either cached value or the one returned by resources (or null)
* @throws IOException if something goes wrong
* @since 2.29
*/
protected final byte[] fromArchive(ArchiveResources resources, String name) throws IOException {
return JarClassLoader.archive.getData(resources, name);
}
/** Creates a delegating loader for given module. The loader is suitable
* for use as a delegating loader for a fake OSGi bundle.
* @param cnb name of the bundle/module
* @return classloader or null if the module does not exist
* @since 2.50
*/
protected final ClassLoader createClassLoader(String cnb) {
Module m = findModule(cnb);
return m == null ? null : new NetigsoLoader(m);
}
/** Finds module for given name.
* @param cnb code name base of the module
* @return the module or null
* @since 2.50
*/
protected final Module findModule(String cnb) {
return mgr.get(cnb);
}
/** Gives OSGi support access to NetBeans bytecode manipulation libraries.
* They are built over {@link Instrumentation} specification
* read more at <a href="@TOP@architecture-overview.html#usecase-bytecode.patching">
* architecture document</a>.
*
* @param l the classloader that is loading the class
* @param className the class name
* @param pd protection domain to use
* @param arr bytecode (must not be modified)
* @return same or alternative bytecode for the class
* @throws IllegalStateException if the byte code is not valid
* @since 2.65
*/
protected final byte[] patchByteCode(ClassLoader l, String className, ProtectionDomain pd, byte[] arr) {
try {
return NbInstrumentation.patchByteCode(l, className, null, arr);
} catch (IllegalClassFormatException ex) {
throw new IllegalStateException(ex);
}
}
}