package sushi.application.pages.querying; import java.util.ArrayList; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.form.Form; import sushi.application.components.form.BlockingAjaxButton; import sushi.event.SushiEventType; import sushi.event.attribute.SushiAttribute; import sushi.query.SushiQuery; import sushi.query.SushiQueryTypeEnum; import com.espertech.esper.client.EPException; /** * This page enables the creation and modification of Live @see SushiQuery */ public class LiveQueryEditor extends QueryEditor { private static final long serialVersionUID = 1L; private static final String LIVE_QUERY_HELP_TEXT = "Live Queries are either asked from the eventtypes" + lineBreak + "or defined by a pattern. " + lineBreak + lineBreak + "Example-Query:" + lineBreak + "SELECT ValueName, Timestamp" + lineBreak + "FROM EventType" + lineBreak + "WHERE eventType = 'ValueNameX'" + lineBreak + lineBreak + "Example-Query for Patterns:" + lineBreak + "SELECT A.Value1, B.Value2 Timestamp" + lineBreak + "FROM Pattern[ every A=EventType1 " + lineBreak + "-> B=EventType2(A.Value1 = B.Value1)]" + lineBreak + lineBreak + "Other useful constructs might be: and, or, not" + lineBreak; private BlockingAjaxButton showQueryLogButton; private AjaxButton editQueryButton, deleteQueryButton, saveQueryButton; public LiveQueryEditor() { super(); helpText = LIVE_QUERY_HELP_TEXT; updateQueryListChoice(); buildMainLayout(); buildFinalLayout(); } private void updateQueryListChoice() { queryTitles = sushiEsper.getAllLiveQueryTitles(); if (!queryTitles.isEmpty()) { selectedQueryTitle = queryTitles.get(0); } } private void buildFinalLayout() { saveQueryButton = new AjaxButton("saveQueryButton") { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); try { String queryTitle = (String)queryNameTextField.getValue(); if (queryTitle.isEmpty()) { getFeedbackPanel().error("Please specify a name for the query!"); target.add(getFeedbackPanel()); return; } SushiQuery liveQuery = SushiQuery.findQueryByTitle(queryTitle); if (liveQuery == null){ liveQuery = new SushiQuery(queryTitle, query, SushiQueryTypeEnum.LIVE); sushiEsper.addLiveQuery(liveQuery); queryTitles.add(queryTitle); } liveQuery.setQueryString(query); liveQuery.save(); //set input fields to null textFieldDefaultValues.setQueryNameTextField(""); query = ""; target.add(queryListChoice); target.add(queryNameTextField); target.add(queryTextArea); } catch (EPException e) { getFeedbackPanel().error(e.getMessage()); target.add(getFeedbackPanel()); } } }; layoutForm.add(saveQueryButton); editQueryButton = new AjaxButton("editQueryButton") { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); String queryTitle = selectedQueryTitle; textFieldDefaultValues.setQueryNameTextField(queryTitle); query = sushiEsper.getLiveQueryByTitle(queryTitle).getQueryString(); updateQueryListChoice(); target.add(queryNameTextField); target.add(queryTextArea); target.add(queryListChoice); } }; layoutForm.add(editQueryButton); deleteQueryButton = new AjaxButton("deleteQueryButton") { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); String queryTitle = selectedQueryTitle; if (!queryTitle.isEmpty()) { sushiEsper.removeLiveQuery((String) queryTitle); queryTitles.remove(queryTitle); target.add(queryListChoice); } } }; layoutForm.add(deleteQueryButton); showQueryLogButton = new BlockingAjaxButton("showQueryLogButton", layoutForm) { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); String queryTitle = selectedQueryTitle; queryResult = (sushiEsper.getListenerByName(queryTitle)).getLog(); target.add(queryResultTextArea); } }; layoutForm.add(showQueryLogButton); } /** * creates a preview of the registered events and their attributes for easier query formulation */ @Override protected ArrayList<SushiAttribute> generateNodesOfEventTypeTree() { ArrayList<SushiAttribute> treeElements = new ArrayList<SushiAttribute>(); List<SushiEventType> eventTypes = SushiEventType.findAll(); for (SushiEventType eventType : eventTypes) { SushiAttribute eventTypeRootElement = new SushiAttribute(eventType.getTypeName()); treeElements.add(eventTypeRootElement); List<SushiAttribute> rootAttributes = eventType.getRootLevelValueTypes(); for (SushiAttribute rootAttribute : rootAttributes) { rootAttribute.setParent(eventTypeRootElement); } } return treeElements; } }