/* * Copyright Siemens AG, 2013-2016. Part of the SW360 Portal Project. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.sw360.moderation.db; import org.apache.thrift.protocol.TType; import org.eclipse.sw360.datahandler.thrift.components.EccInformation; import org.eclipse.sw360.datahandler.thrift.moderation.ModerationRequest; import java.util.Arrays; import java.util.Collection; import static com.google.common.base.Strings.isNullOrEmpty; import static org.eclipse.sw360.datahandler.common.SW360Utils.newDefaultEccInformation; /** * Class for comparing a document with its counterpart in the database * Writes the difference (= additions and deletions) to the moderation request * * @author alex.borodin@evosoft.com */ public class EccInformationModerationRequestGenerator extends ModerationRequestGenerator<EccInformation._Fields, EccInformation> { private static final Collection<EccInformation._Fields> READ_ONLY_FIELDS = Arrays.asList(EccInformation._Fields.ASSESSMENT_DATE, EccInformation._Fields.ASSESSOR_CONTACT_PERSON, EccInformation._Fields.ASSESSOR_DEPARTMENT); @Override public ModerationRequest setAdditionsAndDeletions(ModerationRequest request, EccInformation updateCI, EccInformation actualCI){ this.updateDocument = updateCI == null ? newDefaultEccInformation() : updateCI; this.actualDocument = actualCI == null ? newDefaultEccInformation() : actualCI; documentAdditions = null; documentDeletions = null; for(EccInformation._Fields field : EccInformation._Fields.values()){ if (READ_ONLY_FIELDS.contains(field)){ continue; } if (EccInformation.metaDataMap.get(field).valueMetaData.type == TType.BOOL || EccInformation.metaDataMap.get(field).valueMetaData.type == TType.I32){ if(actualDocument.getFieldValue(field) != updateDocument.getFieldValue(field)){ ensureDocumentAdditionsIsSet(); ensureDocumentDeletionsIsSet(); documentAdditions.setFieldValue(field, updateDocument.getFieldValue(field)); documentDeletions.setFieldValue(field, actualDocument.getFieldValue(field)); } } else if (EccInformation.metaDataMap.get(field).valueMetaData.type == TType.STRING || EccInformation.metaDataMap.get(field).valueMetaData.type == TType.ENUM || EccInformation.metaDataMap.get(field).valueMetaData.type == TType.STRUCT) { if (isEquivalentToEmpty(field, actualDocument) && isEquivalentToEmpty( field, updateDocument)) { // do nothing } else if (actualDocument.isSet(field) && !updateDocument.isSet(field)) { ensureDocumentDeletionsIsSet(); documentDeletions.setFieldValue(field, actualDocument.getFieldValue(field)); } else if (updateDocument.isSet(field) && !actualDocument.isSet(field)) { ensureDocumentAdditionsIsSet(); documentAdditions.setFieldValue(field, updateDocument.getFieldValue(field)); } else if (!(actualDocument.getFieldValue(field).equals(updateDocument.getFieldValue(field)))) { ensureDocumentAdditionsIsSet(); ensureDocumentDeletionsIsSet(); documentAdditions.setFieldValue(field, updateDocument.getFieldValue(field)); documentDeletions.setFieldValue(field, actualDocument.getFieldValue(field)); } } } request.getReleaseAdditions().setEccInformation(documentAdditions); request.getReleaseDeletions().setEccInformation(documentDeletions); return request; } protected boolean isEquivalentToEmpty(EccInformation._Fields field, EccInformation document){ if (EccInformation.metaDataMap.get(field).valueMetaData.type == TType.STRING){ return isNullOrEmpty((String) document.getFieldValue(field)); } else { return document.getFieldValue(field) == null; } } private void ensureDocumentDeletionsIsSet() { if(documentDeletions == null){ documentDeletions = newDefaultEccInformation(); } } private void ensureDocumentAdditionsIsSet() { if(documentAdditions == null){ documentAdditions = newDefaultEccInformation(); } } }