rm30335 im Redmine
ASNManagerEJB.handleImportASN() wird geprüft, ob nach dem ersten Drittel schon schwerwiegende Fehler entdeckt wurden: this.containsCriticalErrors( container, processType ). Und wenn ja, springt man aus der Methode raus.Hat mit der Sache eigentlich nichts zu tun ist aber interessant:
ASNXMLImportHandler.processRootElement() hat eine sehr komische Logik. Nämlich, wenn die Liste processingItemInfos Elemente enthält, dann gilt die Nachricht als erfolgreich importiert. Zumindest diese Meldung wird ausgegeben. Aber: wenn das Flag successfullyImported auf true steht, wird ein ProcessingInfo Objekt erstellt, der dann Fehler enthält.Die umgekehrte Operation zu:
ClientResultMessageEntry clientMessage = ErrorMsgUtil.getClientResultMessageEntry( ctx, uiErrMsgObj, uiErrMsgObj.getRelation() == null ? relation : uiErrMsgObj.getRelation(), asnModel.getDespatchId(), asnModel.getASNId(), asnModel.getCreationDate(), counter++ );
Also:
/** * This method makes the "reverse" operation to * {@link #getClientResultMessageEntry(SASUserContext, UIErrorMsg, RelationModel, String, int, long, int)} * Unfortunately the "full reverse" is not possible, so this method tries to do it as far as it is possible. * @param clientMessage message to convert * @return converted {@link UIErrorMsg} or null if the parameter clientMessage is null. */ public static UIErrorMsg convertClientResultMessageEntryToUiErrorMsg(ClientResultMessageEntry clientMessage) { if(clientMessage==null || clientMessage.isSuccess()) { return null; } UIErrorMsg uiErrMsgObj = new UIErrorMsg(); // is NOT contained in getClientResultMessageEntry() uiErrMsgObj.setErrorDescription(clientMessage.getText()); // Nls nls = new Nls(); // nls.init(ctx); // // int csvLineId = uiErrMsgObj.getCsvLineId(); // String lineTxt = null; // if (csvLineId != -1){ // lineTxt = nls.getText("airsupply.asn.validation.info.beginlineno", "(See the csv-file row %s1 ff.)", new String[]{"" +csvLineId}); // } // // String asnIdentifier = null; // if (despatchId != null && !despatchId.trim().equals("") && !uiErrMsgObj.isEnhancedMessage()) { // asnIdentifier = nls.getText("airsupply.asn.validation.invalidasn", "(Despatch ID %s1)", new String[]{despatchId}); // } // // String errorTxt = uiErrMsgObj.getErrorDescription(); // if (asnIdentifier != null){ // errorTxt += " "; // errorTxt += asnIdentifier; // } // // if (lineTxt != null){ // errorTxt += " " +lineTxt; // } // clientMessage.setIsSuccess(false); // clientMessage.setResultNumber(counter); uiErrMsgObj.setErrorCode(clientMessage.getCode()); uiErrMsgObj.setAreaName(clientMessage.getAreaName()); // clientMessage.setReferenceId(despatchId); uiErrMsgObj.setAlertCreationDate(clientMessage.getCreationDate()); // clientMessage.setObjectCreationDate(creationDate); if( clientMessage.getCustomerGroupName()!=null && clientMessage.getSupplierGroupName()!=null && clientMessage.getSupplierNumber()!=null ) { RelationModel relation = new RelationModel(); relation.setCustomerGroupName(clientMessage.getCustomerGroupName()); relation.setSupplierGroupName(clientMessage.getSupplierGroupName()); relation.setSupplierNo(clientMessage.getSupplierNumber()); uiErrMsgObj.setRelation(relation); } uiErrMsgObj.setObjectId(clientMessage.getObjectId()); uiErrMsgObj.setFieldName(clientMessage.getFieldName()); // clientMessage.setNlsDefaultMessage(errorTxt); uiErrMsgObj.setPageId(clientMessage.getTargetId()); try { uiErrMsgObj.setSectionName(ASN_SECTION.valueOf(clientMessage.getSectionName())); } catch (IllegalArgumentException e) { // do nothing here } uiErrMsgObj.setPreventRefIdLink(clientMessage.isPreventRefIdLink()); uiErrMsgObj.setPreventSectionLink(clientMessage.isPreventSectionLink()); copyRefIdList(clientMessage, uiErrMsgObj); return uiErrMsgObj; } private static void copyRefIdList(ClientResultMessageEntry clientMessage, UIErrorMsg uiErrMsgObj) { List<Map<String, String>> fromList = clientMessage.getFieldRefIds(); if(fromList!=null) { List<Map<String, String>> toList = new ArrayList<>(); for (Map<String, String> fromMap : fromList) { Map<String, String> toMap = new HashMap<>(); for(Entry<String, String> fieldRefIdsEntry : fromMap.entrySet()) { String key = fieldRefIdsEntry.getKey(); if (ClientResultMessageEntry.REFERENCE_KEYS.INTERNAL_OBJECTID.toString().equals(key)) { if (uiErrMsgObj.getInternalObjectId()==0) { uiErrMsgObj.setInternalObjectId(parseStringToIntOrDefault(fieldRefIdsEntry.getValue(), 0)); } } else if ( ClientResultMessageEntry.REFERENCE_KEYS.INTERNAL_REFERENCEID.toString().equals(key) ) { if (uiErrMsgObj.getInternalReferenceId()==0) { uiErrMsgObj.setInternalReferenceId(parseStringToIntOrDefault(fieldRefIdsEntry.getValue(), 0)); } } else if ( ClientResultMessageEntry.REFERENCE_KEYS.FILTER_NAME.toString().equals(key) ) { if (StringUtils.isEmpty(uiErrMsgObj.getFilterName())) { uiErrMsgObj.setFilterName(fieldRefIdsEntry.getValue()); } } else if ( ClientResultMessageEntry.REFERENCE_KEYS.ATTRIBUTE_NAME.toString().equals(key) ) { if (StringUtils.isEmpty(uiErrMsgObj.getAttributeName())) { uiErrMsgObj.setAttributeName(fieldRefIdsEntry.getValue()); } } else //noinspection StatementWithEmptyBody if ( ClientResultMessageEntry.REFERENCE_KEYS.DOCUMENT_ID.toString().equals(key) ) { // asnId = Integer.parseInt(fieldRefIdsEntry.getValue()); // do nothing for now } else { toMap.put(fieldRefIdsEntry.getKey(), fieldRefIdsEntry.getValue()); } } toList.add(toMap); } uiErrMsgObj.setFieldRefIds(toList); } } @SuppressWarnings("SameParameterValue") private static int parseStringToIntOrDefault(String value, int defaultInt) { try { return Integer.parseInt(value); } catch (NumberFormatException e) { return defaultInt; } }
Diese Variante ziehen wir vor, da der Code so gut wie gar nicht geändert werden muss. Wir nutzen aus, dass die Methode ErrorMsgUtil.handleAsnErrorReport() auch dann Reports schreibt, wenn keine übergeben werden. Sie werden dann aus den Fehlern, die im Container gespeichert sind, erzeugt.