use of com.ibm.xsp.extlib.javacompiler.JavaSourceClassLoader in project org.openntf.nsfodp by OpenNTF.
the class XspTranspiler method defineCustomControls.
private void defineCustomControls(Path ccSourceRoot) throws IOException {
if (ccSourceRoot != null) {
subTask("Initializing Custom Control definitions");
// Generate a classpath, which the CC library needs to find classes for property types
Set<Path> cleanup = new HashSet<>();
try {
Collection<String> dependencies = buildDependenciesCollection(cleanup);
String[] classPath = dependencies.toArray(new String[dependencies.size()]);
ConfigParser configParser = ConfigParserFactory.getParserInstance();
try (JavaSourceClassLoader classLoader = new JavaSourceClassLoader(Thread.currentThread().getContextClassLoader(), Collections.emptyList(), classPath)) {
FacesClassLoader facesClassLoader = new DynamicFacesClassLoader(dynamicXPageBean, classLoader);
try (Stream<Path> ccConfigs = Files.find(ccSourceRoot, Integer.MAX_VALUE, (path, attr) -> attr.isRegularFile() && path.toString().toLowerCase().endsWith(".xsp-config"), FileVisitOption.FOLLOW_LINKS)) {
// $NON-NLS-1$
ccConfigs.forEach(ccConfig -> {
Document xspConfig = ODPUtil.readXml(ccConfig);
// $NON-NLS-1$
String namespace = StringUtil.trim(NSFODPDomUtil.node(xspConfig, "/faces-config/faces-config-extension/namespace-uri/text()").get().getTextContent());
Path fileName = ccSourceRoot.relativize(ccConfig);
FacesLibraryFragment fragment = configParser.createFacesLibraryFragment(facesProject, facesClassLoader, fileName.toString(), xspConfig.getDocumentElement(), resourceBundleSource, iconUrlSource, namespace);
facesProject.register(fragment);
facesProject.getRegistry().refreshReferences();
});
}
}
} finally {
NSFODPUtil.deltree(cleanup);
}
}
}
use of com.ibm.xsp.extlib.javacompiler.JavaSourceClassLoader in project org.openntf.nsfodp by OpenNTF.
the class ODPCompiler method compile.
/**
* Runs the compilation process:
*
* <ol>
* <li>Installs all bundles from the provided update sites</li>
* <li>Initializes plugin contributions from installed bundles</li>
* <li>Compiles all XPage artifacts</li>
* <li>Constructs the NSF from the on-disk project</li>
* <li>Uninstalls any installed bundles</li>
* </ol>
*
* @param cl the base {@link ClassLoader} to use during compilation
* @return a {@link Path} representing the created database
* @throws Exception if there is a problem compiling any component
* @since 1.0.0
*/
public synchronized Path compile(ClassLoader cl) throws Exception {
Collection<Bundle> bundles = installBundles();
JavaSourceClassLoader classLoader = null;
Set<Path> cleanup = new HashSet<>();
try {
boolean hasXPages = odp.hasXPagesElements();
if (hasXPages) {
initRegistry();
Collection<String> dependencies = buildDependenciesCollection(cleanup);
dependencies.addAll(ODPUtil.expandRequiredBundles(bundleContext, odp.getRequiredBundles()));
// Add any Jars from the ODP
for (Path jar : odp.getJars()) {
// If the path is inside a JAR, extract it
if ("jar".equals(jar.toUri().getScheme())) {
// $NON-NLS-1$
// $NON-NLS-1$
Path tempJar = Files.createTempFile(NSFODPUtil.getTempDirectory(), jar.getFileName().toString(), ".jar");
cleanup.add(tempJar);
Files.copy(jar, tempJar, StandardCopyOption.REPLACE_EXISTING);
// $NON-NLS-1$
dependencies.add("jar:" + tempJar.toUri());
} else {
// $NON-NLS-1$
dependencies.add("jar:" + jar.toUri());
}
}
String[] classPath = dependencies.toArray(new String[dependencies.size()]);
List<String> options = Stream.concat(compilerOptions.stream(), // $NON-NLS-1$ //$NON-NLS-2$
Stream.of("-source", compilerLevel, "-target", compilerLevel)).collect(Collectors.toList());
classLoader = new JavaSourceClassLoader(cl, options, classPath);
// Bar loading of different-version SSJS classes from ndext
// $NON-NLS-1$
classLoader.getJavaFileManager().setNonDelegatingPackages(Arrays.asList("com.ibm.jscript"));
// Compile Java classes
compileJavaSources(classLoader);
compileCustomControls(classLoader);
compileXPages(classLoader);
}
try (NotesAPI session = NotesAPI.get()) {
Path file = createDatabase(session);
try (NDatabase database = session.openDatabase("", file.toAbsolutePath().toString())) {
// $NON-NLS-1$
try (NDXLImporter importer = session.createDXLImporter()) {
importDbProperties(importer, database);
importEarlyBasicElements(importer, database);
importLotusScriptLibraries(importer, database);
importBasicElements(importer, database);
importFileResources(importer, database);
importDbScript(importer, database);
if (hasXPages) {
Set<String> compiledClassNames = new HashSet<>(classLoader.getCompiledClassNames());
importCustomControls(importer, database, classLoader, compiledClassNames);
importXPages(importer, database, classLoader, compiledClassNames);
importJavaElements(importer, database, classLoader, compiledClassNames);
}
// Append a timestamp if requested
if (this.isAppendTimestampToTitle()) {
// $NON-NLS-1$
database.setTitle(database.getTitle() + " - " + TIMESTAMP.get().format(new Date()));
}
// Set the template info if requested
String templateName = this.getTemplateName();
if (StringUtil.isNotEmpty(templateName)) {
// $NON-NLS-1$
int noteId = database.getSharedFieldNoteID("$TemplateBuild");
NNote doc;
if (noteId != 0) {
doc = database.getNoteByID(noteId);
} else {
// Import an empty one
try (InputStream is = ODPCompiler.class.getResourceAsStream("/dxl/TemplateBuild.xml")) {
// $NON-NLS-1$
// $NON-NLS-1$
String dxl = StreamUtil.readString(is, "UTF-8");
// $NON-NLS-1$
List<Integer> ids = importDxl(importer, dxl, database, "$TemplateBuild blank field");
doc = database.getNoteByID(ids.get(0));
}
}
String version = this.getTemplateVersion();
if (StringUtil.isNotEmpty(version)) {
// $NON-NLS-1$
doc.set("$TemplateBuild", version);
}
// $NON-NLS-1$
doc.set("$TemplateBuildName", templateName);
// $NON-NLS-1$
doc.set("$TemplateBuildDate", new Date());
doc.save();
}
}
}
return file;
}
} catch (JavaCompilerException e) {
StringWriter o = new StringWriter();
PrintWriter errOut = new PrintWriter(o);
e.printExtraInformation(errOut);
throw new RuntimeException(MessageFormat.format(Messages.ODPCompiler_javaCompilationFailed, o), e);
} finally {
uninstallBundles(bundles);
if (classLoader != null) {
classLoader.close();
}
NSFODPUtil.deltree(cleanup);
}
}
use of com.ibm.xsp.extlib.javacompiler.JavaSourceClassLoader in project org.openntf.nsfodp by OpenNTF.
the class ODPCompiler method importJavaElements.
private void importJavaElements(NDXLImporter importer, NDatabase database, JavaSourceClassLoader classLoader, Set<String> compiledClassNames) throws Exception {
subTask(Messages.ODPCompiler_importingJava);
Map<Path, List<JavaSource>> javaSourceFiles = odp.getJavaSourceFiles();
for (Map.Entry<Path, List<JavaSource>> entry : javaSourceFiles.entrySet()) {
for (JavaSource source : entry.getValue()) {
Path filePath = entry.getKey().relativize(source.getDataFile());
String className = ODPUtil.toJavaClassName(filePath);
compiledClassNames.remove(className);
byte[] byteCode = classLoader.getClassByteCode(className);
Document dxlDoc = source.getDxl();
// $NON-NLS-1$
DXLUtil.writeItemFileData(dxlDoc, "$ClassData0", byteCode);
// $NON-NLS-1$
DXLUtil.writeItemNumber(dxlDoc, "$ClassSize0", byteCode.length);
List<String> classIndexItem = new ArrayList<>();
// $NON-NLS-1$
classIndexItem.add("WEB-INF/classes/" + ODPUtil.toJavaPath(className));
// Also look for any inner classes that were compiled
List<String> innerClasses = classLoader.getCompiledClassNames().stream().filter(// $NON-NLS-1$ //$NON-NLS-2$
cname -> cname.matches("^" + Pattern.quote(className) + "[\\.\\$].+$")).collect(Collectors.toList());
for (int i = 0; i < innerClasses.size(); i++) {
String innerClassName = innerClasses.get(i);
compiledClassNames.remove(innerClassName);
byte[] innerByteCode = classLoader.getClassByteCode(innerClassName);
// $NON-NLS-1$
DXLUtil.writeItemFileData(dxlDoc, "$ClassData" + (i + 1), innerByteCode);
// $NON-NLS-1$
DXLUtil.writeItemNumber(dxlDoc, "$ClassSize" + (i + 1), innerByteCode.length);
// $NON-NLS-1$
classIndexItem.add("WEB-INF/classes/" + ODPUtil.toJavaPath(innerClassName));
}
// $NON-NLS-1$
DXLUtil.writeItemString(dxlDoc, "$ClassIndexItem", true, classIndexItem.toArray(new CharSequence[classIndexItem.size()]));
importDxl(importer, NSFODPDomUtil.getXmlString(dxlDoc, null), database, MessageFormat.format(Messages.ODPCompiler_javaClassLabel, className));
}
}
// Create standalone class files for remaining classes
for (String leftoverClassName : compiledClassNames) {
// $NON-NLS-1$
String fileName = "WEB-INF/classes/" + ODPUtil.toJavaPath(leftoverClassName);
byte[] leftoverByteCode = classLoader.getClassByteCode(leftoverClassName);
// $NON-NLS-1$ //$NON-NLS-2$
CompilerUtil.importFileResource(importer, leftoverByteCode, database, fileName, "~C4g", "w");
}
}
Aggregations