Search in sources :

Example 1 with JarValidationException

use of org.apache.drill.exec.exception.JarValidationException in project drill by axbaretto.

the class LocalFunctionRegistry method validate.

/**
 * Validates all functions, present in jars.
 * Will throw {@link FunctionValidationException} if:
 * <ol>
 *  <li>Jar with the same name has been already registered.</li>
 *  <li>Conflicting function with the similar signature is found.</li>
 *  <li>Aggregating function is not deterministic.</li>
 *</ol>
 * @param jarName jar name to be validated
 * @param scanResult scan of all classes present in jar
 * @return list of validated function signatures
 */
public List<String> validate(String jarName, ScanResult scanResult) {
    List<String> functions = Lists.newArrayList();
    FunctionConverter converter = new FunctionConverter();
    List<AnnotatedClassDescriptor> providerClasses = scanResult.getAnnotatedClasses();
    if (registryHolder.containsJar(jarName)) {
        throw new JarValidationException(String.format("Jar with %s name has been already registered", jarName));
    }
    final ListMultimap<String, String> allFuncWithSignatures = registryHolder.getAllFunctionsWithSignatures();
    for (AnnotatedClassDescriptor func : providerClasses) {
        DrillFuncHolder holder = converter.getHolder(func, ClassLoader.getSystemClassLoader());
        if (holder != null) {
            String functionInput = holder.getInputParameters();
            String[] names = holder.getRegisteredNames();
            for (String name : names) {
                String functionName = name.toLowerCase();
                String functionSignature = String.format(functionSignaturePattern, functionName, functionInput);
                if (allFuncWithSignatures.get(functionName).contains(functionSignature)) {
                    throw new FunctionValidationException(String.format("Found duplicated function in %s: %s", registryHolder.getJarNameByFunctionSignature(functionName, functionSignature), functionSignature));
                } else if (holder.isAggregating() && !holder.isDeterministic()) {
                    throw new FunctionValidationException(String.format("Aggregate functions must be deterministic: %s", func.getClassName()));
                } else {
                    functions.add(functionSignature);
                    allFuncWithSignatures.put(functionName, functionSignature);
                }
            }
        } else {
            logger.warn("Unable to initialize function for class {}", func.getClassName());
        }
    }
    return functions;
}
Also used : AnnotatedClassDescriptor(org.apache.drill.common.scanner.persistence.AnnotatedClassDescriptor) FunctionValidationException(org.apache.drill.exec.exception.FunctionValidationException) DrillFuncHolder(org.apache.drill.exec.expr.fn.DrillFuncHolder) FunctionConverter(org.apache.drill.exec.expr.fn.FunctionConverter) JarValidationException(org.apache.drill.exec.exception.JarValidationException)

Example 2 with JarValidationException

use of org.apache.drill.exec.exception.JarValidationException in project drill by apache.

the class LocalFunctionRegistry method validate.

/**
 * Validates all functions, present in jars.
 * Will throw {@link FunctionValidationException} if:
 * <ol>
 *  <li>Jar with the same name has been already registered.</li>
 *  <li>Conflicting function with the similar signature is found.</li>
 *  <li>Aggregating function is not deterministic.</li>
 *</ol>
 * @param jarName jar name to be validated
 * @param scanResult scan of all classes present in jar
 * @return list of validated function signatures
 */
public List<String> validate(String jarName, ScanResult scanResult) {
    List<String> functions = Lists.newArrayList();
    FunctionConverter converter = new FunctionConverter();
    List<AnnotatedClassDescriptor> providerClasses = scanResult.getAnnotatedClasses(FunctionTemplate.class.getName());
    if (registryHolder.containsJar(jarName)) {
        throw new JarValidationException(String.format("Jar with %s name has been already registered", jarName));
    }
    final ListMultimap<String, String> allFuncWithSignatures = registryHolder.getAllFunctionsWithSignatures();
    for (AnnotatedClassDescriptor func : providerClasses) {
        DrillFuncHolder holder = converter.getHolder(func, ClassLoader.getSystemClassLoader());
        if (holder != null) {
            String functionInput = holder.getInputParameters();
            String[] names = holder.getRegisteredNames();
            for (String name : names) {
                String functionName = name.toLowerCase();
                String functionSignature = String.format(functionSignaturePattern, functionName, functionInput);
                if (allFuncWithSignatures.get(functionName).contains(functionSignature)) {
                    throw new FunctionValidationException(String.format("Found duplicated function in %s: %s", registryHolder.getJarNameByFunctionSignature(functionName, functionSignature), functionSignature));
                } else if (holder.isAggregating() && !holder.isDeterministic()) {
                    throw new FunctionValidationException(String.format("Aggregate functions must be deterministic: %s", func.getClassName()));
                } else {
                    functions.add(functionSignature);
                    allFuncWithSignatures.put(functionName, functionSignature);
                }
            }
        } else {
            logger.warn("Unable to initialize function for class {}", func.getClassName());
        }
    }
    return functions;
}
Also used : AnnotatedClassDescriptor(org.apache.drill.common.scanner.persistence.AnnotatedClassDescriptor) FunctionValidationException(org.apache.drill.exec.exception.FunctionValidationException) FunctionTemplate(org.apache.drill.exec.expr.annotations.FunctionTemplate) DrillFuncHolder(org.apache.drill.exec.expr.fn.DrillFuncHolder) FunctionConverter(org.apache.drill.exec.expr.fn.FunctionConverter) JarValidationException(org.apache.drill.exec.exception.JarValidationException)

