{"record":{"id":"783a8844c60ba825","repo":"apache/maven","slug":"reader-or-inputstream-must-be-non-null-783a88","errorCode":null,"errorMessage":"reader or inputStream must be non null","messagePattern":"reader or inputStream must be non null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultToolchainsXmlFactory.java","lineNumber":55,"sourceCode":"import org.apache.maven.api.toolchain.InputSource;\nimport org.apache.maven.api.toolchain.PersistedToolchains;\nimport org.apache.maven.toolchain.v4.MavenToolchainsStaxReader;\nimport org.apache.maven.toolchain.v4.MavenToolchainsStaxWriter;\n\nimport static java.util.Objects.requireNonNull;\nimport static org.apache.maven.impl.StaxLocation.getLocation;\nimport static org.apache.maven.impl.StaxLocation.getMessage;\n\n@Named\n@Singleton\npublic class DefaultToolchainsXmlFactory implements ToolchainsXmlFactory {\n    @Override\n    public PersistedToolchains read(@Nonnull XmlReaderRequest request) throws XmlReaderException {\n        Objects.requireNonNull(request, \"request\");\n        Reader reader = request.getReader();\n        InputStream inputStream = request.getInputStream();\n        if (reader == null && inputStream == null) {\n            throw new IllegalArgumentException(\"reader or inputStream must be non null\");\n        }\n        try {\n            InputSource source = null;\n            if (request.getModelId() != null || request.getLocation() != null) {\n                source = InputSource.of(request.getLocation());\n            }\n            MavenToolchainsStaxReader xml = request.getTransformer() != null\n                    ? new MavenToolchainsStaxReader(request.getTransformer()::transform)\n                    : new MavenToolchainsStaxReader();\n            xml.setAddDefaultEntities(request.isAddDefaultEntities());\n            if (reader != null) {\n                return xml.read(reader, request.isStrict(), source);\n            } else {\n                return xml.read(inputStream, request.isStrict(), source);\n            }\n        } catch (Exception e) {\n            throw new XmlReaderException(\"Unable to read toolchains: \" + getMessage(e), getLocation(e), e);\n        }","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultToolchainsXmlFactory.java#L37-L73","documentation":"DefaultToolchainsXmlFactory.read accepts only a Reader or an InputStream; path and url on the request are not consulted. If both reader and inputStream are null it throws IllegalArgumentException before parsing a PersistedToolchains document.","triggerScenarios":"Building a XmlReaderRequest for toolchains with only .path(...) or .url(...) set (ignored by this factory), or with no source at all.","commonSituations":"Reusing request-builder code from factories that do support path/url; assuming the XML factory APIs are symmetric across model, plugin, settings and toolchains.","solutions":["Open the file and pass .inputStream(Files.newInputStream(path)) or .reader(Files.newBufferedReader(path))","Check getReader()/getInputStream() for null before calling read"],"exampleFix":"// before\nPersistedToolchains t = toolchainsXmlFactory.read(XmlReaderRequest.builder()\n    .path(toolchainsPath) // ignored: wants reader or inputStream\n    .build()); // throws\n\n// after\\ntry (InputStream is = Files.newInputStream(toolchainsPath)) {\\n    PersistedToolchains t = toolchainsXmlFactory.read(XmlReaderRequest.builder()\\n        .inputStream(is)\\n        .build());\\n}","handlingStrategy":"validation","validationCode":"XmlReaderRequest req = XmlReaderRequest.builder().build();\nif (req.getReader() == null && req.getInputStream() == null) {\n    try (InputStream is = Files.newInputStream(toolchainsPath)) {\n        toolchainsXmlFactory.read(XmlReaderRequest.builder()\n            .inputStream(is)\n            .build());\n    }\n} else {\n    toolchainsXmlFactory.read(req);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["This factory ignores path and url: always open the stream yourself","Share one request-building helper for settings and toolchains reads"],"tags":["maven","toolchains","xml","reader","null-check"],"backgroundTag":"missing-required-argument","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}