// ============================================================================
//
// 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.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.validation.internal.ValOperation;
import org.eclipse.wst.validation.internal.ValType;
import org.eclipse.wst.validation.internal.ValidationResultSummary;
import org.eclipse.wst.validation.internal.ValidationRunner;
import org.talend.core.model.general.Project;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.core.service.IModelValidationService;
import org.talend.mdm.repository.core.service.IModelValidationService.IModelValidateResult;
import org.talend.mdm.repository.core.validate.i18n.Messages;
import org.talend.mdm.repository.ui.dialogs.ValidationResultDialog;
import org.talend.mdm.repository.ui.dialogs.lock.LockedDirtyObjectDialog;
import org.talend.mdm.repository.ui.views.MDMProblemView;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import org.talend.mdm.repository.utils.UIUtil;
import org.talend.repository.ProjectManager;
/**
* created by HHB on 2013-1-23 Detailled comment
*
*/
public class MDMValidationRunner extends WorkspaceJob {
static Logger log = Logger.getLogger(MDMValidationRunner.class);
private static boolean running = false;
private final IValidationPreference validationPref;
Map<IProject, Set<IResource>> toValidate = new HashMap<IProject, Set<IResource>>();
Map<IRepositoryViewObject, IFile> viewObjMap = new HashMap<IRepositoryViewObject, IFile>();
private int returnCode = IDialogConstants.OK_ID;
private IModelValidateResult validateResult = null;
/**
* Sets the validateResult.
*
* @param validateResult the validateResult to set
*/
private void setValidateResult(IModelValidateResult validateResult) {
this.validateResult = validateResult;
}
private LockedDirtyObjectDialog lockDirtyDialog;
/**
* Getter for returnCode.
*
* @return the returnCode
*/
public int getReturnCode() {
return this.returnCode;
}
/**
* Sets the returnCode.
*
* @param returnCode the returnCode to set
*/
private void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}
/**
* DOC HHB ValidationRunner constructor comment.
*
* @param name
*/
public MDMValidationRunner(List<IRepositoryViewObject> viewObjs, IValidationPreference validationPref) {
super("MDM Validation"); //$NON-NLS-1$
this.validationPref = validationPref;
init(viewObjs);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.jobs.Job#shouldSchedule()
*/
@Override
public boolean shouldSchedule() {
return !running;
}
public static IModelValidateResult validate(List<IRepositoryViewObject> viewObjs, IValidationPreference validationPref) {
MDMValidationRunner runner = new MDMValidationRunner(viewObjs, validationPref);
IJobChangeListener listener = new JobChangeAdapter() {
@Override
public void aboutToRun(IJobChangeEvent event) {
running = true;
}
@Override
public void done(IJobChangeEvent event) {
running = false;
}
};
runner.addJobChangeListener(listener);
runner.schedule();
try {
runner.join();
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
return runner.validateResult;
}
private void init(List<IRepositoryViewObject> viewObjs) {
viewObjMap.clear();
Project talendProject = ProjectManager.getInstance().getCurrentProject();
if (talendProject != null) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(talendProject.getTechnicalLabel());
Set<IResource> files = new HashSet<IResource>();
for (IRepositoryViewObject viewObj : viewObjs) {
IFile file = null;
ERepositoryObjectType type = viewObj.getRepositoryObjectType();
if (type == IServerObjectRepositoryType.TYPE_DATAMODEL) {
Item item = viewObj.getProperty().getItem();
file = RepositoryResourceUtil.findReferenceFile(type, item, "xsd"); //$NON-NLS-1$
if (file != null) {
files.add(file);
}
//
// file = RepositoryResourceUtil.findReferenceFile(type, item, "mapinfo"); //$NON-NLS-1$
// if (file != null) {
// files.add(file);
// }
}
viewObjMap.put(viewObj, file);
}
toValidate.put(project, files);
if (UIUtil.isWorkInUI()) {
lockDirtyDialog = new LockedDirtyObjectDialog(null, Messages.MDMValidationRunner_promptToSaveEditors, viewObjs);
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.resources.WorkspaceJob#runInWorkspace(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
if (UIUtil.isWorkInUI() && lockDirtyDialog.needShowDialog()) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
if (lockDirtyDialog.open() == IDialogConstants.CANCEL_ID) {
setReturnCode(IDialogConstants.CANCEL_ID);
} else {
lockDirtyDialog.saveDirtyObjects();
}
}
});
if (getReturnCode() == IDialogConstants.CANCEL_ID) {
setValidateResult(new MDMValidationService.ModelValidateResult());
return Status.CANCEL_STATUS;
}
}
final ValOperation vo = ValidationRunner.validate(toValidate, ValType.Manual, monitor, false);
if (vo.isCanceled()) {
setValidateResult(new MDMValidationService.ModelValidateResult());
return Status.CANCEL_STATUS;
}
final ValidationResultSummary result = vo.getResult();
final IModelValidateResult validateResult = new MDMValidationService.ModelValidateResult(viewObjMap);
if (validationPref.shouldShowResults(result)) {
final Set<IResource> resources = toValidate.values().iterator().next();
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
ValidationResultDialog d = new ValidationResultDialog(new Shell(), result, validationPref, viewObjMap);
int code = d.open();
validateResult.setSelectedButton(code);
setValidateResult(validateResult);
}
});
} else {
setValidateResult(validateResult);
if (validateResult.hasErrOrWarning()) {
int code = ValidationPreferenceService.getInstance().getDeployActionWhenValidateFail();
validateResult.setSelectedButton(code);
} else {
validateResult.setSelectedButton(IModelValidationService.BUTTON_OK);
}
}
activeProblemView(result);
return Status.OK_STATUS;
}
private void activeProblemView(ValidationResultSummary result) {
if (UIUtil.isWorkInUI()) {
if (result.getSeverityError() > 0 || result.getSeverityWarning() > 0 || result.getSeverityInfo() > 0) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
if (page != null && UIUtil.isMDMPerspective(page)) {
IWorkbenchPart activepart = page.getActivePart();
try {
page.showView(MDMProblemView.VIEW_ID);
if (activepart != null) {
page.activate(activepart);
}
} catch (PartInitException e) {
log.error(e.getMessage(), e);
}
}
}
});
}
}
}
}