/*
 * FindBugs - Find Bugs in Java programs
 * Copyright (C) 2006, University of Maryland
 *
 * 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 edu.umd.cs.findbugs;

import java.io.IOException;
import java.io.Serializable;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

import edu.umd.cs.findbugs.cloud.Cloud.UserDesignation;
import edu.umd.cs.findbugs.util.Util;
import edu.umd.cs.findbugs.xml.XMLAttributeList;
import edu.umd.cs.findbugs.xml.XMLOutput;
import edu.umd.cs.findbugs.xml.XMLWriteable;

class to hold the user annotation and user designation for a BugInstance
/** * class to hold the user annotation and user designation for a BugInstance */
public class BugDesignation implements XMLWriteable, Serializable, Comparable<BugDesignation> {
The default key for the user designation. Bad things could happen if this key isn't in getUserDesignations()
/** * The default key for the user designation. Bad things could happen if this * key isn't in getUserDesignations() */
public static final String UNCLASSIFIED = UserDesignation.UNCLASSIFIED.name();
user designation -- value should be one of the keys returned by I18N.getInstance().getUserDesignations()
/** * user designation -- value should be one of the keys returned by * I18N.getInstance().getUserDesignations() */
@Nonnull private String designation = UNCLASSIFIED; @Override public String toString() { String result = designation; if (user != null) { result += " by " + user; } if (annotationText != null && annotationText.length() > 0) { result += " : " + annotationText; } return result; } private boolean dirty; public boolean isDirty() { return dirty; } public void cleanDirty() { setDirty(false); } public void setDirty(boolean dirty) { if (this.dirty == dirty) { return; } this.dirty = dirty; // if (dirty) { // System.out.println("Setting dirty bit"); // new RuntimeException("Setting dirty bit").printStackTrace(System.out); // } else { // System.out.println("Clearing dirty bit"); // new RuntimeException("Clearing dirty bit").printStackTrace(System.out); // } } private @javax.annotation.CheckForNull String user; public BugDesignation() { }
Params:
  • designation –
  • timestamp –
  • annotationText –
  • user –
/** * @param designation * @param timestamp * @param annotationText * @param user */
public BugDesignation(String designation, long timestamp, String annotationText, String user) { this.designation = designation; this.timestamp = timestamp; this.annotationText = annotationText; this.user = user; } public BugDesignation(BugDesignation that) { this(that.designation, that.timestamp, that.annotationText, that.user); } private long timestamp = System.currentTimeMillis();
free text from the user
/** free text from the user */
// TODO: make this @CheckForNull private String annotationText;
return the user designation E.g., "MOSTLY_HARMLESS", "CRITICAL", "NOT_A_BUG", etc. Note that this is the key, suitable for writing to XML, but not for showing to the user.
See Also:
  • getUserDesignation.getUserDesignation(String key)
/** * return the user designation E.g., "MOSTLY_HARMLESS", "CRITICAL", * "NOT_A_BUG", etc. * * Note that this is the key, suitable for writing to XML, but not for * showing to the user. * * @see I18N#getUserDesignation(String key) */
@Nonnull public String getDesignationKey() { return designation; } public boolean hasDesignationKey() { return designation.length() > 0 && !designation.equals(UNCLASSIFIED); }
set the user designation E.g., "MOSTLY_HARMLESS", "CRITICAL", "NOT_A_BUG", etc. If the argument is null, it will be treated as UNCLASSIFIED. Note that this is the key, suitable for writing to XML, but not what the user sees. Strange things could happen if designationKey is not one of the keys returned by I18N.instance().getUserDesignations().
See Also:
  • getUserDesignationKeys.getUserDesignationKeys()
/** * set the user designation E.g., "MOSTLY_HARMLESS", "CRITICAL", * "NOT_A_BUG", etc. * * If the argument is null, it will be treated as UNCLASSIFIED. * * Note that this is the key, suitable for writing to XML, but not what the * user sees. Strange things could happen if designationKey is not one of * the keys returned by I18N.instance().getUserDesignations(). * * @see I18N#getUserDesignationKeys() */
public void setDesignationKey(String designationKey) { if ("".equals(designationKey)) { assert false; designationKey = null; } if (designation.equals(designationKey)) { return; } setDirty(true); timestamp = System.currentTimeMillis(); designation = (designationKey != null ? designationKey : UNCLASSIFIED); } @CheckForNull public String getUser() { return user; } public void setUser(String u) { user = u; } public long getTimestamp() { return timestamp; } public void setTimestamp(long ts) { if (timestamp != ts) { timestamp = ts; if (false && !hasAnnotationText() && !hasDesignationKey()) { new RuntimeException("Setting timestamp on bug designation without annotation or designation").printStackTrace(System.out); } setDirty(true); } } @CheckForNull public String getAnnotationText() { return annotationText; } public boolean hasAnnotationText() { return annotationText != null && annotationText.length() > 0; } @Nonnull public String getNonnullAnnotationText() { if (annotationText == null) { return ""; } return annotationText; } public void setAnnotationText(String s) { if (s.equals(annotationText)) { return; } setDirty(true); annotationText = s; timestamp = System.currentTimeMillis(); } @Override public void writeXML(XMLOutput xmlOutput) throws IOException { XMLAttributeList attributeList = new XMLAttributeList(); // all three of these xml attributes are optional if (hasDesignationKey()) { attributeList.addAttribute("designation", designation); } if (user != null && !"".equals(user)) { attributeList.addAttribute("user", user); } if (dirty) { attributeList.addAttribute("needsSync", "true"); } if (timestamp > 0) { attributeList.addAttribute("timestamp", String.valueOf(timestamp)); } if ((annotationText != null && !"".equals(annotationText))) { xmlOutput.openTag("UserAnnotation", attributeList); xmlOutput.writeCDATA(annotationText); xmlOutput.closeTag("UserAnnotation"); } else { xmlOutput.openCloseTag("UserAnnotation", attributeList); } }
replace unset fields of this user designation with values set in the other
/** * replace unset fields of this user designation with values set in the * other */
public void merge(@CheckForNull BugDesignation other) { if (other == null) { return; } boolean changed = false; if ((annotationText == null || annotationText.length() == 0) && other.annotationText != null && other.annotationText.length() > 0) { annotationText = other.annotationText; setDirty(true); changed = true; } if (!hasDesignationKey() && other.hasDesignationKey()) { designation = other.designation; setDirty(true); changed = true; } if (!changed) { return; // if no changes don't even try to copy user or timestamp } if ((user == null || user.length() == 0) && other.user != null && other.user.length() > 0) { user = other.user; } if (timestamp == 0 && other.timestamp != 0) { timestamp = other.timestamp; } } @Override public int hashCode() { int hash = (int) this.timestamp; if (user != null) { hash += user.hashCode(); } hash += designation.hashCode(); if (annotationText != null) { hash += annotationText.hashCode(); } return hash; } @Override public boolean equals(Object o) { if (!(o instanceof BugDesignation)) { return false; } return this.compareTo((BugDesignation) o) == 0; } @Override public int compareTo(BugDesignation o) { if (this == o) { return 0; } int result = Util.compare(o.timestamp, this.timestamp); if (result != 0) { return result; } result = Util.nullSafeCompareTo(this.user, o.user); if (result != 0) { return result; } result = this.designation.compareTo(o.designation); if (result != 0) { return result; } result = Util.nullSafeCompareTo(this.annotationText, o.annotationText); if (result != 0) { return result; } return 0; } }