// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.core.validate;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.mdm.repository.core.marker.ValidateMarkerUtil;
import org.talend.mdm.repository.core.service.IModelValidationService;
import org.talend.mdm.repository.core.validate.impl.AfterSavingValidationPreference;
import org.talend.mdm.repository.core.validate.impl.BeforeDeployingValidationPreference;
import org.talend.mdm.repository.core.validate.impl.ImmediateValidationPreference;
/**
* created by HHB on 2013-1-24 Detailled comment
*
*/
public class MDMValidationService implements IModelValidationService {
static Logger log = Logger.getLogger(MDMValidationService.class);
private IValidationPreference immediatePref = new ImmediateValidationPreference();
private IValidationPreference afterSavingPref = new AfterSavingValidationPreference();
private IValidationPreference beforeDeployingPref = new BeforeDeployingValidationPreference();
public static class ModelValidateResult implements IModelValidateResult {
private static final int OK = -1;
private static final int WARNING = IMarker.SEVERITY_WARNING;
private static final int ERROR = IMarker.SEVERITY_ERROR;
private int selectedButton;
private Map<Integer, List<IRepositoryViewObject>> severityMap = new HashMap<Integer, List<IRepositoryViewObject>>();
public ModelValidateResult(Map<IRepositoryViewObject, IFile> viewObjMap) {
initSeverityMap();
collectChectResult(viewObjMap);
filterCheckResult();
this.selectedButton = IDialogConstants.CANCEL_ID;
}
/**
* Sets the selectedButton.
*
* @param selectedButton the selectedButton to set
*/
@Override
public void setSelectedButton(int selectedButton) {
this.selectedButton = selectedButton;
}
public ModelValidateResult() {
this.selectedButton = IDialogConstants.CANCEL_ID;
}
/*
* (non-Javadoc)
*
* @see org.talend.mdm.repository.core.service.IModelValidationService.IModelValidateResult#hasErrOrWarning()
*/
@Override
public boolean hasErrOrWarning() {
return severityMap.get(ERROR).size() > 0 || severityMap.get(WARNING).size() > 0;
}
@Override
public int getSelectedButton() {
return selectedButton;
}
private void initSeverityMap() {
severityMap.put(OK, new LinkedList<IRepositoryViewObject>());
severityMap.put(ERROR, new LinkedList<IRepositoryViewObject>());
severityMap.put(WARNING, new LinkedList<IRepositoryViewObject>());
}
private void collectChectResult(Map<IRepositoryViewObject, IFile> viewObjMap) {
for (IRepositoryViewObject viewObj : viewObjMap.keySet()) {
IFile file = viewObjMap.get(viewObj);
if (file == null) {
severityMap.get(OK).add(viewObj);
} else {
String[] markerTypes = ValidateMarkerUtil.getMarkerTypeByViewType(viewObj.getRepositoryObjectType());
if (markerTypes != null) {
try {
for (String markerType : markerTypes) {
int severity = file.findMaxProblemSeverity(markerType, false, IResource.DEPTH_ZERO);
List<IRepositoryViewObject> objs = severityMap.get(severity);
if (objs != null && !objs.contains(viewObj)) {
objs.add(viewObj);
}
}
} catch (CoreException e) {
log.error(e.getMessage(), e);
}
}
}
}
}
private void filterCheckResult() {
List<IRepositoryViewObject> okObjs = severityMap.get(OK);
List<IRepositoryViewObject> errorObjs = severityMap.get(ERROR);
List<IRepositoryViewObject> warningObjs = severityMap.get(WARNING);
for (IRepositoryViewObject obj : errorObjs) {
if (warningObjs.contains(obj)) {
warningObjs.remove(obj);
}
if (okObjs.contains(obj)) {
okObjs.remove(obj);
}
}
for (IRepositoryViewObject obj : warningObjs) {
if (okObjs.contains(obj)) {
okObjs.remove(obj);
}
}
}
@Override
public List<IRepositoryViewObject> getValidObjects(int selectedButtons) {
switch (selectedButtons) {
case BUTTON_OK:
case BUTTON_SKIP_ERROR_WARNING:
return severityMap.get(OK);
case BUTTON_SKIP_ERROR:
List<IRepositoryViewObject> objs = new LinkedList<IRepositoryViewObject>();
objs.addAll(severityMap.get(OK));
objs.addAll(severityMap.get(WARNING));
return objs;
case BUTTON_CANCEL:
return Collections.emptyList();
}
;
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.mdm.repository.core.service.IModelValidationService.IModelValidateResult#getInValidObjects(int)
*/
@Override
public List<IRepositoryViewObject> getInvalidObjects(int selectedButtons) {
switch (selectedButtons) {
case BUTTON_OK:
case BUTTON_SKIP_ERROR_WARNING:
List<IRepositoryViewObject> objs = new LinkedList<IRepositoryViewObject>();
objs.addAll(severityMap.get(ERROR));
objs.addAll(severityMap.get(WARNING));
return objs;
case BUTTON_SKIP_ERROR:
return severityMap.get(ERROR);
case BUTTON_CANCEL:
List<IRepositoryViewObject> all = new LinkedList<IRepositoryViewObject>();
all.addAll(severityMap.get(OK));
all.addAll(severityMap.get(ERROR));
all.addAll(severityMap.get(WARNING));
return all;
}
return null;
}
}
/*
* (non-Javadoc)
*
* @see org.talend.mdm.repository.core.service.IValidationService#validate(java.util.List, int)
*/
@Override
public IModelValidateResult validate(List<IRepositoryViewObject> viewObjs, int condition) {
if (viewObjs != null && viewObjs.size() > 0) {
switch (condition) {
case VALIDATE_IMMEDIATE:
return MDMValidationRunner.validate(viewObjs, immediatePref);
case VALIDATE_AFTER_SAVE:
return MDMValidationRunner.validate(viewObjs, afterSavingPref);
case VALIDATE_BEFORE_DEPLOY:
return MDMValidationRunner.validate(viewObjs, beforeDeployingPref);
default:
break;
}
}
return null;
}
}