Remove empty catch blocks for exceptions
I put in e.printStackTrace() instead
diff --git a/Core/WPISuite/src/main/java/edu/wpi/cs/wpisuitetng/modules/core/entitymanagers/UserManager.java b/Core/WPISuite/src/main/java/edu/wpi/cs/wpisuitetng/modules/core/entitymanagers/UserManager.java
index 4411ce8..dc4653f 100644
--- a/Core/WPISuite/src/main/java/edu/wpi/cs/wpisuitetng/modules/core/entitymanagers/UserManager.java
+++ b/Core/WPISuite/src/main/java/edu/wpi/cs/wpisuitetng/modules/core/entitymanagers/UserManager.java
@@ -21,10 +21,10 @@
import com.google.gson.JsonParseException;
import com.google.gson.JsonSyntaxException;
+import edu.wpi.cs.wpisuitetng.Session;
import edu.wpi.cs.wpisuitetng.authentication.PasswordCryptographer;
import edu.wpi.cs.wpisuitetng.authentication.Sha256Password;
import edu.wpi.cs.wpisuitetng.database.Data;
-import edu.wpi.cs.wpisuitetng.Session;
import edu.wpi.cs.wpisuitetng.exceptions.BadRequestException;
import edu.wpi.cs.wpisuitetng.exceptions.ConflictException;
import edu.wpi.cs.wpisuitetng.exceptions.DatabaseException;
@@ -41,338 +41,303 @@
import edu.wpi.cs.wpisuitetng.modules.core.models.UserDeserializer;
/**
- * The EntityManager implementation for the User class. Manages interaction with the
- * set of Users in the Database defined by the constructor
- * @author
- *
+ * The EntityManager implementation for the User class. Manages interaction with the
+ * set of Users in the Database defined by the constructor
+ *
+ * @author
*/
public class UserManager implements EntityManager<User> {
- Class<User> user = User.class;
- private PasswordCryptographer passwordHash;
- Gson gson;
- Data data;
-
- private static final Logger logger = Logger.getLogger(UserManager.class.getName());
+ Class<User> user = User.class;
+ private PasswordCryptographer passwordHash;
+ Gson gson;
+ Data data;
- /**
- * Creates a UserManager operating on the given Data.
- * Attaches the custom serializer and deserializers for the Gson library.
- * Determines the algorithm used to secure passwords.
- * @param data
- */
- public UserManager(Data data)
- {
- this.data = data;
- this.passwordHash = new Sha256Password();
+ private static final Logger logger = Logger.getLogger(UserManager.class.getName());
- // build the custom serializer/deserializer
- GsonBuilder builder = new GsonBuilder();
- builder.registerTypeAdapter(this.user, new UserDeserializer());
+ /**
+ * Creates a UserManager operating on the given Data.
+ * Attaches the custom serializer and deserializers for the Gson library.
+ * Determines the algorithm used to secure passwords.
+ *
+ * @param data
+ */
+ public UserManager(Data data) {
+ this.data = data;
+ this.passwordHash = new Sha256Password();
- this.gson = builder.create();
+ // build the custom serializer/deserializer
+ GsonBuilder builder = new GsonBuilder();
+ builder.registerTypeAdapter(this.user, new UserDeserializer());
- }
+ this.gson = builder.create();
-
- @Override
- public User makeEntity(Session s, String content) throws WPISuiteException{
+ }
- //TODO: create a custom de-serializer & serializer so we can hash the desired password & remove it from others.
-
- logger.log(Level.FINE, "Attempting new User creation...");
+ @Override
+ public User makeEntity(Session s, String content) throws WPISuiteException {
- User p;
- try{
- p = User.fromJSON(content);
- } catch(JsonSyntaxException e){
- logger.log(Level.WARNING, "Invalid User entity creation string.");
- throw new BadRequestException("The entity creation string had invalid format. Entity String: " + content);
- }
+ //TODO: create a custom de-serializer & serializer so we can hash the desired password & remove it from others.
- if(getEntity(s,p.getUsername())[0] == null)
- {
- String newPassword = UserDeserializer.parsePassword(content);
- String hashedPassword = this.passwordHash.generateHash(newPassword);
+ logger.log(Level.FINE, "Attempting new User creation...");
- p.setPassword(hashedPassword);
-
- p.setRole(Role.USER);
-
- save(s,p);
- }
- else
- {
- logger.log(Level.WARNING, "Conflict Exception during User creation.");
- throw new ConflictException("A user with the given ID already exists. Entity String: " + content);
- }
+ User p;
+ try {
+ p = User.fromJSON(content);
+ } catch (JsonSyntaxException e) {
+ logger.log(Level.WARNING, "Invalid User entity creation string.");
+ throw new BadRequestException("The entity creation string had invalid format. Entity String: " +
+ content);
+ }
- logger.log(Level.FINE, "User creation success!");
+ if (getEntity(s, p.getUsername())[0] == null) {
+ String newPassword = UserDeserializer.parsePassword(content);
+ String hashedPassword = this.passwordHash.generateHash(newPassword);
- return p;
- }
-
-
- @Override
- public User[] getEntity(Session s,String id) throws WPISuiteException
- {
- User[] m = new User[1];
- if(id.equalsIgnoreCase(""))
- {
- return getAll(s);
- }
- else
- {
- return data.retrieve(user, "username", id).toArray(m);
- }
- }
-
- /**
- * returns a user without requiring a session,
- * specifically for the scenario where a session needs to be created.
- * only ever returns one user, "" is not a valid argument;
- *
- * @param id - the id of the user, in this case it's the username
- * @return a list of matching users
- * @throws WPISuiteException
- */
- public User[] getEntity(String id) throws WPISuiteException
- {
- User[] m = new User[1];
- if(id.equalsIgnoreCase(""))
- {
- throw new NotFoundException("No User id given.");
- }
- else
- {
- m = data.retrieve(user, "username", id).toArray(m);
-
- if(m[0] == null)
- {
- throw new NotFoundException("User with id <" + id + "> not found.");
- }
- else
- {
- return m;
- }
- }
- }
+ p.setPassword(hashedPassword);
- @Override
- public User[] getAll(Session s) {
- User[] ret = new User[1];
- ret = data.retrieveAll(new User("","","",0)).toArray(ret);
- return ret;
- }
+ p.setRole(Role.USER);
- @Override
- public void save(Session s,User model) throws WPISuiteException {
- if(data.save(model))
- {
- logger.log(Level.FINE, "User Saved :" + model);
+ save(s, p);
+ } else {
+ logger.log(Level.WARNING, "Conflict Exception during User creation.");
+ throw new ConflictException("A user with the given ID already exists. Entity String: " +
+ content);
+ }
- return ;
- }
- else
- {
- logger.log(Level.WARNING, "User Save Failure!");
- throw new DatabaseException("Save failure for User."); // Session User: " + s.getUsername() + " User: " + model.getName());
- }
-
- }
+ logger.log(Level.FINE, "User creation success!");
- @Override
- public boolean deleteEntity(Session s1 ,String id) throws WPISuiteException {
+ return p;
+ }
- if(s1.getUser().getRole().equals(Role.ADMIN))
- {
- Model m = data.delete(data.retrieve(user, "username", id).get(0));
- logger.log(Level.INFO, "UserManager deleting user <" + id + ">");
- return (m != null) ? true : false;
- }
- else
- {
- logger.log(Level.WARNING,"User: "+s1.getUser().getUsername()+"attempted to delete: "+id);
- throw new UnauthorizedException("Delete not authorized");
- }
-
-
-
-
- }
+ @Override
+ public User[] getEntity(Session s, String id) throws WPISuiteException {
+ User[] m = new User[1];
+ if (id.equalsIgnoreCase("")) {
+ return getAll(s);
+ } else {
+ return data.retrieve(user, "username", id).toArray(m);
+ }
+ }
- @Override
- public void deleteAll(Session s) {
- logger.log(Level.INFO, "UserManager invoking DeleteAll...");
- data.deleteAll(new User("","","",0));
- }
+ /**
+ * returns a user without requiring a session,
+ * specifically for the scenario where a session needs to be created.
+ * only ever returns one user, "" is not a valid argument;
+ *
+ * @param id - the id of the user, in this case it's the username
+ * @return a list of matching users
+ * @throws WPISuiteException
+ */
+ public User[] getEntity(String id) throws WPISuiteException {
+ User[] m = new User[1];
+ if (id.equalsIgnoreCase("")) {
+ throw new NotFoundException("No User id given.");
+ } else {
+ m = data.retrieve(user, "username", id).toArray(m);
- @Override
- public int Count() {
- // TODO pending on get all
- return 0;
- }
-
- /**
- * Updates a single user object based on the JSON update string provided.
- * Inflates the JSON into a User object then checks each field for differences.
- * @param s The Session to check authorization for this action
- * @param toUpdate the User to update
- * @param changeSet a JSON string representation of a User object. Contains the fields
- * to be updated.
- * @exception WPISuiteException thrown when the ObjectMapper fails
- * @return The updated User.
- */
- public User update(Session s, User toUpdate, String changeSet) throws WPISuiteException
- {
- // TODO: permissions checking here
+ if (m[0] == null) {
+ throw new NotFoundException("User with id <" +
+ id + "> not found.");
+ } else {
+ return m;
+ }
+ }
+ }
- User changes;
+ @Override
+ public User[] getAll(Session s) {
+ User[] ret = new User[1];
+ ret = data.retrieveAll(new User("", "", "", 0)).toArray(ret);
+ return ret;
+ }
- // Inflate the changeSet into a User object.
- try
- {
- logger.log(Level.FINE, "User update being attempted...");
- changes = User.fromJSON(changeSet);
- }
- catch(JsonParseException e)
- {
- logger.log(Level.WARNING, "UserManager.update() had a failure in the changeset mapper.");
+ @Override
+ public void save(Session s, User model) throws WPISuiteException {
+ if (data.save(model)) {
+ logger.log(Level.FINE, "User Saved :" + model);
- throw new SerializationException("Error inflating the changeset: " + e.getMessage());
- }
+ return;
+ } else {
+ logger.log(Level.WARNING, "User Save Failure!");
+ throw new DatabaseException("Save failure for User."); // Session User: " + s.getUsername() + " User: " + model.getName());
+ }
-
- if(s.getUser().getUsername().equals(toUpdate.getUsername()) || s.getUser().getRole().equals(Role.ADMIN))
- {
- // Resolve differences toUpdate using changes, field-by-field.
- toUpdate.setIdNum(changes.getIdNum());
-
- if(changes.getName() != null)
- {
- toUpdate.setName(changes.getName());
- }
-
- if(changes.getPassword() != null)
- {
- String encryptedPass = this.passwordHash.generateHash(changes.getPassword());
- toUpdate.setPassword(encryptedPass);
- }
-
- if((changes.getRole() != null))
- {
- if(s.getUser().getRole().equals(Role.ADMIN))
- {
- if (toUpdate.getRole().equals(Role.ADMIN) &&
- !changes.getRole().equals(Role.ADMIN) &&
- getAdminCount() <= 1) {
- throw new ForbiddenException("There must be at least one admin account");
- }
- toUpdate.setRole(changes.getRole());
- }
- else
- {
- logger.log(Level.WARNING,"User: "+s.getUser().getUsername()+" attempted unauthorized priveledge elevation");
- }
- }
-
- // save the changes back
- this.save(s, toUpdate);
- }
- else
- {
- logger.log(Level.WARNING, "Access denied to user: "+s.getUser().getUsername());
- throw new UnauthorizedException("Users accessible only by Admins and themselves");
- }
- return toUpdate;
- }
+ }
- @Override
- public String advancedGet(Session s, String[] args)
- throws WPISuiteException {
- throw new NotImplementedException();
- }
+ @Override
+ public boolean deleteEntity(Session s1, String id) throws WPISuiteException {
- @Override
- public String advancedPut(Session s, String[] args, String content)
- throws WPISuiteException {
- throw new NotImplementedException();
- }
+ if (s1.getUser().getRole().equals(Role.ADMIN)) {
+ Model m = data.delete(data.retrieve(user, "username", id).get(0));
+ logger.log(Level.INFO, "UserManager deleting user <" + id + ">");
+ return (m != null) ? true : false;
+ } else {
+ logger.log(Level.WARNING, "User: " +
+ s1.getUser().getUsername() +
+ "attempted to delete: " + id);
+ throw new UnauthorizedException("Delete not authorized");
+ }
- @Override
- public String advancedPost(Session s, String string, String content)
- throws WPISuiteException {
- throw new NotImplementedException();
- }
+ }
+ @Override
+ public void deleteAll(Session s) {
+ logger.log(Level.INFO, "UserManager invoking DeleteAll...");
+ data.deleteAll(new User("", "", "", 0));
+ }
- @Override
- public User update(Session s, String content) throws WPISuiteException {
- String str = UserManager.parseUsername(content);
-
- return this.update(s, this.getEntity(str)[0], content);
- }
-
- /**
- * This static utility method takes a JSON string and attempts to
- * retrieve a username field from it.
- * @param serializedUser a JSON string containing a password
- * @return the username field parsed.
- */
- public static String parseUsername(String serializedUser)
- {
- logger.log(Level.FINE, "Attempting username parsing...");
-
- if(serializedUser == null || !serializedUser.contains("username"))
- {
- throw new JsonParseException("The given JSON string did not contain a username field.");
- }
-
- int fieldStartIndex = serializedUser.indexOf("username");
- int separator = serializedUser.indexOf(':', fieldStartIndex);
- int startIndex = serializedUser.indexOf('"', separator) + 1;
- int endIndex = serializedUser.indexOf('"', startIndex);
-
- String username = serializedUser.substring(startIndex, endIndex);
-
- logger.log(Level.FINE, "Username parsing success!");
- return username;
- }
-
- /**
- * Creates an Admin user if one does not exist
- */
- public User createAdmin()
- {
- logger.log(Level.INFO, "Adding an admin");
+ @Override
+ public int Count() {
+ // TODO pending on get all
+ return 0;
+ }
- User p = new User("Admin", "admin", "password", 0);
+ /**
+ * Updates a single user object based on the JSON update string provided.
+ * Inflates the JSON into a User object then checks each field for differences.
+ *
+ * @param s The Session to check authorization for this action
+ * @param toUpdate the User to update
+ * @param changeSet a JSON string representation of a User object. Contains the fields
+ * to be updated.
+ * @exception WPISuiteException thrown when the ObjectMapper fails
+ * @return The updated User.
+ */
+ public User update(Session s, User toUpdate, String changeSet) throws WPISuiteException {
+ // TODO: permissions checking here
- try {
- if(getEntity(null,p.getUsername())[0] == null)
- {
- String newPassword = "password";
- String hashedPassword = this.passwordHash.generateHash(newPassword);
+ User changes;
- p.setPassword(hashedPassword);
-
- p.setRole(Role.ADMIN);
-
- save(null,p);
- }
- else
- {
- p = getEntity(null,p.getUsername())[0];
- }
- } catch (WPISuiteException e) {
- }
+ // Inflate the changeSet into a User object.
+ try {
+ logger.log(Level.FINE, "User update being attempted...");
+ changes = User.fromJSON(changeSet);
+ } catch (JsonParseException e) {
+ logger.log(Level.WARNING, "UserManager.update() had a failure in the changeset mapper.");
- logger.log(Level.INFO, "Admin creation success!");
-
- return p;
- }
-
- private int getAdminCount() throws WPISuiteException {
- return data.retrieve(User.class, "role", Role.ADMIN).size();
- }
+ throw new SerializationException("Error inflating the changeset: " +
+ e.getMessage());
+ }
+
+ if (s.getUser().getUsername().equals(toUpdate.getUsername()) ||
+ s.getUser().getRole().equals(Role.ADMIN)) {
+ // Resolve differences toUpdate using changes, field-by-field.
+ toUpdate.setIdNum(changes.getIdNum());
+
+ if (changes.getName() != null) {
+ toUpdate.setName(changes.getName());
+ }
+
+ if (changes.getPassword() != null) {
+ String encryptedPass = this.passwordHash.generateHash(changes.getPassword());
+ toUpdate.setPassword(encryptedPass);
+ }
+
+ if ((changes.getRole() != null)) {
+ if (s.getUser().getRole().equals(Role.ADMIN)) {
+ if (toUpdate.getRole().equals(Role.ADMIN) &&
+ !changes.getRole().equals(Role.ADMIN) &&
+ getAdminCount() <= 1) {
+ throw new ForbiddenException("There must be at least one admin account");
+ }
+ toUpdate.setRole(changes.getRole());
+ } else {
+ logger.log(Level.WARNING, "User: " +
+ s.getUser().getUsername() +
+ " attempted unauthorized priveledge elevation");
+ }
+ }
+
+ // save the changes back
+ this.save(s, toUpdate);
+ } else {
+ logger.log(Level.WARNING, "Access denied to user: " +
+ s.getUser().getUsername());
+ throw new UnauthorizedException("Users accessible only by Admins and themselves");
+ }
+ return toUpdate;
+ }
+
+ @Override
+ public String advancedGet(Session s, String[] args) throws WPISuiteException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public String advancedPut(Session s, String[] args, String content) throws WPISuiteException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public String advancedPost(Session s, String string, String content) throws WPISuiteException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public User update(Session s, String content) throws WPISuiteException {
+ String str = UserManager.parseUsername(content);
+
+ return this.update(s, this.getEntity(str)[0], content);
+ }
+
+ /**
+ * This static utility method takes a JSON string and attempts to
+ * retrieve a username field from it.
+ *
+ * @param serializedUser a JSON string containing a password
+ * @return the username field parsed.
+ */
+ public static String parseUsername(String serializedUser) {
+ logger.log(Level.FINE, "Attempting username parsing...");
+
+ if (serializedUser == null || !serializedUser.contains("username")) {
+ throw new JsonParseException("The given JSON string did not contain a username field.");
+ }
+
+ int fieldStartIndex = serializedUser.indexOf("username");
+ int separator = serializedUser.indexOf(':', fieldStartIndex);
+ int startIndex = serializedUser.indexOf('"', separator) + 1;
+ int endIndex = serializedUser.indexOf('"', startIndex);
+
+ String username = serializedUser.substring(startIndex, endIndex);
+
+ logger.log(Level.FINE, "Username parsing success!");
+ return username;
+ }
+
+ /**
+ * Creates an Admin user if one does not exist
+ */
+ public User createAdmin() {
+ logger.log(Level.INFO, "Adding an admin");
+
+ User p = new User("Admin", "admin", "password", 0);
+
+ try {
+ if (getEntity(null, p.getUsername())[0] == null) {
+ String newPassword = "password";
+ String hashedPassword = this.passwordHash.generateHash(newPassword);
+
+ p.setPassword(hashedPassword);
+
+ p.setRole(Role.ADMIN);
+
+ save(null, p);
+ } else {
+ p = getEntity(null, p.getUsername())[0];
+ }
+ } catch (WPISuiteException e) {
+ //TODO Stop swallowing exceptions
+ e.printStackTrace();
+ }
+
+ logger.log(Level.INFO, "Admin creation success!");
+
+ return p;
+ }
+
+ private int getAdminCount() throws WPISuiteException {
+ return data.retrieve(User.class, "role", Role.ADMIN).size();
+ }
}
\ No newline at end of file
diff --git a/DefectTracker/src/main/java/edu/wpi/cs/wpisuitetng/modules/defecttracker/models/DefectEvent.java b/DefectTracker/src/main/java/edu/wpi/cs/wpisuitetng/modules/defecttracker/models/DefectEvent.java
index 96eae91..9c0e049 100644
--- a/DefectTracker/src/main/java/edu/wpi/cs/wpisuitetng/modules/defecttracker/models/DefectEvent.java
+++ b/DefectTracker/src/main/java/edu/wpi/cs/wpisuitetng/modules/defecttracker/models/DefectEvent.java
@@ -25,74 +25,73 @@
* For example, the addition of a comment or the modification of fields.
*/
public abstract class DefectEvent extends AbstractModel {
-
- public enum EventType {
- COMMENT,
- CHANGESET
- };
-
- protected Date date = new Date();
- protected User user = new User("", "", "", -1);
-
- /**
- * The type of event this is. Subclasses must specify this in order to be deserialized properly.
- */
- protected EventType type;
-
- /**
- * @return The Date when this event happened
- */
- public Date getDate() {
- return date;
- }
-
- /**
- * @param date The Date of the Event to set
- */
- public void setDate(Date date) {
- this.date = date;
- }
-
- /**
- * @return The User responsible for this event
- */
- public User getUser() {
- return user;
- }
-
- /**
- * @param user The User responsible for the event to set
- */
- public void setUser(User user) {
- this.user = user;
- }
-
- /**
- * Given a builder, add anything to it that's necessary for Gson to interact with this class.
- *
- * @param builder The builder to modify
- */
- public static void addGsonDependencies(GsonBuilder builder) {
- builder.registerTypeAdapter(DefectEvent.class, new DefectEventDeserializer());
- builder.registerTypeAdapter(DefectChangeset.class, new DefectChangesetDeserializer());
- }
-
- @Override
- public void save() {
- // TODO Auto-generated method stub
- }
- @Override
- public void delete() {
- // TODO Auto-generated method stub
- }
-
- // this model will only be created server side and then retrieved as part of a Defect in the future
- // so I'm not sure if this is necessary
- @Override
- public Boolean identify(Object o) {
- // TODO Auto-generated method stub
- return null;
- }
-
+ public enum EventType {
+ COMMENT, CHANGESET
+ }
+
+ protected Date date = new Date();
+ protected User user = new User("", "", "", -1);
+
+ /**
+ * The type of event this is. Subclasses must specify this in order to be deserialized properly.
+ */
+ protected EventType type;
+
+ /**
+ * @return The Date when this event happened
+ */
+ public Date getDate() {
+ return date;
+ }
+
+ /**
+ * @param date The Date of the Event to set
+ */
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ /**
+ * @return The User responsible for this event
+ */
+ public User getUser() {
+ return user;
+ }
+
+ /**
+ * @param user The User responsible for the event to set
+ */
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ /**
+ * Given a builder, add anything to it that's necessary for Gson to interact with this class.
+ *
+ * @param builder The builder to modify
+ */
+ public static void addGsonDependencies(GsonBuilder builder) {
+ builder.registerTypeAdapter(DefectEvent.class, new DefectEventDeserializer());
+ builder.registerTypeAdapter(DefectChangeset.class, new DefectChangesetDeserializer());
+ }
+
+ @Override
+ public void save() {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void delete() {
+ // TODO Auto-generated method stub
+ }
+
+ // this model will only be created server side and then retrieved as part of a Defect in the future
+ // so I'm not sure if this is necessary
+ @Override
+ public Boolean identify(Object o) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
}
diff --git a/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/MainView.java b/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/MainView.java
index de054c2..f285efb 100644
--- a/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/MainView.java
+++ b/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/MainView.java
@@ -43,9 +43,9 @@
* @author justinhess
*/
public class MainView extends JTabbedPane {
-
+
static final long serialVersionUID = 7957462092495599897L;
-
+
private boolean dragging = false;
private Image tabImage = null;
private Point currentMouseLocation = null;
@@ -56,7 +56,7 @@
private final JPopupMenu popup = new JPopupMenu();
private JMenuItem closeAll = new JMenuItem("Close All Tabs");
private JMenuItem closeOthers = new JMenuItem("Close Others");
-
+
/**
* Adds main subtab when user goes to RequirementManager
*/
@@ -64,32 +64,30 @@
this.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
this.addTab("Requirement Overview", overview);
this.addTab("Iteration Overview", iterationOverview);
-
- closeAll.addActionListener(new ActionListener()
- {
+
+ closeAll.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ViewEventController.getInstance().closeAllTabs();
-
+
}
});
-
- closeOthers.addActionListener(new ActionListener()
- {
+
+ closeOthers.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ViewEventController.getInstance().closeOthers();
-
+
}
});
-
+
// add listener for changes in the overview tables
ViewEventController.getInstance().getOverviewTable().getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
// check for Editing Multiple Requirements Mode and a change not caused by a refresh
- if (ViewEventController.getInstance().getOverviewTable().getEditFlag()
- && !ViewEventController.getInstance().getOverviewTable().wasChangedByRefresh()) {
+ if (ViewEventController.getInstance().getOverviewTable().getEditFlag() &&
+ !ViewEventController.getInstance().getOverviewTable().wasChangedByRefresh()) {
// find the cell that was changed
int otRow = e.getLastRow();
int otCol = e.getColumn();
@@ -97,31 +95,30 @@
Object value = ViewEventController.getInstance().getOverviewTable().getModel().getValueAt(otRow, otCol);
// highlight the cell
ViewEventController.getInstance().getOverviewTable().getCellRenderer(otRow, otCol).getTableCellRendererComponent(ViewEventController.getInstance().getOverviewTable(), value, true, true, otRow, otCol);
-
+
// check for changes and enable/disable the Save Changes button accordingly
if (ViewEventController.getInstance().getOverviewTable().hasChanges()) {
ViewEventController.getInstance().getToolbar().getEditButton().enableCreateEditButton();
- }
- else
+ } else
ViewEventController.getInstance().getToolbar().getEditButton().disableCreateEditButton();
}
}
});
-
+
popup.add(closeAll);
popup.add(closeOthers);
-
+
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
-
+
if (!dragging) {
// Gets the tab index based on the mouse position
int tabNumber = getUI().tabForCoordinate(MainView.this, e.getX(), e.getY());
-
+
if (tabNumber >= 0) {
draggedTabIndex = tabNumber;
Rectangle bounds = getUI().getTabBounds(MainView.this, tabNumber);
-
+
// Paint the tabbed pane to a buffer
Image totalImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics totalGraphics = totalImage.getGraphics();
@@ -129,35 +126,35 @@
// Don't be double buffered when painting to a static image.
setDoubleBuffered(false);
paintComponent(totalGraphics);
-
+
// Paint just the dragged tab to the buffer
tabImage = new BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_ARGB);
Graphics graphics = tabImage.getGraphics();
- graphics.drawImage(totalImage, 0, 0, bounds.width, bounds.height, bounds.x, bounds.y, bounds.x + bounds.width, bounds.y + bounds.height, MainView.this);
-
+ graphics.drawImage(totalImage, 0, 0, bounds.width, bounds.height, bounds.x, bounds.y, bounds.x +
+ bounds.width, bounds.y +
+ bounds.height, MainView.this);
+
dragging = true;
repaint();
}
} else {
currentMouseLocation = e.getPoint();
-
+
// Need to repaint
repaint();
}
-
+
super.mouseDragged(e);
}
});
-
- this.addMouseListener(new MouseAdapter()
- {
+
+ this.addMouseListener(new MouseAdapter() {
@Override
- public void mousePressed(MouseEvent e)
- {
+ public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
popup.show(e.getComponent(), e.getX(), e.getY());
}
-
+
public void mouseReleased(MouseEvent e) {
if (dragging) {
int tabNumber = getUI().tabForCoordinate(MainView.this, e.getX(), e.getY());
@@ -171,7 +168,7 @@
}
}
}
-
+
dragging = false;
tabImage = null;
}
@@ -180,11 +177,10 @@
this.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JComponent selected = (JComponent) MainView.this.getSelectedComponent();
-
+
ViewEventController.getInstance().getToolbar().getEditButton().getEditButton().setEnabled(false);
-
- if (selected == overview)
- {
+
+ if (selected == overview) {
ViewEventController.getInstance().getToolbar().getEditButton().getEditButton().setEnabled(true);
ViewEventController.getInstance().getOverviewTable().refresh();
ViewEventController.getInstance().getOverviewTree().refresh();
@@ -192,24 +188,20 @@
overview.setDividerLocation(180);
overview.revalidate();
overview.repaint();
- }
- else if (selected == iterationOverview)
- {
+ } else if (selected == iterationOverview) {
ViewEventController.getInstance().getOverviewTree().refresh();
iterationOverview.setLeftComponent(ViewEventController.getInstance().getOverviewTree());
iterationOverview.setDividerLocation(180);
iterationOverview.revalidate();
iterationOverview.repaint();
- }
- else if (selected instanceof RequirementPanel)
- {
+ } else if (selected instanceof RequirementPanel) {
RequirementPanel req = (RequirementPanel) selected;
req.fireRefresh();
}
}
});
}
-
+
/**
* Method paintComponent.
*
@@ -217,14 +209,14 @@
*/
protected void paintComponent(Graphics g) {
super.paintComponent(g);
-
+
// Are we dragging?
if (dragging && currentMouseLocation != null && tabImage != null) {
// Draw the dragged tab
g.drawImage(tabImage, currentMouseLocation.x, currentMouseLocation.y, this);
}
}
-
+
/**
* Overridden insertTab function to add the closable tab element.
*
@@ -235,14 +227,14 @@
* @param index Location of the tab
*/
@Override
- public void insertTab(String title, Icon icon, Component component,
- String tip, int index) {
+ public void insertTab(String title, Icon icon, Component component, String tip, int index) {
super.insertTab(title, icon, component, tip, index);
- if (!(component instanceof OverviewPanel) && !(component instanceof IterationOverviewPanel)) {
+ if (!(component instanceof OverviewPanel) &&
+ !(component instanceof IterationOverviewPanel)) {
setTabComponentAt(index, new ClosableTabComponent(this));
}
}
-
+
/**
* Method getOverview.
*
@@ -251,7 +243,7 @@
public OverviewPanel getOverview() {
return overview;
}
-
+
/**
* Method setSelectedComponent.
*
@@ -262,7 +254,7 @@
this.lastTab = this.getSelectedComponent();
super.setSelectedComponent(c);
}
-
+
/**
* Method removeTabAt.
*
@@ -276,9 +268,11 @@
setSelectedComponent(this.lastTab);
}
} catch (IllegalArgumentException e) {
+ //TODO Stop swallowing exceptions
+ e.printStackTrace();
}
}
-
+
//Getters and setters
/**
* Method getPopup.
@@ -288,7 +282,7 @@
public JPopupMenu getPopup() {
return popup;
}
-
+
/**
* Method getCloseAll.
*
@@ -297,7 +291,7 @@
public JMenuItem getCloseAll() {
return closeAll;
}
-
+
/**
* Method getCloseOthers.
*
@@ -306,105 +300,105 @@
public JMenuItem getCloseOthers() {
return closeOthers;
}
-
+
/**
* @return the dragging
*/
boolean isDragging() {
return this.dragging;
}
-
+
/**
* @param dragging the dragging to set
*/
void setDragging(boolean dragging) {
this.dragging = dragging;
}
-
+
/**
* @return the tabImage
*/
Image getTabImage() {
return this.tabImage;
}
-
+
/**
* @param tabImage the tabImage to set
*/
void setTabImage(Image tabImage) {
this.tabImage = tabImage;
}
-
+
/**
* @return the currentMouseLocation
*/
Point getCurrentMouseLocation() {
return this.currentMouseLocation;
}
-
+
/**
* @param currentMouseLocation the currentMouseLocation to set
*/
void setCurrentMouseLocation(Point currentMouseLocation) {
this.currentMouseLocation = currentMouseLocation;
}
-
+
/**
* @return the draggedTabIndex
*/
int getDraggedTabIndex() {
return this.draggedTabIndex;
}
-
+
/**
* @param draggedTabIndex the draggedTabIndex to set
*/
void setDraggedTabIndex(int draggedTabIndex) {
this.draggedTabIndex = draggedTabIndex;
}
-
+
/**
* @return the iterationOverview
*/
IterationOverviewPanel getIterationOverview() {
return this.iterationOverview;
}
-
+
/**
* @param iterationOverview the iterationOverview to set
*/
void setIterationOverview(IterationOverviewPanel iterationOverview) {
this.iterationOverview = iterationOverview;
}
-
+
/**
* @return the lastTab
*/
Component getLastTab() {
return this.lastTab;
}
-
+
/**
* @param lastTab the lastTab to set
*/
void setLastTab(Component lastTab) {
this.lastTab = lastTab;
}
-
+
/**
* @param overview the overview to set
*/
void setOverview(OverviewPanel overview) {
this.overview = overview;
}
-
+
/**
* @param closeAll the closeAll to set
*/
void setCloseAll(JMenuItem closeAll) {
this.closeAll = closeAll;
}
-
+
/**
* @param closeOthers the closeOthers to set
*/
diff --git a/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/overview/OverviewTable.java b/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/overview/OverviewTable.java
index f82d28a..f9be622 100644
--- a/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/overview/OverviewTable.java
+++ b/RequirementManager/src/main/java/edu/wpi/cs/wpisuitetng/modules/requirementmanager/view/overview/OverviewTable.java
@@ -37,22 +37,20 @@
* @author justinhess
* @version $Revision: 1.0 $
*/
-public class OverviewTable extends JTable
-{
+public class OverviewTable extends JTable {
private DefaultTableModel tableModel = null;
private boolean initialized;
private boolean isInEditMode;
private boolean changedByRefresh = false;
private Border paddingBorder = BorderFactory.createEmptyBorder(0, 4, 0, 0);
-
+
/**
* Sets initial table view
*
* @param data Initial data to fill OverviewTable
* @param columnNames Column headers of OverviewTable
*/
- public OverviewTable(Object[][] data, String[] columnNames)
- {
+ public OverviewTable(Object[][] data, String[] columnNames) {
this.tableModel = new DefaultTableModel(data, columnNames);
this.setModel(tableModel);
this.setDefaultRenderer(Object.class, new OverviewTableCellRenderer());
@@ -61,88 +59,78 @@
this.setDragEnabled(true);
this.setDropMode(DropMode.ON);
this.setTransferHandler(new OverviewTableTransferHandler(this));
-
+
this.getTableHeader().setReorderingAllowed(false);
this.setAutoCreateRowSorter(true);
setFillsViewportHeight(true);
isInEditMode = false;
-
+
ViewEventController.getInstance().setOverviewTable(this);
initialized = false;
-
+
/* Create double-click event listener */
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
-
- if (getRowCount() > 0)
- {
+
+ if (getRowCount() > 0) {
int mouseY = e.getY();
Rectangle lastRow = getCellRect(getRowCount() - 1, 0, true);
int lastRowY = lastRow.y + lastRow.height;
-
- if (mouseY > lastRowY)
- {
+
+ if (mouseY > lastRowY) {
getSelectionModel().clearSelection();
repaint();
}
}
-
+
// only allow edit requirement panel to pop up outside of Multiple Requirement Editing Mode
- if ((e.getClickCount() == 2) && !isInEditMode)
- {
+ if ((e.getClickCount() == 2) && !isInEditMode) {
ViewEventController.getInstance().editSelectedRequirement();
}
}
});
}
-
+
/**
* updates OverviewTable with the contents of the requirement model *
*/
public void refresh() {
List<Requirement> requirements = RequirementModel.getInstance().getRequirements();
-
+
String[] pastEst = new String[requirements.size()];
-
+
if (isInEditMode) {
// store all the estimates currently in the table if in Mult. Req. Editing mode
for (int i = 0; i < this.getRowCount(); i++) {
pastEst[i] = String.valueOf(this.tableModel.getValueAt(i, 7));
}
-
+
pastEst[requirements.size() - 1] = String.valueOf(requirements.get(requirements.size() - 1).getEstimate());
-
+
// indicate that refresh is about to affect the table
setChangedByRefresh(true);
}
-
+
// clear the table
tableModel.setRowCount(0);
-
+
for (int i = 0; i < requirements.size(); i++) {
Requirement req = requirements.get(i);
String currEst = String.valueOf(req.getEstimate());
-
+
// re-enter the value last in the cell if in Mult. Req. Editing mode and req estimate not just edited
- if (isInEditMode && (!currEst.equals(pastEst[i])) && (!req.getEstimateEdited())) {
+ if (isInEditMode &&
+ (!currEst.equals(pastEst[i])) && (!req.getEstimateEdited())) {
currEst = pastEst[i];
}
-
- tableModel.addRow(new Object[] { req.getId(),
- req,
- req.getRelease(),
- req.getIteration(),
- req.getType(),
- req.getStatus(),
- req.getPriority(),
- currEst
- });
+
+ tableModel.addRow(new Object[] { req.getId(), req, req.getRelease(), req.getIteration(), req.getType(), req.getStatus(), req.getPriority(), currEst });
req.setEstimateEdited(false);
}
// indicate that refresh is no longer affecting the table
setChangedByRefresh(false);
}
-
+
/**
* Overrides the isCellEditable method to ensure no cells are editable.
*
@@ -150,25 +138,25 @@
* @param col column of OverviewTable cell is located @return boolean
*/
@Override
- public boolean isCellEditable(int row, int col)
- {
+ public boolean isCellEditable(int row, int col) {
// extract the ID number displayed in the row
String rowIDstr = this.getValueAt(row, 0).toString();
int rowID = Integer.parseInt(rowIDstr);
// retrieve the requirement with ID rowID and the requirement's estimate
Requirement req = RequirementModel.getInstance().getRequirement(rowID);
-
+
// if the column contains the estimate, the requirement is not deleted, in progress or completed,
// and the table is in Multiple Requirement Editing mode, make the cell editable
- if ((col == 7) && (isInEditMode) && (!req.isDeleted())
- && (req.getStatus() != RequirementStatus.COMPLETE)
- && (req.getStatus() != RequirementStatus.INPROGRESS)) {
+ if ((col == 7) &&
+ (isInEditMode) && (!req.isDeleted()) &&
+ (req.getStatus() != RequirementStatus.COMPLETE) &&
+ (req.getStatus() != RequirementStatus.INPROGRESS)) {
return true;
}
-
+
return false;
}
-
+
/**
* Used to toggle the isInEditMode to indicate whether the requirements in
* the Overview table are
@@ -179,28 +167,28 @@
public void setEditFlag(boolean beingEdited) {
isInEditMode = beingEdited;
}
-
+
/**
* @return isInEditMode
*/
public boolean getEditFlag() {
return isInEditMode;
}
-
+
/**
* @return the changedByRefresh
*/
public boolean wasChangedByRefresh() {
return changedByRefresh;
}
-
+
/**
* @param changedByRefresh the changedByRefresh to set
*/
public void setChangedByRefresh(boolean changedByRefresh) {
this.changedByRefresh = changedByRefresh;
}
-
+
/**
* Overrides the paintComponent method to retrieve the requirements on the
* first painting.
@@ -208,47 +196,44 @@
* @param g The component object to paint
*/
@Override
- public void paintComponent(Graphics g)
- {
- if (!initialized)
- {
- try
- {
+ public void paintComponent(Graphics g) {
+ if (!initialized) {
+ try {
GetRequirementsController.getInstance().retrieveRequirements();
GetIterationController.getInstance().retrieveIterations();
initialized = true;
- } catch (Exception e)
- {
-
+ } catch (Exception e) {
+ //TODO Stop swallowing exceptions
+ e.printStackTrace();
}
}
-
+
super.paintComponent(g);
}
-
+
/**
* saves the changes made to the Overview Table
*/
public void saveChanges() {
// Set time stamp for transaction history
long timestamp = System.currentTimeMillis();
-
+
// iterate through the rows of the overview table
for (int row = 0; row < this.tableModel.getRowCount(); row++) {
-
+
// extract the ID number displayed in the row
String rowIDstr = this.tableModel.getValueAt(row, 0).toString();
int rowID = Integer.parseInt(rowIDstr);
-
+
// use the ID number in the row to retrieve the requirement represented by the row
Requirement req = RequirementModel.getInstance().getRequirement(rowID);
-
+
// indicate that the requirement were not just created
req.setWasCreated(false);
-
+
// Set the time stamp for the transaction for the creation of the requirement
req.getHistory().setTimestamp(timestamp);
-
+
// update the estimate with the value in the cell at row, column 7
String cellEstimateStr = this.tableModel.getValueAt(row, 7).toString();
int cellEstimate = req.getEstimate();
@@ -259,52 +244,51 @@
} catch (NumberFormatException nfe) {
formatError = true;
}
-
+
if (formatError) {
cellEstimate = req.getEstimate();
this.setValueAt(cellEstimate, row, 7);
- }
- else {
+ } else {
cellEstimate = Integer.parseInt(cellEstimateStr);
}
req.setEstimate(cellEstimate);
-
+
// updates requirement on the server
UpdateRequirementController.getInstance().updateRequirement(req);
}
-
+
// refresh table to get rid of cell highlights
this.refresh();
}
-
+
/**
* @return true if there are unsaved, saveable changes in the Overview Table
*/
public boolean hasChanges() {
-
+
// iterate through the rows of the overview table
for (int row = 0; row < this.tableModel.getRowCount(); row++) {
-
+
// extract the ID number displayed in the row
String rowIDstr = this.tableModel.getValueAt(row, 0).toString();
int rowID = Integer.parseInt(rowIDstr);
-
+
// use the ID number in the row to retrieve the requirement represented by the row
Requirement req = RequirementModel.getInstance().getRequirement(rowID);
-
+
// extract the string from the estimate column
String cellEstimateStr = this.tableModel.getValueAt(row, 7).toString();
-
+
boolean formatError = false;
int cellEstimate = 0;
-
+
// check to see if the value in the cell is a valid integer
try {
cellEstimate = Integer.parseInt(cellEstimateStr);
} catch (NumberFormatException nfe) {
formatError = true;
}
-
+
if (!formatError) {
// if the valid cell estimate is not equal to the requirement estimate,
// indicate that a change has been found by returning true
@@ -312,11 +296,11 @@
return true;
}
}
-
+
// indicate that no changes were found by returning false
return false;
}
-
+
/**
* Method prepareRenderer.
*
@@ -328,14 +312,14 @@
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(renderer, row, column);
-
+
if (JComponent.class.isInstance(comp)) {
((JComponent) comp).setBorder(paddingBorder);
}
return comp;
-
+
}
-
+
public void validateEdits() {
boolean errors = false;
for (int row = 0; row < this.tableModel.getRowCount(); row++) {
@@ -351,5 +335,5 @@
}
ViewEventController.getInstance().getToolbar().editButton.setSaveEnabled(!errors);
}
-
+
}