package hudson.model;
import static java.lang.String.format;
import hudson.Extension;
import hudson.util.PersistedList;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.Stapler;
public class PaneStatusProperties extends UserProperty implements Saveable {
private final PersistedList<String> collapsed = new PersistedList<String>(this);
private static final PaneStatusProperties FALLBACK = new PaneStatusPropertiesSessionFallback();
public boolean isCollapsed(String paneId) {
return collapsed.contains(paneId);
}
/**
* @param paneId panel name
* @return the actual state of panel
*/
public boolean toggleCollapsed(String paneId) throws IOException {
if (collapsed.contains(paneId)) {
collapsed.remove(paneId);
return false;
} else {
collapsed.add(paneId);
return true;
}
}
public void save() throws IOException {
user.save();
}
private Object readResolve() {
collapsed.setOwner(this);
return this;
}
@Extension @Symbol("paneStatus")
public static class DescriptorImpl extends UserPropertyDescriptor {
@Override
public UserProperty newInstance(User user) {
return new PaneStatusProperties();
}
@Override
public boolean isEnabled() {
return false;
}
}
private static class PaneStatusPropertiesSessionFallback extends PaneStatusProperties {
private final String attribute = "jenkins_pane_%s_collapsed";
@Override
public boolean isCollapsed(String paneId) {
final HttpSession session = Stapler.getCurrentRequest().getSession();
return session.getAttribute(format(attribute, paneId)) != null;
}
@Override
public boolean toggleCollapsed(String paneId) {
final HttpSession session = Stapler.getCurrentRequest().getSession();
final String property = format(attribute, paneId);
final Object collapsed = session.getAttribute(property);
if (collapsed == null) {
session.setAttribute(property, true);
return true;
}
session.removeAttribute(property);
return false;
}
}
public static PaneStatusProperties forCurrentUser() {
final User current = User.current();
if (current == null) {
return FALLBACK;
}
return current.getProperty(PaneStatusProperties.class);
}
}