/** * Returns the default filter that should applies to all program type. By default * all hadoop classes and cdap-api classes (and dependencies) are allowed. */ public static Filter defaultFilter() { final Set<String> visibleResources = ProgramResources.getVisibleResources(); final Set<String> visiblePackages = new HashSet<>(); for (String resource : visibleResources) { if (resource.endsWith(".class")) { int idx = resource.lastIndexOf('/'); // Ignore empty package if (idx > 0) { visiblePackages.add(resource.substring(0, idx).replace('/', '.')); } } } return new Filter() { @Override public boolean acceptResource(String resource) { return visibleResources.contains(resource); } @Override public boolean acceptPackage(String packageName) { return visiblePackages.contains(packageName); } }; }
/** * Returns a Set of resource names that are visible through to user program. */ public static synchronized Set<String> getVisibleResources() { if (baseResources != null) { return baseResources; } try { baseResources = createBaseResources(); } catch (IOException e) { LOG.error("Failed to determine base visible resources to user program", e); baseResources = ImmutableSet.of(); } return baseResources; }
/** * Returns a Set of resources name that are visible through the cdap-api module as well as Hadoop classes. * This includes all classes+resources in cdap-api plus all classes+resources that cdap-api * depends on (for example, sl4j, gson, etc). */ private static Set<String> createBaseResources() throws IOException { // Everything should be traceable in the same ClassLoader of this class, which is the CDAP system ClassLoader ClassLoader classLoader = ProgramResources.class.getClassLoader(); // Gather resources information for cdap-api classes // Add everything in cdap-api as visible resources // Trace dependencies for cdap-api classes Set<String> result = ClassPathResources.getResourcesWithDependencies(classLoader, Application.class); // Gather resources for javax.ws.rs classes. They are not traceable from the api classes. Iterables.addAll(result, Iterables.transform(ClassPathResources.getClassPathResources(classLoader, Path.class), ClassPathResources.RESOURCE_INFO_TO_RESOURCE_NAME)); // Gather Hadoop classes and resources getResources(ClassPath.from(classLoader, JAR_ONLY_URI), HADOOP_PACKAGES, EXCLUDE_PACKAGES, ClassPathResources.RESOURCE_INFO_TO_RESOURCE_NAME, result); return Collections.unmodifiableSet(result); }
/** * Returns a Set of resources name that are visible through the cdap-api module as well as Hadoop classes. * This includes all classes+resources in cdap-api plus all classes+resources that cdap-api * depends on (for example, sl4j, gson, etc). */ private static Set<String> createBaseResources() throws IOException { // Everything should be traceable in the same ClassLoader of this class, which is the CDAP system ClassLoader ClassLoader classLoader = ProgramResources.class.getClassLoader(); // Gather resources information for cdap-api classes // Add everything in cdap-api as visible resources // Trace dependencies for cdap-api classes Set<String> result = ClassPathResources.getResourcesWithDependencies(classLoader, Application.class); // Gather resources for javax.ws.rs classes. They are not traceable from the api classes. Iterables.addAll(result, Iterables.transform(ClassPathResources.getClassPathResources(classLoader, Path.class), ClassPathResources.RESOURCE_INFO_TO_RESOURCE_NAME)); // Gather Hadoop classes and resources getResources(ClassPath.from(classLoader, JAR_ONLY_URI), HADOOP_PACKAGES, EXCLUDE_PACKAGES, ClassPathResources.RESOURCE_INFO_TO_RESOURCE_NAME, result); return Collections.unmodifiableSet(result); }
/** * Returns the default filter that should applies to all program type. By default * all hadoop classes and cdap-api classes (and dependencies) are allowed. */ public static Filter defaultFilter() { final Set<String> visibleResources = ProgramResources.getVisibleResources(); final Set<String> visiblePackages = new HashSet<>(); for (String resource : visibleResources) { if (resource.endsWith(".class")) { int idx = resource.lastIndexOf('/'); // Ignore empty package if (idx > 0) { visiblePackages.add(resource.substring(0, idx).replace('/', '.')); } } } return new Filter() { @Override public boolean acceptResource(String resource) { return visibleResources.contains(resource); } @Override public boolean acceptPackage(String packageName) { return visiblePackages.contains(packageName); } }; }
/** * Returns a Set of resource names that are visible through to user program. */ public static synchronized Set<String> getVisibleResources() { if (baseResources != null) { return baseResources; } try { baseResources = createBaseResources(); } catch (IOException e) { LOG.error("Failed to determine base visible resources to user program", e); baseResources = ImmutableSet.of(); } return baseResources; }
public static Location createDeploymentJar(LocationFactory locationFactory, Class<?> clz, Manifest manifest, File... bundleEmbeddedJars) throws IOException { return createDeploymentJar(locationFactory, clz, manifest, new ClassAcceptor() { final Set<String> visibleResources = ProgramResources.getVisibleResources(); @Override public boolean accept(String className, URL classUrl, URL classPathUrl) { if (visibleResources.contains(className.replace('.', '/') + ".class")) { return false; } // TODO: Fix it with CDAP-5800 if (className.startsWith("org.apache.spark.")) { return false; } return true; } }, bundleEmbeddedJars); }
public static Location createDeploymentJar(LocationFactory locationFactory, Class<?> clz, File... bundleEmbeddedJars) throws IOException { return AppJarHelper.createDeploymentJar(locationFactory, clz, new Manifest(), new ClassAcceptor() { final Set<String> visibleResources = ProgramResources.getVisibleResources(); @Override public boolean accept(String className, URL classUrl, URL classPathUrl) { if (visibleResources.contains(className.replace('.', '/') + ".class")) { return false; } // TODO: Fix it with CDAP-5800 if (className.startsWith("org.apache.spark.")) { return false; } // exclude a necessary dependency if (className.startsWith("com.google.")) { return false; } return true; } }, bundleEmbeddedJars); }