public ResourceReference createResourceReference()

in src/main/java/org/apache/nifi/components/resource/StandardResourceReferenceFactory.java [55:115]


    public ResourceReference createResourceReference(final String value, final ResourceDefinition resourceDefinition) {
        if (value == null) {
            return null;
        }

        final String trimmed = value.trim();
        if (trimmed.isEmpty()) {
            return null;
        }

        if (resourceDefinition == null) {
            return null;
        }

        final Set<ResourceType> allowedResourceTypes = resourceDefinition.getResourceTypes();
        if (allowedResourceTypes.contains(ResourceType.URL)) {
            try {
                if (trimmed.startsWith("http://") || trimmed.startsWith("https://")) {
                    return new URLResourceReference(URI.create(trimmed).toURL());
                }

                if (trimmed.startsWith("file:")) {
                    final URL url = URI.create(trimmed).toURL();
                    final String filename = url.getFile();
                    final File file = new File(filename);
                    return new FileResourceReference(file);
                }
            } catch (MalformedURLException e) {
                throw new IllegalArgumentException("Invalid URL: " + trimmed);
            }
        }

        final boolean fileAllowed = allowedResourceTypes.contains(ResourceType.FILE) || allowedResourceTypes.contains(ResourceType.DIRECTORY);
        final boolean textAllowed = allowedResourceTypes.contains(ResourceType.TEXT);

        if (fileAllowed && textAllowed) {
            // We have to make a determination whether this is a file or text. Eventually, it will be best if the user tells us explicitly.
            // For now, we will make a determination based on a couple of simple rules.
            final File file = new File(trimmed);
            if (file.isAbsolute() || file.exists()) {
                return new FileResourceReference(file);
            }

            if (trimmed.startsWith("./") || trimmed.startsWith(".\\")) {
                return new FileResourceReference(file);
            }

            return new Utf8TextResource(value); // Use explicit value, not trimmed value, as the white space may be important for textual content.
        }

        if (fileAllowed) {
            final File file = new File(trimmed);
            return new FileResourceReference(file);
        }

        if (textAllowed) {
            return new Utf8TextResource(value);
        }

        return null;
    }