}
// Create the column
super.addColumnComponent(dataTable, tableAttributes, elementName, columnAttributes, metawidget);
List<StaticWidget> columns = dataTable.getChildren();
HtmlColumn column = (HtmlColumn) columns.get(columns.size() - 1);
// If we can determine the componentType, wrap it with a link
if (tableAttributes.get(TOP_LEVEL_PARAMETERIZED_TYPE) != null)
{
componentType = tableAttributes.get(TOP_LEVEL_PARAMETERIZED_TYPE);
}
if (componentType != null)
{
String controllerName = StringUtils.decapitalize(ClassUtils.getSimpleName(componentType));
// Create a link...
HtmlOutcomeTargetLink link = new HtmlOutcomeTargetLink();
String outcome = getTargetDir();
if (!outcome.isEmpty() && !outcome.startsWith("/"))
{
outcome = "/" + outcome;
}
link.putAttribute("outcome", outcome + "/" + controllerName + "/view");
// ...pointing to the id
String primaryKeyName = "id";
String inspectedType = metawidget.inspect(null, componentType);
if (inspectedType != null)
{
Element root = XmlUtils.documentFromString(inspectedType).getDocumentElement();
NodeList elements = root.getFirstChild().getChildNodes();
for (int loop = 0, length = elements.getLength(); loop < length; loop++)
{
Element element = (Element) elements.item(loop);
if (element.hasAttribute(PRIMARY_KEY))
{
primaryKeyName = element.getAttribute(NAME);
break;
}
}
}
Param param = new Param();
param.putAttribute("name", "id");
param.putAttribute(
"value",
StaticFacesUtils.wrapExpression(dataTable.getAttribute("var") + StringUtils.SEPARATOR_DOT_CHAR
+ primaryKeyName));
link.getChildren().add(param);
link.getChildren().add(column.getChildren().remove(1));
if (columnAttributes.containsKey(FACES_LOOKUP) && columnAttributes.containsKey(REVERSE_PRIMARY_KEY))
{
StaticHtmlMetawidget output = (StaticHtmlMetawidget) link.getChildren().get(1);
String displayExpression = "forgeview:display(" + dataTable.getAttribute("var")
+ StringUtils.SEPARATOR_DOT_CHAR
+ StringUtils.decapitalize(columnAttributes.get(NAME)) + ")";
((BaseStaticXmlWidget) link).putAdditionalNamespaceURI("forgeview", "http://jboss.org/forge/view");
output.setValue(StaticFacesUtils.wrapExpression(displayExpression));
}
if (tableAttributes.get(PARAMETERIZED_TYPE_PATH) != null)
{
// Recreate the EL expression. This is done to ensure that correctly nested EL expressions are created for
// expanded entities. The originally created expression in super.addColumnComponent is incorrect for
// expanded entities since it assumes that all referenced names are at the same level
String valueExpression = dataTable.getAttribute("var") + StringUtils.SEPARATOR_DOT_CHAR
+ tableAttributes.get(PARAMETERIZED_TYPE_PATH) + StringUtils.SEPARATOR_DOT_CHAR
+ StringUtils.decapitalize(columnAttributes.get(NAME));
StaticHtmlMetawidget output = (StaticHtmlMetawidget) link.getChildren().get(1);
output.setValue(StaticFacesUtils.wrapExpression(valueExpression));
}
column.getChildren().add(link);
// If bidirectional, add a footer facet
if (tableAttributes.containsKey(INVERSE_RELATIONSHIP) && !metawidget.isReadOnly())
{
// If it's an inverse relationship, we really should have been able to determine sub-properties, so we
// should never be at 'entity' level *unless* componentType couldn't resolve to an actual type
if (!ENTITY.equals(elementName))
{
StaticHtmlMetawidget footerMetawidget = new StaticHtmlMetawidget();
Map<String, String> footerAttributes = CollectionUtils.newHashMap();
metawidget.initNestedMetawidget(footerMetawidget, footerAttributes);
// (footer facets should never have a 'required' attribute)
footerMetawidget.removeWidgetProcessor(footerMetawidget
.getWidgetProcessor(RequiredAttributeProcessor.class));
footerMetawidget.setValue(StaticFacesUtils.wrapExpression(controllerName + "Bean.add." + columnName));
footerMetawidget.setPath(componentType + StringUtils.SEPARATOR_FORWARD_SLASH_CHAR + columnName);
footerMetawidget.setLayout(new SimpleLayout());
Facet footerFacet = new Facet();
footerFacet.putAttribute("name", "footer");
footerFacet.getChildren().add(footerMetawidget);
ReadableIdProcessor readableIdProcessor = metawidget.getWidgetProcessor(ReadableIdProcessor.class);
if (readableIdProcessor != null)
{
readableIdProcessor.processWidget(footerMetawidget, elementName, columnAttributes, metawidget);
}
HtmlMessage message = new HtmlMessage();
message.putAttribute("for", footerMetawidget.getAttribute("id"));
message.putAttribute("styleClass", "error");
footerFacet.getChildren().add(message);
column.getChildren().add(footerFacet);
}
}
}
}