Example 3 with JarValidationException

use of org.apache.drill.exec.exception.JarValidationException in project drill by axbaretto.

the class FunctionImplementationRegistry method scan.

/**
 * First finds path to marker file url, otherwise throws {@link JarValidationException}.
 * Then scans jar classes according to list indicated in marker files.
 * Additional logic is added to close {@link URL} after {@link ConfigFactory#parseURL(URL)}.
 * This is extremely important for Windows users where system doesn't allow to delete file if it's being used.
 *
 * @param classLoader unique class loader for jar
 * @param path local path to jar
 * @param urls urls associated with the jar (ex: binary and source)
 * @return scan result of packages, classes, annotations found in jar
 */
private ScanResult scan(ClassLoader classLoader, Path path, URL[] urls) throws IOException {
    Enumeration<URL> markerFileEnumeration = classLoader.getResources(CommonConstants.DRILL_JAR_MARKER_FILE_RESOURCE_PATHNAME);
    while (markerFileEnumeration.hasMoreElements()) {
        URL markerFile = markerFileEnumeration.nextElement();
        if (markerFile.getPath().contains(path.toUri().getPath())) {
            URLConnection markerFileConnection = null;
            try {
                markerFileConnection = markerFile.openConnection();
                DrillConfig drillConfig = DrillConfig.create(ConfigFactory.parseURL(markerFile));
                return RunTimeScan.dynamicPackageScan(drillConfig, Sets.newHashSet(urls));
            } finally {
                if (markerFileConnection instanceof JarURLConnection) {
                    ((JarURLConnection) markerFile.openConnection()).getJarFile().close();
                }
            }
        }
    }
    throw new JarValidationException(String.format("Marker file %s is missing in %s", CommonConstants.DRILL_JAR_MARKER_FILE_RESOURCE_PATHNAME, path.getName()));
}
Also used : DrillConfig(org.apache.drill.common.config.DrillConfig) JarURLConnection(java.net.JarURLConnection) URL(java.net.URL) JarURLConnection(java.net.JarURLConnection) URLConnection(java.net.URLConnection) JarValidationException(org.apache.drill.exec.exception.JarValidationException)

Example 4 with JarValidationException

use of org.apache.drill.exec.exception.JarValidationException in project drill by apache.

the class FunctionImplementationRegistry method scan.

/**
 * First finds path to marker file url, otherwise throws {@link JarValidationException}.
 * Then scans jar classes according to list indicated in marker files.
 * Additional logic is added to close {@link URL} after {@link ConfigFactory#parseURL(URL)}.
 * This is extremely important for Windows users where system doesn't allow to delete file if it's being used.
 *
 * @param classLoader unique class loader for jar
 * @param path local path to jar
 * @param urls urls associated with the jar (ex: binary and source)
 * @return scan result of packages, classes, annotations found in jar
 */
private ScanResult scan(ClassLoader classLoader, Path path, URL[] urls) throws IOException {
    Enumeration<URL> markerFileEnumeration = classLoader.getResources(ConfigConstants.DRILL_JAR_MARKER_FILE_RESOURCE_PATHNAME);
    while (markerFileEnumeration.hasMoreElements()) {
        URL markerFile = markerFileEnumeration.nextElement();
        if (markerFile.getPath().contains(path.toUri().getPath())) {
            URLConnection markerFileConnection = null;
            try {
                markerFileConnection = markerFile.openConnection();
                DrillConfig drillConfig = DrillConfig.create(ConfigFactory.parseURL(markerFile));
                return RunTimeScan.dynamicPackageScan(drillConfig, Sets.newHashSet(urls));
            } finally {
                if (markerFileConnection instanceof JarURLConnection) {
                    ((JarURLConnection) markerFileConnection).getJarFile().close();
                }
            }
        }
    }
    throw new JarValidationException(String.format("Marker file %s is missing in %s", ConfigConstants.DRILL_JAR_MARKER_FILE_RESOURCE_PATHNAME, path.getName()));
}
Also used : DrillConfig(org.apache.drill.common.config.DrillConfig) JarURLConnection(java.net.JarURLConnection) URL(java.net.URL) JarURLConnection(java.net.JarURLConnection) URLConnection(java.net.URLConnection) JarValidationException(org.apache.drill.exec.exception.JarValidationException)

Aggregations

JarValidationException (org.apache.drill.exec.exception.JarValidationException)4 JarURLConnection (java.net.JarURLConnection)2 URL (java.net.URL)2 URLConnection (java.net.URLConnection)2 DrillConfig (org.apache.drill.common.config.DrillConfig)2 AnnotatedClassDescriptor (org.apache.drill.common.scanner.persistence.AnnotatedClassDescriptor)2 FunctionValidationException (org.apache.drill.exec.exception.FunctionValidationException)2 DrillFuncHolder (org.apache.drill.exec.expr.fn.DrillFuncHolder)2 FunctionConverter (org.apache.drill.exec.expr.fn.FunctionConverter)2 FunctionTemplate (org.apache.drill.exec.expr.annotations.FunctionTemplate)1