blob: 12c394af1363d85e713ed32678a730041e870b05 [file] [log] [blame]
// $codepro.audit.disable com.instantiations.assist.eclipse.analysis.audit.rule.effectivejava.alwaysOverridetoString.alwaysOverrideToString, com.instantiations.assist.eclipse.analysis.deserializeabilitySecurity, com.instantiations.assist.eclipse.analysis.disallowReturnMutable, com.instantiations.assist.eclipse.analysis.enforceCloneableUsageSecurity
/*******************************************************************************
* Copyright (c) 2010, 2012 Ericsson AB and others.
*
* 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
*
* Description:
*
* This class implements the root R4E element of the UI model
*
* Contributors:
* Sebastien Dubois - Created for Mylyn Review R4E project
*
*******************************************************************************/
package org.eclipse.mylyn.reviews.r4e.ui.internal.model;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.reviews.core.model.IReviewComponent;
import org.eclipse.mylyn.reviews.r4e.core.model.R4EReviewGroup;
import org.eclipse.mylyn.reviews.r4e.core.model.RModelFactory;
import org.eclipse.mylyn.reviews.r4e.core.model.drules.DRModelFactory;
import org.eclipse.mylyn.reviews.r4e.core.model.drules.R4EDesignRuleCollection;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.CompatibilityException;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.OutOfSyncException;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.ResourceHandlingException;
import org.eclipse.mylyn.reviews.r4e.ui.R4EUIPlugin;
import org.eclipse.mylyn.reviews.r4e.ui.internal.dialogs.IReviewGroupInputDialog;
import org.eclipse.mylyn.reviews.r4e.ui.internal.dialogs.IRuleSetInputDialog;
import org.eclipse.mylyn.reviews.r4e.ui.internal.dialogs.R4EUIDialogFactory;
import org.eclipse.mylyn.reviews.r4e.ui.internal.navigator.ReviewNavigatorContentProvider;
import org.eclipse.mylyn.reviews.r4e.ui.internal.preferences.PreferenceConstants;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.R4EUIConstants;
import org.eclipse.swt.widgets.Display;
/**
* @author Sebastien Dubois
* @version $Revision: 1.0 $
*/
public class R4EUIRootElement extends R4EUIModelElement {
// ------------------------------------------------------------------------
// Member variables
// ------------------------------------------------------------------------
/**
* Field fReviewGroups.
*/
private final List<R4EUIReviewGroup> fReviewGroups;
/**
* Field fRuleSets.
*/
private final List<R4EUIRuleSet> fRuleSets;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor for R4EElement.
*
* @param aParent
* IR4EUIModelElement
* @param aName
* String
*/
public R4EUIRootElement(IR4EUIModelElement aParent, String aName) {
super(aParent, aName);
fReviewGroups = new ArrayList<R4EUIReviewGroup>();
fRuleSets = new ArrayList<R4EUIRuleSet>();
}
// ------------------------------------------------------------------------
// Methods
// ------------------------------------------------------------------------
/**
* Method getImageLocation.
*
* @return String
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#getImageLocation()
*/
public String getImageLocation() {
return null;
}
/**
* Create a serialization model element object
*
* @return the new serialization element object
* @throws OutOfSyncException
* @throws ResourceHandlingException
*/
@Override
public List<IReviewComponent> createChildModelDataElement() {
//Get comment from user and set it in model data
final List<IReviewComponent> tempReviewGroups = new ArrayList<IReviewComponent>();
final IReviewGroupInputDialog dialog = R4EUIDialogFactory.getInstance().getReviewGroupInputDialog();
dialog.create();
final int result = dialog.open();
if (result == Window.OK) {
final R4EReviewGroup tempReviewGroup = RModelFactory.eINSTANCE.createR4EReviewGroup();
tempReviewGroup.setName(dialog.getGroupNameValue());
tempReviewGroup.setDescription(dialog.getGroupDescriptionValue());
tempReviewGroup.setFolder(dialog.getGroupFolderValue());
for (String project : dialog.getAvailableProjectsValues()) {
tempReviewGroup.getAvailableProjects().add(project);
}
for (String component : dialog.getAvailableComponentsValues()) {
tempReviewGroup.getAvailableComponents().add(component);
}
for (String ruleSetLocation : dialog.getRuleSetValues()) {
tempReviewGroup.getDesignRuleLocations().add(ruleSetLocation);
}
tempReviewGroup.setDefaultEntryCriteria(dialog.getDefaultEntryCriteriaValue());
tempReviewGroups.add(tempReviewGroup);
}
return tempReviewGroups;
}
/**
* Create a serialization model Rule Set element object
*
* @return the new serialization element object
* @throws OutOfSyncException
* @throws ResourceHandlingException
*/
public IReviewComponent createRuleSetElement() {
//Get comment from user and set it in model data
R4EDesignRuleCollection tempRuleSet = null;
final IRuleSetInputDialog dialog = R4EUIDialogFactory.getInstance().getRuleSetInputDialog();
dialog.create();
final int result = dialog.open();
if (result == Window.OK) {
tempRuleSet = DRModelFactory.eINSTANCE.createR4EDesignRuleCollection();
tempRuleSet.setVersion(dialog.getVersionValue());
tempRuleSet.setFolder(dialog.getFolderValue());
tempRuleSet.setName(dialog.getNameValue());
}
return tempRuleSet;
}
/**
* Close the model element (i.e. disable it)
*
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#close()
*/
@Override
public void close() {
//Remove all children references
R4EUIReviewGroup reviewGroup = null;
final int reviewGroupsSize = fReviewGroups.size();
for (int i = 0; i < reviewGroupsSize; i++) {
reviewGroup = fReviewGroups.get(i);
if (!reviewGroup.isOpen()) {
continue; //skip reviews groups that are already closed
}
reviewGroup.close();
}
fReviewGroups.clear();
R4EUIRuleSet ruleSet = null;
final int ruleSetSize = fRuleSets.size();
for (int i = 0; i < ruleSetSize; i++) {
ruleSet = fRuleSets.get(i);
if (!ruleSet.isOpen()) {
continue; //skip rule sets that are already closed
}
ruleSet.close();
}
fRuleSets.clear();
fOpen = false;
}
/**
* Method getRuleSets
*
* @return List<R4EUIRuleSet>
*/
public List<R4EUIRuleSet> getRuleSets() {
return fRuleSets;
}
//Hierarchy
/**
* Method getChildren.
*
* @return IR4EUIModelElement[]
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#getChildren()
*/
@Override
public IR4EUIModelElement[] getChildren() {
final List<IR4EUIModelElement> newList = new ArrayList<IR4EUIModelElement>();
for (R4EUIReviewGroup group : fReviewGroups) {
newList.add(group);
}
for (R4EUIRuleSet ruleSet : fRuleSets) {
newList.add(ruleSet);
}
return newList.toArray(new IR4EUIModelElement[newList.size()]);
}
/**
* Method getGroups.
*
* @return R4EUIReviewGroup[]
*/
public R4EUIReviewGroup[] getGroups() {
return fReviewGroups.toArray(new R4EUIReviewGroup[fReviewGroups.size()]);
}
/**
* Method hasChildren.
*
* @return boolean
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#hasChildren()
*/
@Override
public boolean hasChildren() {
if (0 == fReviewGroups.size() && 0 == fRuleSets.size()) {
return false;
}
return true;
}
/**
* Method loadReviewGroup.
*
* @param aGroup
* R4EReviewGroup
* @throws ResourceHandlingException
*/
public void loadReviewGroup(R4EReviewGroup aGroup) {
if (aGroup.isEnabled()
|| R4EUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.P_SHOW_DISABLED)) {
final R4EUIReviewGroup addedChild = new R4EUIReviewGroup(this, aGroup, false);
addChildren(addedChild);
}
}
/**
* Method loadRuleSet.
*
* @param aRuleSet
* R4EDesignRuleCollection
* @throws ResourceHandlingException
*/
public void loadRuleSet(R4EDesignRuleCollection aRuleSet) {
if (aRuleSet.isEnabled()
|| R4EUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.P_SHOW_DISABLED)) {
final R4EUIRuleSet addedChild = new R4EUIRuleSet(this, aRuleSet, false);
addChildren(addedChild);
addedChild.close();
}
}
/**
* Method addChildren.
*
* @param aModelComponent
* - the serialization model component object
* @return IR4EUIModelElement
* @throws ResourceHandlingException
* @throws OutOfSyncException
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#createChildren(ReviewNavigatorContentProvider)
*/
@Override
public IR4EUIModelElement createChildren(IReviewComponent aModelComponent) throws ResourceHandlingException,
OutOfSyncException {
if (aModelComponent instanceof R4EReviewGroup) {
final String groupName = ((R4EReviewGroup) aModelComponent).getName();
//Check if group already exists. If so it cannot be recreated
for (R4EUIReviewGroup group : fReviewGroups) {
if (group.getReviewGroup().getName().equals(groupName)) {
final ErrorDialog dialog = new ErrorDialog(null, R4EUIConstants.DIALOG_TITLE_ERROR,
"Error while creating new Review Group ", new Status(IStatus.ERROR, R4EUIPlugin.PLUGIN_ID,
0, "Review Group " + groupName + " already exists", null), IStatus.ERROR);
Display.getDefault().syncExec(new Runnable() {
public void run() {
dialog.open();
}
});
return null;
}
}
final R4EReviewGroup reviewGroup = R4EUIModelController.FModelExt.createR4EReviewGroup(
URI.createFileURI(((R4EReviewGroup) aModelComponent).getFolder()), groupName);
final R4EUIReviewGroup addedChild = new R4EUIReviewGroup(this, reviewGroup, true);
addedChild.setModelData(aModelComponent);
addChildren(addedChild);
final IPreferenceStore preferenceStore = R4EUIPlugin.getDefault().getPreferenceStore();
final String newGroup = reviewGroup.eResource().getURI().toFileString();
final String prefGroupsStr = preferenceStore.getString(PreferenceConstants.P_GROUP_FILE_PATH);
final String[] prefGroups = prefGroupsStr.split(R4EUIConstants.LINE_FEED);
for (String prefGroup : prefGroups) {
if (prefGroup.equals(newGroup + ";")) {
return addedChild; //Do not put group reference in preferences if it is already there
}
}
preferenceStore.setValue(PreferenceConstants.P_GROUP_FILE_PATH,
preferenceStore.getString(PreferenceConstants.P_GROUP_FILE_PATH) + R4EUIConstants.LINE_FEED
+ newGroup);
return addedChild;
} else if (aModelComponent instanceof R4EDesignRuleCollection) {
final String ruleSetName = ((R4EDesignRuleCollection) aModelComponent).getName();
//Check if group already exists. If so it cannot be recreated
for (R4EUIRuleSet ruleSet : fRuleSets) {
if (ruleSet.getRuleSet().getName().equals(ruleSetName)) {
final ErrorDialog dialog = new ErrorDialog(null, R4EUIConstants.DIALOG_TITLE_ERROR,
"Error while creating new Rule Set ", new Status(IStatus.ERROR, R4EUIPlugin.PLUGIN_ID, 0,
"Rule Set " + ruleSetName + " already exists", null), IStatus.ERROR);
Display.getDefault().syncExec(new Runnable() {
public void run() {
dialog.open();
}
});
return null;
}
}
final R4EDesignRuleCollection ruleSet = R4EUIModelController.FModelExt.createR4EDesignRuleCollection(
URI.createFileURI(((R4EDesignRuleCollection) aModelComponent).getFolder()), ruleSetName);
final R4EUIRuleSet addedChild = new R4EUIRuleSet(this, ruleSet, true);
addedChild.setModelData(aModelComponent);
addChildren(addedChild);
final IPreferenceStore preferenceStore = R4EUIPlugin.getDefault().getPreferenceStore();
final String newSet = ruleSet.eResource().getURI().toFileString();
final String prefSetsStr = preferenceStore.getString(PreferenceConstants.P_RULE_SET_FILE_PATH);
final String[] prefSets = prefSetsStr.split(R4EUIConstants.LINE_FEED);
for (String prefSet : prefSets) {
if (prefSet.equals(newSet)) {
return addedChild; //Do not put group reference in preferences if it is already there
}
}
preferenceStore.setValue(PreferenceConstants.P_RULE_SET_FILE_PATH,
preferenceStore.getString(PreferenceConstants.P_RULE_SET_FILE_PATH) + R4EUIConstants.LINE_FEED
+ newSet);
return addedChild;
} else {
return null; //should never happen
}
}
/**
* Method addChildren.
*
* @param aChildToAdd
* IR4EUIModelElement
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#addChildren(IR4EUIModelElement)
*/
@Override
public void addChildren(IR4EUIModelElement aChildToAdd) {
if (aChildToAdd instanceof R4EUIReviewGroup) {
fReviewGroups.add((R4EUIReviewGroup) aChildToAdd);
} else if (aChildToAdd instanceof R4EUIRuleSet) {
fRuleSets.add((R4EUIRuleSet) aChildToAdd);
} else {
return;
}
}
/**
* Method removeChildren.
*
* @param aChildToRemove
* IR4EUIModelElement
* @param aFileRemove
* - also remove from file (hard remove)
* @throws OutOfSyncException
* @throws ResourceHandlingException
* @throws CompatibilityException
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#removeChildren(IR4EUIModelElement)
*/
@Override
public void removeChildren(IR4EUIModelElement aChildToRemove, boolean aFileRemove)
throws ResourceHandlingException, OutOfSyncException, CompatibilityException {
if (aChildToRemove instanceof R4EUIReviewGroup) {
final R4EUIReviewGroup removedElement = fReviewGroups.get(fReviewGroups.indexOf(aChildToRemove));
//Also recursively remove all children
removedElement.removeAllChildren(aFileRemove);
/* TODO uncomment when core model supports hard-removing of elements
if (aFileRemove) removedElement.getReviewGroup().remove());
else */
removedElement.setEnabled(false);
//Remove element from UI if the show disabled element option is off
if (!(R4EUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.P_SHOW_DISABLED))) {
fReviewGroups.remove(removedElement);
}
} else if (aChildToRemove instanceof R4EUIRuleSet) {
final R4EUIRuleSet removedElement = fRuleSets.get(fRuleSets.indexOf(aChildToRemove));
//Verify if the rule set is referred to by any review group
for (R4EUIReviewGroup group : getGroups()) {
if (group.getRuleSets().contains(removedElement)) {
final ErrorDialog dialog = new ErrorDialog(null, R4EUIConstants.DIALOG_TITLE_ERROR,
"Rule Set cannot be removed because it is being used", new Status(IStatus.ERROR,
R4EUIPlugin.PLUGIN_ID, "Rule Set used in Group " + group.getName()), IStatus.ERROR);
Display.getDefault().syncExec(new Runnable() {
public void run() {
dialog.open();
}
});
return;
}
}
//Also recursively remove all children
removedElement.removeAllChildren(aFileRemove);
/* TODO uncomment when core model supports hard-removing of elements
if (aFileRemove) removedElement.getRuleSet().remove());
else */
removedElement.setEnabled(false);
//Remove element from UI if the show disabled element option is off
if (!(R4EUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.P_SHOW_DISABLED))) {
fRuleSets.remove(removedElement);
}
}
}
/**
* Method removeChildrenFromUI.
*
* @param aChildToRemove
* IR4EUIModelElement
* @throws OutOfSyncException
* @throws ResourceHandlingException
*/
public void removeChildrenFromUI(IR4EUIModelElement aChildToRemove) {
if (aChildToRemove instanceof R4EUIReviewGroup) {
final R4EUIReviewGroup removedElement = fReviewGroups.get(fReviewGroups.indexOf(aChildToRemove));
//Close Review Group if open
if (removedElement.isOpen()) {
final IR4EUIModelElement[] reviews = removedElement.getChildren();
for (IR4EUIModelElement review : reviews) {
//Close Review if open
if (review instanceof R4EUIReviewBasic && review.isOpen()) {
R4EUIModelController.FModelExt.closeR4EReview(((R4EUIReviewBasic) review).getReview());
R4EUIModelController.clearAnomalyMap();
R4EUIModelController.setActiveReview(null);
}
}
R4EUIModelController.FModelExt.closeR4EReviewGroup(removedElement.getReviewGroup());
}
fReviewGroups.remove(removedElement);
} else {
final R4EUIRuleSet removedElement = fRuleSets.get(fRuleSets.indexOf(aChildToRemove));
//Close Rule set if open
if (removedElement.isOpen()) {
R4EUIModelController.FModelExt.closeR4EDesignRuleCollection(removedElement.getRuleSet());
}
fRuleSets.remove(removedElement);
}
}
/**
* Method removeAllChildren.
*
* @param aFileRemove
* boolean
* @throws OutOfSyncException
* @throws ResourceHandlingException
* @throws CompatibilityException
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#removeAllChildren(boolean)
*/
@Override
public void removeAllChildren(boolean aFileRemove) throws ResourceHandlingException, OutOfSyncException,
CompatibilityException {
//Recursively remove all children
for (R4EUIReviewGroup group : fReviewGroups) {
removeChildren(group, aFileRemove);
}
for (R4EUIRuleSet ruleSet : fRuleSets) {
removeChildren(ruleSet, aFileRemove);
}
}
//Listeners
/* *//**
* Method addListener.
*
* @param aProvider
* ReviewNavigatorContentProvider
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#addListener(ReviewNavigatorContentProvider)
*/
/*
@Override
public void addListener(ReviewNavigatorContentProvider aProvider) {
super.addListener(aProvider);
if (null != fReviewGroups) {
R4EUIReviewGroup element = null;
for (final Iterator<R4EUIReviewGroup> iterator = fReviewGroups.iterator(); iterator.hasNext();) {
element = iterator.next();
element.addListener(aProvider);
}
}
if (null != fRuleSets) {
R4EUIRuleSet element = null;
for (final Iterator<R4EUIRuleSet> iterator = fRuleSets.iterator(); iterator.hasNext();) {
element = iterator.next();
element.addListener(aProvider);
}
}
}
*//**
* Method removeListener.
*
* @param aProvider
* ReviewNavigatorContentProvider
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#removeListener()
*/
/*
@Override
public void removeListener(ReviewNavigatorContentProvider aProvider) {
super.removeListener(aProvider);
if (null != fReviewGroups) {
R4EUIReviewGroup element = null;
for (final Iterator<R4EUIReviewGroup> iterator = fReviewGroups.iterator(); iterator.hasNext();) {
element = iterator.next();
element.removeListener(aProvider);
}
}
if (null != fRuleSets) {
R4EUIRuleSet element = null;
for (final Iterator<R4EUIRuleSet> iterator = fRuleSets.iterator(); iterator.hasNext();) {
element = iterator.next();
element.removeListener(aProvider);
}
}
}*/
//Commands
/**
* Method isAddChildElementCmd.
*
* @return boolean
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#isNewChildElementCmd()
*/
@Override
public boolean isNewChildElementCmd() {
if (isEnabled()) {
return true;
}
return false;
}
/**
* Method getAddChildElementCmdName.
*
* @return String
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#getNewChildElementCmdName()
*/
@Override
public String getNewChildElementCmdName() {
return R4EUIConstants.NEW_CHILD_ELEMENT_COMMAND_NAME;
}
/**
* Method getAddChildElementCmdTooltip.
*
* @return String
* @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#getNewChildElementCmdTooltip()
*/
@Override
public String getNewChildElementCmdTooltip() {
return R4EUIConstants.NEW_CHILD_ELEMENT_COMMAND_TOOLTIP;
}
}