package org.jblooming.waf;
import org.jblooming.PlatformRuntimeException;
import org.jblooming.ontology.PersistentFile;
import org.jblooming.ontology.SecuredLoggableHideableSupport;
import org.jblooming.ontology.SerializedMap;
import org.jblooming.operator.Operator;
import org.jblooming.operator.User;
import org.jblooming.security.Permission;
import org.jblooming.utilities.StringUtilities;
import org.jblooming.waf.constants.Commands;
import org.jblooming.waf.html.core.JspIncluder;
import org.jblooming.waf.settings.ApplicationState;
import org.jblooming.waf.view.PageSeed;
import org.jblooming.waf.view.PageState;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.PageContext;
import java.io.IOException;
import java.util.*;
/**
* (c) Open Lab - www.open-lab.com
* Date: May 24, 2007
* Time: 10:24:55 AM
*/
public class PageQuark extends SecuredLoggableHideableSupport implements JspIncluder {
private String name;
private String description;
private PersistentFile file;
private int pixelWidth = 0;
private int pixelHeight = 0;
private boolean scrollbar = true;
private boolean installed = true;
protected Set<Permission> permissions = new HashSet<Permission>();
private String permissionIds;
private SerializedMap<String, String> params = new SerializedMap();
public static final String init = PageQuark.class.getName();
public static final String PORTLET = "PRLT";
public static final String FLD_PT_PARAM_KEY_ = "PT_PARAM_KEY_";
/**
* FLD_URL of the helper jsp that layouts the html to be displayed using <code>this</code>.
*/
public String urlToInclude;
/**
* Comparator
*/
public static Comparator nameComparator = new Comparator() {
public String getName (Object o) {
if (o==null)
return null;
PageQuark wp = (PageQuark) o;
return wp.getName();
}
public int compare(Object wp01, Object wp02) {
if (wp01==null || wp02==null || ((PageQuark)wp01).getName()==null || ((PageQuark)wp02).getName()==null ) {
return 0;
}
return ( ((PageQuark)wp01).getName() ).compareTo( ((PageQuark)wp02).getName() );
}
};
public void init(PageContext pageContext) {
PageState ps = PageState.getCurrentPageState();
if (!ps.initedElements.contains(init)) {
pageContext.getRequest().setAttribute(ACTION, INITIALIZE);
try {
toHtml(pageContext);
} catch (IOException e) {
throw new PlatformRuntimeException(e);
} catch (ServletException e) {
throw new PlatformRuntimeException(e);
}
ps.initedElements.add(init);
}
}
public void toHtml(PageContext pageContext) throws IOException, ServletException {
Stack stack = getStack(pageContext.getRequest());
stack.push(this);
try {
//pageContext.include(this.urlToInclude);
pageContext.include(this.urlToInclude!=null ? this.urlToInclude : "/"+this.getFile().getFileLocation());
} finally {
stack.pop();
}
}
protected Stack getStack(ServletRequest request) {
Stack stack = (Stack) request.getAttribute(MAIN_OBJECT_STACK);
if (stack == null) {
stack = new Stack();
request.setAttribute(MAIN_OBJECT_STACK, stack);
}
return stack;
}
public static JspIncluder getCurrentInstance(HttpServletRequest request) {
Stack stack = (Stack) request.getAttribute(MAIN_OBJECT_STACK);
if (stack == null) {
stack = new Stack();
request.setAttribute(MAIN_OBJECT_STACK, stack);
}
return (JspIncluder) stack.peek();
}
/**
* getters and setters
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public PersistentFile getFile() {
return file;
}
public void setFile(PersistentFile file) {
this.file = file;
}
public boolean getScrollbar() {
return scrollbar;
}
public void setScrollbar(boolean scrollbar) {
this.scrollbar = scrollbar;
}
public boolean getInstalled() {
return installed;
}
public void setInstalled(boolean installed) {
this.installed = installed;
}
/**
* SECURABLE
*/
public boolean hasPermissionFor(User u, Permission p) {
return u.hasPermissionFor(p);
}
public int getPixelWidth() {
return pixelWidth;
}
public void setPixelWidth(int pixelWidth) {
this.pixelWidth = pixelWidth;
}
public int getPixelHeight() {
return pixelHeight;
}
public void setPixelHeight(int pixelHeight) {
this.pixelHeight = pixelHeight;
}
/**
* PERMISSIONS
*/
public void addPermission(Permission p) {
permissions.add(p);
refreshPermissionIds();
}
public void removePermission(Permission p) {
if (getPermissions() != null) {
getPermissions().remove(p);
refreshPermissionIds();
}
}
public Set<Permission> getPermissions() {
return permissions;
}
public void setPermissions(Set<Permission> permissions) {
this.permissions = permissions;
}
public boolean containsPermission (Permission p) {
return permissions.contains(p);
}
protected void refreshPermissionIds() {
StringBuffer sb = new StringBuffer(512);
for (Iterator<Permission> iterator = permissions.iterator(); iterator.hasNext();) {
Permission permission = iterator.next();
sb.append(permission.getName());
if (iterator.hasNext())
sb.append('|');
}
permissionIds = sb.toString();
}
private void refreshPermissions() {
permissions = new HashSet();
if (permissionIds != null && permissionIds.trim().length() > 0) {
Set<String> ps = StringUtilities.splitToSet(permissionIds, "|");
for (String s : ps) {
Permission perm = ApplicationState.getPermissions().get(s);
if (perm!=null)
permissions.add(perm);
}
}
}
public String getPermissionIds() {
return permissionIds;
}
public void setPermissionIds(String permissionIds) {
this.permissionIds = permissionIds;
refreshPermissions();
}
public SerializedMap<String, String> getParams() {
if (params!=null)
return params;
else
return new SerializedMap<String, String>();
}
public void setParams(SerializedMap<String, String> parameters) {
this.params = parameters;
}
/**
* can the logged operator see this pageQuark?
*
* @param logged if is null return true only when there is no permission required
* @return true when the logged operator have at least one permission required from the pageQuark. If there is no permissions required return true.
*/
public boolean isVisibleFor(Operator logged) {
boolean ret = false;
if (permissions.size() > 0) {
if (logged != null) {
for (Permission p : permissions) {
if (logged.hasPermissionFor(p)) {
ret = true;
break;
}
}
}
} else {
ret = true;
}
return ret;
}
public boolean isVisibleInThisContext(PageState pageState) {
boolean ret = false;
Operator logged = null;
logged = pageState.getLoggedOperator();
ret = isVisibleFor(logged);
return ret;
}
public PageSeed getPageSeedForPlugin(PageState pageState) {
PageSeed printCustom = new PageSeed(ApplicationState.contextPath+getFile().getFileLocation());
printCustom.mainObjectId = pageState.mainObjectId;
printCustom.setCommand(Commands.EDIT);
printCustom.setPopup(true);
return printCustom;
}
public String getHrefForInclude() {
return getFile().getFileLocation();
}
}