@Test public void buildOneInvocationSequenceWithSpan() { Span span01 = createServerSpan(null); InvocationSequenceData invoc01 = createSequence(span01); InvocationSequenceData _invoc02 = createSequence(null); invoc01.getNestedSequences().add(_invoc02); doReturn(span01).when(spanService).get(span01.getSpanIdent()); builder.setSpanService(spanService).setMode(Mode.SINGLE).setInvocationSequence(invoc01); InvocationTreeElement tree = builder.build(); Map<Object, InvocationTreeElement> lookupMap = InvocationTreeUtil.buildLookupMap(tree); assertThat(lookupMap.size(), is(3)); assertThat(tree.getDataElement(), is(span01)); assertThat(tree.getChildren(), contains(hasProperty("dataElement", is(invoc01)))); verify(spanService).get(span01.getSpanIdent()); verifyNoMoreInteractions(spanService); verifyZeroInteractions(invocationService); }
invoc01.getNestedSequences().add(_invoc02); invoc03.getNestedSequences().add(_invoc04); doReturn(span01).when(spanService).get(span01.getSpanIdent()); doReturn(span02).when(spanService).get(span02.getSpanIdent()); doReturn(span03).when(spanService).get(span03.getSpanIdent()); doReturn(span04).when(spanService).get(span04.getSpanIdent()); assertThat(InvocationTreeUtil.lookupTreeElement(lookupMap, _invoc02), is(nullValue())); assertThat(InvocationTreeUtil.lookupTreeElement(lookupMap, span04), is(nullValue())); verify(spanService).get(span02.getSpanIdent()); verify(spanService).get(span03.getSpanIdent()); verifyNoMoreInteractions(spanService); verifyZeroInteractions(invocationService);
/** * {@inheritDoc} */ @Override public Object getElement(Object template, int occurance, ViewerFilter[] filters) { // return the span directly because it is unique if (template instanceof Span) { return template; } // returning matching invocations InvocationTreeContentProvider contentProvider = (InvocationTreeContentProvider) getContentProvider(); if (contentProvider.getRootElement() != null) { List<InvocationSequenceData> sequences; sequences = InvocationTreeUtil.getInvocationSequences(contentProvider.getRootElement()); InvocationSequenceData found = OccurrenceFinderFactory.getOccurrence(sequences, template, occurance, filters); if (InvocationSequenceDataHelper.hasSpanIdent(found) && (template instanceof Span)) { return spanService.get(found.getSpanIdent()); } else { return found; } } return null; }
/** * Calculates the duration starting from this invocation sequence data element. Includes span * duration as last resource if the span ident exists on the data. * * @param data * the <code>InvocationSequenceData</code> object. * @param spanService * Span service providing the additional span information if needed. * @return the duration starting from this invocation sequence data element. */ public static double calculateDuration(InvocationSequenceData data, ISpanService spanService) { if (InvocationSequenceDataHelper.hasTimerData(data)) { return data.getTimerData().getDuration(); } else if (InvocationSequenceDataHelper.hasSQLData(data)) { return data.getSqlStatementData().getDuration(); } else if ((null != spanService) && hasSpanIdent(data)) { Span span = spanService.get(data.getSpanIdent()); if ((span != null) && !References.FOLLOWS_FROM.equals(span.getReferenceType())) { return span.getDuration(); } } if (InvocationSequenceDataHelper.isRootElementInSequence(data)) { return data.getDuration(); } return -1.0d; }