{"record":{"id":"6723182f7af6a15d","repo":"apache/pulsar","slug":"invalid-package-name-packagename","errorCode":null,"errorMessage":"Invalid package name '${packageName}'","messagePattern":"Invalid package name '(.+?)'","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageName.java","lineNumber":80,"sourceCode":"        return get(pkgName);\n    }\n\n    public static PackageName get(String type, String name, String version) {\n        String pkgName = type + \"://\" + name + \"@\" + version;\n        return get(pkgName);\n    }\n\n    public static PackageName get(String packageName) {\n        try {\n            return cache.get(packageName);\n        } catch (ExecutionException e) {\n            throw new RuntimeException(e.getCause());\n        }\n    }\n\n    private PackageName(String packageName) {\n        if (!packageName.contains(\"://\")) {\n            throw new IllegalArgumentException(\"Invalid package name '\" + packageName + \"'\");\n        }\n\n        List<String> parts = Splitter.on(\"://\").limit(2).splitToList(packageName);\n        if (parts.size() != 2) {\n            throw new IllegalArgumentException(\"Invalid package name '\" + packageName + \"'\");\n        }\n        this.type = PackageType.getEnum(parts.get(0));\n\n        String rest = parts.get(1);\n        // if the package name does not contains '@', that means user does not set the version of package.\n        // We will set the version to latest.\n        if (!rest.contains(\"@\")) {\n            rest += \"@\";\n        }\n        parts = Splitter.on(\"@\").splitToList(rest);\n        if (parts.size() != 2) {\n            throw new IllegalArgumentException(\"Invalid package name '\" + packageName + \"'\");\n        }","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageName.java#L62-L98","documentation":"The private PackageName constructor requires a fully qualified package name of the form <type>://<tenant>/<namespace>/<name>@<version>. This first check fires when the string contains no \"://\" separator, meaning no scheme/type portion was provided. PackageName.get is the public entry point that reaches this constructor.","triggerScenarios":"Calling PackageName.get(\"my-function\") or get(\"tenant/ns/name@v1\") — any string missing the \"function://\", \"sink://\", or \"source://\" scheme prefix.","commonSituations":"Users pass just the package name or path portion taken from docs/CLI output; forgetting the scheme when scripting with the REST API; mixing up package name with function name.","solutions":["Prefix the name with its type scheme, e.g. \"function://tenant/namespace/name@version\".","Validate the format before calling: must match type://tenant/namespace/name[@version].","Check the package type (function/sink/source) and prepend it explicitly."],"exampleFix":"// before\nPackageName pkg = PackageName.get(\"tenant/ns/my-pkg@v1\");\n// after\nPackageName pkg = PackageName.get(\"function://tenant/ns/my-pkg@v1\");","handlingStrategy":"validation","validationCode":"static boolean isValidPackageName(String name) {\n    return name != null && name.matches(\"(function|sink|source)://[^/]+/[^/]+/[^/@]+(@[^@]+)?\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    PackageName pkg = PackageName.get(input);\n} catch (IllegalArgumentException e) {\n    throw new RestException(Response.Status.BAD_REQUEST, \"package name must be type://tenant/namespace/name[@version]\");\n}","preventionTips":["Always include the scheme (function://, sink://, source://).","Build names from components rather than user-supplied strings.","Trim user input before constructing PackageName.","Share a single name-formatting utility across clients."],"tags":["validation","naming","package-management"],"backgroundTag":"invalid-package-name-format","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}