Menu madness
-
My company's app has a navigation menu that sits on the left hand side of the screen. There was a minor menu display bug and I was assigned to fix it. Shouldn't be too complicated, I thought, and got stuck in. After nearly an hour of searching, I finally found the code that actually displays the menu. To my horror, it looked like this. Note the 14 "if" statements in one method. Bear in mind that this is just one method of one of the many, many Jsp's involved!
/*
* (non-Javadoc)
* @see javax.servlet.jsp.tagext.Tag#doStartTag()
*/
@Override
public int doStartTag() throws JspException {
Object obj = pageContext.getAttribute(getId());
AclEntry aclEntry = (AclEntry) pageContext.getSession().getAttribute(Constants.ACL_ENTRY_KEY);
Principal principal = (Principal) aclEntry.getPrincipal();
if (obj != null) {
// Query database, do not show deleted folders
FolderEntry fe = (FolderEntry) obj;
try {
if (fe.getEntryId() > 0) {
Directory d = DirectoryDB.getInstance().selectEntry(fe.getEntryId(), principal);
if (d == null || !d.getShowName().equals(fe.getShowName())) {
return SKIP_BODY;
}
}
} catch (SQLException e) {
e.printStackTrace();
return SKIP_BODY;
}
setFolderEntry(fe);
} else {
// Make parent
try {
Class cls = Class.forName(getClassName());
Class[] types = new Class[]{Owner.class};
Constructor constructor = cls.getConstructor(types);
Owner owner = AclManager.getInstance().newOwner(principal);
FolderEntry entry = (FolderEntry) constructor.newInstance(new Object[]{owner});
entry.setShowName(getName());
entry.setDateEntry(Calendar.getInstance());
setFolderEntry(entry);
// Set tree in session
List<Directory> list = new ArrayList<Directory>();
list.add(entry);
pageContext.getSession().setAttribute(getTargetSessionName(), list);
} catch (Exception e) {
e.printStackTrace();
return SKIP_BODY;
}
}
StringBuilder builder = new StringBuilder();
builder.append("<td width=\"8\"><img width=\"8\" height=\"25\" border=\"0\" src=\"");
builder.append(((HttpServletRequest) pageContext.getRequest()).getContextPath());
builder.append("/image/spacer.gif\" alt=\"\"/></td>");
// Show dotted line image
try {
String[] buf = new String[getFolderEntry().getHeight()];
if (!getFolderEntry().isRoot()) {
Directory p = getFolderEntry();
if (!isYoungestChild(getFolderEntry())) {
// Not youngest
buf[getFolderEntry().getHeight() - 1] = getIconImage(getLineIconUdr());
} else {
// Youngest
buf[getFolderEntry().getHeight() - 1] = getIconImage(getLineIconUr());
}
while (!p.getParent().isRoot()) {
p = p.getParent();
if (p.getJunior() != null && p.getJunior() instanceof FolderEntry) {
// Parent is not youngest
buf[p.getHeight() - 1] = getIconImage(getLineIconUd());
} else {
// Parent is youngest
buf[p.getHeight() - 1] = getIconImage(getSpacerIcon());
}
}
}
for (int i = 0; i < getFolderEntry().getHeight(); i++) {
builder.append(buf[i] != null ? buf[i] : "");
}
// Draw +/-, folder icon
if (getFolderEntry() instanceof MenuDirectory) {
MenuDirectory menu = (MenuDirectory) getFolderEntry();
if (menu instanceof TopMenuDirectory) {
// Child has a menu
if (menu.isExpand()) {
builder.append(getMinusImage());
} else {
builder.append(getPlusImage());
}
builder.append(getMenuImage(menu.getImage()));
} else {
// Child is a normal folder
if (menu instanceof SimpleMenuDirectory) {
// If there are no children, do not show +/-, just a line.
// If root, show a + without an action.
builder.append(getLrImage());
builder.append(getMenuImage(menu.getImage()));
} else if (menu.isExpand()) {
builder.append(getMinusImage());
builder.append(getMenuImage(menu.getImage()));
} else {
builder.append(getPlusImage());
builder.append(getMenuImage(menu.getImage()));
}
}
} else if (!getFolderEntry().hasFolderChildren(getFolderEntry().getClass().getName(), principal)) {
// If there are no children, do not show +/-, just a line.
// If root, show a + without an action.
if (getFolderEntry().isRoot()) {
builder.append(getPlusImageNoAction());
builder.append(getFolderImage(getFolderIconClose()));
} else {
builder.append(getLrImage());
builder.append(getFolderImage(getFolderIconClose()));
}
} else if (getFolderEntry().isExpand()) {
builder.append(getMinusImage());
builder.append(getFolderImage(getFolderIconOpen()));
} else {
builder.append(getPlusImage());
builder.append(getFolderImage(getFolderIconClose()));
}
} catch (SQLException e) {
e.printStackTrace();
return SKIP_BODY;
}
try {
pageContext.getOut().print(builder.toString());
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_BODY_INCLUDE;
}
-
At least it's indented....
-
Not so bad code IMO.