<mavenModuleSetBuild _class='hudson.maven.MavenModuleSetBuild'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>128</buildNumber><marked><SHA1>b8f6cf3f44d25d526d96435ce91615d4efdabba7</SHA1><branch><SHA1>b8f6cf3f44d25d526d96435ce91615d4efdabba7</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>b8f6cf3f44d25d526d96435ce91615d4efdabba7</SHA1><branch><SHA1>b8f6cf3f44d25d526d96435ce91615d4efdabba7</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>b8f6cf3f44d25d526d96435ce91615d4efdabba7</SHA1><branch><SHA1>b8f6cf3f44d25d526d96435ce91615d4efdabba7</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/bxservice/idempiere-rest</remoteUrl><scmName></scmName></action><action></action><action _class='hudson.maven.reporters.MavenAggregatedArtifactRecord'></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#128</displayName><duration>21615</duration><estimatedDuration>22004</estimatedDuration><fullDisplayName>idempiere-rest-master #128</fullDisplayName><id>128</id><inProgress>false</inProgress><keepLog>false</keepLog><number>128</number><queueId>5609</queueId><result>FAILURE</result><timestamp>1787971446716</timestamp><url>https://jenkins.younex.de/view/all/job/idempiere-rest-master/128/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/v1/resource/impl/ModelResourceImpl.java</affectedPath><commitId>b8f6cf3f44d25d526d96435ce91615d4efdabba7</commitId><timestamp>1787917252000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>fix(models): normalize table name to AD_Table.TableName before model class lookup (#533)

The models endpoints resolve the table case-insensitively (MTable.get uses
equalsIgnoreCase and UPPER(TableName)) but passed the caller's raw path segment
to MTable.getClass(), which derives a Java class name from that exact string and
is case-sensitive.

On a case-insensitive filesystem with exploded-directory bundles (an Eclipse PDE
launch on macOS or Windows), the wrong-case class file is found on disk and then
rejected by defineClass with "NoClassDefFoundError: ... (wrong name: ...)". That
is a LinkageError rather than an Exception, so it escapes the resource method's
catch (Exception ex) and the caller receives a bare Jersey 500 instead of a
structured error response. On a case-sensitive filesystem, or from a JAR bundle
on any OS, the lookup misses cleanly and returns null instead.

Normalize to AD_Table.TableName immediately after the access check in getPO,
getPOs, create and createChild, and use the resolved PO's table name in update
and updateChild. In update and updateChild the name is captured by a lambda, so
a separate single-assignment local is introduced rather than reassigning the
existing variable.

No behaviour change for callers already using the canonical casing.

Fixes #532

Co-authored-by: Claude Opus 5
</comment><date>2026-08-28 13:40:52 +0200</date><id>b8f6cf3f44d25d526d96435ce91615d4efdabba7</id><msg>fix(models): normalize table name to AD_Table.TableName before model class lookup (#533)</msg><path><editType>edit</editType><file>com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/v1/resource/impl/ModelResourceImpl.java</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><mavenArtifacts></mavenArtifacts><mavenVersionUsed>3.9.6</mavenVersionUsed></mavenModuleSetBuild>