| /******************************************************************************* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| *******************************************************************************/ |
| package org.ofbiz.entity.util; |
| |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.List; |
| |
| import javax.xml.parsers.ParserConfigurationException; |
| |
| import org.ofbiz.base.util.Debug; |
| import org.ofbiz.entity.Delegator; |
| import org.ofbiz.entity.GenericEntityException; |
| import org.ofbiz.entity.GenericPK; |
| import org.ofbiz.entity.GenericValue; |
| import org.ofbiz.entity.model.ModelEntity; |
| import org.xml.sax.SAXException; |
| |
| /** |
| * Some utility routines for loading seed data. |
| */ |
| public class EntityDataAssert { |
| |
| public static final String module = EntityDataAssert.class.getName(); |
| |
| public static int assertData(URL dataUrl, Delegator delegator, List<Object> errorMessages) throws GenericEntityException, SAXException, ParserConfigurationException, IOException { |
| int rowsChecked = 0; |
| |
| if (dataUrl == null) { |
| String errMsg = "Cannot assert/check data, dataUrl was null"; |
| errorMessages.add(errMsg); |
| Debug.logError(errMsg, module); |
| return 0; |
| } |
| |
| Debug.logVerbose("Loading XML Resource: " + dataUrl.toExternalForm(), module); |
| |
| try { |
| for (GenericValue checkValue: delegator.readXmlDocument(dataUrl)) { |
| checkSingleValue(checkValue, delegator, errorMessages); |
| rowsChecked++; |
| } |
| } catch (GenericEntityException e) { |
| String xmlError = "Error checking/asserting XML Resource: " + dataUrl.toExternalForm() + "; Error was: " + e.getMessage(); |
| Debug.logError(e, xmlError, module); |
| // instead of adding this as a message, throw the real exception; then caller has more control |
| //errorMessages.add(xmlError); |
| throw e; |
| } |
| |
| return rowsChecked; |
| } |
| |
| public static void checkValueList(List<GenericValue> valueList, Delegator delegator, List<Object> errorMessages) throws GenericEntityException { |
| if (valueList == null) return; |
| |
| for (GenericValue checkValue : valueList) { |
| checkSingleValue(checkValue, delegator, errorMessages); |
| } |
| } |
| |
| public static void checkSingleValue(GenericValue checkValue, Delegator delegator, List<Object> errorMessages) throws GenericEntityException { |
| if (checkValue == null) { |
| errorMessages.add("Got a value to check was null"); |
| return; |
| } |
| // to check get the PK, find by that, compare all fields |
| GenericPK checkPK = null; |
| |
| try { |
| checkPK = checkValue.getPrimaryKey(); |
| GenericValue currentValue = EntityQuery.use(delegator).from(checkPK.getEntityName()).where(checkPK).queryOne(); |
| if (currentValue == null) { |
| errorMessages.add("Entity [" + checkPK.getEntityName() + "] record not found for pk: " + checkPK); |
| return; |
| } |
| |
| ModelEntity modelEntity = checkValue.getModelEntity(); |
| for (String nonpkFieldName: modelEntity.getNoPkFieldNames()) { |
| // skip the fields the entity engine maintains |
| if (ModelEntity.CREATE_STAMP_FIELD.equals(nonpkFieldName) || ModelEntity.CREATE_STAMP_TX_FIELD.equals(nonpkFieldName) || |
| ModelEntity.STAMP_FIELD.equals(nonpkFieldName) || ModelEntity.STAMP_TX_FIELD.equals(nonpkFieldName)) { |
| continue; |
| } |
| |
| Object checkField = checkValue.get(nonpkFieldName); |
| Object currentField = currentValue.get(nonpkFieldName); |
| |
| if (checkField != null && !checkField.equals(currentField)) { |
| errorMessages.add("Field [" + modelEntity.getEntityName() + "." + nonpkFieldName + |
| "] did not match; file value [" + checkField + "], db value [" + currentField + "] pk [" + checkPK + "]"); |
| } |
| } |
| } catch (GenericEntityException e) { |
| throw e; |
| } catch (Throwable t) { |
| String errMsg; |
| if (checkPK == null) { |
| errMsg = "Error checking value [" + checkValue + "]: " + t.toString(); |
| } else { |
| errMsg = "Error checking entity [" + checkPK.getEntityName() + "] with pk [" + checkPK.getAllFields() + "]: " + t.toString(); |
| } |
| errorMessages.add(errMsg); |
| Debug.logError(t, errMsg, module); |
| } |
| } |
| } |