From c904343fa2dee7dd20831951420d1b32b01deec2 Mon Sep 17 00:00:00 2001 From: Teo Sarca Date: Sun, 23 Apr 2017 13:59:39 +0300 Subject: [PATCH] fix NPE on DocumentInterfaceWrapperHelper.getValue https://github.com/metasfresh/metasfresh-webui-api/issues/291 --- .../model/DocumentInterfaceWrapper.java | 52 +++++++++++++++++-- .../model/DocumentInterfaceWrapperHelper.java | 3 +- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapper.java b/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapper.java index c8f88d7bb..ad38e813a 100644 --- a/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapper.java +++ b/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapper.java @@ -38,11 +38,11 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public - * License along with this program. If not, see + * License along with this program. If not, see * . * #L% */ @@ -102,7 +102,7 @@ else if (model instanceof IDocumentAware) document = ((IDocumentAware)model).getDocument(); useOldValuesDefault = false; } - + if (document == null) { final DocumentInterfaceWrapper wrapper = getWrapper(model); @@ -179,7 +179,7 @@ else if (model instanceof IDocumentAware) * @param model * @return {@link DocumentInterfaceWrapper} or null if no {@link DocumentInterfaceWrapper} can be extracted from given model */ - /* package */static DocumentInterfaceWrapper getWrapper(final Object model) + private static DocumentInterfaceWrapper getWrapper(final Object model) { if (model == null) { @@ -204,6 +204,50 @@ else if (model instanceof DocumentInterfaceWrapper) return null; } + /* package */static DocumentInterfaceWrapper getOrCreateWrapper(final Object model) + { + if (model == null) + { + return null; + } + + // + // Try to get the wrapper directly + if (Proxy.isProxyClass(model.getClass())) + { + final InvocationHandler ih = Proxy.getInvocationHandler(model); + if (ih instanceof DocumentInterfaceWrapper) + { + final DocumentInterfaceWrapper wrapper = (DocumentInterfaceWrapper)ih; + return wrapper; + } + return null; + } + else if (model instanceof DocumentInterfaceWrapper) + { + return (DocumentInterfaceWrapper)model; + } + + // + // Try getting the document and create a wrapper for it + if (model instanceof Document) + { + final Document document = (Document)model; + final boolean useOldValues = false; + return new DocumentInterfaceWrapper(document, useOldValues); + } + else if (model instanceof IDocumentAware) + { + final Document document = ((IDocumentAware)model).getDocument(); + final boolean useOldValues = false; + return new DocumentInterfaceWrapper(document, useOldValues); + } + + // + // Wrapper could not be found or create + throw new IllegalArgumentException("Cannot get or create the " + DocumentInterfaceWrapper.class + " from " + model); + } + public static int getWindowNo(final Object model) { final Document document = getDocument(model); diff --git a/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapperHelper.java b/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapperHelper.java index 241ff38b9..1e67a22db 100644 --- a/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapperHelper.java +++ b/src/main/java/de/metas/ui/web/window/model/DocumentInterfaceWrapperHelper.java @@ -135,9 +135,10 @@ public boolean isNew(final Object model) @Override public T getValue(final Object model, final String columnName, final boolean throwExIfColumnNotFound, final boolean useOverrideColumnIfAvailable) { + final DocumentInterfaceWrapper wrapper = DocumentInterfaceWrapper.getOrCreateWrapper(model); + // // Get _Override's value, if any - final DocumentInterfaceWrapper wrapper = DocumentInterfaceWrapper.getWrapper(model); if (useOverrideColumnIfAvailable) { final T value = getValueOverrideOrNull(wrapper, columnName);