/* * Copyright (c) 2008, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wso2.carbon.governance.generic.ui.utils; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axiom.om.impl.builder.StAXOMBuilder; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.governance.api.util.GovernanceConstants; import org.wso2.carbon.governance.generic.ui.common.dataobjects.AddLink; import org.wso2.carbon.governance.generic.ui.common.dataobjects.CheckBox; import org.wso2.carbon.governance.generic.ui.common.dataobjects.CloseAddLink; import org.wso2.carbon.governance.generic.ui.common.dataobjects.DateField; import org.wso2.carbon.governance.generic.ui.common.dataobjects.DropDown; import org.wso2.carbon.governance.generic.ui.common.dataobjects.OptionText; import org.wso2.carbon.governance.generic.ui.common.dataobjects.TextArea; import org.wso2.carbon.governance.generic.ui.common.dataobjects.TextField; import org.wso2.carbon.governance.generic.ui.common.dataobjects.UIComponent; import org.wso2.carbon.ui.CarbonUIUtil; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.xml.namespace.QName; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.StringReader; import java.util.*; /* This is the class which generate the service UI by reading service-config.xml */ public class GenericUIGenerator { private static final Log log = LogFactory.getLog(GenericUIGenerator.class); private String dataElement; private String dataNamespace; public GenericUIGenerator() { this(UIGeneratorConstants.DATA_ELEMENT, UIGeneratorConstants.DATA_NAMESPACE); } public GenericUIGenerator(String dataElement, String dataNamespace) { this.dataElement = dataElement; this.dataNamespace = dataNamespace; } //StringBuffer serviceUI; public OMElement getUIConfiguration(String content, HttpServletRequest request, ServletConfig config, HttpSession session) throws Exception { OMElement omElement = null; try { XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(content)); StAXOMBuilder builder = new StAXOMBuilder(reader); omElement = builder.getDocumentElement(); } catch (XMLStreamException e) { log.error("Unable to parse the UI configuration.", e); } return omElement; } public String printWidgetWithValues(OMElement widget, OMElement data, boolean isFilterOperation, HttpServletRequest request, ServletConfig config) { return printWidgetWithValues(widget, data, isFilterOperation, true, true, request, config); } public String printWidgetWithValues(OMElement widget, OMElement data, boolean isFilterOperation, boolean markReadonly, boolean hasValue, HttpServletRequest request, ServletConfig config) { if (isFilterOperation && Boolean.toString(false).equals( widget.getAttributeValue(new QName(null, UIGeneratorConstants.FILTER_ATTRIBUTE)))) { return ""; } int columns = 2; //default value of number of columns is 2 String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); boolean collapsed = true; // Default collapse set to true String widgetCollapse = widget.getAttributeValue(new QName(null, UIGeneratorConstants.WIDGET_COLLAPSED)); if (widgetCollapse != null) { collapsed = Boolean.valueOf(widgetCollapse); } String divId = "_collapse_id_" + widgetName.replaceAll(" ", ""); OMElement dataHead = null; if (data != null) { dataHead = GenericUtil.getChildWithName(data, widgetName, dataNamespace); } if (widget.getAttributeValue(new QName(null, UIGeneratorConstants.WIDGET_COLUMN)) != null) { columns = Integer.parseInt(widget.getAttributeValue(new QName(null, UIGeneratorConstants.WIDGET_COLUMN))); } Iterator subHeadingIt = widget.getChildrenWithName(new QName(null, UIGeneratorConstants.SUBHEADING_ELEMENT)); StringBuilder table = new StringBuilder(); table.append("<div id=\"" + divId + "\" " + "onmouseover='title=\"\"' onmouseout='title=\"" + String.valueOf(collapsed) + "\"'" + " title=\"" + String.valueOf(collapsed) + "\"><table class=\"normal-nopadding\" cellspacing=\"0\">"); List<String> subList = new ArrayList<String>(); OMElement sub = null; if (subHeadingIt != null && subHeadingIt.hasNext()) { sub = (OMElement) subHeadingIt.next(); // NO need to have multiple subheading elements in a single widget element } if (sub != null && UIGeneratorConstants.SUBHEADING_ELEMENT.equals(sub.getLocalName())) { Iterator headingList = sub.getChildrenWithLocalName(UIGeneratorConstants.HEADING_ELEMENT); while (headingList.hasNext()) { OMElement subheading = (OMElement) headingList.next(); subList.add(subheading.getText()); } if (subList.size() > columns) { /*This is the place where special scenario comes in to play with number of columns other than having two columns */ return ""; // TODO: throw an exception } } table.append(printMainHeader(widgetName, columns)); String widgetMaxOccurs = widget.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)); //skip print heading for unbounded area if (subList.size() > 2 && widgetMaxOccurs == null) { //if the column size is not 2 we print sub-headers first before going in to loop //In this table there should not be any field with maxOccurs unbounded// table.append(printSubHeaders(subList.toArray(new String[subList.size()]))); } Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); int columnCount = 0; int rowCount = 0; OMElement inner = null; if (widgetMaxOccurs != null) { if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(widgetMaxOccurs)) { processElements(widget, data, request, config, widgetName, table, subList); } } else { while (arguments.hasNext()) { OMElement arg = (OMElement) arguments.next(); String maxOccurs = ""; if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { if (isFilterOperation && Boolean.toString(false).equals( arg.getAttributeValue(new QName(null, UIGeneratorConstants.FILTER_ATTRIBUTE)))) { continue; } rowCount++; //this variable used to find the which raw is in and use this to print the sub header String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); String tooltip = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TOOLTIP_ATTRIBUTE)); if (tooltip == null) { tooltip = ""; } tooltip = StringEscapeUtils.escapeHtml(tooltip); //Read the maxOccurs value maxOccurs = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)); if (maxOccurs != null) { if (!UIGeneratorConstants.MAXOCCUR_BOUNDED.equals(maxOccurs) && !UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(maxOccurs)) { //if user has given something else other than unbounded return ""; //TODO: throw an exception } if (!UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(maxOccurs)) { //if maxOccurs is not unbounded then print the sub header otherwise we will show the adding link if (rowCount == 1) { // We print the sub header only when we parse the first element otherwise we'll print sub header for each field element table.append(printSubHeaders(subList.toArray(new String[subList.size()]))); } } } else { if (subList.size() == 2 && rowCount == 1) { // We print the sub header only when we parse the first element otherwise we'll print sub header for each field element // sub headers are printed in this position only if column number is exactly 2// table.append(printSubHeaders(subList.toArray(new String[subList.size()]))); } } if (dataHead != null) { //if the data xml contains the main element then get the element contains value inner = GenericUtil.getChildWithName(dataHead, arg.getFirstChildWithName( new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText().replaceAll(" ", "-"), dataNamespace); } if (UIGeneratorConstants.TEXT_FIELD.equals(elementType)) { columnCount = handleTextField(isFilterOperation, markReadonly, hasValue, request, columns, widgetName, table, columnCount, inner, arg, tooltip); } else if (UIGeneratorConstants.DATE_FIELD.equals(elementType)) { columnCount = handleDateField(isFilterOperation, markReadonly, columns, widgetName, table, columnCount, inner, arg, tooltip); } else if (UIGeneratorConstants.OPTION_FIELD.equals(elementType)) { columnCount = handleOptionField(isFilterOperation, markReadonly, request, config, columns, widgetName, table, columnCount, inner, arg, tooltip); } else if (UIGeneratorConstants.CHECKBOX_FIELD.equals(elementType)) { columnCount = handleCheckBox(columns, widgetName, table, columnCount, inner, arg, tooltip); } else if (UIGeneratorConstants.TEXT_AREA_FIELD.equals(elementType)) { columnCount = handleTextArea(isFilterOperation, markReadonly, columns, widgetName, table, columnCount, inner, arg, tooltip); } else if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(elementType)) { inner = handleOptionTextField(request, config, widgetName, dataHead, table, subList, inner, arg, maxOccurs, tooltip); } } } } table.append("</table></div>"); return table.toString(); } private void processElements(OMElement widget, OMElement data, HttpServletRequest request, ServletConfig config, String widgetName, StringBuilder table, List<String> subList) { List<OMElement> dataElements = new ArrayList<OMElement>(); if (data != null) { dataElements = GenericUtil.getChildsWithName(data, widgetName, dataNamespace); } // Here generating map with RXT table name --> Field names --> Values List<Map<String, String>> addedValues = new ArrayList<Map<String, String>>(); int addedItemsCount = addRxtProperties(dataElements, addedValues); boolean isDisplay = false; if (addedItemsCount != 0) { isDisplay = true; } // Generating headers if user not specify the headers if (subList.size() == 0) { addHeaders(widget, subList); } UIComponent addLink = new AddLink(widgetName, widgetName, null, UIGeneratorConstants.ADD_ICON_PATH, widgetName, subList.toArray(new String[subList.size() + 1]), false, null, isDisplay, false); table.append(addLink.generate()); for (int i = 0; i < addedItemsCount; i++) { Iterator argument = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); int a = 0; table.append("<tr>"); while (argument.hasNext()) { OMElement arg = (OMElement) argument.next(); String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String label = null; if (subList.size() == 0) { label = arg.getAttributeValue(new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } } String value = arg.getAttributeValue(new QName(null, UIGeneratorConstants.DEFAULT_ATTRIBUTE)); if (value == null) { String key = GenericUtil.getDataElementName(name); value = addedValues.get(i).get(key); } String elementId = "id_" + widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", "") + "_" + (i + 1); name = name.replaceAll(" ", "") + "_" + (i + 1); boolean isReadOnly = false; if ("true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { isReadOnly = true; } String tooltip = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TOOLTIP_ATTRIBUTE)); if (tooltip == null) { tooltip = ""; } tooltip = StringEscapeUtils.escapeHtml(tooltip); if (UIGeneratorConstants.DATE_FIELD.equals(elementType)) { UIComponent dateField = new DateField(label, name, elementId, null, widgetName, value, isReadOnly, tooltip, false, false); table.append(dateField.generate()); } else if (UIGeneratorConstants.CHECKBOX_FIELD.equals(elementType)) { UIComponent checkBox = new CheckBox(label,name, elementId, widgetName, value, tooltip, false, false); table.append(checkBox.generate()); } else if (UIGeneratorConstants.OPTION_FIELD.equals(elementType)) { List<String> optionValues = getOptionValues(arg, request, config); DropDown dropDown = new DropDown(label, isReadOnly, name, elementId, null, optionValues.toArray( new String[optionValues.size()]), widgetName, value, tooltip, false); table.append(dropDown.generate()); } else if (UIGeneratorConstants.TEXT_AREA_FIELD.equals(elementType)) { int height = -1; int width = 200; String heightString = arg.getAttributeValue(new QName(null, UIGeneratorConstants.HEIGHT_ATTRIBUTE)); if (heightString != null) { try { height = Integer.parseInt(heightString); } catch (NumberFormatException ignored) { } } String widthString = arg.getAttributeValue(new QName(null, UIGeneratorConstants.WIDTH_ATTRIBUTE)); if (widthString != null) { try { width = Integer.parseInt(widthString); } catch (NumberFormatException ignored) { } } UIComponent textArea = new TextArea(label, name, elementId, null, widgetName, value, height, width, isReadOnly, false, tooltip, false, false); table.append(textArea.generate()); } else { boolean isURL = Boolean.toString(true).equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.URL_ATTRIBUTE))); String urlTemplate = arg.getAttributeValue( new QName(null, UIGeneratorConstants.URL_TEMPLATE_ATTRIBUTE)); boolean isPath = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.PATH_ATTRIBUTE))); String startsWith = arg.getAttributeValue(new QName(null, UIGeneratorConstants.PATH_START_WITH)); UIComponent textField = new TextField(label, name, elementId, null, widgetName, value, isURL, urlTemplate, isPath, isReadOnly, true, tooltip, startsWith, request, false); table.append(textField.generate()); } } a++; } table.append(printDeleteWidget(widgetName)); table.append("</tr>"); } table.append(printCloseAddLink(widgetName, addedItemsCount)); } private OMElement handleOptionTextField(HttpServletRequest request, ServletConfig config, String widgetName, OMElement dataHead, StringBuilder table, List<String> subList, OMElement inner, OMElement arg, String maxOccurs, String tooltip) { String optionValue = null; if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(maxOccurs)) { // This is the code segment to run in maxoccur unbounded situation // String addedItems = "0"; // if(dataHead != null){ // addedItems = dataHead.getFirstChildWithName(new QName(null,UIGeneratorConstants.COUNT)).getText(); // } OMElement firstChildWithName = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue(new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } boolean isURL = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.URL_ATTRIBUTE))); String urlTemplate = arg.getAttributeValue(new QName(null, UIGeneratorConstants.URL_TEMPLATE_ATTRIBUTE)); boolean isPath = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.PATH_ATTRIBUTE))); String startsWith = arg.getAttributeValue(new QName(null, UIGeneratorConstants.PATH_START_WITH)); // String addedOptionValues [] = new String[Integer.parseInt(addedItems)]; // String addedValues[] = new String[Integer.parseInt(addedItems)]; List<String> addedOptionValues = new ArrayList<String>(); List<String> addedValues = new ArrayList<String>(); int addedItemsCount = 0; if (dataHead != null) { //if the element contains value is not null get the value // with option-text field we put text value like this text_value.replaceAll(" ","-") addedItemsCount = fillOptionValues(dataHead, addedOptionValues, addedValues); } /* if there are no added items headings of the table will hide,else display */ boolean isDisplay = false; if (addedItemsCount == 0) { isDisplay = false; } else if (addedItemsCount > 0) { isDisplay = true; } UIComponent addLink = new AddLink(label, name, null, UIGeneratorConstants.ADD_ICON_PATH, widgetName, subList.toArray(new String[subList.size() + 1]), isPath, startsWith, isDisplay, false); table.append(addLink.generate()); List<String> optionValues = getOptionValues(arg, request, config); if (addedItemsCount > 0) { // This is the place where we fill already added entries for (int i = 0; i < addedItemsCount; i++) { String addedOptionValue = addedOptionValues.get(i); String addedValue = addedValues.get(i); if (addedOptionValue != null && addedValue != null) { UIComponent optionText = new OptionText(name, (i + 1), null, null, null, optionValues.toArray(new String[optionValues.size()]), widgetName, addedOptionValue, addedValue, isURL, urlTemplate, isPath, tooltip, startsWith, request, false); table.append(optionText.generate()); } } } UIComponent closeAddLink = new CloseAddLink(name, addedItemsCount, false); table.append(closeAddLink.generate()); // add the previously added items and then close the tbody } else { OMElement firstChildWithName = arg.getFirstChildWithName( new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue( new QName(UIGeneratorConstants.ARGUMENT_LABEL)); String value = null; String startsWith = arg.getAttributeValue(new QName(null, UIGeneratorConstants.PATH_START_WITH)); if (label == null) { label = name; } boolean isURL = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.URL_ATTRIBUTE))); String urlTemplate = arg.getAttributeValue( new QName(null, UIGeneratorConstants.URL_TEMPLATE_ATTRIBUTE)); boolean isPath = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.PATH_ATTRIBUTE))); if (dataHead != null) { //if the element contains value is not null get the value // with option-text field we put text value like this text_value.replaceAll(" ","-") inner = GenericUtil.getChildWithName(dataHead, UIGeneratorConstants.TEXT_FIELD + arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(), dataNamespace); if (inner != null) { value = inner.getText(); } OMElement optionValueElement = GenericUtil.getChildWithName(dataHead, arg.getFirstChildWithName( new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(), dataNamespace); if (optionValueElement != null) { optionValue = optionValueElement.getText(); } } List<String> optionValues = getOptionValues(arg, request, config); UIComponent optionText = new OptionText(null, 0, label, name, null, optionValues.toArray( new String[optionValues.size()]), widgetName, optionValue, value, isURL, urlTemplate, isPath, tooltip, startsWith, request, false); table.append(optionText.generate()); } return inner; } private int handleOptionField(boolean isFilterOperation, boolean markReadonly, HttpServletRequest request, ServletConfig config, int columns, String widgetName, StringBuilder table, int columnCount, OMElement inner, OMElement arg, String tooltip) { OMElement firstChildWithName = arg.getFirstChildWithName( new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String mandat = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MANDETORY_ATTRIBUTE)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue( new QName(UIGeneratorConstants.ARGUMENT_LABEL)); String optionValue = null; boolean isReadOnly = false; if (markReadonly && "true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { isReadOnly = true; } if (label == null) { label = name; } if (inner != null) { //if the element contains value is not null get the value optionValue = inner.getText(); } List<String> optionValues = getOptionValues(arg, request, config); if (isFilterOperation) { optionValues.add(0, ""); } if (columns > 2) { if (columnCount == 0) { table.append("<tr>"); } UIComponent dropDown = new DropDown(null, isReadOnly, name, null, null, optionValues.toArray( new String[optionValues.size()]), widgetName, optionValue, tooltip, false); table.append(dropDown.generate()); columnCount++; if (columnCount == columns) { table.append("</tr>"); columnCount = 0; } } else { UIComponent dropDown = new DropDown(label, isReadOnly, name, null, mandat, optionValues.toArray(new String[optionValues.size()]), widgetName, optionValue, tooltip, false); table.append(dropDown.generate()); } return columnCount; } private int handleDateField(boolean isFilterOperation, boolean markReadonly, int columns, String widgetName, StringBuilder table, int columnCount, OMElement inner, OMElement arg, String tooltip) { String mandet = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MANDETORY_ATTRIBUTE)); boolean isReadOnly = false; String value = null; if (markReadonly && "true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { isReadOnly = true; } if (isFilterOperation) { mandet = "false"; } if (inner != null) { //if the element contains value is not null get the value value = inner.getText(); } if (columns > 2) { if (columnCount == 0) { table.append("<tr>"); } UIComponent dateField = new DateField(null, arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(), null, null, widgetName, value, isReadOnly, tooltip, false, false); table.append(dateField.generate()); columnCount++; if (columnCount == columns) { table.append("</tr>"); columnCount = 0; } } else { OMElement firstChildWithName = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue(new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } UIComponent dateField = new DateField(label, name, null, mandet, widgetName, value, isReadOnly, tooltip, true, false); table.append(dateField.generate()); } return columnCount; } private int handleTextField(boolean isFilterOperation, boolean markReadonly, boolean hasValue, HttpServletRequest request, int columns, String widgetName, StringBuilder table, int columnCount, OMElement inner, OMElement arg, String tooltip) { String value; String mandat = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MANDETORY_ATTRIBUTE)); boolean isReadOnly = false; if (markReadonly && "true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { isReadOnly = true; } if (isFilterOperation) { mandat = "false"; } boolean isURL = Boolean.toString(true).equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.URL_ATTRIBUTE))); String urlTemplate = arg.getAttributeValue(new QName(null, UIGeneratorConstants.URL_TEMPLATE_ATTRIBUTE)); boolean isPath = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.PATH_ATTRIBUTE))); String startsWith = arg.getAttributeValue(new QName(null, UIGeneratorConstants.PATH_START_WITH)); if (inner != null) { //if the element contains value is not null get the value value = inner.getText(); } else { value = arg.getAttributeValue(new QName(null, UIGeneratorConstants.DEFAULT_ATTRIBUTE)); } if (columns > 2) { if (columnCount == 0) { table.append("<tr>"); } UIComponent textField = new TextField(null, arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(), null, null, widgetName, value, isURL, urlTemplate, isPath, isReadOnly, hasValue, tooltip, startsWith, request, false); table.append(textField.generate()); columnCount++; if (columnCount == columns) { table.append("</tr>"); columnCount = 0; } } else { OMElement firstChildWithName = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue(new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } UIComponent text = new TextField(label, name, null, mandat, widgetName, value, isURL, urlTemplate, isPath, isReadOnly, hasValue, tooltip, startsWith, request, false); table.append(text.generate()); } return columnCount; } private int handleTextArea(boolean isFilterOperation, boolean markReadonly, int columns, String widgetName, StringBuilder table, int columnCount, OMElement inner, OMElement arg, String tooltip) { String mandet = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MANDETORY_ATTRIBUTE)); String richText = arg.getAttributeValue(new QName(null, UIGeneratorConstants.IS_RICH_TEXT)); String value = null; boolean isReadOnly = false; if (markReadonly && "true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { isReadOnly = true; } boolean isRichText = false; //By default rich text is off if (richText != null) { isRichText = Boolean.valueOf(richText); } if (isFilterOperation) { mandet = "false"; } if (inner != null) { //if the element contains value is not null get the value value = inner.getText(); } int height = -1; int width = -1; String heightString = arg.getAttributeValue(new QName(null, UIGeneratorConstants.HEIGHT_ATTRIBUTE)); if (heightString != null) { try { height = Integer.parseInt(heightString); } catch (NumberFormatException ignored) { } } String widthString = arg.getAttributeValue(new QName(null, UIGeneratorConstants.WIDTH_ATTRIBUTE)); if (widthString != null) { try { width = Integer.parseInt(widthString); } catch (NumberFormatException ignored) { } } if (columns > 2) { if (columnCount == 0) { table.append("<tr>"); } UIComponent textArea = new TextArea(null, arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(), null, null, widgetName, value, height, width, isReadOnly, false, tooltip, true, false); table.append(textArea.generate()); columnCount++; if (columnCount == columns) { table.append("</tr>"); columnCount = 0; } } else { OMElement firstChildWithName = arg.getFirstChildWithName( new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue( new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } UIComponent textArea = new TextArea(label, name, null, mandet, widgetName, value, height, width, isReadOnly, isRichText, tooltip, false, false); table.append(textArea.generate()); } return columnCount; } private int fillOptionValues(OMElement dataHead, List<String> addedOptionValues, List<String> addedValues) { Iterator itemChildIt = dataHead.getChildElements(); int i = 0; while (itemChildIt.hasNext()) { // get all the filled values to the newly added fields Object itemChildObj = itemChildIt.next(); if (!(itemChildObj instanceof OMElement)) { continue; } OMElement itemChildEle = (OMElement) itemChildObj; if (!(itemChildEle.getQName().equals(new QName(dataNamespace, UIGeneratorConstants.ENTRY_FIELD)))) { continue; } String entryText = itemChildEle.getText(); String entryKey = null; String entryVal; int colonIndex = entryText.indexOf(":"); if (colonIndex < entryText.length() - 1) { entryKey = entryText.substring(0, colonIndex); entryText = entryText.substring(colonIndex + 1); } else if (colonIndex == entryText.length() -1) { entryKey = entryText.substring(0, colonIndex); entryText = StringUtils.EMPTY; } entryVal = entryText; if (entryKey != null && !entryKey.equals("")) { addedOptionValues.add(entryKey); } else { addedOptionValues.add("0"); } if (entryVal != null) { addedValues.add(entryVal); } i++; } return i; } private int handleCheckBox(int columns, String widgetName, StringBuilder table, int columnCount, OMElement inner, OMElement arg, String tooltip) { OMElement firstChildWithName = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String name = firstChildWithName.getText(); String label = firstChildWithName.getAttributeValue(new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } String optionValue = null; if (inner != null) { //if the element contains value is not null get the value optionValue = inner.getText(); } if (columns > 1) { if (columnCount == 0) { table.append("<tr>"); } UIComponent checkBox = new CheckBox(label,name, null, widgetName, optionValue, tooltip, true, false); table.append(checkBox.generate()); columnCount++; if (columnCount == columns) { table.append("</tr>"); columnCount = 0; } } else { UIComponent checkBox = new CheckBox(label,name, null, widgetName, optionValue, tooltip, true, false); table.append(checkBox.generate()); } return columnCount; } private int addRxtProperties(List<OMElement> dataElements, List<Map<String, String>> addedValues) { int addedItemsCount = 0; for (int i = 0; i < dataElements.size(); i++) { OMElement dataHeadElements = dataElements.get(i); Iterator itemChildIt = dataHeadElements.getChildElements(); int a = 0; Map<String, String> values = new HashMap<String, String>(); while (itemChildIt.hasNext()) { // get all the filled values to the newly added fields Object itemChildObj = itemChildIt.next(); if (!(itemChildObj instanceof OMElement)) { continue; } OMElement itemChildEle = (OMElement) itemChildObj; values.put(itemChildEle.getLocalName(), itemChildEle.getText()); a++; } addedValues.add(values); addedItemsCount++; } return addedItemsCount; } private void addHeaders(OMElement widget, List<String> subList) { Iterator headerElements = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); while (headerElements.hasNext()) { OMElement arg = (OMElement) headerElements.next(); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String label = arg.getAttributeValue(new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } subList.add(label); } } } public String printMainHeader(String header, int columns) { StringBuilder head = new StringBuilder(); head.append("<thead><tr><th style=\"border-right:0\" colspan=\"" + columns + "\">"); head.append(header); head.append("</th></tr></thead>"); return head.toString(); } public static String printSubHeaders(String[] headers) { StringBuilder subHeaders = new StringBuilder(); subHeaders.append("<tr>"); for (String header : headers) { subHeaders.append("<td class=\"sub-header\">"); subHeaders.append((header == null) ? "" : header); subHeaders.append("</td>"); } subHeaders.append("<td class=\"sub-header\"></td>"); subHeaders.append("</tr>"); return subHeaders.toString(); } public String printCloseAddLink(String name, int count) { name = name.replaceAll("-", ""); name = name.replaceAll(" ", ""); StringBuilder link = new StringBuilder(); link.append("</tbody></table>"); link.append("<input id=\"" + name.replaceAll(" ", "").replaceAll("-", "") + "CountTaker\" type=\"hidden\" value=\"" + count + "\" name=\""); link.append(name.replaceAll(" ", "").replaceAll("-", "") + UIGeneratorConstants.COUNT + "\"/>\n"); link.append("</td></tr>"); return link.toString(); } /* This is the method which extract information from the UI and embedd them to xml using value elements */ public OMElement getDataFromUI(OMElement head, HttpServletRequest request) { OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace namespace = fac.createOMNamespace(dataNamespace, ""); OMElement data = fac.createOMElement(dataElement, namespace); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); OMElement widgetData = fac.createOMElement(GenericUtil.getDataElementName(widgetName), namespace); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; String widgetMaxOccurs = widget.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)); if (widgetMaxOccurs != null) { if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(widgetMaxOccurs)) { String count = request.getParameter(widgetName.replaceAll(" ", "") +UIGeneratorConstants.COUNT); for (int i = 0; i < Integer.parseInt(count); i++) { arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); int a = 0; OMElement entryElement = fac.createOMElement(GenericUtil.getDataElementName(widgetName),namespace); boolean isAllBlank = true; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String elementType = name.replaceAll(" ", ""); String webElement = widgetName.replaceAll(" ", "") + "_" + elementType.replaceAll(" ", "") + "_" + (i + 1); String input = request.getParameter(webElement); //String input2 = request.getParameter(widgetName + "_" + elementType + "_" + (i + 1)); if (input == null) { input = ""; } else { isAllBlank = false; } OMElement innerElemnt = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); innerElemnt.setText(input); entryElement.addChild(innerElemnt); a++; } // widgetData.addChild(entryElement); if (!isAllBlank) { data.addChild(entryElement); } } } }else{ while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(elementType)) { if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals( arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { //implement the new way of extracting data if the maxoccurs unbounded happend in option-text field String count = request.getParameter(name.replaceAll(" ", "") + UIGeneratorConstants.COUNT); for (int i = 0; i < Integer.parseInt(count); i++) { String entryValue = ""; String input = request.getParameter(widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", "") + (i + 1)); if (input != null && !("".equals(input))) { entryValue += input; } entryValue += ":"; String inputTextValue = request.getParameter(widgetName.replaceAll(" ", "") + UIGeneratorConstants.TEXT_FIELD + "_" + name.replaceAll(" ", "") + (i + 1)); if (inputTextValue != null && !("".equals(inputTextValue))) { entryValue += inputTextValue; } if (!":".equals(entryValue)) { OMElement entryElement = fac.createOMElement(UIGeneratorConstants.ENTRY_FIELD, namespace); entryElement.setText(entryValue); widgetData.addChild(entryElement); } } } // if maxoccurs unbounded is not mentioned use the default behaviour else { String input = request.getParameter(widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", "")); if (input != null && !("".equals(input))) { OMElement text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(input); widgetData.addChild(text); } String inputOption = request.getParameter(widgetName.replaceAll(" ", "") + UIGeneratorConstants.TEXT_FIELD + "_" + name.replaceAll(" ", "")); if (inputOption != null && !("".equals(inputOption))) { OMElement value = fac.createOMElement( GenericUtil.getDataElementName(UIGeneratorConstants.TEXT_FIELD + name), namespace); value.setText(inputOption); widgetData.addChild(value); } } } else { String input = request.getParameter(widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", "")); if ("checkbox".equals(elementType) && input == null){ input = "false"; } OMElement text = null; if (input != null && !("".equals(input))) { text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(input); widgetData.addChild(text); } else { if (name.equals("Name") && widgetName.equalsIgnoreCase("overview")) { text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(GovernanceConstants.DEFAULT_SERVICE_NAME); widgetData.addChild(text); } if (name.equals("Namespace")) { text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(UIGeneratorConstants.DEFAULT_NAMESPACE); widgetData.addChild(text); } } } } } data.addChild(widgetData); } } return GenericUtil.addExtraElements(data, request); } public List<Map> getTooltipList(OMElement head) { List<Map> res = new ArrayList<Map>(); List<String> id = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); //check the validation fields and get the id's of them String value = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TOOLTIP_ATTRIBUTE)); if (value != null && !"".equals(value)) { if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(elementType)) { if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals( arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { Map<String, Object> map = new HashMap<String, Object>(); List ids = new ArrayList<String>(); ids.add(widgetName.replaceAll(" ", "_") + "_" + name.replaceAll("" + " ", "-")); ids.add(widgetName.replaceAll(" ", "_") + UIGeneratorConstants .TEXT_FIELD + "_" + name.replaceAll("" + " ", "-")); map.put("ids", ids); map.put("tooltip", value); map.put("properties", "unbounded"); res.add(map); } else { Map<String, Object> map = new HashMap<String, Object>(); List ids = new ArrayList<String>(); ids.add(widgetName.replaceAll(" ", "_") + "_" + name.replaceAll("" + " ", "-")); ids.add(widgetName.replaceAll(" ", "_") + UIGeneratorConstants .TEXT_FIELD + "_" + name.replaceAll("" + " ", "-")); map.put("ids", ids); map.put("tooltip", value); res.add(map); } } else { Map<String, Object> map = new HashMap<String, Object>(); List ids = new ArrayList<String>(); ids.add(widgetName.replaceAll(" ", "_") + "_" + name.replaceAll("" + " ", "-")); map.put("ids", ids); map.put("tooltip", value); res.add(map); } } } } } return res; } public OMElement getDataFromUIForBasicFilter(OMElement head, HttpServletRequest request) { OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace namespace = fac.createOMNamespace(dataNamespace, ""); OMElement data = fac.createOMElement(dataElement, namespace); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); OMElement widgetData = fac.createOMElement(GenericUtil.getDataElementName(widgetName), namespace); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(elementType)) { if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals( arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { continue; } // if maxoccurs unbounded is not mentioned use the default behaviour else { String input = request.getParameter(widgetName.replaceAll(" ", "_") + "_" + name.replaceAll(" ", "-")); if (input != null && !("".equals(input))) { OMElement text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(input); widgetData.addChild(text); } String inputOption = request.getParameter(widgetName.replaceAll(" ", "_") + UIGeneratorConstants.TEXT_FIELD + "_" + name.replaceAll(" ", "-")); if (inputOption != null && !("".equals(inputOption))) { OMElement value = fac.createOMElement( GenericUtil.getDataElementName(UIGeneratorConstants.TEXT_FIELD + name), namespace); value.setText(inputOption); widgetData.addChild(value); } } } else { String input = request.getParameter(widgetName.replaceAll(" ", "_") + "_" + name.replaceAll(" ", "-")); OMElement text = null; if (input != null && !("".equals(input))) { text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(input); widgetData.addChild(text); } else { if (name.equals("Name")) { text = fac.createOMElement(GenericUtil.getDataElementName(name), namespace); text.setText(GovernanceConstants.DEFAULT_SERVICE_NAME); widgetData.addChild(text); } } } } } data.addChild(widgetData); } return GenericUtil.addExtraElements(data, request); } public List<Map> getValidationAttributes(OMElement head) { List<Map> res = new ArrayList<Map>(); List<String> id = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); boolean isUnboundedTable = UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(widget.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT))); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); //check the validation fields and get the id's of them String value = arg.getAttributeValue(new QName(null, UIGeneratorConstants.VALIDATE_ATTRIBUTE)); if (value != null && !"".equals(value)) { if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(elementType)) { if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals( arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { Map<String, Object> map = new HashMap<String, Object>(); List ids = new ArrayList<String>(); ids.add(widgetName.replaceAll(" ", "") + "_" + name.replaceAll("" + " ", "-")); ids.add(widgetName.replaceAll(" ", "_") + UIGeneratorConstants .TEXT_FIELD + "_" + name.replaceAll("" + " ", "-")); map.put("ids", ids); map.put("name", name); map.put("regexp", value); map.put("properties", "unbounded"); res.add(map); } else { Map<String, Object> map = new HashMap<String, Object>(); List ids = new ArrayList<String>(); ids.add(widgetName.replaceAll(" ", "_") + "_" + name.replaceAll("" + " ", "-")); ids.add(widgetName.replaceAll(" ", "_") + UIGeneratorConstants .TEXT_FIELD + "_" + name.replaceAll("" + " ", "-")); map.put("ids", ids); map.put("name", name); map.put("regexp", value); res.add(map); } } else { Map<String, Object> map = new HashMap<String, Object>(); List ids = new ArrayList<String>(); ids.add(widgetName.replaceAll(" ", "") + "_" + name.replaceAll("" + " ", "-")); map.put("ids", ids); map.put("name", name); map.put("regexp", value); map.put("unboundedTable", isUnboundedTable); res.add(map); } } } } } return res; } public String[] getMandatoryIdList(OMElement head) { List<String> id = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); //check the mandatory fields and get the id's of them String mandatory = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MANDETORY_ATTRIBUTE)); if (mandatory != null && "true".equals(mandatory)) { id.add("id_" + widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", "")); } } } } return id.toArray(new String[id.size()]); } public String[] getKeyList(OMElement head, String[] keys) { List<String> id = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String key = widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", ""); if(Arrays.asList(keys).contains(key.toLowerCase())){ id.add(key); } } } } return id.toArray(new String[id.size()]); } public String getLabelValue(OMElement head, String feild) { Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String key = widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", ""); if (feild.toLowerCase().equals(key.toLowerCase())) { String label = null; label = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)) .getAttributeValue( new QName(UIGeneratorConstants.ARGUMENT_LABEL)); if (label == null) { label = name; } return label; } } } } return null; } public String[] getMandatoryNameList(OMElement head) { List<String> name = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { String name_element = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String mandatory = arg.getAttributeValue(new QName(null, UIGeneratorConstants.MANDETORY_ATTRIBUTE)); if (mandatory != null && "true".equals(mandatory)) { name.add(name_element); } } } } return name.toArray(new String[name.size()]); } public String[] getUnboundedTooltipList(OMElement head) { List<String> tooltips = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { //check the unbounded fields and get the names of them if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)))) { //previous check is used to check the max occur unbounded only with option-text fields with other fields it will ignore if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { String tooltip = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TOOLTIP_ATTRIBUTE)); if (tooltip == null) { tooltip = ""; } tooltips.add(tooltip); } } } } } return tooltips.toArray(new String[tooltips.size()]); } public String[] getUnboundedNameList(OMElement head) { List<String> name = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { //check the unbounded fields and get the names of them if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)))) { //previous check is used to check the max occur unbounded only with option-text fields with other fields it will ignore if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { name.add(arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText()); } } } } } return name.toArray(new String[name.size()]); } public String[] getUnboundedWidgetList(OMElement head) { List<String> widgetList = new ArrayList<String>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { //check the unbounded fields and get the widget names of them if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)))) { //previous check is used to check the max occur unbounded only with option-text fields with other fields it will ignore if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { widgetList.add(widget.getAttributeValue(new QName(null, UIGeneratorConstants.WIDGET_NAME))); } } } } } return widgetList.toArray(new String[widgetList.size()]); } public String[][] getDateIdAndNameList(OMElement head, OMElement data, boolean markReadOnly) { List<String[]> result = new ArrayList<String[]>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); String widgetMaxOccurs = widget.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)); OMElement arg = null; if (widgetMaxOccurs != null ){ List<OMElement> dataElements = new ArrayList<OMElement>(); if (data != null) { dataElements = GenericUtil.getChildsWithName(data, widgetName, dataNamespace); } List<String[]> addedValues = new ArrayList<String[]>(); int addedItemsCount = 0; for (int i = 0; i < dataElements.size(); i++) { OMElement dataHeadElements = dataElements.get(i); Iterator itemChildIt = dataHeadElements.getChildElements(); int a = 0; List<String> values = new ArrayList<String>(); while (itemChildIt.hasNext()) { Object itemChildObj = itemChildIt.next(); if (!(itemChildObj instanceof OMElement)) { continue; } OMElement itemChildEle = (OMElement) itemChildObj; values.add(itemChildEle.getText()); a++; } addedValues.add(values.toArray(new String[values.size()])); addedItemsCount++; } for (int i = 0; i < addedItemsCount; i++) { Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { if (UIGeneratorConstants.DATE_FIELD.equals(arg.getAttributeValue(new QName (null, UIGeneratorConstants.TYPE_ATTRIBUTE)))) { if (markReadOnly && "true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { continue; } String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String elementId = widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", "")+"_"+(i+1); String[] idAndName = new String[2]; idAndName[0] = "id_" + elementId; idAndName[1] = name; result.add(idAndName); } } } } } else { Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { if (UIGeneratorConstants.DATE_FIELD.equals(arg.getAttributeValue(new QName (null, UIGeneratorConstants.TYPE_ATTRIBUTE)))) { if (markReadOnly && "true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { continue; } String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); String[] idAndName = new String[2]; idAndName[0] = "id_" + widgetName.replaceAll(" ", "") + "_" + name.replaceAll(" ", ""); idAndName[1] = name; result.add(idAndName); } } } } } return result.toArray(new String[result.size()][2]); } public String[][] getUnboundedValues(OMElement head, HttpServletRequest request, ServletConfig config) { List<String[]> values = new ArrayList<String[]>(); Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { //check the unbounded fields and get the values of drop-down in option-text type if (UIGeneratorConstants.OPTION_TEXT_FIELD.equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)))) { //previous check is used to check the max occur unbounded only with option-text fields with other fields it will ignore if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals( arg.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)))) { List<String> inner = getOptionValues(arg, request, config); values.add(inner.toArray(new String[inner.size()])); } } } } } return values.toArray(new String[0][0]); } private List<String> getOptionValues(OMElement arg, HttpServletRequest request, ServletConfig config) { OMElement values = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.OPTION_VALUES)); Iterator iterator = values.getChildrenWithLocalName(UIGeneratorConstants.OPTION_VALUE); List<String> inner = new ArrayList<String>(); if (iterator != null && iterator.hasNext()) { while (iterator.hasNext()) { inner.add(((OMElement) iterator.next()).getText()); } return inner; } else { try { String className = values.getAttributeValue(new QName(null, UIGeneratorConstants.OPTION_VALUE_CLASS)); ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class<?> populatorClass = Class.forName(className, true, loader); DropDownDataPopulator populator = (DropDownDataPopulator) populatorClass.newInstance(); String[] list = populator.getList(request, config); return new ArrayList<String>(Arrays.asList(list)); } catch (ClassNotFoundException e) { log.error("Unable to load populator class", e); } catch (InstantiationException e) { log.error("Unable to load populator class", e); } catch (IllegalAccessException e) { log.error("Unable to load populator class", e); } } return inner; } public String getUnboundedWidgets(OMElement head, HttpServletRequest request, ServletConfig config) { Iterator it = head.getChildrenWithName(new QName(UIGeneratorConstants.WIDGET_ELEMENT)); StringBuilder builder = new StringBuilder(); while (it.hasNext()) { OMElement widget = (OMElement) it.next(); String widgetMaxOccurs = widget.getAttributeValue(new QName(null, UIGeneratorConstants.MAXOCCUR_ELEMENT)); String widgetName = widget.getAttributeValue(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)); if(widgetMaxOccurs != null){ if (UIGeneratorConstants.MAXOCCUR_UNBOUNDED.equals(widgetMaxOccurs)) { builder.append("function add"+widgetName.replaceAll(" ", "") + "_" + widgetName.replaceAll(" ", "")+"(){"); widgetName = widgetName.replaceAll(" ", ""); builder.append("var endpointMgt = document.getElementById('"+widgetName+"Mgt');"); builder.append("endpointMgt.parentNode.style.display = '';"); builder.append("var epCountTaker = document.getElementById('"+widgetName+"CountTaker'); "); builder.append("var "+widgetName+"Count = parseInt(epCountTaker.value);"); builder.append(""+widgetName+"Count++;"); builder.append("epCountTaker.value = "+widgetName+"Count;"); builder.append("var theTr = document.createElement('TR');"); Iterator arguments = widget.getChildrenWithLocalName(UIGeneratorConstants.ARGUMENT_ELMENT); OMElement arg = null; int a = 0; boolean isDateFieldAdded = false; while (arguments.hasNext()) { arg = (OMElement) arguments.next(); String elementType = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TYPE_ATTRIBUTE)); boolean isReadOnly = false; if ("true".equals(arg.getAttributeValue(new QName(null, UIGeneratorConstants.READONLY_ATTRIBUTE)))) { isReadOnly = true; } String tooltip = arg.getAttributeValue(new QName(null, UIGeneratorConstants.TOOLTIP_ATTRIBUTE)); if (tooltip == null) { tooltip = ""; } tooltip = StringEscapeUtils.escapeHtml(tooltip); String name = arg.getFirstChildWithName(new QName(null, UIGeneratorConstants.ARGUMENT_NAME)).getText(); if (UIGeneratorConstants.ARGUMENT_ELMENT.equals(arg.getLocalName())) { builder.append("var theTd"+a+" = document.createElement('TD');"); builder.append("var rowId = '"+widgetName+"Count"+elementType+"_"+a+"_'+(epCountTaker.value -1);"); if(UIGeneratorConstants.DATE_FIELD.equals(elementType)){ UIComponent dateField = new DateField(null,name, null, null,widgetName, null, false, tooltip,false,true); builder.append("theTd"+a+".innerHTML = '" + dateField.generate() + "';"); isDateFieldAdded = true; } else if (UIGeneratorConstants.CHECKBOX_FIELD.equals(elementType)) { UIComponent checkBox = new CheckBox(name, name, null, widgetName, null,tooltip,false,true); builder.append("theTd"+a+".innerHTML = '" + checkBox.generate() + "';"); } else if (UIGeneratorConstants.OPTION_FIELD.equals(elementType)) { String startsWith = arg.getAttributeValue(new QName(null,UIGeneratorConstants.PATH_START_WITH)); List<String> optionValues = getOptionValues(arg, request, config); DropDown dropDown = new DropDown(null, isReadOnly, name, null, null,optionValues.toArray(new String[optionValues.size()]), widgetName, null, tooltip,true); builder.append("theTd"+a+".innerHTML = '" + dropDown.generate() + "';"); }else if (UIGeneratorConstants.TEXT_AREA_FIELD.equals(elementType)) { int height = -1; int width = 200; String heightString = arg.getAttributeValue(new QName(null, UIGeneratorConstants.HEIGHT_ATTRIBUTE)); if (heightString != null) { try { height = Integer.parseInt(heightString); } catch (NumberFormatException ignored) { } } String widthString = arg.getAttributeValue(new QName(null, UIGeneratorConstants.WIDTH_ATTRIBUTE)); if (widthString != null) { try { width = Integer.parseInt(widthString); } catch (NumberFormatException ignored) { } } UIComponent textArea = new TextArea(null, name, null, null, widgetName, null, height, width, isReadOnly, false, tooltip, false,true); builder.append("theTd"+a+".innerHTML = '" + textArea.generate() + "';"); } else { boolean isURL = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.URL_ATTRIBUTE))); String urlTemplate = arg.getAttributeValue( new QName(null, UIGeneratorConstants.URL_TEMPLATE_ATTRIBUTE)); boolean isPath = Boolean.toString(true).equals(arg.getAttributeValue( new QName(null, UIGeneratorConstants.PATH_ATTRIBUTE))); String startsWith = arg.getAttributeValue(new QName(null,UIGeneratorConstants.PATH_START_WITH)); UIComponent textArea = new TextField(null, name, null, null, widgetName, null, isURL, urlTemplate, isPath, isReadOnly, false, tooltip, startsWith, request,true); builder.append("theTd"+a+".innerHTML = '" + textArea.generate() + "';"); } //check the unbounded fields and get the widget names of them builder.append("theTr.appendChild(theTd"+a+");"); } a++; } builder.append("var theTddelete = document.createElement('TD');"); builder.append("var td3Inner = '<a class=\"icon-link\" title=\"delete\" onclick=\"delete"+widgetName+"_"+widgetName+"(this.parentNode.parentNode.rowIndex)\" style=\"background-image:url(../admin/images/delete.gif);\">Delete</a>';"); builder.append("theTddelete.innerHTML = td3Inner;"); builder.append("theTr.appendChild(theTddelete);"); builder.append("var dateArr = new Array();"); builder.append("var dateArrSize = 0;"); /*Following code segment contains a loop to make ids and names of elements appearing * in the row, unique. * The way they are made unique is for "_' + "+widgetName+"Count is appended * to each name and id.*/ builder.append("jQuery('*',theTr).each(function(){"); builder.append("var idAttr = jQuery(this).attr('id');"); builder.append("if (typeof idAttr !== typeof undefined && idAttr !== false && idAttr != \"\") {"); builder.append("idAttr = jQuery(this).attr('id') + '_' + "); builder.append(widgetName); builder.append("Count;"); builder.append("var jdateId = '#' + jQuery(this).id;"); builder.append("if (theTr.innerHTML.indexOf(jdateId) !== -1) {"); builder.append("dateArr[dateArrSize] = idAttr;"); builder.append("dateArrSize++;"); builder.append("}"); builder.append("jQuery(this).attr('id',idAttr);"); builder.append("}"); builder.append("var nameAttr = jQuery(this).attr('name');"); builder.append("if (typeof nameAttr !== typeof undefined && "); builder.append("nameAttr !== false && nameAttr != \"\") {"); builder.append("nameAttr = jQuery(this).attr('name') +'_'+ "); builder.append(widgetName); builder.append("Count;"); builder.append("jQuery(this).attr('name',nameAttr);"); builder.append("}"); builder.append("});"); builder.append("endpointMgt.appendChild(theTr);"); if(isDateFieldAdded){ builder.append("for (var i = 0; i < dateArr.length; ++i) {var elementId = dateArr[i];var datePickValue = \"#\"+elementId;jQuery(datePickValue).datepicker();}"); } builder.append("}"); builder.append("function delete"+widgetName+"_"+widgetName+"(index){"); builder.append("var endpointMgt = document.getElementById('"+widgetName+"Mgt');"); builder.append("endpointMgt.parentNode.style.display = '';"); builder.append("endpointMgt.parentNode.deleteRow(index);"); builder.append("var table = endpointMgt.parentNode;"); builder.append("var rows = table.getElementsByTagName('input');"); builder.append("if (rows != null & rows.length == 0) {"); builder.append(" endpointMgt.parentNode.style.display = 'none';"); builder.append("}"); builder.append("}"); } } } return builder.toString(); } public String printWidget(String widget,String values,String id) { StringBuilder content = new StringBuilder(); if(UIGeneratorConstants.DATE_FIELD.equals(widget)){ content.append("<td><a class=\"icon-link\" style=\"background-image: url( ../admin/images/calendar.gif);\" onclick=\"jQuery('#" + id + "').datepicker( 'show' );\" href=\"javascript:void(0)\"></a>"); content.append("<input type=\"text\" name=\"" + id + "\" value=\""+ values +"\" id=\"" + id + "\" style=\"width:200px\"/></td>"); } else if(UIGeneratorConstants.TEXT_AREA_FIELD.equals(widget)){ content.append("<td><textarea type=\"text\" name=\"" + id + "\" id=\"" + id + "\" style=\"width:200px\">"+ values +"</textarea></td>"); } else if(UIGeneratorConstants.TEXT_FIELD.equals(widget)){ content.append("<td><input type=\"text\" name=\"" + id + "\" value=\""+ values +"\" id=\"" + id + "\" style=\"width:200px\"/></td>"); } else if(UIGeneratorConstants.CHECKBOX_FIELD.equals(widget)){ content.append("<td><input type=\"checkbox\" name=\"" + id + "\" value=\""+ values +"\" id=\"" + id + "\" style=\"width:200px\"/></td>"); } else{ content.append("<td><input type=\"text\" name=\"" + id + "\" value=\""+ values +"\" id=\"" + id + "\" style=\"width:200px\"/></td>"); } return content.toString(); } public String printTextFieldX(String id, String mandatory,boolean isPath, boolean isReadOnly, String tooltip, String startsWith,String value, HttpServletRequest request) { StringBuilder element = new StringBuilder(); String selectResource = ""; if (isPath) { if (startsWith != null) { selectResource = " <input type=\"button\" class=\"button\" value=\"..\" title=\"" + CarbonUIUtil.geti18nString("select.path", "org.wso2.carbon.governance.services.ui.i18n.Resources", request.getLocale()) + "\" onclick=\"showGovernanceResourceTreeWithCustomPath('" + id + "' ,'" + startsWith + "');\"/>"; } else { selectResource = " <input type=\"button\" class=\"button\" value=\"..\" title=\"" + CarbonUIUtil.geti18nString("select.path", "org.wso2.carbon.governance.services.ui.i18n.Resources", request.getLocale()) + "\" onclick=\"showGovernanceResourceTree('" + id + "');\"/>"; } } if ("true".equals(mandatory)) { element.append("<td><span class=\"required\">*</span><input type=\"text\" name=\"" + id + "\" title=\"" + tooltip + "\" id=\"" + id + "\" " + (value != null ? "value=\"" + value + "\"" :"") +" style=\"width:" + UIGeneratorConstants .DEFAULT_WIDTH+ "px\"" + (isReadOnly ? " readonly" : "") + "/>" + (isPath ? selectResource : "") + "</td>"); } else { element.append("<td><input type=\"text\" name=\"" + id + "\" title=\"" + tooltip + "\" id=\"" + id + "\" " + (value != null ? "value=\"" + value + "\"" :"") +" style=\"width:" + (value != null ? "value=\"" + value + "\"" :"") + UIGeneratorConstants .DEFAULT_WIDTH+ "px\"" + (isReadOnly ? " readonly" : "") + "/>" + (isPath ? selectResource : "") + "</td>"); } return element.toString(); } public String printDateFeild(String id, String value, boolean isReadOnly,String tooltip) { StringBuilder element = new StringBuilder(); value = StringEscapeUtils.escapeHtml(value); element.append("<td>"); if (!isReadOnly) { element.append("<a class=\"icon-link\" style=\"background-image: " + "url( ../admin/images/calendar.gif);\" onclick=\"jQuery('#" + id + "')" + ".datepicker( 'show' );\" href=\"javascript:void(0)\"></a>"); } element.append("<input type=\"text\" name=\"" + id + "\" title=\"" + tooltip + "\" style=\"width:" + UIGeneratorConstants.DATE_WIDTH + "px\"" + (isReadOnly ? " readonly" : "") + " id=\"" + id + "\" " + "value=\"" + value + "\" />" + "</td>"); return element.toString(); } public String printDropDownFeild(String id, String[] values,String value, String tooltip) { StringBuilder dropDown = new StringBuilder(); dropDown.append("<td><select id=\"id_" + id + "\" " + "name=\"" + id + "\" title=\"" + tooltip + "\">"); for (int i = 0; i < values.length; i++) { dropDown.append("<option value=\"" + StringEscapeUtils.escapeHtml(values[i]) + "\""); if (values[i].equals(value)) { dropDown.append(" selected>"); } else { dropDown.append(">"); } dropDown.append(StringEscapeUtils.escapeHtml(values[i])); dropDown.append("</option>"); } dropDown.append("</select></td>"); return dropDown.toString(); } public String printCheckboxFeild(String id, String value, String tooltip) { if (Boolean.toString(true).equals(value)) { return "<td><input type=\"checkbox\" checked=\"checked\" name=\"" + id + "\" value=\"true\" title=\"" + tooltip + "\"/></td>"; } else { return "<td><input type=\"checkbox\" name=\"" + id + "\" value=\"true\" title=\"" + tooltip + "\"/></td>"; } } public String printDeleteWidget(String widget) { StringBuilder content = new StringBuilder(); content.append("<td><a class=\"icon-link\" title=\"delete\" onclick=\"delete"+widget.replaceAll(" ", "")+"_"+widget.replaceAll(" ", "")+"(this.parentNode.parentNode.rowIndex)\" style=\"background-image:url(../admin/images/delete.gif);\">Delete</a></td>"); return content.toString(); } }