package jpaoletti.jpm.struts.tags;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.jsp.tagext.TagSupport;
import jpaoletti.jpm.core.*;
import jpaoletti.jpm.core.operations.OperationScope;
import jpaoletti.jpm.security.core.PMSecurityUser;
import jpaoletti.jpm.struts.PMEntitySupport;
import jpaoletti.jpm.struts.PMStrutsContext;
import jpaoletti.jpm.util.DisplacedList;
/**
* Helper tags for Presentation Manager
*
* @author jpaoletti
* @since 15/09/2011
* @version 1.2
*
*/
public class PMTags extends TagSupport {
public static boolean contains(List list, Object o) {
return list != null && list.contains(o);
}
/**
* Builds a jpm url based on given url
*
* @param session Session user. Cannot be null
* @param url Url to be built, <b>without</b> context path
*
* @return ready to use url
*/
public static String url(PMSession session, String url) {
return url(session, url, false);
}
/**
* Builds a jpm url based on given url
*
* @param session Session user. Cannot be null
* @param url Url to be built, <b>without</b> context path
* @param confirm if confirm is true, uses loadPageConfirm instead of
* loadPage
*
* @return ready to use url
*/
public static String url(PMSession session, String url, Boolean confirm) {
return url(session, url, confirm, "javascript:");
}
/**
* Builds a jpm url based on given url
*
* @param session Session user. Cannot be null
* @param url Url to be built, <b>without</b> context path
* @param confirm if confirm is true, uses loadPageConfirm instead of
* loadPage
*
* @return ready to use url
*/
public static String url(PMSession session, String url, Boolean confirm, String prefix) {
if (session != null) {
final String contextPath = PMEntitySupport.getInstance().getContext_path();
final StringBuilder sb = new StringBuilder();
if (prefix != null) {
sb.append(prefix);
}
if (confirm) {
sb.append("loadPageConfirm('");
} else {
sb.append("loadPage('");
}
sb.append(contextPath);
sb.append("/");
sb.append(session.getStringEncrypter().encrypt(
(url.startsWith("/")) ? url.substring(1) : url));
sb.append(".jpm')");
return sb.toString();
} else {
return url;
}
}
public static String plainUrl(PMSession session, String url) {
final String contextPath = PMEntitySupport.getInstance().getContext_path();
final String finalUrl = (url.startsWith("/")) ? url.substring(1) : url;
if (session != null) {
return contextPath + "/"
+ session.getStringEncrypter().encrypt(finalUrl)
+ ".jpm";
} else {
return contextPath + "/" + finalUrl;
}
}
public static Long floor(Double d) {
return d.longValue();
}
public static String itemCheckbox(PMStrutsContext ctx, DisplacedList list, Object item) throws PMException {
if (ctx.getEntityContainer().getList().isHasSelectedScope()) {
final StringBuilder input = new StringBuilder();
final InstanceId id = ctx.getDataAccess().getInstanceId(ctx, new EntityInstanceWrapper(item));
final String idValue = id.getValue();
input.append("<input class='ui-list-icon' type='checkbox' ");
input.append("onchange='selectItem(").append(idValue).append(");'");
if (ctx.getEntityContainer().isSelected(id)) {
input.append("checked");
}
input.append("/>");
return input.toString();
} else {
return "";
}
}
public static String instanceId(PMStrutsContext ctx, Entity entity, Object item) throws PMException {
final InstanceId id = entity.getDataAccess().getInstanceId(ctx, new EntityInstanceWrapper(item));
return id.getValue();
}
public static String listItemOperations(PMStrutsContext ctx, DisplacedList list, Object item) {
try {
final StringBuilder sb = new StringBuilder();
for (Operation itemOperation : ctx.getOperations(item, ctx.getOperation()).getOperations()) {
//If we have permission
if (ctx.getPmsession().getUser().hasPermission(itemOperation.getPerm())) {
//if operation is at item scope
if (OperationScope.ITEM.is(itemOperation.getScope())) {
sb.append("<a class='ui-list-icon-container' href=\"");
if (itemOperation.getUrl() != null) {
sb.append(itemOperation.getUrl());
} else {
final InstanceId id = ctx.getDataAccess().getInstanceId(ctx, new EntityInstanceWrapper(item));
final String idValue = id.getValue();
final String furl = itemOperation.getId() + ".do?pmid=" + ctx.getEntity().getId() + "&item=" + idValue;
if (itemOperation.getPopup()) {
sb.append("javascript:popup('").append(plainUrl(ctx.getPmsession(), furl)).append("')");
} else {
sb.append(url(ctx.getPmsession(), furl, itemOperation.getConfirm(), "javascript:"));
}
}
sb.append("\" id='operation");
sb.append(itemOperation.getId());
sb.append("' title='");
sb.append(PresentationManager.getMessage("operation." + itemOperation.getId()));
sb.append("'><div class='ui-list-icon ui-icon ui-icon-operation-").append(itemOperation.getId()).append("'> </div></a>");
}
}
}
return sb.toString();
} catch (PMException ex) {
PresentationManager.getPm().error(ex);
return "?";
}
}
public static String highlight(Entity entity, Field field, Object item, Object field_value) {
final List<Highlight> highlights = entity.getHighlights(field, item);
if (highlights != null) {
final StringBuilder sb = new StringBuilder();
for (Highlight highlight : highlights) {
sb.append(highlight.getStyle()).append(" ");
}
return sb.toString();
} else {
return "";
}
}
public static String rowNumber(PaginatedList pmlist, DisplacedList list, Object item) {
if (pmlist.isShowRowNumber()) {
return String.format("<span class='ui-list-icon'>[%0" + pmlist.getListTotalDigits() + "d] </span>", list.indexOf(item));
} else {
return "";
}
}
/**
* This method show a tooltip if the key is defined
*
* @param key Key
*/
public static String tooltip(Field field) {
final String tooltip = field.getTooltip();
if (tooltip == null) {
return "";
}
return "<img class='tooltip' title='" + tooltip + "' alt='?' src='"
+ getContextPath() + "/templates/"
+ getTemplate() + "/img/tooltip.gif' />";
}
public static List<Field> displayedFields(PMSecurityUser user, Entity entity, String operationId) {
final List<Field> displayedFields = new ArrayList<Field>();
for (Field field : entity.getOrderedFields()) {
if (field.shouldDisplay(operationId, user)) {
displayedFields.add(field);
}
}
return displayedFields;
}
public static List<Field> displayedFields(PMSecurityUser user, Entity entity, String operationId, Panel panel) {
return panel.getFields(entity, operationId, user);
}
/**
* Getter for template name
*/
protected static String getTemplate() {
return PresentationManager.getPm().getTemplate();
}
/**
* Getter for context path
*/
protected static String getContextPath() {
return PMEntitySupport.getInstance().getContext_path();
}
/**
* Prints the objects in the jsp writer of the page context
*/
protected void print(Object... objects) throws IOException {
for (Object object : objects) {
pageContext.getOut().print(object);
}
}
/**
* Prints the objects in the jsp writer of the page context with a new line
*/
protected void println(Object... objects) throws IOException {
for (Object object : objects) {
pageContext.getOut().println(object);
}
}
public static Field getField(Entity entity, String fieldId) {
return entity.getFieldById(fieldId);
}
/**
* Display an internationalized message
*/
public static String message(String key) {
return PresentationManager.getMessage(key);
}
public static Operation operation(Entity entity, String operationId) {
return entity.getOperations().getOperation(operationId);
}
}