Java tutorial
// $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, com.instantiations.assist.eclipse.analysis.mutabilityOfArrays /******************************************************************************* * 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 Postponed Anomaly 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.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.mylyn.reviews.core.model.IComment; import org.eclipse.mylyn.reviews.core.model.IReviewComponent; import org.eclipse.mylyn.reviews.r4e.core.model.R4EAnomaly; import org.eclipse.mylyn.reviews.r4e.core.model.R4EAnomalyState; import org.eclipse.mylyn.reviews.r4e.core.model.R4EComment; import org.eclipse.mylyn.reviews.r4e.core.model.R4EParticipant; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReview; import org.eclipse.mylyn.reviews.r4e.core.model.R4EReviewComponent; import org.eclipse.mylyn.reviews.r4e.core.model.serial.Persistence; 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.core.utils.VersionUtils; import org.eclipse.mylyn.reviews.r4e.ui.R4EUIPlugin; import org.eclipse.mylyn.reviews.r4e.ui.internal.properties.general.PostponedAnomalyProperties; import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.CommandUtils; import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.R4EUIConstants; import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.UIUtils; import org.eclipse.ui.views.properties.IPropertySource; /** * @author Sebastien Dubois * @version $Revision: 1.0 $ */ public class R4EUIPostponedAnomaly extends R4EUIAnomalyExtended { // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ /** * Field POSTPONED_ANOMALY_ICON_FILE. (value is ""icons/obj16/postanmly_obj.gif"") */ public static final String POSTPONED_ANOMALY_ICON_FILE = "icons/obj16/postanmly_obj.gif"; /** * Field COMPATIBILITY_ERROR_MESSAGE. (value is ""Original Anomaly cannot be updated as its meta-data version is * more recent than the current application meta-data.\nOperation cancelled"") */ private static final String COMPATIBILITY_ERROR_MESSAGE = "Original Anomaly cannot be updated as its meta-data version is more recent than the current application meta-data." + R4EUIConstants.LINE_FEED + "Operation cancelled"; /** * Field COMPATIBILITY_WARNING_DIALOG_TITLE. (value is ""Original Anomaly Version Mismatch Detected"") */ private static final String COMPATIBILITY_WARNING_DIALOG_TITLE = "Original Anomaly Version Mismatch Detected"; /** * Field COMPATIBILITY_WARNING_MESSAGE. (value is ""Original Anomaly format version is older than the one currently * handled by this version of R4E.\n You can update the original Anomaly, which will upgrade its parent Review * version to the current one, or cancel the operation."") */ private static final String COMPATIBILITY_WARNING_MESSAGE = "Original Anomaly format version is older than the one currently handled by this version of R4E." + R4EUIConstants.LINE_FEED + "You can update the original Anomaly, which will upgrade its parent Review version to the current one, or cancel the operation."; /** * Field COMPATIBILITY_WARNING_DIALOG_BUTTONS. */ private static final String[] COMPATIBILITY_WARNING_DIALOG_BUTTONS = { "Update Anomaly", "Cancel" }; // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ /** * Constructor for R4EUIAnomaly. * * @param aParent * IR4EUIModelElement * @param aAnomaly * R4EAnomaly * @param aPosition * IR4EUIPosition */ public R4EUIPostponedAnomaly(IR4EUIModelElement aParent, R4EAnomaly aAnomaly, IR4EUIPosition aPosition) { super(aParent, aAnomaly, aPosition); setImage(POSTPONED_ANOMALY_ICON_FILE); } // ------------------------------------------------------------------------ // Methods // ------------------------------------------------------------------------ /** * Method getToolTip. * * @return String * @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#getToolTip() */ @Override public String getToolTip() { return "Original Review: " + getOriginalReviewName() + R4EUIConstants.LIST_SEPARATOR + R4EUIAnomalyBasic.buildAnomalyToolTip(fAnomaly); } /** * Method getAdapter. * * @param adapter * Class * @return Object * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) */ @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (IR4EUIModelElement.class.equals(adapter)) { return this; } if (IPropertySource.class.equals(adapter)) { return new PostponedAnomalyProperties(this); } return null; } //Attributes /** * Method getOriginalReviewName. * * @return String */ public String getOriginalReviewName() { String originalReviewName = fAnomaly.getInfoAtt().get(R4EUIConstants.POSTPONED_ATTR_ORIG_REVIEW_NAME); //TODO: This is for backwards compatibility and should eventually be removed if (null == originalReviewName) { originalReviewName = ((R4EUIPostponedFile) getParent()).getFileContext().getInfoAtt() .get(R4EUIConstants.POSTPONED_ATTR_ORIG_REVIEW_NAME); } return originalReviewName; } /** * Method updateAnomaly * * @param aPostponedAnomaly * R4EAnomaly * @throws ResourceHandlingException * @throws OutOfSyncException */ public void updateAnomaly(R4EAnomaly aPostponedAnomaly) throws ResourceHandlingException, OutOfSyncException { //Disable the anomaly if it is not postponed anymore if (aPostponedAnomaly.getState().equals(R4EAnomalyState.DEFERRED)) { fAnomaly.setEnabled(aPostponedAnomaly.isEnabled()); //Close Anomaly if disabled if (!fAnomaly.isEnabled()) { close(); } } else { fAnomaly.setEnabled(false); //Disable anomaly if it is not postponed to begin with close(); } //Update postponed anomaly state updateState(aPostponedAnomaly.getState()); } /** * Method updateOriginalAnomaly * * @throws ResourceHandlingException * @throws OutOfSyncException * @throws CompatibilityException */ public void updateOriginalAnomaly() throws ResourceHandlingException, OutOfSyncException, CompatibilityException { final String origReviewName = getOriginalReviewName(); R4EUIReviewGroup uiGroup = null; if (getParent() instanceof R4EUIPostponedFile) { uiGroup = (R4EUIReviewGroup) getParent().getParent().getParent().getParent(); } else if (getParent() instanceof R4EUIAnomalyContainer) { uiGroup = (R4EUIReviewGroup) getParent().getParent().getParent().getParent(); } else { return; //should never happen } final R4EReview origReview = R4EUIModelController.FModelExt.openR4EReview(uiGroup.getReviewGroup(), origReviewName); //Open original review final R4EAnomaly origAnomaly = CommandUtils.getOriginalAnomaly(origReview, fAnomaly); if (null != origAnomaly) { //set data in original anomaly CommandUtils.copyAnomalyData(origAnomaly, fAnomaly); } //Close original review R4EUIModelController.FModelExt.closeR4EReview(origReview); } /** * Check version compatibility between the element(s) to load and the current R4E application * * @throws CompatibilityException * @throws ResourceHandlingException */ public boolean checkCompatibility() throws ResourceHandlingException, CompatibilityException { final String origReviewName = getOriginalReviewName(); final R4EUIReviewGroup uiGroup = (R4EUIReviewGroup) getParent().getParent().getParent().getParent(); R4EReview originalReview = R4EUIModelController.FModelExt.openR4EReview(uiGroup.getReviewGroup(), origReviewName); String currentVersion = Persistence.Roots.REVIEW.getVersion(); int checkResult = VersionUtils.compareVersions(currentVersion, originalReview.getFragmentVersion()); switch (checkResult) { case R4EUIConstants.VERSION_APPLICATION_OLDER: displayCompatibilityErrorDialog(); return false; case R4EUIConstants.VERSION_APPLICATION_NEWER: int result = displayCompatibilityWarningDialog(originalReview.getFragmentVersion(), currentVersion); switch (result) { case R4EUIConstants.OPEN_NORMAL: //Upgrade version immediately try { Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(originalReview, R4EUIModelController.getReviewer()); originalReview.setFragmentVersion(currentVersion); R4EUIModelController.FResourceUpdater.checkIn(bookNum); } catch (ResourceHandlingException e) { UIUtils.displayResourceErrorDialog(e); return false; } catch (OutOfSyncException e) { UIUtils.displaySyncErrorDialog(e); return false; } fReadOnly = false; return true; default: //Assume Cancel return false; } default: //Normal case, do nothing fReadOnly = false; return true; } } /** * Method createComment. * * @param aPostponedComment * R4EComment * @return R4EUIComment * @throws ResourceHandlingException * @throws OutOfSyncException */ public R4EUIComment createComment(R4EComment aPostponedComment) throws ResourceHandlingException, OutOfSyncException { //Check if the creator of the postponed anomaly is a participant of the current review. If not, it will be //created and disabled after the postponed anomaly is created final R4EUIReviewBasic uiReview = R4EUIModelController.getActiveReview(); R4EParticipant participant = uiReview.getParticipant(aPostponedComment.getAuthor().getId(), false); boolean isParticipant = true; if (null == participant) { participant = uiReview.getParticipant(aPostponedComment.getAuthor().getId(), true); isParticipant = false; } //Copy comment information from postponed comment model element R4EUIComment uiComment = null; final R4EComment comment = R4EUIModelController.FModelExt.createR4EComment(participant, fAnomaly); Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(comment, R4EUIModelController.getReviewer()); comment.setDescription(aPostponedComment.getDescription()); comment.setCreatedOn(aPostponedComment.getCreatedOn()); final Map<String, String> info = comment.getInfoAtt(); //We use the R4EComment attribute map to store the original comment ID info.put(R4EUIConstants.POSTPONED_ATTR_ORIG_COMMENT_ID, CommandUtils.buildOriginalCommentID(aPostponedComment)); R4EUIModelController.FResourceUpdater.checkIn(bookNum); //Disable original creator if it is not a participant in the current review if (!isParticipant) { bookNum = R4EUIModelController.FResourceUpdater.checkOut(participant, R4EUIModelController.getReviewer()); participant.setEnabled(false); R4EUIModelController.FResourceUpdater.checkIn(bookNum); } //Create and set UI model element uiComment = new R4EUIComment(this, comment); addChildren(uiComment); return uiComment; } /** * Method addChildren. * * @param aModelComponent * - the serialization model component object * @return IR4EUIModelElement * @throws ResourceHandlingException * @throws OutOfSyncException * @throws CompatibilityException * @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#createChildren(R4EReviewComponent) */ @Override public IR4EUIModelElement createChildren(IReviewComponent aModelComponent) throws ResourceHandlingException, OutOfSyncException, CompatibilityException { //First create the children on the original anomaly... R4EComment origComment = null; //Open original review final String origReviewName = getOriginalReviewName(); final R4EUIReviewGroup uiGroup = (R4EUIReviewGroup) getParent().getParent().getParent().getParent(); final R4EReview origReview = R4EUIModelController.FModelExt.openR4EReview(uiGroup.getReviewGroup(), origReviewName); final R4EAnomaly origAnomaly = CommandUtils.getOriginalAnomaly(origReview, fAnomaly); if (null != origAnomaly) { //Add Child Comments to original anomaly final R4EParticipant participantInOrigReview = CommandUtils.getParticipantForReview(origReview, R4EUIModelController.getReviewer()); origComment = R4EUIModelController.FModelExt.createR4EComment(participantInOrigReview, origAnomaly); final Long origBookNum = R4EUIModelController.FResourceUpdater.checkOut(origComment, participantInOrigReview.getId()); origComment.setDescription(((IComment) aModelComponent).getDescription()); R4EUIModelController.FResourceUpdater.checkIn(origBookNum); } //Close original review R4EUIModelController.FModelExt.closeR4EReview(origReview); //...then create the comment on the current review if (null != origComment) { return createComment(origComment); } return null; } //Commands /** * Method isOpenEditorCmd. * * @return boolean * @see org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement#isOpenEditorCmd() */ @Override public boolean isOpenEditorCmd() { if (!(getParent() instanceof R4EUIPostponedFile)) { return false; } if (isEnabled() && null != R4EUIModelController.getActiveReview() && null != ((R4EUIPostponedFile) getParent()).getTargetFileVersion()) { return true; } return false; } /** * Method displayCompatibilityErrorDialog. */ public void displayCompatibilityErrorDialog() { R4EUIPlugin.Ftracer.traceError(COMPATIBILITY_ERROR_MESSAGE); final ErrorDialog dialog = new ErrorDialog(null, R4EUIConstants.DIALOG_TITLE_ERROR, "Compatibility problem Detected", new Status(IStatus.ERROR, R4EUIPlugin.PLUGIN_ID, 0, COMPATIBILITY_ERROR_MESSAGE, null), IStatus.ERROR); dialog.open(); } /** * Method displayCompatibilityWarningDialog. * * @return boolean */ public int displayCompatibilityWarningDialog(String aDataVersion, String aApplVersionl) { R4EUIPlugin.Ftracer.traceWarning(COMPATIBILITY_WARNING_MESSAGE); final MessageDialog dialog = new MessageDialog(null, COMPATIBILITY_WARNING_DIALOG_TITLE, null, COMPATIBILITY_WARNING_MESSAGE + R4EUIConstants.LINE_FEED + "Element meta-data Version: " + aDataVersion + R4EUIConstants.LINE_FEED + "Application meta-data Version: " + aApplVersionl, MessageDialog.QUESTION_WITH_CANCEL, COMPATIBILITY_WARNING_DIALOG_BUTTONS, 0); return dialog.open(); } }