package sushi.application.pages.transformation.patternbuilder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolbar; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.extensions.markup.html.repeater.tree.table.TreeColumn; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import sushi.application.components.form.WarnOnExitForm; import sushi.application.components.tree.SushiAttributeTreeExpansion; import sushi.application.components.tree.SushiAttributeTreeExpansionModel; import sushi.application.components.tree.SushiAttributeTreeProvider; import sushi.application.components.tree.SushiLabelTreeTable; import sushi.application.pages.transformation.AdvancedTransformationRuleEditorPanel; import sushi.application.pages.transformation.patternbuilder.model.AttributeSelectionPanel; import sushi.event.SushiEventType; import sushi.event.attribute.SushiAttribute; import sushi.event.attribute.SushiAttributeTypeEnum; import sushi.transformation.element.externalknowledge.ExternalKnowledgeExpressionSet; public class AttributeTreePanel extends Panel { private static final long serialVersionUID = -3517674159437927655L; private Form<Void> layoutForm; private DropDownChoice<SushiEventType> eventTypeDropDownChoice; private SushiAttributeTreeProvider attributeTreeTableProvider; private SushiLabelTreeTable<SushiAttribute, String> attributeTreeTable; private AdvancedTransformationRuleEditorPanel advancedRuleEditorPanel; private Map<String, String> attributeIdentifiersAndExpressions; private Map<String, ExternalKnowledgeExpressionSet> attributeIdentifiersWithExternalKnowledge; public AttributeTreePanel(String id, final AdvancedTransformationRuleEditorPanel advancedRuleEditorPanel) { super(id); this.advancedRuleEditorPanel = advancedRuleEditorPanel; attributeIdentifiersAndExpressions = new HashMap<String, String>(); attributeIdentifiersWithExternalKnowledge = new HashMap<String, ExternalKnowledgeExpressionSet>(); layoutForm = new WarnOnExitForm("layoutForm"); add(layoutForm); buildEventTypeDropDownChoice(); buildAttributeTreeTable(); } private void buildEventTypeDropDownChoice() { List<SushiEventType> eventTypes = SushiEventType.findAll(); eventTypeDropDownChoice = new DropDownChoice<SushiEventType>("eventTypeDropDownChoice", new Model<SushiEventType>(), eventTypes); eventTypeDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { if (eventTypeDropDownChoice.getModelObject() != null) { List<SushiAttribute> rootAttributes = new ArrayList<SushiAttribute>(); SushiAttribute timestampAttribute = new SushiAttribute(eventTypeDropDownChoice.getModelObject().getTimestampName(), SushiAttributeTypeEnum.DATE); timestampAttribute.setTimestamp(true); rootAttributes.add(timestampAttribute); rootAttributes.addAll(eventTypeDropDownChoice.getModelObject().getRootLevelValueTypes()); attributeTreeTableProvider = new SushiAttributeTreeProvider(rootAttributes); attributeIdentifiersAndExpressions.keySet().clear(); attributeIdentifiersAndExpressions.put("Timestamp", ""); for (String attributeIdentifier : eventTypeDropDownChoice.getModelObject().getAttributeExpressionsWithoutTimestampName()) { attributeIdentifiersAndExpressions.put(attributeIdentifier, ""); } renderOrUpdateAttributeTreeTable(); target.add(attributeTreeTable); } else { attributeTreeTableProvider = new SushiAttributeTreeProvider(); renderOrUpdateAttributeTreeTable(); target.add(attributeTreeTable); } } }); eventTypeDropDownChoice.setOutputMarkupId(true); layoutForm.add(eventTypeDropDownChoice); } private void buildAttributeTreeTable() { attributeTreeTableProvider = new SushiAttributeTreeProvider(); renderOrUpdateAttributeTreeTable(); } public DropDownChoice<SushiEventType> getEventTypeDropDownChoice() { return eventTypeDropDownChoice; } public SushiEventType getSelectedEventType() { return eventTypeDropDownChoice.getModelObject(); } public void setSelectedEventType(SushiEventType selectedEventType) { eventTypeDropDownChoice.setChoices(SushiEventType.findAll()); eventTypeDropDownChoice.setModelObject(selectedEventType); } public Map<String, String> getAttributeIdentifiersAndExpressions() { return attributeIdentifiersAndExpressions; } public SushiLabelTreeTable<SushiAttribute, String> getAttributeTreeTable() { return attributeTreeTable; } public SushiAttributeTreeProvider getAttributeTreeTableProvider() { return attributeTreeTableProvider; } public void setAttributeTreeTableProvider(SushiAttributeTreeProvider attributeTreeTableProvider) { this.attributeTreeTableProvider = attributeTreeTableProvider; } public Map<String, ExternalKnowledgeExpressionSet> getAttributeIdentifiersWithExternalKnowledge() { return attributeIdentifiersWithExternalKnowledge; } public void setAttributeIdentifiersWithExternalKnowledge(Map<String, ExternalKnowledgeExpressionSet> attributeIdentifiersWithExternalKnowledge) { this.attributeIdentifiersWithExternalKnowledge = attributeIdentifiersWithExternalKnowledge; } private void renderOrUpdateAttributeTreeTable() { List<IColumn<SushiAttribute, String>> columns = createColumns(); attributeTreeTable = new SushiLabelTreeTable<SushiAttribute, String>( "attributeTreeTable", columns, attributeTreeTableProvider, Integer.MAX_VALUE, new SushiAttributeTreeExpansionModel()); attributeTreeTable.setOutputMarkupId(true); SushiAttributeTreeExpansion.get().expandAll(); attributeTreeTable.getTable().addTopToolbar(new HeadersToolbar<String>(attributeTreeTable.getTable(), attributeTreeTableProvider)); layoutForm.addOrReplace(attributeTreeTable); } public void updateAttributeTreeTable(AjaxRequestTarget target, Map<String, String> attributeIdentifiersAndExpressions, Map<String, ExternalKnowledgeExpressionSet> attributeIdentifiersWithExternalKnowledge) { List<SushiAttribute> rootAttributes = new ArrayList<SushiAttribute>(); SushiAttribute timestampAttribute = new SushiAttribute(eventTypeDropDownChoice.getModelObject().getTimestampName(), SushiAttributeTypeEnum.DATE); timestampAttribute.setTimestamp(true); rootAttributes.add(timestampAttribute); rootAttributes.addAll(eventTypeDropDownChoice.getModelObject().getRootLevelValueTypes()); attributeTreeTableProvider = new SushiAttributeTreeProvider(rootAttributes); this.attributeIdentifiersAndExpressions = attributeIdentifiersAndExpressions; this.attributeIdentifiersWithExternalKnowledge = attributeIdentifiersWithExternalKnowledge; renderOrUpdateAttributeTreeTable(); target.add(attributeTreeTable); } private List<IColumn<SushiAttribute, String>> createColumns() { List<IColumn<SushiAttribute, String>> columns = new ArrayList<IColumn<SushiAttribute, String>>(); columns.add(new PropertyColumn<SushiAttribute, String>(Model.of("ID"), "ID")); columns.add(new TreeColumn<SushiAttribute, String>(Model.of("Attributes"))); columns.add(new AbstractColumn<SushiAttribute, String>(new Model("Select")) { @Override public void populateItem(Item cellItem, String componentId, IModel rowModel) { SushiAttribute attribute = ((SushiAttribute) rowModel.getObject()); cellItem.add(new AttributeSelectionPanel(componentId, attribute, attributeIdentifiersAndExpressions, attributeIdentifiersWithExternalKnowledge, advancedRuleEditorPanel.getPatternBuilderPanel())); } }); return columns; } public void clear(AjaxRequestTarget target) { eventTypeDropDownChoice.setModelObject(null); target.add(eventTypeDropDownChoice); attributeTreeTableProvider = new SushiAttributeTreeProvider(new ArrayList<SushiAttribute>()); attributeIdentifiersAndExpressions.keySet().clear(); renderOrUpdateAttributeTreeTable(); target.add(attributeTreeTable); } }