/* * ALMA - Atacama Large Millimeter Array * (c) Universidad Tecnica Federico Santa Maria, 2009 * Copyright by ESO (in the framework of the ALMA collaboration), * All rights reserved * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ package cl.utfsm.acs.acg.gui; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.regex.PatternSyntaxException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.dialogs.ListDialog; import cern.laser.business.data.Alarm; import cern.laser.business.data.Triplet; import alma.acs.alarmsystem.generated.FaultCode; import alma.acs.alarmsystem.generated.FaultFamily; import alma.acs.alarmsystem.generated.FaultMember; import cl.utfsm.acs.acg.core.AlarmSystemManager; import cl.utfsm.acs.acg.core.AlarmManager; import cl.utfsm.acs.acg.core.IllegalOperationException; import cl.utfsm.acs.acg.core.ReductionManager; import cl.utfsm.acs.acg.core.ReductionRule; public class ReductionsView extends ViewPart implements IMyViewPart { public static String ID = "cl.utfsm.acs.acg.gui.reductionsview"; private enum NodeType { NODE_REDUCTION, NODE_REDUCTION_PARENT_DATA, MULTIPLICITY_REDUCTION, MULTIPLICITY_REDUCTION_PARENT_DATA } private ReductionManager _reductionManager; private AlarmManager _alarmManager; /* High level widgets */ private SashForm _sash; private Tree _tree; private Composite _compInitial; private Composite _reductionsComp; private Group _treeGroup; /* NR Parent Widgets */ private Group _NRParentGroup; private Group _NRParentFtGroup; private Label _NRParentFFLabel; private Combo _NRParentFFCombo; private Label _NRParentFMLabel; private Combo _NRParentFMCombo; private Label _NRParentFCLabel; private Combo _NRParentFCCombo; // private Group _NRParentChGroup; private Group _NRParentChFilterGroup; private Label _NRParentChFFLabel; private Group _NRParentChFilterLevelGroup; private Button _NRParentChAllRadio; private Button _NRParentChSelectedRadio; private Button _NRParentChUnselectedRadio; private Combo _NRParentChFFCombo; private Label _NRParentChFMLabel; private Combo _NRParentChFMCombo; private Label _NRParentChFCLabel; private Combo _NRParentChFCCombo; private Label _NRParentChFilterLabel; private Text _NRParentChFilterText; private Table _NRParentChAlarmList; private Label _NRParentErrorMessageLabel; /* MR Parent Widgets */ private Group _MRParentGroup; private Group _MRParentFtGroup; private Label _MRParentFFLabel; private Combo _MRParentFFCombo; private Label _MRParentFMLabel; private Combo _MRParentFMCombo; private Label _MRParentFCLabel; private Combo _MRParentFCCombo; private Label _MRParentThresholdLabel; private Text _MRParentThresholdText; // private Group _MRParentChGroup; private Group _MRParentChFilterGroup; private Label _MRParentChFFLabel; private Group _MRParentChFilterLevelGroup; private Button _MRParentChAllRadio; private Button _MRParentChSelectedRadio; private Button _MRParentChUnselectedRadio; private Combo _MRParentChFFCombo; private Label _MRParentChFMLabel; private Combo _MRParentChFMCombo; private Label _MRParentChFCLabel; private Combo _MRParentChFCCombo; private Label _MRParentChFilterLabel; private Text _MRParentChFilterText; private Table _MRParentChAlarmList; private Label _MRParentErrorMessageLabel; /* Listeners */ private Listener _addElement; private Listener _addRule; private Listener _removeElement; private Listener _updateNRParentFF; private Listener _updateNRParent; private Listener _updateNRParentChFF; private Listener _updateNRParentCh; private Listener _updateMRParentFF; private Listener _updateMRParent; private Listener _updateMRParentChFF; private Listener _updateMRParentCh; @Override public void createPartControl(Composite parent) { setTitleToolTip("Configuration of Reduction Rules.\nReduction Rules link two or more alarms in a father/son relationship."); setTitleImage(Activator.getDefault().getImageRegistry().get(Activator.IMG_REDUCTIONS)); createViewWidgets(parent); refreshContents(); } private void createViewWidgets(Composite parent) { _addElement = new Listener() { public void handleEvent(Event event) { TreeItem sel = null; TreeItem item = null; if(_tree.getSelection() == null || _tree.getSelection().length == 0) return; sel = _tree.getSelection()[0]; NodeType type = (NodeType)sel.getData(); item = sel; if(type == NodeType.NODE_REDUCTION_PARENT_DATA || type == NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA) item = sel.getParentItem(); type = (NodeType) item.getData(); java.util.List<FaultFamily> ffs = _alarmManager.getAllAlarms(); java.util.List<String> ffnames = new ArrayList<String>(); for(FaultFamily ff: ffs) { if (ff.getFaultCodeCount() > 0 && ff.getFaultMemberCount() > 0) ffnames.add(ff.getName()); } Collections.sort(ffnames,IGNORE_CASE_ORDER); ListDialog dialog = new ListDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()); dialog.setTitle("Create Reduction Rule"); dialog.setMessage("Select Parent Fault Family"); dialog.setBlockOnOpen(true); dialog.setInput(ffnames); dialog.setContentProvider(new ArrayContentProvider()); dialog.setLabelProvider(new LabelProvider()); dialog.open(); if(dialog.getReturnCode() == InputDialog.CANCEL) return; String ffname = (String) dialog.getResult()[0]; FaultMember[] fms = _alarmManager.getFaultFamily(ffname).getFaultMember(); java.util.List<String> fmnames = new ArrayList<String>(); for(FaultMember fm: fms) { fmnames.add(fm.getName()); } Collections.sort(ffnames,IGNORE_CASE_ORDER); dialog = new ListDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()); dialog.setTitle("Create Reduction Rule"); dialog.setMessage("Select Parent Fault Member"); dialog.setBlockOnOpen(true); dialog.setInput(fmnames); dialog.setContentProvider(new ArrayContentProvider()); dialog.setLabelProvider(new LabelProvider()); dialog.open(); if(dialog.getReturnCode() == InputDialog.CANCEL) return; String fmname = (String) dialog.getResult()[0]; FaultCode[] fcs = _alarmManager.getFaultFamily(ffname).getFaultCode(); java.util.List<String> fcvalues = new ArrayList<String>(); for(FaultCode fc: fcs) { fcvalues.add(Integer.toString(fc.getValue())); } Collections.sort(ffnames,IGNORE_CASE_ORDER); dialog = new ListDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()); dialog.setTitle("Create Reduction Rule"); dialog.setMessage("Select Parent Fault Code"); dialog.setBlockOnOpen(true); dialog.setInput(fcvalues); dialog.setContentProvider(new ArrayContentProvider()); dialog.setLabelProvider(new LabelProvider()); dialog.open(); if(dialog.getReturnCode() == InputDialog.CANCEL) return; String fcvalue = (String) dialog.getResult()[0]; ReductionRule parent = null; boolean error = false; if(type == NodeType.NODE_REDUCTION) { parent = _reductionManager.getNRParentByTriplet(ffname, fmname, Integer.parseInt(fcvalue)); TreeItem[] chs = _tree.getItems()[0].getItems(); for(TreeItem ch: chs) { if(ch.getText().compareTo("<"+ffname+","+fmname+","+fcvalue+">") == 0) error = true; } } else if(type == NodeType.MULTIPLICITY_REDUCTION) { parent = _reductionManager.getMRParentByTriplet(ffname, fmname, Integer.parseInt(fcvalue)); TreeItem[] chs = _tree.getItems()[1].getItems(); for(TreeItem ch: chs) { if(ch.getText().compareTo("<"+ffname+","+fmname+","+fcvalue+">") == 0) error = true; } } if(error || parent != null){ ErrorDialog edialog = new ErrorDialog(ReductionsView.this.getViewSite().getShell(), "Reduction Rule Already Exists", "The reduction rule you are trying to create already exists", new Status(IStatus.ERROR,"cl.utfsm.acs.acg","The reduction rule parent already exists"), IStatus.ERROR); edialog.setBlockOnOpen(true); edialog.open(); return; } else parent = new ReductionRule(_alarmManager.getAlarm(ffname+":"+fmname+":"+fcvalue)); TreeItem pTree = new TreeItem(item,SWT.NONE); pTree.setText("<"+ffname+","+fmname+","+fcvalue+">"); if(type == NodeType.NODE_REDUCTION) { pTree.setData(NodeType.NODE_REDUCTION_PARENT_DATA); parent.setIsNodeReduction(true); } else if(type == NodeType.MULTIPLICITY_REDUCTION) { pTree.setData(NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA); parent.setIsNodeReduction(false); } _tree.setSelection(pTree); Event e = new Event(); _tree.notifyListeners(SWT.Selection, e); } }; _addRule = new Listener() { public void handleEvent(Event event) { Table t = (Table)event.widget; if(event.type == SWT.KeyUp) if(!(event.keyCode == SWT.CR || event.keyCode == ' ')) return; if(event.type == SWT.MouseDoubleClick){ Point pt = new Point(event.x,event.y); if(t.getItem(pt) == null) return; } boolean isNode; if(_tree.getSelection() == null || _tree.getSelection().length == 0) return; TreeItem tmp1 = _tree.getSelection()[0]; if((NodeType)_tree.getSelection()[0].getData() == NodeType.NODE_REDUCTION_PARENT_DATA) isNode = true; else if((NodeType)_tree.getSelection()[0].getData() == NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA) isNode = false; else return; String[] tr = getTriplet(tmp1.getText()); ReductionRule parent; if(isNode) parent = _reductionManager.getNRParentByTriplet(tr[0], tr[1], Integer.parseInt(tr[2])); else parent = _reductionManager.getMRParentByTriplet(tr[0], tr[1], Integer.parseInt(tr[2])); if(t.getSelection() == null || t.getSelection().length == 0) return; TableItem item = t.getSelection()[0]; Alarm p,c; if(parent == null) { if(isNode) p = _alarmManager.getAlarm(_NRParentFFCombo.getText()+":"+_NRParentFMCombo.getText()+":"+_NRParentFCCombo.getText()); else p = _alarmManager.getAlarm(_MRParentFFCombo.getText()+":"+_MRParentFMCombo.getText()+":"+_MRParentFCCombo.getText()); if(p == null) { if(isNode) _NRParentErrorMessageLabel.setText("Couldn't find parent alarm."); else _MRParentErrorMessageLabel.setText("Couldn't find parent alarm."); return; } c = null; } else { p = parent.getParent(); c = parent.getChild(item.getText()); } if(c == null){ //Add child c = _alarmManager.getAlarm(item.getText()); if(c == null) { if(isNode) _NRParentErrorMessageLabel.setText("Couldn't find child alarm."); else _MRParentErrorMessageLabel.setText("Couldn't find child alarm."); return; } try { if(isNode) _reductionManager.addNodeReductionRule(p, c); else { _reductionManager.addMultiReductionRule(p, c); if(parent == null) _reductionManager.updateMultiThreshold(p, Integer.parseInt(_MRParentThresholdText.getText())); } item.setImage(Activator.getDefault().getImageRegistry().get(Activator.IMG_TICKET)); if(parent == null) _tree.getSelection()[0].setText("<" + p.getAlarmId().replace(':', ',') + ">"); if(isNode) _NRParentErrorMessageLabel.setText(""); else _MRParentErrorMessageLabel.setText(""); } catch (IllegalOperationException e) { if(isNode) _NRParentErrorMessageLabel.setText(e.getMessage()); else _MRParentErrorMessageLabel.setText(e.getMessage()); } } else{ //Remove child try { //ReductionRule rr; if(isNode) { _reductionManager.deleteNodeReductionRule(p, c); //rr = _reductionManager.getNRParentByTriplet(p.getTriplet().getFaultFamily(), p.getTriplet().getFaultMember(), p.getTriplet().getFaultCode()); } else { _reductionManager.deleteMultiReductionRule(p, c); //rr = _reductionManager.getMRParentByTriplet(p.getTriplet().getFaultFamily(), p.getTriplet().getFaultMember(), p.getTriplet().getFaultCode()); } } catch (IllegalOperationException e) { e.printStackTrace(); } item.setImage((org.eclipse.swt.graphics.Image)null); } fillMRParentChAlarmList(tr[0], tr[1], Integer.parseInt(tr[2])); sortReductionRulesList(); Triplet t2 = p.getTriplet(); if(isNode) selectElementFromTree("<"+t2.getFaultFamily()+","+t2.getFaultMember()+","+t2.getFaultCode()+">", true); else selectElementFromTree("<"+t2.getFaultFamily()+","+t2.getFaultMember()+","+t2.getFaultCode()+">", false); } }; _removeElement = new Listener() { public void handleEvent(Event event) { boolean choice = MessageDialog.openQuestion( ReductionsView.this.getViewSite().getShell(), "Confirmation", "Are you sure you want to delete this element" ); if (choice == true ){ TreeItem sel = null; if(_tree.getSelection() == null || _tree.getSelection().length == 0) return; NodeType type = (NodeType)_tree.getSelection()[0].getData(); if(type == NodeType.NODE_REDUCTION || type == NodeType.MULTIPLICITY_REDUCTION) return; TreeItem item = _tree.getSelection()[0]; String[] tr = getTriplet(item.getText()); try { if(type == NodeType.NODE_REDUCTION_PARENT_DATA){ //Remove all the NODE REDUCTION Rules in which this node is parent. ReductionRule rr = _reductionManager.getNRParentByTriplet(tr[0], tr[1], Integer.parseInt(tr[2])); if(rr != null) { Alarm p = rr.getParent(); List<Alarm> chL = rr.getChildren(); Alarm[] als = new Alarm[chL.size()]; chL.toArray(als); for(int i = 0; i < als.length; i++) _reductionManager.deleteNodeReductionRule(p, als[i]); } } else if(type == NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA){ //Remove all the MULTIPLICITY REDUCTION Rules in which this node is a parent. ReductionRule rr = _reductionManager.getMRParentByTriplet(tr[0], tr[1], Integer.parseInt(tr[2])); if(rr != null) { Alarm p = rr.getParent(); List<Alarm> chL = rr.getChildren(); Alarm[] als = new Alarm[chL.size()]; chL.toArray(als); for(int i = 0; i < als.length; i++) _reductionManager.deleteMultiReductionRule(p, als[i]); } } } catch (NullPointerException e){ ErrorDialog error = new ErrorDialog(ReductionsView.this.getViewSite().getShell(), "Cannot delete the item", e.getMessage(), new Status(IStatus.ERROR,"cl.utfsm.acs.acg",e.getMessage()), IStatus.ERROR); error.setBlockOnOpen(true); error.open(); } catch (IllegalOperationException e) { ErrorDialog error = new ErrorDialog(ReductionsView.this.getViewSite().getShell(), "Cannot delete the item", e.getMessage(), new Status(IStatus.ERROR,"cl.utfsm.acs.acg",e.getMessage()), IStatus.ERROR); error.setBlockOnOpen(true); error.open(); } sel = _tree.getSelection()[0].getParentItem(); _tree.getSelection()[0].dispose(); _tree.setSelection(sel); Event e = new Event(); _tree.notifyListeners(SWT.Selection, e); } } }; _sash = new SashForm(parent,SWT.NONE); _sash.setLayout(new FillLayout()); _reductionsComp = new Composite(_sash,SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 1; _reductionsComp.setLayout(layout); _treeGroup = new Group(_reductionsComp,SWT.SHADOW_ETCHED_IN); GridData gd = new GridData(); gd.horizontalAlignment = SWT.FILL; gd.verticalAlignment = SWT.FILL; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; _treeGroup.setLayoutData(gd); GridLayout gl = new GridLayout(); gl.numColumns = 1; _treeGroup.setLayout(gl); _treeGroup.setText("Reduction Rules List"); _tree = new Tree(_treeGroup,SWT.VIRTUAL | SWT.BORDER); gd = new GridData(); gd.verticalAlignment = SWT.FILL; gd.horizontalAlignment = SWT.FILL; gd.grabExcessVerticalSpace = true; gd.grabExcessHorizontalSpace = true; _tree.setLayoutData(gd); Menu treePopUp = new Menu(parent); /* MenuItem treePopUpDelete = new MenuItem(treePopUp,SWT.PUSH); treePopUpDelete.setText("Delete"); treePopUpDelete.addListener(SWT.Selection, _removeElement); MenuItem treePopUpAddRule = new MenuItem(treePopUp,SWT.PUSH); treePopUpAddRule.setText("Add Rule"); treePopUpAddRule.addListener(SWT.Selection, _addElement); MenuItem treePopUpAddChildren = new MenuItem(treePopUp,SWT.PUSH); treePopUpAddChildren.setText("Add Children"); //treePopUpAddChildren.addListener(SWT.Selection, _addElement); */ _tree.setMenu(treePopUp); treePopUp.addListener(SWT.Show, new Listener() { public void handleEvent(Event e) { TreeItem sel = _tree.getSelection()[0]; NodeType type = (NodeType) sel.getData(); Menu treePopUp = _tree.getMenu(); MenuItem[] items = treePopUp.getItems(); for (int i = 0; i < items.length; i++) items[i].dispose(); MenuItem mitem; switch(type) { case NODE_REDUCTION: mitem = new MenuItem(treePopUp,SWT.PUSH); mitem.setText("Add Node Reduction Rule Parent"); mitem.addListener(SWT.Selection, _addElement); break; case NODE_REDUCTION_PARENT_DATA: mitem = new MenuItem(treePopUp,SWT.PUSH); mitem.setText("Delete Node Reduction Rules for this parent"); mitem.addListener(SWT.Selection, _removeElement); break; case MULTIPLICITY_REDUCTION: mitem = new MenuItem(treePopUp,SWT.PUSH); mitem.setText("Add Multiplicity Reduction Rule Parent"); mitem.addListener(SWT.Selection, _addElement); break; case MULTIPLICITY_REDUCTION_PARENT_DATA: mitem = new MenuItem(treePopUp,SWT.PUSH); mitem.setText("Delete Multiplicity Reduction Rules for this parent"); mitem.addListener(SWT.Selection, _removeElement); break; default: for (int i = 0; i < items.length; i++) items[i].dispose(); break; } } }); _tree.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { TreeItem []tmp = ((Tree)e.widget).getSelection(); if( tmp == null || tmp.length == 0 ) return; TreeItem item = tmp[0]; NodeType type = (NodeType)item.getData(); Control c = _compInitial.getChildren()[0]; if( c instanceof Label ) { c.dispose(); _compInitial.layout(); c = _compInitial.getChildren()[0]; } if( type == NodeType.NODE_REDUCTION ) { _NRParentGroup.setVisible(false); ((GridData)_NRParentGroup.getLayoutData()).exclude = true; _MRParentGroup.setVisible(false); ((GridData)_MRParentGroup.getLayoutData()).exclude = true; } else if( type == NodeType.NODE_REDUCTION_PARENT_DATA ) { _NRParentGroup.setVisible(true); ((GridData)_NRParentGroup.getLayoutData()).exclude = false; _MRParentGroup.setVisible(false); ((GridData)_MRParentGroup.getLayoutData()).exclude = true; String[] triplet = getTriplet(item.getText()); fillNRParentWidgets(triplet[0],triplet[1],Integer.parseInt(triplet[2])); _NRParentGroup.moveAbove(c); _compInitial.layout(); } else if( type == NodeType.MULTIPLICITY_REDUCTION ){ _NRParentGroup.setVisible(false); ((GridData)_NRParentGroup.getLayoutData()).exclude = true; _MRParentGroup.setVisible(false); ((GridData)_MRParentGroup.getLayoutData()).exclude = true; } else if( type == NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA ) { _NRParentGroup.setVisible(false); ((GridData)_NRParentGroup.getLayoutData()).exclude = true; _MRParentGroup.setVisible(true); ((GridData)_MRParentGroup.getLayoutData()).exclude = false; String[] triplet = getTriplet(item.getText()); fillMRParentWidgets(triplet[0],triplet[1],Integer.parseInt(triplet[2])); _MRParentGroup.moveAbove(c); _compInitial.layout(); } } }); /* Top widget of the right side */ _compInitial = new Composite(_sash,SWT.NONE); _compInitial.setLayout(new GridLayout()); new Label(_compInitial,SWT.NONE).setText("Select a reduction rule"); /* NR/MR Details */ createNRParentWidgets(); createMRParentWidgets(); _NRParentGroup.setVisible(false); _MRParentGroup.setVisible(false); _sash.setWeights(new int[] {3, 5}); } private void createNRParentWidgets() { _updateNRParentFF = new Listener() { public void handleEvent(Event event){ _NRParentFMCombo.removeAll(); FaultMember[] fml = _alarmManager.getFaultFamily(_NRParentFFCombo.getText()).getFaultMember(); for (int j = 0; j < fml.length; j++) { _NRParentFMCombo.add(fml[j].getName()); } _NRParentFCCombo.removeAll(); FaultCode[] fcl = _alarmManager.getFaultFamily(_NRParentFFCombo.getText()).getFaultCode(); for (int j = 0; j < fcl.length; j++) { _NRParentFCCombo.add(String.valueOf(fcl[j].getValue())); } _NRParentErrorMessageLabel.setText("Please choose a Fault Member and a Fault Code."); } }; _updateNRParent = new Listener() { public void handleEvent(Event event) { if(_tree.getSelection() == null || _tree.getSelection().length == 0) return; NodeType type = (NodeType)_tree.getSelection()[0].getData(); if(type != NodeType.NODE_REDUCTION_PARENT_DATA) return; if(_NRParentFMCombo.getText().isEmpty()) { _NRParentErrorMessageLabel.setText("Please choose a Fault Member."); return; } if(_NRParentFCCombo.getText().isEmpty()) { _NRParentErrorMessageLabel.setText("Please choose a Fault Code."); return; } String[] tr = getTriplet(_tree.getSelection()[0].getText()); ReductionRule nrr = _reductionManager.getNRParentByTriplet(tr[0], tr[1], Integer.parseInt(tr[2])); ReductionRule nrr2 = _reductionManager.getNRParentByTriplet(_NRParentFFCombo.getText(), _NRParentFMCombo.getText(), Integer.parseInt(_NRParentFCCombo.getText())); Alarm parent = null; Alarm nParent; fillNRParentChAlarmList(_NRParentFFCombo.getText(),_NRParentFMCombo.getText(),Integer.parseInt(_NRParentFCCombo.getText())); if(nrr == null) { _NRParentErrorMessageLabel.setText("There's no Reduction Rule (no children) for the selected Alarm."); return; } else parent = nrr.getParent(); if(nrr2 == null) nParent = _alarmManager.getAlarm(new String(_NRParentFFCombo.getText()+":"+_NRParentFMCombo.getText()+":"+_NRParentFCCombo.getText())); else { nParent = nrr2.getParent(); if(nrr != nrr2) { ErrorDialog edialog = new ErrorDialog(ReductionsView.this.getViewSite().getShell(), "Reduction Rule Already Exists", "The reduction rule you are trying to create already exists", new Status(IStatus.ERROR,"cl.utfsm.acs.acg","The reduction rule parent already exists"), IStatus.ERROR); edialog.setBlockOnOpen(true); edialog.open(); return; } } if(parent != null) { String[] ch = parent.getNodeChildren(); //Remove all Children from nrr and add them to nrr2. for (int i = 0; i < ch.length; i++) { Alarm aCh = _alarmManager.getAlarm(ch[i]); if(aCh != null){ try { if(!_reductionManager.deleteNodeReductionRule(parent, aCh)) { _NRParentErrorMessageLabel.setText("One or more children alarms didn't exist."); continue; } _reductionManager.addNodeReductionRule(nParent, aCh); } catch (IllegalOperationException e) { _NRParentErrorMessageLabel.setText("The parent alarm didn't exist."); } } } _tree.getSelection()[0].setText("<" + nParent.getAlarmId().replace(':', ',') + ">"); _NRParentErrorMessageLabel.setText(""); if(tr[0].compareTo(_NRParentFFCombo.getText()) != 0 || tr[1].compareTo(_NRParentFMCombo.getText()) != 0 || tr[2].compareTo(_NRParentFCCombo.getText()) != 0) { sortReductionRulesList(); Triplet t = nParent.getTriplet(); selectElementFromTree("<"+t.getFaultFamily()+","+t.getFaultMember()+","+t.getFaultCode()+">", true); } } } }; _updateNRParentChFF = new Listener() { public void handleEvent(Event event){ _NRParentChFMCombo.removeAll(); _NRParentChFMCombo.add("Any"); if(_NRParentChFFCombo.getText().compareTo("Any")!=0){ FaultMember[] fml = _alarmManager.getFaultFamily(_NRParentChFFCombo.getText()).getFaultMember(); for (int j = 0; j < fml.length; j++) { _NRParentChFMCombo.add(fml[j].getName()); } } _NRParentChFMCombo.select(0); _NRParentChFCCombo.removeAll(); _NRParentChFCCombo.add("Any"); if(_NRParentChFFCombo.getText().compareTo("Any")!=0){ FaultCode[] fcl = _alarmManager.getFaultFamily(_NRParentChFFCombo.getText()).getFaultCode(); for (int j = 0; j < fcl.length; j++) { _NRParentChFCCombo.add(String.valueOf(fcl[j].getValue())); } } _NRParentChFCCombo.select(0); TreeItem []tmp = _tree.getSelection(); if( tmp == null || tmp.length == 0 ) return; TreeItem item = tmp[0]; String[] triplet = getTriplet(item.getText()); fillNRParentChAlarmList(triplet[0],triplet[1],Integer.parseInt(triplet[2])); } }; _updateNRParentCh = new Listener() { public void handleEvent(Event event){ TreeItem []tmp = _tree.getSelection(); if( tmp == null || tmp.length == 0 ) return; TreeItem item = tmp[0]; String[] triplet = getTriplet(item.getText()); fillNRParentChAlarmList(triplet[0],triplet[1],Integer.parseInt(triplet[2])); } }; _NRParentGroup = new Group(_compInitial, SWT.SHADOW_ETCHED_IN); GridLayout gl = new GridLayout(); gl.numColumns = 1; GridData gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.horizontalAlignment = SWT.FILL; gd.verticalAlignment = SWT.FILL; _NRParentGroup.setLayout(gl); _NRParentGroup.setLayoutData(gd); _NRParentFtGroup = new Group(_NRParentGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 2; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentFtGroup.setLayout(gl); _NRParentFtGroup.setLayoutData(gd); _NRParentFtGroup.setText("Parent Alarm"); _NRParentFFLabel = new Label(_NRParentFtGroup,SWT.NONE); _NRParentFFLabel.setText("Fault Family:"); _NRParentFFCombo = new Combo(_NRParentFtGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentFFCombo.setLayoutData(gd); _NRParentFFCombo.addListener(SWT.Selection, _updateNRParentFF); _NRParentFMLabel = new Label(_NRParentFtGroup,SWT.NONE); _NRParentFMLabel.setText("Fault Member:"); _NRParentFMCombo = new Combo(_NRParentFtGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentFMCombo.setLayoutData(gd); _NRParentFMCombo.addListener(SWT.Selection, _updateNRParent); _NRParentFCLabel = new Label(_NRParentFtGroup,SWT.NONE); _NRParentFCLabel.setText("Fault Code:"); _NRParentFCCombo = new Combo(_NRParentFtGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentFCCombo.setLayoutData(gd); _NRParentFCCombo.addListener(SWT.Selection, _updateNRParent); // _NRParentChGroup = new Group(_NRParentGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 1; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.horizontalAlignment = SWT.FILL; gd.verticalAlignment = SWT.FILL; _NRParentChGroup.setLayout(gl); _NRParentChGroup.setLayoutData(gd); _NRParentChGroup.setText("Alarms to Hide"); _NRParentChFilterGroup = new Group(_NRParentChGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 2; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentChFilterGroup.setLayout(gl); _NRParentChFilterGroup.setLayoutData(gd); _NRParentChFilterGroup.setText("Filter Options"); _NRParentChFilterLevelGroup = new Group(_NRParentChFilterGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 3; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; gd.horizontalAlignment = SWT.FILL; _NRParentChFilterLevelGroup.setLayout(gl); _NRParentChFilterLevelGroup.setLayoutData(gd); _NRParentChFilterLevelGroup.setText("Show"); _NRParentChAllRadio = new Button (_NRParentChFilterLevelGroup, SWT.RADIO); _NRParentChAllRadio.setText("All"); _NRParentChAllRadio.addListener(SWT.Selection, _updateNRParentCh); _NRParentChSelectedRadio = new Button (_NRParentChFilterLevelGroup, SWT.RADIO); _NRParentChSelectedRadio.setText("Selected"); _NRParentChSelectedRadio.addListener(SWT.Selection, _updateNRParentCh); _NRParentChUnselectedRadio = new Button (_NRParentChFilterLevelGroup, SWT.RADIO); _NRParentChUnselectedRadio.setText("Unselected"); _NRParentChUnselectedRadio.addListener(SWT.Selection, _updateNRParentCh); _NRParentChFFLabel = new Label(_NRParentChFilterGroup,SWT.NONE); _NRParentChFFLabel.setText("Fault Family:"); _NRParentChFFCombo = new Combo(_NRParentChFilterGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentChFFCombo.setLayoutData(gd); _NRParentChFFCombo.addListener(SWT.Selection, _updateNRParentChFF); _NRParentChFMLabel = new Label(_NRParentChFilterGroup,SWT.NONE); _NRParentChFMLabel.setText("Fault Member:"); _NRParentChFMCombo = new Combo(_NRParentChFilterGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentChFMCombo.setLayoutData(gd); _NRParentChFMCombo.addListener(SWT.Selection, _updateNRParentCh); _NRParentChFCLabel = new Label(_NRParentChFilterGroup,SWT.NONE); _NRParentChFCLabel.setText("Fault Code:"); _NRParentChFCCombo = new Combo(_NRParentChFilterGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentChFCCombo.setLayoutData(gd); _NRParentChFCCombo.addListener(SWT.Selection, _updateNRParentCh); _NRParentChFilterLabel = new Label(_NRParentChFilterGroup,SWT.NONE); _NRParentChFilterLabel.setText("Filter RegEx:"); _NRParentChFilterText = new Text(_NRParentChFilterGroup, SWT.BORDER); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _NRParentChFilterText.setLayoutData(gd); _NRParentChFilterText.addListener(SWT.Modify, _updateNRParentCh); _NRParentChAlarmList = new Table(_NRParentChGroup,SWT.BORDER); gd = new GridData(); gd.verticalAlignment = SWT.FILL; gd.horizontalAlignment = SWT.FILL; gd.grabExcessVerticalSpace = true; gd.grabExcessHorizontalSpace = true; _NRParentChAlarmList.setLayoutData(gd); _NRParentChAlarmList.addListener(SWT.KeyUp, _addRule); _NRParentChAlarmList.addListener(SWT.MouseDoubleClick, _addRule); _NRParentErrorMessageLabel = new Label(_NRParentGroup, SWT.NONE); _NRParentErrorMessageLabel.setText(""); _NRParentErrorMessageLabel.setForeground(getViewSite().getShell().getDisplay().getSystemColor(SWT.COLOR_RED)); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; gd.horizontalSpan = 2; _NRParentErrorMessageLabel.setLayoutData(gd); } private void createMRParentWidgets() { _updateMRParentFF = new Listener() { public void handleEvent(Event event){ _MRParentFMCombo.removeAll(); FaultMember[] fml = _alarmManager.getFaultFamily(_MRParentFFCombo.getText()).getFaultMember(); for (int j = 0; j < fml.length; j++) { _MRParentFMCombo.add(fml[j].getName()); } _MRParentFCCombo.removeAll(); FaultCode[] fcl = _alarmManager.getFaultFamily(_MRParentFFCombo.getText()).getFaultCode(); for (int j = 0; j < fcl.length; j++) { _MRParentFCCombo.add(String.valueOf(fcl[j].getValue())); } //_MRParentThresholdText.setText(""); _MRParentErrorMessageLabel.setText("Please choose a Fault Member and a Fault Code."); } }; _updateMRParent = new Listener() { public void handleEvent(Event event) { if(_tree.getSelection() == null || _tree.getSelection().length == 0) return; NodeType type = (NodeType)_tree.getSelection()[0].getData(); if(type != NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA) return; if(_MRParentFMCombo.getText().isEmpty()) { _MRParentErrorMessageLabel.setText("Please choose a Fault Member."); return; } if(_MRParentFCCombo.getText().isEmpty()) { _MRParentErrorMessageLabel.setText("Please choose a Fault Code."); return; } if(_MRParentThresholdText.getText().isEmpty()) { _MRParentErrorMessageLabel.setText("Please set a Threshold value."); return; } int thr; try { thr = Integer.parseInt(_MRParentThresholdText.getText()); } catch(NumberFormatException e) { _MRParentErrorMessageLabel.setText("Incorrect Threshold. A number is required."); return; } String[] tr = getTriplet(_tree.getSelection()[0].getText()); ReductionRule mrr = _reductionManager.getMRParentByTriplet(tr[0], tr[1], Integer.parseInt(tr[2])); ReductionRule mrr2 = _reductionManager.getMRParentByTriplet(_MRParentFFCombo.getText(), _MRParentFMCombo.getText(), Integer.parseInt(_MRParentFCCombo.getText())); Alarm parent = null; Alarm mParent; fillMRParentChAlarmList(_MRParentFFCombo.getText(),_MRParentFMCombo.getText(),Integer.parseInt(_MRParentFCCombo.getText())); if(mrr == null) { _MRParentErrorMessageLabel.setText("There's no Reduction Rule (no children) for the selected Alarm."); return; } else parent = mrr.getParent(); if(mrr2 == null) mParent = _alarmManager.getAlarm(new String(_MRParentFFCombo.getText()+":"+_MRParentFMCombo.getText()+":"+_MRParentFCCombo.getText())); else { mParent = mrr2.getParent(); if(mrr != mrr2) { ErrorDialog edialog = new ErrorDialog(ReductionsView.this.getViewSite().getShell(), "Reduction Rule Already Exists", "The reduction rule you are trying to create already exists", new Status(IStatus.ERROR,"cl.utfsm.acs.acg","The reduction rule parent already exists"), IStatus.ERROR); edialog.setBlockOnOpen(true); edialog.open(); return; } } if(parent != null) { String[] ch = parent.getMultiplicityChildren(); //Remove all Children from mrr and add them to mrr2. try { for (int i = 0; i < ch.length; i++) { Alarm aCh = _alarmManager.getAlarm(ch[i]); if(aCh != null){ if(!_reductionManager.deleteMultiReductionRule(parent, aCh)) { _MRParentErrorMessageLabel.setText("One or more children alarms didn't exist."); continue; } _reductionManager.addMultiReductionRule(mParent, aCh); } } _reductionManager.updateMultiThreshold(mParent, thr); } catch (IllegalOperationException e) { _MRParentErrorMessageLabel.setText("The parent alarm didn't exist."); } _tree.getSelection()[0].setText("<" + mParent.getAlarmId().replace(':', ',') + ">"); _MRParentErrorMessageLabel.setText(""); } if (mrr != null && mrr.getChildrenCount() < mrr.getThreshold()) { _MRParentErrorMessageLabel.setText("You need to have at least threshold ("+mrr.getThreshold()+") childs for this triplet."); return; } if(tr[0].compareTo(_MRParentFFCombo.getText()) != 0 || tr[1].compareTo(_MRParentFMCombo.getText()) != 0 || tr[2].compareTo(_MRParentFCCombo.getText()) != 0) { sortReductionRulesList(); Triplet t = mParent.getTriplet(); selectElementFromTree("<"+t.getFaultFamily()+","+t.getFaultMember()+","+t.getFaultCode()+">", false); } } }; _updateMRParentChFF = new Listener() { public void handleEvent(Event event){ _MRParentChFMCombo.removeAll(); _MRParentChFMCombo.add("Any"); if(_MRParentChFFCombo.getText().compareTo("Any")!=0){ FaultMember[] fml = _alarmManager.getFaultFamily(_MRParentChFFCombo.getText()).getFaultMember(); for (int j = 0; j < fml.length; j++) { _MRParentChFMCombo.add(fml[j].getName()); } } _MRParentChFMCombo.select(0); _MRParentChFCCombo.removeAll(); _MRParentChFCCombo.add("Any"); if(_MRParentChFFCombo.getText().compareTo("Any")!=0){ FaultCode[] fcl = _alarmManager.getFaultFamily(_MRParentChFFCombo.getText()).getFaultCode(); for (int j = 0; j < fcl.length; j++) { _MRParentChFCCombo.add(String.valueOf(fcl[j].getValue())); } } _MRParentChFCCombo.select(0); TreeItem []tmp = _tree.getSelection(); if( tmp == null || tmp.length == 0 ) return; TreeItem item = tmp[0]; String[] triplet = getTriplet(item.getText()); fillMRParentChAlarmList(triplet[0],triplet[1],Integer.parseInt(triplet[2])); } }; _updateMRParentCh = new Listener() { public void handleEvent(Event event){ TreeItem []tmp = _tree.getSelection(); if( tmp == null || tmp.length == 0 ) return; TreeItem item = tmp[0]; String[] triplet = getTriplet(item.getText()); fillMRParentChAlarmList(triplet[0],triplet[1],Integer.parseInt(triplet[2])); } }; _MRParentGroup = new Group(_compInitial, SWT.SHADOW_ETCHED_IN); GridLayout gl = new GridLayout(); gl.numColumns = 1; GridData gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.horizontalAlignment = SWT.FILL; gd.verticalAlignment = SWT.FILL; _MRParentGroup.setLayout(gl); _MRParentGroup.setLayoutData(gd); _MRParentFtGroup = new Group(_MRParentGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 2; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentFtGroup.setLayout(gl); _MRParentFtGroup.setLayoutData(gd); _MRParentFtGroup.setText("Primary Alarm"); _MRParentFFLabel = new Label(_MRParentFtGroup,SWT.NONE); _MRParentFFLabel.setText("Fault Family:"); _MRParentFFCombo = new Combo(_MRParentFtGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentFFCombo.setLayoutData(gd); _MRParentFFCombo.addListener(SWT.Selection, _updateMRParentFF); _MRParentFMLabel = new Label(_MRParentFtGroup,SWT.NONE); _MRParentFMLabel.setText("Fault Member:"); _MRParentFMCombo = new Combo(_MRParentFtGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentFMCombo.setLayoutData(gd); _MRParentFMCombo.addListener(SWT.Selection, _updateMRParent); _MRParentFCLabel = new Label(_MRParentFtGroup,SWT.NONE); _MRParentFCLabel.setText("Fault Code:"); _MRParentFCCombo = new Combo(_MRParentFtGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentFCCombo.setLayoutData(gd); _MRParentFCCombo.addListener(SWT.Selection, _updateMRParent); _MRParentThresholdLabel = new Label(_MRParentFtGroup,SWT.NONE); _MRParentThresholdLabel.setText("Threshold:"); _MRParentThresholdText = new Text(_MRParentFtGroup, SWT.BORDER); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentThresholdText.setLayoutData(gd); _MRParentThresholdText.addListener(SWT.Modify, _updateMRParent); // _MRParentChGroup = new Group(_MRParentGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 1; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.horizontalAlignment = SWT.FILL; gd.verticalAlignment = SWT.FILL; _MRParentChGroup.setLayout(gl); _MRParentChGroup.setLayoutData(gd); _MRParentChGroup.setText("Alarms to Ignore"); _MRParentChFilterGroup = new Group(_MRParentChGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 2; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentChFilterGroup.setLayout(gl); _MRParentChFilterGroup.setLayoutData(gd); _MRParentChFilterGroup.setText("Filter Options"); _MRParentChFilterLevelGroup = new Group(_MRParentChFilterGroup, SWT.SHADOW_ETCHED_IN); gl = new GridLayout(); gl.numColumns = 3; gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; gd.horizontalAlignment = SWT.FILL; _MRParentChFilterLevelGroup.setLayout(gl); _MRParentChFilterLevelGroup.setLayoutData(gd); _MRParentChFilterLevelGroup.setText("Show"); _MRParentChAllRadio = new Button (_MRParentChFilterLevelGroup, SWT.RADIO); _MRParentChAllRadio.setText("All"); _MRParentChAllRadio.addListener(SWT.Selection, _updateMRParentCh); _MRParentChSelectedRadio = new Button (_MRParentChFilterLevelGroup, SWT.RADIO); _MRParentChSelectedRadio.setText("Selected"); _MRParentChSelectedRadio.addListener(SWT.Selection, _updateMRParentCh); _MRParentChUnselectedRadio = new Button (_MRParentChFilterLevelGroup, SWT.RADIO); _MRParentChUnselectedRadio.setText("Unselected"); _MRParentChUnselectedRadio.addListener(SWT.Selection, _updateMRParentCh); _MRParentChFFLabel = new Label(_MRParentChFilterGroup,SWT.NONE); _MRParentChFFLabel.setText("Fault Family:"); _MRParentChFFCombo = new Combo(_MRParentChFilterGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentChFFCombo.setLayoutData(gd); _MRParentChFFCombo.addListener(SWT.Selection, _updateMRParentChFF); _MRParentChFMLabel = new Label(_MRParentChFilterGroup,SWT.NONE); _MRParentChFMLabel.setText("Fault Member:"); _MRParentChFMCombo = new Combo(_MRParentChFilterGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentChFMCombo.setLayoutData(gd); _MRParentChFMCombo.addListener(SWT.Selection, _updateMRParentCh); _MRParentChFCLabel = new Label(_MRParentChFilterGroup,SWT.NONE); _MRParentChFCLabel.setText("Fault Code:"); _MRParentChFCCombo = new Combo(_MRParentChFilterGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentChFCCombo.setLayoutData(gd); _MRParentChFCCombo.addListener(SWT.Selection, _updateMRParentCh); _MRParentChFilterLabel = new Label(_MRParentChFilterGroup,SWT.NONE); _MRParentChFilterLabel.setText("Filter RegEx:"); _MRParentChFilterText = new Text(_MRParentChFilterGroup, SWT.BORDER); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; _MRParentChFilterText.setLayoutData(gd); _MRParentChFilterText.addListener(SWT.Modify, _updateMRParentCh); _MRParentChAlarmList = new Table(_MRParentChGroup,SWT.BORDER); gd = new GridData(); gd.verticalAlignment = SWT.FILL; gd.horizontalAlignment = SWT.FILL; gd.grabExcessVerticalSpace = true; gd.grabExcessHorizontalSpace = true; _MRParentChAlarmList.setLayoutData(gd); _MRParentChAlarmList.addListener(SWT.KeyUp, _addRule); _MRParentChAlarmList.addListener(SWT.MouseDoubleClick, _addRule); _MRParentErrorMessageLabel = new Label(_MRParentGroup, SWT.NONE); _MRParentErrorMessageLabel.setText(""); _MRParentErrorMessageLabel.setForeground(getViewSite().getShell().getDisplay().getSystemColor(SWT.COLOR_RED)); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; gd.horizontalSpan = 2; _MRParentErrorMessageLabel.setLayoutData(gd); } /* (non-Javadoc) * @see cl.utfsm.acs.acg.gui.IMyViewPart#refreshContents() */ public void refreshContents() { _tree.removeAll(); _reductionManager = AlarmSystemManager.getInstance().getReductionManager(); _alarmManager = AlarmSystemManager.getInstance().getAlarmManager(); sortReductionRulesList(); _tree.deselectAll(); } private void fillNRParentWidgets(String ff, String fm, int fc) { //_updateNRParentFF.setEnabled(false); ReductionRule nrr = _reductionManager.getNRParentByTriplet(ff, fm, fc); Alarm parent = null; // This should happen only when creating a new rule... if( nrr == null ) { parent = _alarmManager.getAlarm(ff+":"+fm+":"+fc); _NRParentErrorMessageLabel.setText("No Reduction Rule for this triplet."); } else parent = nrr.getParent(); _NRParentFFCombo.removeAll(); _NRParentChFFCombo.removeAll(); _NRParentChFFCombo.add("Any"); _NRParentChFFCombo.select(0); List<FaultFamily> ffList = _alarmManager.getAllAlarms(); List<String> tmp = new ArrayList<String>(); List<FaultFamily> sortedFFList = new ArrayList<FaultFamily>(); for(FaultFamily tff: ffList) tmp.add(tff.getName()); Collections.sort(tmp,IGNORE_CASE_ORDER); for(String sff: tmp) sortedFFList.add(_alarmManager.getFaultFamily(sff)); ffList = sortedFFList; FaultFamily ffs = null; int i = -1; for (Iterator<FaultFamily> iterator = ffList.iterator(); iterator.hasNext();) { FaultFamily fft = iterator.next(); if(fft.getFaultCodeCount() > 0 && fft.getFaultMemberCount() > 0) _NRParentFFCombo.add(fft.getName()); _NRParentChFFCombo.add(fft.getName()); if(parent != null && fft.getName().compareTo(parent.getTriplet().getFaultFamily()) == 0){ i = _NRParentFFCombo.getItemCount() - 1; ffs = fft; } } _NRParentFFCombo.select(i); _NRParentFMCombo.removeAll(); if(ffs != null) { i = -1; FaultMember[] fml = ffs.getFaultMember(); List<FaultMember> fmList = Arrays.asList(fml); tmp = new ArrayList<String>(); List<FaultMember> sortedFMList = new ArrayList<FaultMember>(); for(FaultMember tfm: fmList) tmp.add(tfm.getName()); Collections.sort(tmp, IGNORE_CASE_ORDER); for(String sfm: tmp) for(FaultMember tfm: fmList) if(sfm.compareTo(tfm.getName()) == 0) sortedFMList.add(tfm); fmList = sortedFMList; for (FaultMember fmt: fmList) { _NRParentFMCombo.add(fmt.getName()); if(fmt.getName().compareTo(parent.getTriplet().getFaultMember()) == 0) i = _NRParentFMCombo.getItemCount() - 1; } _NRParentFMCombo.select(i); } _NRParentFCCombo.removeAll(); if(ffs != null) { i = -1; FaultCode[] fcl = ffs.getFaultCode(); List<FaultCode> fcList = Arrays.asList(fcl); tmp = new ArrayList<String>(); List<FaultCode> sortedFCList = new ArrayList<FaultCode>(); for(FaultCode tfc: fcList) tmp.add(Integer.toString(tfc.getValue())); Collections.sort(tmp); for(String sfc: tmp) for(FaultCode tfc: fcList) if(sfc.compareTo(Integer.toString(tfc.getValue())) == 0) sortedFCList.add(tfc); fcList = sortedFCList; for (FaultCode fct: fcList) { _NRParentFCCombo.add(Integer.toString(fct.getValue())); if(fct.getValue() == parent.getTriplet().getFaultCode()) i = _NRParentFCCombo.getItemCount() - 1; } _NRParentFCCombo.select(i); } _NRParentChFMCombo.removeAll(); _NRParentChFMCombo.add("Any"); _NRParentChFMCombo.select(0); _NRParentChFCCombo.removeAll(); _NRParentChFCCombo.add("Any"); _NRParentChFCCombo.select(0); if(ff.isEmpty() && fm.isEmpty() && fc == 0) { if(!_NRParentFFCombo.getText().isEmpty() && !_NRParentFMCombo.getText().isEmpty() && !_NRParentFCCombo.getText().isEmpty()) fillNRParentChAlarmList(_NRParentFFCombo.getText(),_NRParentFMCombo.getText(),Integer.parseInt(_NRParentFCCombo.getText())); } else fillNRParentChAlarmList(ff,fm,fc); //_updateNRParentFF.setEnabled(true); } public void fillNRParentChAlarmList(String ff, String fm, int fc){ _NRParentErrorMessageLabel.setText(""); _NRParentChAlarmList.removeAll(); ReductionRule nrr = _reductionManager.getNRParentByTriplet(ff, fm, fc); Alarm parent; // This should never happen anyways... if( nrr == null ) { parent = _alarmManager.getAlarm(ff+":"+fm+":"+fc); _NRParentErrorMessageLabel.setText("No Reduction Rule for this triplet."); } else parent = nrr.getParent(); if(parent == null) { _NRParentErrorMessageLabel.setText("Couldn't find the selected Alarm."); return; } List<Alarm> alarms = _alarmManager.getAlarms(); List<String> tmp = new ArrayList<String>(); List<Alarm> sortedAlarms = new ArrayList<Alarm>(); for(Alarm al: alarms) tmp.add(al.getIdentifier()); Collections.sort(tmp,IGNORE_CASE_ORDER); for(String sal: tmp) sortedAlarms.add(_alarmManager.getAlarm(sal)); alarms = sortedAlarms; try { for (Iterator<Alarm> iterator = alarms.iterator(); iterator.hasNext();) { Alarm alarm = iterator.next(); if(alarm.getAlarmId().compareTo(parent.getAlarmId()) == 0) continue; if(_NRParentChFFCombo.getText().compareTo("Any") != 0) if(alarm.getTriplet().getFaultFamily().compareTo(_NRParentChFFCombo.getText()) != 0) continue; if(_NRParentChFMCombo.getText().compareTo("Any") != 0) if(alarm.getTriplet().getFaultMember().compareTo(_NRParentChFMCombo.getText()) != 0) continue; if(_NRParentChFCCombo.getText().compareTo("Any") != 0) if(alarm.getTriplet().getFaultCode() != Integer.parseInt(_NRParentChFCCombo.getText())) continue; if(_NRParentChFilterText.getText().compareTo("")!=0) if(!alarm.getAlarmId().matches(_NRParentChFilterText.getText())) continue; if(_NRParentChSelectedRadio.getSelection() && (nrr == null || nrr.getChild(alarm.getAlarmId()) == null)) continue; if(_NRParentChUnselectedRadio.getSelection() && (nrr != null && nrr.getChild(alarm.getAlarmId()) != null)) continue; TableItem t = new TableItem(_NRParentChAlarmList, SWT.None); t.setText(alarm.getAlarmId()); if(nrr != null) { List<Alarm> children = nrr.getChildren(); for (Iterator<Alarm> iterator2 = children.iterator(); iterator2.hasNext();) { Alarm alarm2 = iterator2.next(); if(alarm.getAlarmId().compareTo(alarm2.getAlarmId()) == 0){ t.setImage(Activator.getDefault().getImageRegistry().get(Activator.IMG_TICKET)); break; } } } } } catch(Exception e) { _NRParentErrorMessageLabel.setText(e.getMessage()); } } private void fillMRParentWidgets(String ff, String fm, int fc) { ReductionRule mrr = _reductionManager.getMRParentByTriplet(ff, fm, fc); Alarm parent = null; // This should happen only when creating a new rule... if( mrr == null ) { parent = _alarmManager.getAlarm(ff+":"+fm+":"+fc); _MRParentErrorMessageLabel.setText("No Reduction Rule for this triplet."); } else { parent = mrr.getParent(); if (mrr.getChildrenCount() < mrr.getThreshold()) _MRParentErrorMessageLabel.setText("You need to have at least threshold ("+mrr.getThreshold()+") childs for this triplet."); } _MRParentFFCombo.removeAll(); _MRParentChFFCombo.removeAll(); _MRParentChFFCombo.add("Any"); _MRParentChFFCombo.select(0); List<FaultFamily> ffList = _alarmManager.getAllAlarms(); List<String> tmp = new ArrayList<String>(); List<FaultFamily> sortedFFList = new ArrayList<FaultFamily>(); for(FaultFamily tff: ffList) tmp.add(tff.getName()); Collections.sort(tmp, IGNORE_CASE_ORDER); for(String sff: tmp) sortedFFList.add(_alarmManager.getFaultFamily(sff)); ffList = sortedFFList; FaultFamily ffs = null; int i = -1; for (Iterator<FaultFamily> iterator = ffList.iterator(); iterator.hasNext();) { FaultFamily fft = iterator.next(); if(fft.getFaultCodeCount() > 0 && fft.getFaultMemberCount() > 0) _MRParentFFCombo.add(fft.getName()); _MRParentChFFCombo.add(fft.getName()); if(parent != null && fft.getName().compareTo(parent.getTriplet().getFaultFamily()) == 0){ i = _MRParentFFCombo.getItemCount() - 1; ffs = fft; } } _MRParentFFCombo.select(i); _MRParentFMCombo.removeAll(); if(ffs != null) { i = -1; FaultMember[] fml = ffs.getFaultMember(); List<FaultMember> fmList = Arrays.asList(fml); tmp = new ArrayList<String>(); List<FaultMember> sortedFMList = new ArrayList<FaultMember>(); for(FaultMember tfm: fmList) tmp.add(tfm.getName()); Collections.sort(tmp, IGNORE_CASE_ORDER); for(String sfm: tmp) for(FaultMember tfm: fmList) if(sfm.compareTo(tfm.getName()) == 0) sortedFMList.add(tfm); fmList = sortedFMList; for (FaultMember fmt: fmList) { _MRParentFMCombo.add(fmt.getName()); if(fmt.getName().compareTo(parent.getTriplet().getFaultMember()) == 0) i = _MRParentFMCombo.getItemCount() - 1; } _MRParentFMCombo.select(i); } _MRParentFCCombo.removeAll(); if(ffs != null) { i = -1; FaultCode[] fcl = ffs.getFaultCode(); List<FaultCode> fcList = Arrays.asList(fcl); tmp = new ArrayList<String>(); List<FaultCode> sortedFCList = new ArrayList<FaultCode>(); for(FaultCode tfc: fcList) tmp.add(Integer.toString(tfc.getValue())); Collections.sort(tmp); for(String sfc: tmp) for(FaultCode tfc: fcList) if(sfc.compareTo(Integer.toString(tfc.getValue())) == 0) sortedFCList.add(tfc); fcList = sortedFCList; for (FaultCode fct: fcList) { _MRParentFCCombo.add(Integer.toString(fct.getValue())); if(fct.getValue() == parent.getTriplet().getFaultCode()) i = _MRParentFCCombo.getItemCount() - 1; } _MRParentFCCombo.select(i); } _MRParentThresholdText.setText(""); if(mrr != null) _MRParentThresholdText.setText(Integer.toString(mrr.getThreshold())); _MRParentChFMCombo.removeAll(); _MRParentChFMCombo.add("Any"); _MRParentChFMCombo.select(0); _MRParentChFCCombo.removeAll(); _MRParentChFCCombo.add("Any"); _MRParentChFCCombo.select(0); if(ff.isEmpty() && fm.isEmpty() && fc == 0) { if(!_MRParentFFCombo.getText().isEmpty() && !_MRParentFMCombo.getText().isEmpty() && !_MRParentFCCombo.getText().isEmpty()) fillMRParentChAlarmList(_MRParentFFCombo.getText(),_MRParentFMCombo.getText(),Integer.parseInt(_MRParentFCCombo.getText())); } else fillMRParentChAlarmList(ff,fm,fc); //_updateNRParentFF.setEnabled(true); } public void fillMRParentChAlarmList(String ff, String fm, int fc) { _MRParentErrorMessageLabel.setText(""); _MRParentChAlarmList.removeAll(); ReductionRule mrr = _reductionManager.getMRParentByTriplet(ff, fm, fc); Alarm parent; // This should only happen when creating a new rule... if( mrr == null ) { parent = _alarmManager.getAlarm(ff+":"+fm+":"+fc); _MRParentErrorMessageLabel.setText("No Reduction Rule for this triplet."); } else parent = mrr.getParent(); if(parent == null) { _MRParentErrorMessageLabel.setText("Couldn't find the selected Alarm."); return; } if(_MRParentThresholdText.getText().isEmpty()) { _MRParentErrorMessageLabel.setText("Please set a Threshold value."); return; } try { Integer.parseInt(_MRParentThresholdText.getText()); } catch(NumberFormatException e) { _MRParentErrorMessageLabel.setText("Incorrect Threshold. A number is required."); return; } List<Alarm> alarms = _alarmManager.getAlarms(); List<String> tmp = new ArrayList<String>(); List<Alarm> sortedAlarms = new ArrayList<Alarm>(); for(Alarm al: alarms) tmp.add(al.getIdentifier()); Collections.sort(tmp, IGNORE_CASE_ORDER); for(String sal: tmp) sortedAlarms.add(_alarmManager.getAlarm(sal)); alarms = sortedAlarms; try { for (Iterator<Alarm> iterator = alarms.iterator(); iterator.hasNext();) { Alarm alarm = iterator.next(); if(alarm.getAlarmId().compareTo(parent.getAlarmId()) == 0) continue; if(_MRParentChFFCombo.getText().compareTo("Any") != 0) if(alarm.getTriplet().getFaultFamily().compareTo(_MRParentChFFCombo.getText()) != 0) continue; if(_MRParentChFMCombo.getText().compareTo("Any") != 0) if(alarm.getTriplet().getFaultMember().compareTo(_MRParentChFMCombo.getText()) != 0) continue; if(_MRParentChFCCombo.getText().compareTo("Any") != 0) if(alarm.getTriplet().getFaultCode() != Integer.parseInt(_MRParentChFCCombo.getText())) continue; if(_MRParentChFilterText.getText().compareTo("")!=0) if(!alarm.getAlarmId().matches(_MRParentChFilterText.getText())) continue; if(_MRParentChSelectedRadio.getSelection() && (mrr == null || mrr.getChild(alarm.getAlarmId()) == null)) continue; if(_MRParentChUnselectedRadio.getSelection() && (mrr != null && mrr.getChild(alarm.getAlarmId()) != null)) continue; TableItem t = new TableItem(_MRParentChAlarmList, SWT.None); t.setText(alarm.getAlarmId()); if(mrr != null) { List<Alarm> children = mrr.getChildren(); for (Iterator<Alarm> iterator2 = children.iterator(); iterator2.hasNext();) { Alarm alarm2 = iterator2.next(); if(alarm.getAlarmId().compareTo(alarm2.getAlarmId()) == 0){ t.setImage(Activator.getDefault().getImageRegistry().get(Activator.IMG_TICKET)); break; } } } } if (mrr != null && mrr.getChildrenCount() < mrr.getThreshold()) _MRParentErrorMessageLabel.setText("You need to have at least threshold ("+mrr.getThreshold()+") childs for this triplet."); } catch(PatternSyntaxException e) { _MRParentErrorMessageLabel.setText(e.getMessage()); } } @Override public void setFocus() { } public void setEnabled(boolean v) { _tree.setEnabled(v); _NRParentGroup.setEnabled(v); _MRParentGroup.setEnabled(v); } private String[] getTriplet(String str) { str = str.replaceAll("^<",""); str = str.replaceAll(">$",""); String[] triplet = str.split(","); return triplet; } public void sortReductionRulesList() { _tree.removeAll(); for(int i=0; i!=2; i++) { TreeItem iTree = new TreeItem(_tree,SWT.NONE); iTree.setText((i==0 ? "Node Reductions" : "Multiplicity Reductions")); iTree.setData((i==0 ? NodeType.NODE_REDUCTION : NodeType.MULTIPLICITY_REDUCTION)); if( i == 0 ) sortNodeReductionRuleList(iTree); else sortMultiReductionRuleList(iTree); } } public void sortNodeReductionRuleList(TreeItem iTree) { List<ReductionRule> rrList = _reductionManager.getNodeReductionRules(); List<ReductionRule> sortedRRList = new ArrayList<ReductionRule>(); List<String> tmp = new ArrayList<String>(); for(ReductionRule rr: rrList) { Triplet t = rr.getParent().getTriplet(); String name = "<" + t.getFaultFamily() + "," + t.getFaultMember() + "," + t.getFaultCode() + ">"; tmp.add(name); } Collections.sort(tmp,IGNORE_CASE_ORDER); for(String srr: tmp) for(ReductionRule rr: rrList) { Triplet t = rr.getParent().getTriplet(); String name = "<" + t.getFaultFamily() + "," + t.getFaultMember() + "," + t.getFaultCode() + ">"; if(name.compareTo(srr) == 0) sortedRRList.add(rr); } rrList = sortedRRList; for (ReductionRule rule : rrList) { TreeItem kTree = new TreeItem(iTree,SWT.NONE); Triplet t = rule.getParent().getTriplet(); kTree.setText("<" + t.getFaultFamily() + "," + t.getFaultMember() + "," + t.getFaultCode() + ">"); kTree.setData(NodeType.NODE_REDUCTION_PARENT_DATA); } } public void sortMultiReductionRuleList(TreeItem iTree) { List<ReductionRule> rrList = _reductionManager.getMultiReductionRules(); List<ReductionRule> sortedRRList = new ArrayList<ReductionRule>(); List<String> tmp = new ArrayList<String>(); for(ReductionRule rr: rrList) { Triplet t = rr.getParent().getTriplet(); String name = "<" + t.getFaultFamily() + "," + t.getFaultMember() + "," + t.getFaultCode() + ">"; tmp.add(name); } Collections.sort(tmp, IGNORE_CASE_ORDER); for(String srr: tmp) for(ReductionRule rr: rrList) { Triplet t = rr.getParent().getTriplet(); String name = "<" + t.getFaultFamily() + "," + t.getFaultMember() + "," + t.getFaultCode() + ">"; if(name.compareTo(srr) == 0) sortedRRList.add(rr); } rrList = sortedRRList; for (ReductionRule rule : rrList) { TreeItem kTree = new TreeItem(iTree,SWT.NONE); Triplet t = rule.getParent().getTriplet(); kTree.setText("<" + t.getFaultFamily() + "," + t.getFaultMember() + "," + t.getFaultCode() + ">"); kTree.setData(NodeType.MULTIPLICITY_REDUCTION_PARENT_DATA); } } public void selectElementFromTree(String triplet, boolean isNodeReduction){ if(triplet == null) return; TreeItem[] its; TreeItem sel = null; if(isNodeReduction) its = _tree.getItems()[0].getItems(); else its = _tree.getItems()[1].getItems(); for(TreeItem it: its) if(it.getText().compareTo(triplet) == 0) sel = it; if(sel == null) return; _tree.setSelection(sel); Event e = new Event(); _tree.notifyListeners(SWT.Selection, e); } @Override public void fillWidgets() { // TODO Auto-generated method stub } public void setReadOnly(boolean v){ if(v) { _tree.setMenu(null); _NRParentChAlarmList.setMenu(null); _NRParentChAlarmList.removeListener(SWT.KeyUp, _addRule); _NRParentChAlarmList.removeListener(SWT.MouseDoubleClick, _addRule); _MRParentChAlarmList.setMenu(null); _MRParentChAlarmList.removeListener(SWT.KeyUp, _addRule); _MRParentChAlarmList.removeListener(SWT.MouseDoubleClick, _addRule); } else { _tree.setMenu(null); _NRParentChAlarmList.setMenu(null); _NRParentChAlarmList.addListener(SWT.KeyUp, _addRule); _NRParentChAlarmList.addListener(SWT.MouseDoubleClick, _addRule); _MRParentChAlarmList.setMenu(null); _MRParentChAlarmList.addListener(SWT.KeyUp, _addRule); _MRParentChAlarmList.addListener(SWT.MouseDoubleClick, _addRule); } _NRParentFFCombo.setEnabled(!v); _NRParentFMCombo.setEnabled(!v); _NRParentFCCombo.setEnabled(!v); _MRParentFFCombo.setEnabled(!v); _MRParentFMCombo.setEnabled(!v); _MRParentFCCombo.setEnabled(!v); _MRParentThresholdText.setEnabled(!v); // //private Button _NRParentChAllRadio; //private Button _NRParentChSelectedRadio; //private Button _NRParentChUnselectedRadio; //private Combo _NRParentChFFCombo; //private Combo _NRParentChFMCombo; //private Combo _NRParentChFCCombo; //private Text _NRParentChFilterText; //private Button _MRParentChAllRadio; //private Button _MRParentChSelectedRadio; //private Button _MRParentChUnselectedRadio; //private Combo _MRParentChFFCombo; //private Combo _MRParentChFMCombo; //private Combo _MRParentChFCCombo; //private Text _MRParentChFilterText; //private Table _MRParentChAlarmList; } static final Comparator<String> IGNORE_CASE_ORDER = new Comparator<String>() { public int compare(String e1, String e2) { return e1.toLowerCase().compareTo(e2.toLowerCase()); } }; }