/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.verification.ui.vrules.wizard.runtime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.jboss.tools.common.model.ui.wizards.query.AbstractQueryWizardView;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TreeItem;
import org.jboss.tools.common.verification.ui.XStudioVerificationPlugin;
import org.jboss.tools.common.verification.ui.vrules.preferences.VerificationPreferencePage;
import org.jboss.tools.common.verification.ui.vrules.wizard.DescriptionManager;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.ServiceDialog;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.options.PreferenceModelUtilities;
import org.jboss.tools.common.verification.vrules.VHelper;
import org.jboss.tools.common.verification.vrules.VManager;
import org.jboss.tools.common.verification.vrules.VModel;
import org.jboss.tools.common.verification.vrules.VObject;
import org.jboss.tools.common.verification.vrules.VRule;
import org.jboss.tools.common.verification.vrules.VRuleSet;
import org.jboss.tools.common.verification.vrules.VTask;
import org.jboss.tools.common.verification.vrules.VTaskListener;
import org.jboss.tools.common.verification.vrules.layer.VModelFactory;
public class VerifyWizardView extends AbstractQueryWizardView {
private static final String COMMAND_RESUME = VerificationUIMessages.VerifyWizardView_Resume;
private static final String COMMAND_PAUSE = VerificationUIMessages.VerifyWizardView_Pause;
private static final String COMMAND_STOP = VerificationUIMessages.VerifyWizardView_Stop;
private static final String COMMAND_RUN_SELECTED = VerificationUIMessages.VerifyWizardView_RunSelected;
private static final String COMMAND_RUN_ALL = VerificationUIMessages.VerifyWizardView_RunAll;
static final String COMMAND_CLOSE = VerificationUIMessages.VerifyWizardView_Close;
static String[] INITIAL_COMMANDS = new String[]{COMMAND_RUN_ALL, COMMAND_RUN_SELECTED, COMMAND_CLOSE, HELP};
static String[] RUNNING_COMMANDS = new String[]{COMMAND_PAUSE, COMMAND_STOP, COMMAND_CLOSE, HELP};
static String[] PAUSE_COMMANDS = new String[]{COMMAND_RESUME, COMMAND_STOP, COMMAND_CLOSE, HELP};
protected RuntimeSignificanceView significance = new RuntimeSignificanceView();
protected RuntimeRulesProvider provider = new RuntimeRulesProvider();
protected TreeViewer treeViewer;
protected XModel model;
protected VObject vobject;
protected VTask task = null;
protected VTaskListener listener = new VTaskListenerSafeImpl(new VTaskListenerImpl(this));
protected Map<String,RuntimeItemWrapper> wrappers = new HashMap<String,RuntimeItemWrapper>();
protected DescriptionManager tip = new DescriptionManager();
public VerifyWizardView() {
this.setMessage(WizardKeys.getString("VerifyWizardView.Message")); //$NON-NLS-1$
this.setTitle(WizardKeys.getString("VerifyWizardView.Title")); //$NON-NLS-1$
this.setWindowTitle(WizardKeys.getString("VerifyWizardView.WindowTitle")); //$NON-NLS-1$
}
private VManager getRulesManager() {
return VHelper.getManager(/*PreferenceModelUtilities.getPreferenceModel()*/);
}
public Control createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.horizontalSpacing = 10;
layout.marginHeight = 10;
layout.verticalSpacing = 10;
layout.marginWidth = 10;
composite.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(gd);
Control sc = significance.createControl(composite);
sc.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
treeViewer = new TreeViewer(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.MULTI);
treeViewer.setContentProvider(provider);
treeViewer.setLabelProvider(provider);
treeViewer.setInput(this);
Control tc = treeViewer.getControl();
tc.setLayoutData(new GridData(GridData.FILL_BOTH));
significance.update();
tip.install(treeViewer.getTree());
treeViewer.expandToLevel(2);
return composite;
}
public void setObject(Object data) {
Properties p = findProperties(data);
if(p != null) {
String key = p.getProperty("help"); //$NON-NLS-1$
setHelpKey(key);
}
Object[] os = (Object[])data;
XModelObject object = (XModelObject)os[0];
model = object.getModel();
VManager rulesManager = getRulesManager();
significance.setManager(rulesManager);
VModel vmodel = VModelFactory.getModel(object.getModel());
vobject = vmodel.getObjectByPath(object.getPath());
VRule[] rules = VHelper.getRules(rulesManager, vobject);
if(rules == null) return;
VRuleSet[] sets = getRuleSets(rules);
RuntimeRuleSetWrapper[] ruleSets = new RuntimeRuleSetWrapper[sets.length];
if(sets != null) for (int i = 0; i < sets.length; i++) {
if(!sets[i].isEnabled()) continue;
ruleSets[i] = new RuntimeRuleSetWrapper(sets[i]);
wrappers.put(sets[i].getName(), ruleSets[i]);
new RWLImpl(ruleSets[i]);
VRule[] rs = getRules(sets[i], rules);
ArrayList<RuntimeRuleWrapper> lc = new ArrayList<RuntimeRuleWrapper>();
for (int j = 0; j < rs.length; j++) {
if(!rs[j].isEnabled()) continue;
RuntimeRuleWrapper r = new RuntimeRuleWrapper(rs[j]);
wrappers.put(rs[j].getName(), r);
r.setManager(rulesManager);
new RWLImpl(r);
lc.add(r);
}
RuntimeItemWrapper[] cw = lc.toArray(new RuntimeItemWrapper[0]);
ruleSets[i].children = cw;
}
provider.ruleSets = ruleSets;
changeControl(INITIAL_COMMANDS);
}
public String[] getCommands() {
return INITIAL_COMMANDS;
}
public String getDefaultCommand() {
return INITIAL_COMMANDS[0];
}
private VRuleSet[] getRuleSets(VRule[] rules) {
Set<String> s = new HashSet<String>();
ArrayList<VRuleSet> l = new ArrayList<VRuleSet>();
for (int i = 0; i < rules.length; i++) {
VRuleSet set = rules[i].getRuleSet();
if(s.contains(set.getName())) continue;
s.add(set.getName());
l.add(set);
}
return l.toArray(new VRuleSet[0]);
}
private VRule[] getRules(VRuleSet set, VRule[] rules) {
ArrayList<VRule> l = new ArrayList<VRule>();
for (int i = 0; i < rules.length; i++)
if(set == rules[i].getRuleSet()) l.add(rules[i]);
return l.toArray(new VRule[0]);
}
class RWLImpl implements RuntimeItemWrapperListener {
RuntimeItemWrapper wrapper;
public RWLImpl(RuntimeItemWrapper wrapper) {
this.wrapper = wrapper;
wrapper.setListener(this);
}
public void statusChanged() {
if(treeViewer != null) treeViewer.refresh(wrapper);
}
}
/**
*
* @param commands (translatable)
*/
public void changeControl(String[] commands) {
commandBar.setCommands(commands);
commandBar.setDefaultCommand(commands[0]);
commandBar.update();
if(commandBar.getControl() != null && !commandBar.getControl().isDisposed()) {
commandBar.getControl().pack();
commandBar.getControl().getParent().layout();
}
}
public RuntimeItemWrapper findWrapper(String id) {
return (RuntimeItemWrapper)wrappers.get(id);
}
public void action(String command) {
stopEditing();
if(COMMAND_RUN_ALL.equals(command)) {
clearStatus();
if(task != null) task.removeTaskListener(listener);
task = getRulesManager().createTask(vobject);
task.addTaskListener(listener);
task.start();
} else if(COMMAND_RUN_SELECTED.equals(command)) {
clearStatus();
VRule[] rs = getSelectedRules();
if(rs == null) return;
if(task != null) task.removeTaskListener(listener);
task = getRulesManager().createTask(vobject, rs);
task.addTaskListener(listener);
task.start();
} else if(COMMAND_CLOSE.equals(command)) {
if(task != null) {
task.removeTaskListener(listener);
task.stop();
task = null;
}
setCode(0);
dispose();
} else if(COMMAND_STOP.equals(command)) {
if(task != null) task.stop();
} else if(COMMAND_PAUSE.equals(command)) {
if(task != null) task.pause();
} else if(COMMAND_RESUME.equals(command)) {
if(task != null) task.start();
} else if(HELP.equals(command)) {
super.action(command);
}
}
static int ERROR_COUMT_LIMIT = -1;
int getErrorCountLimit() {
XModelObject o = PreferenceModelUtilities.getPreferenceModel().getByPath(VerificationPreferencePage.PREFERENCES[0]);
if(o == null) return -1;
String s = o.getAttributeValue(VerificationPreferencePage.ATTR_ERRORS_NUMBER_LIMIT);
int limit = -1;
if(!"unlimited".equals(s) && s != null && s.length() > 0) try { //$NON-NLS-1$
limit = Integer.parseInt(s);
} catch (NumberFormatException e) {
XStudioVerificationPlugin.getPluginLog().logError(e);
}
return limit;
}
boolean limitLock = false;
public void limitReached() {
if(limitLock) return;
limitLock = true;
Display.getDefault().syncExec(
new Runnable() {
public void run() {
ServiceDialog d = model.getService();
d.showDialog(VerificationUIMessages.WARNING, NLS.bind(VerificationUIMessages.LIMIT_OF_REPORTED_ERRORS_IS_REACHED, ""+getErrorCountLimit()), new String[]{VerificationUIMessages.OK}, null, ServiceDialog.WARNING); //$NON-NLS-1$
limitLock = false;
task.stop();
}
}
);
}
private VRule[] getSelectedRules() {
if(treeViewer == null) return null;
ArrayList<VRule> list = new ArrayList<VRule>();
Set<String> set = new HashSet<String>();
TreeItem[] is = treeViewer.getTree().getSelection();
if(is == null || is.length == 0) return null;
for (int i = 0; i < is.length; i++) {
RuntimeItemWrapper w = (RuntimeItemWrapper)is[i].getData();
if(w == null) continue;
VRule[] rs = w.getRules();
for (int j = 0; j < rs.length; j++) {
if(set.contains(rs[j].getName())) continue;
set.add(rs[j].getName());
list.add(rs[j]);
}
}
return (VRule[])list.toArray(new VRule[0]);
}
private void clearStatus() {
RuntimeRuleSetWrapper[] ruleSets = provider.getRuleSets();
for (int i = 0; i < ruleSets.length; i++) {
ruleSets[i].setStatus(0);
RuntimeItemWrapper[] cs = ruleSets[i].children;
for (int j = 0; j < cs.length; j++) cs[j].setStatus(0);
}
}
}