package jpaoletti.jpm.struts.converter;
import jpaoletti.jpm.converter.ConverterException;
import jpaoletti.jpm.core.*;
import jpaoletti.jpm.core.message.MessageFactory;
import jpaoletti.jpm.struts.CollectionHelper;
import jpaoletti.jpm.struts.tags.PMTags;
/**
* Converter for integer <br>
* <pre>
* {@code
* <converter class="jpaoletti.jpm.converter.ObjectConverter">
* <operationId>edit</operationId>
* <properties>
* <property name="entity" value="other_entity" />
* <property name="display" value="other_entity_display" />
* <property name="with-null" value="true" />
* <property name="filter" value="jpaoletti.jpm.core.ListFilterXX" />
* <property name="sort-field" value="xxx" />
* <property name="sort-direction" value="asc | desc" />
* <property name="min-search-size" value="0" />
* </properties>
* </converter>
* }
* </pre>
*
* @author jpaoletti
*
*/
public class ObjectConverter extends StrutsEditConverter {
@Override
public Object build(PMContext ctx) throws ConverterException {
try {
final String _entity = getConfig("entity");
final Entity entity = ctx.getPresentationManager().getEntity(_entity);
final String newFieldValue = (String) ctx.getFieldValue();
if (newFieldValue == null || newFieldValue.trim().equals("-1") || "".equals(newFieldValue)) {
return null;
}
return entity.getDataAccess().getItem(ctx, new InstanceId(newFieldValue));
} catch (PMException ex) {
throw new ConverterException(MessageFactory.error(ctx.getEntity(), ctx.getField(), "cant.convert.object", ex.getMessage()));
}
}
@Override
public Object visualize(PMContext ctx) throws ConverterException {
final String _entity = getConfig("entity");
final StringBuilder url = new StringBuilder("object_converter.jsp");
url.append("?related=").append(getConfig("related", ""));
url.append("&oentity=").append(_entity);
final Entity entity = ctx.getPresentationManager().getEntity(_entity);
if (entity == null) {
throw new ConverterException("object.converter.entity.cannot.be.null");
}
if (!entity.isIdentified()) {
throw new ConverterException("object.converter.id.cannot.be.null");
}
final Object fieldValue = ctx.getFieldValue();
final String _display = getConfig("display");
if (fieldValue == null) {
ctx.put("_selected_value", "");
ctx.put("_selected_id", "-1");
ctx.put("_with_null", getConfig("with-null", "false")); //false because selected is already null
} else {
final CollectionHelper helper = new CollectionHelper(_display);
try {
ctx.put("_selected_value", helper.getObjectDisplay(fieldValue));
ctx.put("_selected_id", entity.getDataAccess().getInstanceId(ctx, new EntityInstanceWrapper(fieldValue)).getValue());
ctx.put("_with_null", getConfig("with-null", "false"));
} catch (PMException ex) {
throw new ConverterException("object.converter.cannot.get.id");
}
}
ctx.put("_min_search_size", getConfig("min-search-size", "0"));
ctx.put("_search", getConfig("search", "false"));
final StringBuilder sb = new StringBuilder("/get_list.do");
sb.append("?entity=").append(_entity);
sb.append("&filter_class=").append(getConfig("filter"));
sb.append("&id=").append("");
if (_display != null) {
sb.append("&display=").append(_display);
}
sb.append("&sortField=").append(getConfig("sort-field"));
sb.append("&originalEntity=").append(ctx.getEntity().getId());
sb.append("&originalOperation=").append(ctx.getOperation().getId());
sb.append("&relatedFieldName=").append(getConfig("related", ""));
sb.append("&relatedRequired=").append(getConfig("related-required", "false"));
final String sd = getConfig("sort-direction");
if (sd != null && !"".equals(sd.trim()) && "desc".equalsIgnoreCase(sd)) {
sb.append("&sortDir=").append("1");
}
ctx.put("jsonUrl", PMTags.plainUrl(ctx.getPmsession(), sb.toString()));
//works only for bootstrap version
if ("true".equals(getConfig("add", "false"))) {
if (entity.getOperations().getOperation("add") != null) {
url.append("&add=").append(PMTags.plainUrl(ctx.getPmsession(), "add.do?pmid=" + _entity));
}
}
return super.visualize(url.toString());
}
}