147 List<IXDataRenderer> lanes = new ArrayList<>(laneFilters.size());
148 laneFilters.stream().filter(ld -> ld.isEnabled()).forEach(lane -> {
149 IItemCollection laneItems = items.apply(lane.getFilter());
150 if (laneItems.iterator().hasNext()) {
151 ISpanSeries<IItem> laneSeries = QuantitySeries.max(laneItems, JfrAttributes.START_TIME,
152 JfrAttributes.END_TIME);
153 this.setTooltipTitle(MessageFormat.format(Messages.ThreadsPage_LANE_TOOLTIP_TITLE, threadName, lane.getName()));
154 lanes.add(new ItemRow(SpanRenderer.withBoundaries(laneSeries, DataPageToolkit.ITEM_COLOR, this.getTooltipTitle()), laneItems));
155 }
156 });
157 IXDataRenderer renderer = !lanes.isEmpty() ? RendererToolkit.uniformRows(lanes)
158 : new ItemRow(RendererToolkit.empty(), ItemCollectionToolkit.EMPTY);
159 IItemCollection itemsAndThreadLifespan = addThreadLifeSpanEvents(thread, items);
160 // If the lane doesn't match a filter, display the Thread name as the tooltip title
161 if (this.getTooltipTitle() == null) {
162 this.setTooltipTitle(threadName);
163 } else {
164 this.resetTooltipTitle();
165 }
166 return new QuantitySpanRenderer(threadRanges(threadName, itemsAndThreadLifespan), renderer, THREAD_BG_COLOR, 10,
167 threadName, this.getTooltipTitle());
168 }
169
170 private IItemCollection addThreadLifeSpanEvents(Object thread, final IItemCollection items) {
171 IItemCollection threadLifeSpan = dataSourceSupplier.get().getItems()
172 .apply(ItemFilters.and(ItemFilters.equals(JfrAttributes.EVENT_THREAD, (IMCThread) thread),
173 ItemFilters.type(JdkTypeIDs.JAVA_THREAD_START, JdkTypeIDs.JAVA_THREAD_END)));
174 IItemCollection itemsAndThreadLifespan = ItemCollectionToolkit.merge(() -> Stream.of(items, threadLifeSpan));
175 return itemsAndThreadLifespan;
176 }
177
178 private IQuantitySeries<?> threadRanges(String threadName, IItemCollection items) {
179 IItemCollection startEvents = items.apply(ItemFilters.type(JdkTypeIDs.JAVA_THREAD_START));
180 IItemCollection endEvents = items.apply(ItemFilters.type(JdkTypeIDs.JAVA_THREAD_END));
181 Iterator<IQuantity> start = ItemCollectionToolkit.values(startEvents, JfrAttributes.START_TIME).get().sorted()
182 .iterator();
183 Iterator<IQuantity> end = ItemCollectionToolkit.values(endEvents, JfrAttributes.END_TIME).get().sorted()
184 .iterator();
185
186 ArrayList<IQuantity> startList = new ArrayList<>();
187 ArrayList<IQuantity> endList = new ArrayList<>();
|
147 List<IXDataRenderer> lanes = new ArrayList<>(laneFilters.size());
148 laneFilters.stream().filter(ld -> ld.isEnabled()).forEach(lane -> {
149 IItemCollection laneItems = items.apply(lane.getFilter());
150 if (laneItems.iterator().hasNext()) {
151 ISpanSeries<IItem> laneSeries = QuantitySeries.max(laneItems, JfrAttributes.START_TIME,
152 JfrAttributes.END_TIME);
153 this.setTooltipTitle(MessageFormat.format(Messages.ThreadsPage_LANE_TOOLTIP_TITLE, threadName, lane.getName()));
154 lanes.add(new ItemRow(SpanRenderer.withBoundaries(laneSeries, DataPageToolkit.ITEM_COLOR, this.getTooltipTitle()), laneItems));
155 }
156 });
157 IXDataRenderer renderer = !lanes.isEmpty() ? RendererToolkit.uniformRows(lanes)
158 : new ItemRow(RendererToolkit.empty(), ItemCollectionToolkit.EMPTY);
159 IItemCollection itemsAndThreadLifespan = addThreadLifeSpanEvents(thread, items);
160 // If the lane doesn't match a filter, display the Thread name as the tooltip title
161 if (this.getTooltipTitle() == null) {
162 this.setTooltipTitle(threadName);
163 } else {
164 this.resetTooltipTitle();
165 }
166 return new QuantitySpanRenderer(threadRanges(threadName, itemsAndThreadLifespan), renderer, THREAD_BG_COLOR, 10,
167 threadName, this.getTooltipTitle(), thread);
168 }
169
170 private IItemCollection addThreadLifeSpanEvents(Object thread, final IItemCollection items) {
171 IItemCollection threadLifeSpan = dataSourceSupplier.get().getItems()
172 .apply(ItemFilters.and(ItemFilters.equals(JfrAttributes.EVENT_THREAD, (IMCThread) thread),
173 ItemFilters.type(JdkTypeIDs.JAVA_THREAD_START, JdkTypeIDs.JAVA_THREAD_END)));
174 IItemCollection itemsAndThreadLifespan = ItemCollectionToolkit.merge(() -> Stream.of(items, threadLifeSpan));
175 return itemsAndThreadLifespan;
176 }
177
178 private IQuantitySeries<?> threadRanges(String threadName, IItemCollection items) {
179 IItemCollection startEvents = items.apply(ItemFilters.type(JdkTypeIDs.JAVA_THREAD_START));
180 IItemCollection endEvents = items.apply(ItemFilters.type(JdkTypeIDs.JAVA_THREAD_END));
181 Iterator<IQuantity> start = ItemCollectionToolkit.values(startEvents, JfrAttributes.START_TIME).get().sorted()
182 .iterator();
183 Iterator<IQuantity> end = ItemCollectionToolkit.values(endEvents, JfrAttributes.END_TIME).get().sorted()
184 .iterator();
185
186 ArrayList<IQuantity> startList = new ArrayList<>();
187 ArrayList<IQuantity> endList = new ArrayList<>();
|