Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/**
* SampleScanner.java
*
* Copyright (c) 2013-2018, F(X)yz
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of F(X)yz, any associated website, nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL F(X)yz BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.fxyz3d.util;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.module.ModuleReader;
import java.lang.module.ResolvedModule;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
import org.fxyz3d.FXyzSample;
import org.fxyz3d.FXyzSamplerProject;
import org.fxyz3d.model.EmptySample;
import org.fxyz3d.model.Project;
/**
* All the code related to classpath scanning, etc for samples.
*/
public class SampleScanner {
private static final List ILLEGAL_CLASS_NAMES = new ArrayList<>();
static {
ILLEGAL_CLASS_NAMES.add("/com/javafx/main/Main.class");
ILLEGAL_CLASS_NAMES.add("/com/javafx/main/NoJavaFXFallback.class");
ILLEGAL_CLASS_NAMES.add("module-info.class");
}
private static final Map packageToProjectMap = new HashMap<>();
static {
System.out.println("Initialising FXyz-Sampler sample scanner...");
System.out.println("\tDiscovering projects...");
// find all projects on the classpath that expose a FXyzSamplerProject
// service. These guys are our friends....
ServiceLoader loader = ServiceLoader.load(FXyzSamplerProject.class);
for (FXyzSamplerProject project : loader) {
final String projectName = project.getProjectName();
final String basePackage = project.getSampleBasePackage();
packageToProjectMap.put(basePackage, project);
System.out.println("\t\tFound project '" + projectName +
"', with sample base package '" + basePackage + "'");
}
if (packageToProjectMap.isEmpty()) {
System.out.println("\tError: Did not find any projects!");
}
}
private final Map projectsMap = new HashMap<>();
/**
* Gets the list of sample classes to load
*
* @return The classes
*/
public Map discoverSamples() {
Class>[] results = new Class[] { };
try {
results = loadFromPathScanning();
} catch (IOException e) {
e.printStackTrace();
}
for (Class> sampleClass : results) {
if (! FXyzSample.class.isAssignableFrom(sampleClass)) continue;
if (sampleClass.isInterface()) continue;
if (Modifier.isAbstract(sampleClass.getModifiers())) continue;
// if (FXyzSample.class.isAssignableFrom(EmptySample.class)) continue;
if (sampleClass == EmptySample.class) continue;
FXyzSample sample = null;
try {
sample = (FXyzSample)sampleClass.getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
if (sample == null || ! sample.isVisible()) continue;
final String packageName = sampleClass.getPackage().getName();
for (String key : packageToProjectMap.keySet()) {
if (packageName.contains(key)) {
final String prettyProjectName = packageToProjectMap.get(key).getProjectName();
Project project;
if (! projectsMap.containsKey(prettyProjectName)) {
project = new Project(prettyProjectName, key);
project.setWelcomePage(packageToProjectMap.get(key).getWelcomePage());
projectsMap.put(prettyProjectName, project);
} else {
project = projectsMap.get(prettyProjectName);
}
project.addSample(packageName, sample);
}
}
}
return projectsMap;
}
/**
* Scans all classes.
*
* @return The classes
* @throws IOException
*/
private Class>[] loadFromPathScanning() throws IOException {
final Set> classes = new LinkedHashSet<>();
// scan the module-path
ModuleLayer.boot().configuration().modules().stream()
.map(ResolvedModule::reference)
.filter(rm -> !isSystemModule(rm.descriptor().name()))
.forEach(mref -> {
try (ModuleReader reader = mref.open()) {
reader.list()
.filter(c -> c.endsWith(".class") &&
! ILLEGAL_CLASS_NAMES.contains(c))
.forEach(c -> {
final Class> clazz = processClassName(c);
if (clazz != null) {
classes.add(clazz);
}
});
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
});
return classes.toArray(new Class[classes.size()]);
}
private Class> processClassName(final String name) {
String className = name.replace("\\", ".");
className = className.replace("/", ".");
// some cleanup code
if (className.contains("$")) {
// we don't care about samples as inner classes, so
// we jump out
return null;
}
if (className.contains(".bin")) {
className = className.substring(className.indexOf(".bin") + 4);
className = className.replace(".bin", "");
}
if (className.startsWith(".")) {
className = className.substring(1);
}
if (className.endsWith(".class")) {
className = className.substring(0, className.length() - 6);
}
Class> clazz = null;
try {
clazz = Class.forName(className);
} catch (Throwable e) {
// Throwable, could be all sorts of bad reasons the class won't instantiate
System.out.println("ERROR: Class name: " + className + ", Initial filename: " + name);
// e.printStackTrace();
}
return clazz;
}
/**
* Return true if the given module name is a system module. There can be
* system modules in layers above the boot layer.
*/
private static boolean isSystemModule(final String moduleName) {
return moduleName.startsWith("java.")
|| moduleName.startsWith("javax.")
|| moduleName.startsWith("javafx.")
|| moduleName.startsWith("jdk.")
|| moduleName.startsWith("oracle.");
}
}