<s> package org . eclipse . jdt . internal . core . builder ; import org . eclipse . core . resources . * ; import org . eclipse . core . runtime . * ; import org . eclipse . jdt . core . compiler . CategorizedProblem ; import org . eclipse . jdt . core . compiler . IProblem ; import org . eclipse . jdt . internal . compiler . problem . AbortCompilation ; import org . eclipse . jdt . internal . core . util . Messages ; public class BuildNotifier { protected IProgressMonitor monitor ; protected boolean cancelling ; protected float percentComplete ; protected float progressPerCompilationUnit ; protected int newErrorCount ; protected int fixedErrorCount ; protected int newWarningCount ; protected int fixedWarningCount ; protected int workDone ; protected int totalWork ; protected String previousSubtask ; public static int NewErrorCount = 0 ; public static int FixedErrorCount = 0 ; public static int NewWarningCount = 0 ; public static int FixedWarningCount = 0 ; public static void resetProblemCounters ( ) { NewErrorCount = 0 ; FixedErrorCount = 0 ; NewWarningCount = 0 ; FixedWarningCount = 0 ; } public BuildNotifier ( IProgressMonitor monitor , IProject project ) { this . monitor = monitor ; this . cancelling = false ; this . newErrorCount = NewErrorCount ; this . fixedErrorCount = FixedErrorCount ; this . newWarningCount = NewWarningCount ; this . fixedWarningCount = FixedWarningCount ; this . workDone = 0 ; this . totalWork = 1000000 ; } public void aboutToCompile ( SourceFile unit ) { String message = Messages . bind ( Messages . build_compiling , unit . resource . getFullPath ( ) . removeLastSegments ( 1 ) . makeRelative ( ) . toString ( ) ) ; subTask ( message ) ; } public void begin ( ) { if ( this . monitor != null ) this . monitor . beginTask ( "" , this . totalWork ) ; this . previousSubtask = null ; } public void checkCancel ( ) { if ( this . monitor != null && this . monitor . isCanceled ( ) ) throw new OperationCanceledException ( ) ; } public void checkCancelWithinCompiler ( ) { if ( this . monitor != null && this . monitor . isCanceled ( ) && ! this . cancelling ) { setCancelling ( true ) ; throw new AbortCompilation ( true , null ) ; } } public void compiled ( SourceFile unit ) { String message = Messages . bind ( Messages . build_compiling , unit . resource . getFullPath ( ) . removeLastSegments ( 1 ) . makeRelative ( ) . toString ( ) ) ; subTask ( message ) ; updateProgressDelta ( this . progressPerCompilationUnit ) ; checkCancelWithinCompiler ( ) ; } public void done ( ) { NewErrorCount = this . newErrorCount ; FixedErrorCount = this . fixedErrorCount ; NewWarningCount = this . newWarningCount ; FixedWarningCount = this . fixedWarningCount ; updateProgress ( 1.0f ) ; subTask ( Messages . build_done ) ; if ( this . monitor != null ) this . monitor . done ( ) ; this . previousSubtask = null ; } protected String problemsMessage ( ) { int numNew = this . newErrorCount + this . newWarningCount ; int numFixed = this . fixedErrorCount + this . fixedWarningCount ; if ( numNew == 0 && numFixed == 0 ) return "" ; boolean displayBoth = numNew > 0 && numFixed > 0 ; StringBuffer buffer = new StringBuffer ( ) ; buffer . append ( '(' ) ; if ( numNew > 0 ) { buffer . append ( Messages . build_foundHeader ) ; buffer . append ( ' ' ) ; if ( displayBoth || this . newErrorCount > 0 ) { if ( this . newErrorCount == 1 ) buffer . append ( Messages . build_oneError ) ; else buffer . append ( Messages . bind ( Messages . build_multipleErrors , String . valueOf ( this . newErrorCount ) ) ) ; if ( displayBoth || this . newWarningCount > 0 ) buffer . append ( " + " ) ; } if ( displayBoth || this . newWarningCount > 0 ) { if ( this . newWarningCount == 1 ) buffer . append ( Messages . build_oneWarning ) ; else buffer . append ( Messages . bind ( Messages . build_multipleWarnings , String . valueOf ( this . newWarningCount ) ) ) ; } if ( numFixed > 0 ) buffer . append ( ", " ) ; } if ( numFixed > 0 ) { buffer . append ( Messages . build_fixedHeader ) ; buffer . append ( ' ' ) ; if ( displayBoth ) { buffer . append ( String . valueOf ( this . fixedErrorCount ) ) ; buffer . append ( " + " ) ; buffer . append ( String . valueOf ( this . fixedWarningCount ) ) ; } else { if ( this . fixedErrorCount > 0 ) { if ( this . fixedErrorCount == 1 ) buffer . append ( Messages . build_oneError ) ; else buffer . append ( Messages . bind ( Messages . build_multipleErrors , String . valueOf ( this . fixedErrorCount ) ) ) ; if ( this . fixedWarningCount > 0 ) buffer . append ( " + " ) ; } if ( this . fixedWarningCount > 0 ) { if ( this . fixedWarningCount == 1 ) buffer . append ( Messages . build_oneWarning ) ; else buffer . append ( Messages . bind ( Messages . build_multipleWarnings , String . valueOf ( this . fixedWarningCount ) ) ) ; } } } buffer . append ( ')' ) ; return buffer . toString ( ) ; } public void setCancelling ( boolean cancelling ) { this . cancelling = cancelling ; } public void setProgressPerCompilationUnit ( float progress ) { this . progressPerCompilationUnit = progress ; } public void subTask ( String message ) { String pm = problemsMessage ( ) ; String msg = pm . length ( ) == 0 ? message : pm + " " + message ; if ( msg . equals ( this . previousSubtask ) ) return ; if ( this . monitor != null ) this . monitor . subTask ( msg ) ; this . previousSubtask = msg ; } protected void updateProblemCounts ( CategorizedProblem [ ] newProblems ) { for ( int i = 0 , l = newProblems . length ; i < l ; i ++ ) if ( newProblems [ i ] . isError ( ) ) this . newErrorCount ++ ; else this . newWarningCount ++ ; } protected void updateProblemCounts ( IMarker [ ] oldProblems , CategorizedProblem [ ] newProblems ) { if ( newProblems != null ) { next : for ( int i = 0 , l = newProblems . length ; i < l ; i ++ ) { CategorizedProblem newProblem = newProblems [ i ] ; if ( newProblem . getID ( ) == IProblem . Task ) continue ; boolean isError = newProblem . isError ( ) ; String message = newProblem . getMessage ( ) ; if ( oldProblems != null ) { for ( int j = 0 , m = oldProblems . length ; j < m ; j ++ ) { IMarker pb = oldProblems [ j ] ; if ( pb == null ) continue ; boolean wasError = IMarker . SEVERITY_ERROR == pb . getAttribute ( IMarker . SEVERITY , IMarker . SEVERITY_ERROR ) ; if ( isError == wasError && message . equals ( pb . getAttribute ( IMarker . MESSAGE , "" ) ) ) { oldProblems [ j ] = null ; continue next ; } } } if ( isError ) this . newErrorCount ++ ; else this . newWarningCount ++ ; } } if ( oldProblems != null ) { next : for ( int i = 0 , l = oldProblems . length ; i < l ; i ++ ) { IMarker oldProblem = oldProblems [ i ] ; if ( oldProblem == null ) continue next ; boolean wasError = IMarker . SEVERITY_ERROR == oldProblem . getAttribute ( IMarker . SEVERITY , IMarker . SEVERITY_ERROR ) ; String message = oldProblem . getAttribute ( IMarker . MESSAGE , "" ) ; if ( newProblems != null ) { for ( int j = 0 , m = newProblems . length ; j < m ; j ++ ) { CategorizedProblem pb = newProblems [ j ] ; if ( pb . getID ( ) == IProblem . Task ) continue ; if ( wasError == pb . isError ( ) && message . equals ( pb . getMessage ( ) ) ) continue next ; } } if ( wasError ) this . fixedErrorCount ++ ; else this . fixedWarningCount ++ ; } } } public void updateProgress ( float newPercentComplete ) { if ( newPercentComplete > this . percentComplete ) { this . percentComplete = Math . min ( newPercentComplete , 1.0f ) ; int work = Math . round ( this . percentComplete * this . totalWork ) ; if ( work > this . workDone ) { if ( this . monitor != null ) this . monitor . worked ( work - this . workDone ) ; this . workDone = work ; } } } public void updateProgressDelta ( float percentWorked ) { updateProgress ( this . percentComplete + percentWorked ) ; } } </s>