001 package org.hackystat.projectbrowser.page.telemetry.datapanel; 002 003 import java.util.List; 004 import org.apache.wicket.AttributeModifier; 005 import org.apache.wicket.markup.html.WebComponent; 006 import org.apache.wicket.markup.html.basic.Label; 007 import org.apache.wicket.markup.html.form.CheckBox; 008 import org.apache.wicket.markup.html.form.Form; 009 import org.apache.wicket.markup.html.form.TextField; 010 import org.apache.wicket.markup.html.link.BookmarkablePageLink; 011 import org.apache.wicket.markup.html.list.ListItem; 012 import org.apache.wicket.markup.html.list.ListView; 013 import org.apache.wicket.markup.html.panel.Panel; 014 import org.apache.wicket.model.IModel; 015 import org.apache.wicket.model.Model; 016 import org.apache.wicket.model.PropertyModel; 017 import org.hackystat.projectbrowser.googlechart.GoogleChart; 018 import org.hackystat.projectbrowser.imageurl.ImageUrl; 019 import org.hackystat.projectbrowser.page.popupwindow.PopupWindowPanel; 020 import org.hackystat.projectbrowser.page.telemetry.TelemetryPage; 021 import org.hackystat.projectbrowser.page.telemetry.TelemetrySession; 022 import org.hackystat.sensorbase.resource.projects.jaxb.Project; 023 import org.hackystat.telemetry.service.resource.chart.jaxb.TelemetryPoint; 024 025 /** 026 * Panel for showing telemetry content. 027 * 028 * @author Shaoxuan Zhang 029 * 030 */ 031 public class TelemetryDataPanel extends Panel { 032 /** Support serialization. */ 033 private static final long serialVersionUID = 1L; 034 /** TelemetrySession that hold the page state. */ 035 TelemetrySession session; 036 037 /** 038 * @param id the wicket component id. 039 * @param s the TelemetrySession. 040 */ 041 public TelemetryDataPanel(String id, TelemetrySession s) { 042 super(id); 043 this.session = s; 044 IModel dataModel = new PropertyModel(session, "dataModel"); 045 046 BookmarkablePageLink restLink = new BookmarkablePageLink("restLink", TelemetryPage.class, 047 session.getPageParameters()); 048 049 // restLink.add(new Label("restLinkLabel", new Model(restLink))); 050 add(restLink); 051 052 Form streamForm = new Form("streamForm") { 053 /** Support serialization. */ 054 private static final long serialVersionUID = 1L; 055 056 @Override 057 public void onSubmit() { 058 if (session.getDataModel().isSizeWithinRange()) { 059 if (!session.getDataModel().updateSelectedChart()) { 060 session.setFeedback("Failed to get a chart image. " 061 + " Please check to make sure you've selected at least one stream!"); 062 } 063 } 064 else { 065 session.setFeedback( 066 "The size of the chart cannot be greater than " + GoogleChart.MAX_SIZE); 067 } 068 } 069 }; 070 add(streamForm); 071 // table headers 072 add(new Label("telemetryName", new PropertyModel(dataModel, "telemetryName"))); 073 074 ListView dateList = new ListView("dateList", new PropertyModel(dataModel, "dateList")) { 075 /** Support serialization. */ 076 public static final long serialVersionUID = 1L; 077 078 @Override 079 protected void populateItem(ListItem item) { 080 String dateString = (String) item.getModelObject(); 081 item.add(new Label("date", dateString)); 082 } 083 }; 084 streamForm.add(dateList); 085 086 // checkbox to select stream to display 087 streamForm.add(new CheckBox("selectAll", new Model()) { 088 /** Support serialization. */ 089 public static final long serialVersionUID = 1L; 090 091 @Override 092 protected void onSelectionChanged(java.lang.Object newSelection) { 093 session.getDataModel().changeSelectionForAll((Boolean) newSelection); 094 } 095 096 @Override 097 protected boolean wantOnSelectionChangedNotifications() { 098 return true; 099 } 100 }); 101 102 // stream data 103 ListView projectTable = new ListView("projectTable", new PropertyModel(dataModel, 104 "selectedProjects")) { 105 /** Support serialization. */ 106 public static final long serialVersionUID = 1L; 107 108 @Override 109 protected void populateItem(ListItem item) { 110 Project project = (Project) item.getModelObject(); 111 Label projectNameLabel = new Label("projectName", project.getName()); 112 List<SelectableTelemetryStream> streamList = session.getDataModel().getTelemetryStream( 113 project); 114 projectNameLabel.add(new AttributeModifier("rowspan", new Model(streamList.size() + 1))); 115 item.add(projectNameLabel); 116 117 ListView projectStream = new ListView("projectStream", streamList) { 118 /** Support serialization. */ 119 public static final long serialVersionUID = 1L; 120 121 @Override 122 protected void populateItem(ListItem item) { 123 SelectableTelemetryStream stream = (SelectableTelemetryStream) item.getModelObject(); 124 String streamName = stream.getTelemetryStream().getName(); 125 String streamUnit = stream.getTelemetryStream().getYAxis().getUnits(); 126 127 item.add(new CheckBox("streamCheckBox", new PropertyModel(stream, "selected"))); 128 item.add(new Label("streamName", streamName)); 129 item.add(new Label("streamUnit", streamUnit)); 130 131 /* 132 * WebComponent streamMarker = new WebComponent("streamMarker"); streamMarker.add(new 133 * AttributeModifier("src", true, new PropertyModel(stream, "markerImageUrl"))); 134 * item.add(streamMarker); 135 */ 136 137 item.add(new ImageUrl("streamMarker", stream.getMarkerImageUrl())); 138 139 ListView streamData = new ListView("streamData", stream.getTelemetryStream() 140 .getTelemetryPoint()) { 141 /** Support serialization. */ 142 public static final long serialVersionUID = 1L; 143 144 @Override 145 protected void populateItem(ListItem item) { 146 TelemetryPoint point = (TelemetryPoint) item.getModelObject(); 147 String value = point.getValue(); 148 if (value == null) { 149 item.add(new Label("data", "N/A")); 150 } 151 else { 152 int i = value.indexOf('.'); 153 if (i > 0 && (i + 2) < value.length()) { 154 value = value.substring(0, i + 2); 155 } 156 item.add(new Label("data", value)); 157 } 158 } 159 }; 160 item.add(streamData); 161 } 162 }; 163 item.add(projectStream); 164 } 165 }; 166 streamForm.add(projectTable); 167 168 streamForm.add(new TextField("width", new PropertyModel(dataModel, "width"))); 169 streamForm.add(new TextField("height", new PropertyModel(dataModel, "height"))); 170 171 // add the selected chart. 172 WebComponent selectedchartUrl = new WebComponent("selectedChart") { 173 public static final long serialVersionUID = 1L; 174 175 @Override 176 public boolean isVisible() { 177 return !session.getDataModel().isChartEmpty(); 178 } 179 }; 180 selectedchartUrl.add(new AttributeModifier("src", true, new PropertyModel(dataModel, 181 "selectedChart"))); 182 add(selectedchartUrl); 183 184 PopupWindowPanel selectedchartUrlWindow = new PopupWindowPanel("selectedChartUrlWindow", 185 "Google Chart URL") { 186 /** Support serialization. */ 187 public static final long serialVersionUID = 1L; 188 189 @Override 190 public boolean isVisible() { 191 return !session.getDataModel().isChartEmpty(); 192 } 193 }; 194 selectedchartUrlWindow.getModalWindow().setContent( 195 new Label(selectedchartUrlWindow.getModalWindow().getContentId(), new PropertyModel( 196 dataModel, "selectedChart"))); 197 add(selectedchartUrlWindow); 198 199 } 200 201 /** 202 * Show the panel only when the data model is not empty and no loadin is in process. 203 * 204 * @return true when this panel should be shown. 205 */ 206 @Override 207 public boolean isVisible() { 208 return !session.getDataModel().isEmpty() && session.getDataModel().isComplete(); 209 } 210 211 }