/** * Find prev job entry. * * @param to the to * @param nr the nr * @return the job entry copy */ public JobEntryCopy findPrevJobEntry( JobEntryCopy to, int nr ) { return findPrevJobEntry( to, nr, false ); }
/** * Checks for loop. * * @param entry the entry * @param lookup the lookup * @return true, if successful */ private boolean hasLoop( JobEntryCopy entry, JobEntryCopy lookup, HashSet<JobEntryCopy> checkedEntries ) { String cacheKey = entry.getName() + " - " + ( lookup != null ? lookup.getName() : "" ); Boolean hasLoop = loopCache.get( cacheKey ); if ( hasLoop != null ) { return hasLoop; } hasLoop = false; checkedEntries.add( entry ); int nr = findNrPrevJobEntries( entry ); for ( int i = 0; i < nr; i++ ) { JobEntryCopy prevJobMeta = findPrevJobEntry( entry, i ); if ( prevJobMeta != null && ( prevJobMeta.equals( lookup ) || ( !checkedEntries.contains( prevJobMeta ) && hasLoop( prevJobMeta, lookup == null ? entry : lookup, checkedEntries ) ) ) ) { hasLoop = true; break; } } loopCache.put( cacheKey, hasLoop ); return hasLoop; }
@Test public void testHasLoop_simpleLoop() throws Exception { //main->2->3->main JobMeta jobMetaSpy = spy( jobMeta ); JobEntryCopy jobEntryCopyMain = createJobEntryCopy( "mainStep" ); JobEntryCopy jobEntryCopy2 = createJobEntryCopy( "step2" ); JobEntryCopy jobEntryCopy3 = createJobEntryCopy( "step3" ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopyMain ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopyMain, 0 ) ).thenReturn( jobEntryCopy2 ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopy2 ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopy2, 0 ) ).thenReturn( jobEntryCopy3 ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopy3 ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopy3, 0 ) ).thenReturn( jobEntryCopyMain ); assertTrue( jobMetaSpy.hasLoop( jobEntryCopyMain ) ); }
@Test public void testHasLoop_loopInPrevSteps() throws Exception { //main->2->3->4->3 JobMeta jobMetaSpy = spy( jobMeta ); JobEntryCopy jobEntryCopyMain = createJobEntryCopy( "mainStep" ); JobEntryCopy jobEntryCopy2 = createJobEntryCopy( "step2" ); JobEntryCopy jobEntryCopy3 = createJobEntryCopy( "step3" ); JobEntryCopy jobEntryCopy4 = createJobEntryCopy( "step4" ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopyMain ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopyMain, 0 ) ).thenReturn( jobEntryCopy2 ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopy2 ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopy2, 0 ) ).thenReturn( jobEntryCopy3 ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopy3 ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopy3, 0 ) ).thenReturn( jobEntryCopy4 ); when( jobMetaSpy.findNrPrevJobEntries( jobEntryCopy4 ) ).thenReturn( 1 ); when( jobMetaSpy.findPrevJobEntry( jobEntryCopy4, 0 ) ).thenReturn( jobEntryCopy3 ); //check no StackOverflow error assertFalse( jobMetaSpy.hasLoop( jobEntryCopyMain ) ); }