From 58c0cdb7a45bd6c4ae7027102c273ad51cf3d51b Mon Sep 17 00:00:00 2001 From: Ole-Martin Mork Date: Mon, 31 Mar 2003 21:57:17 +0000 Subject: [PATCH] done some work on realtime scanning. added some properties and stuff. git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@1664 51baf565-9d33-0410-a72c-fc3788e3496d --- pmd-netbeans/build.xml | 3 + pmd-netbeans/lib/jakarta-oro-2.0.jar | Bin 0 -> 76273 bytes pmd-netbeans/lib/oro-license | 56 +++++++++ pmd-netbeans/src/manifest.mf | 2 +- pmd-netbeans/src/pmd/Bundle.properties | 2 + pmd-netbeans/src/pmd/RunPMDAction.java | 11 +- pmd-netbeans/src/pmd/config/Bundle.properties | 8 ++ .../src/pmd/config/PMDOptionsSettings.java | 37 ++++++ .../config/PMDOptionsSettingsBeanInfo.java | 15 ++- .../src/pmd/config/ui/RuleEnabler.java | 11 +- pmd-netbeans/src/pmd/mf-layer.xml | 1 + .../src/pmd/resources/annotation-scan.xml | 13 +++ .../src/pmd/scan/EditorChangeListener.java | 33 +++--- .../src/pmd/scan/PMDScanAnnotation.java | 107 ++++++++++++++++++ pmd-netbeans/src/pmd/scan/Scanner.java | 11 +- 15 files changed, 277 insertions(+), 33 deletions(-) create mode 100644 pmd-netbeans/lib/jakarta-oro-2.0.jar create mode 100644 pmd-netbeans/lib/oro-license create mode 100644 pmd-netbeans/src/pmd/resources/annotation-scan.xml create mode 100644 pmd-netbeans/src/pmd/scan/PMDScanAnnotation.java diff --git a/pmd-netbeans/build.xml b/pmd-netbeans/build.xml index b062070784..c486d01caa 100644 --- a/pmd-netbeans/build.xml +++ b/pmd-netbeans/build.xml @@ -7,6 +7,7 @@ + @@ -31,6 +32,7 @@ + @@ -52,6 +54,7 @@ + diff --git a/pmd-netbeans/lib/jakarta-oro-2.0.jar b/pmd-netbeans/lib/jakarta-oro-2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..3176673b7f0cafdf0185c5b7030783e0205a17c0 GIT binary patch literal 76273 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 L4!sc6!ejsd7z@Zr literal 0 HcmV?d00001 diff --git a/pmd-netbeans/lib/oro-license b/pmd-netbeans/lib/oro-license new file mode 100644 index 0000000000..e61dd247ae --- /dev/null +++ b/pmd-netbeans/lib/oro-license @@ -0,0 +1,56 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation", "Jakarta-Oro" + * must not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * or "Jakarta-Oro", nor may "Apache" or "Jakarta-Oro" appear in their + * name, without prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + * Portions of this software are based upon software originally written + * by Daniel F. Savarese. We appreciate his contributions. + */ diff --git a/pmd-netbeans/src/manifest.mf b/pmd-netbeans/src/manifest.mf index 19f8226004..701914e87e 100644 --- a/pmd-netbeans/src/manifest.mf +++ b/pmd-netbeans/src/manifest.mf @@ -1,7 +1,7 @@ Manifest-Version: 1.0 OpenIDE-Module-Specification-Version: 0.71 Created-By: Ole-Martin Mørk -Class-Path: ext/pmd-1.04.jar ext/jaxen-core-1.0-fcs.jar ext/saxpath-1.0-fcs.jar +Class-Path: ext/pmd-1.04.jar ext/jaxen-core-1.0-fcs.jar ext/saxpath-1.0-fcs.jar ext/jakarta-oro-2.0.jar OpenIDE-Module: pmd OpenIDE-Module-Layer: pmd/mf-layer.xml OpenIDE-Module-IDE-Dependencies: IDE/1 > 2.23 diff --git a/pmd-netbeans/src/pmd/Bundle.properties b/pmd-netbeans/src/pmd/Bundle.properties index af1efbf63b..392f1f3566 100644 --- a/pmd-netbeans/src/pmd/Bundle.properties +++ b/pmd-netbeans/src/pmd/Bundle.properties @@ -35,3 +35,5 @@ OpenIDE-Module-Long-Description=Runs the PMD source code scanner tool. \ Hyperlinked Output Window display. LBL_pmd_annotation=PMD Error + +LBL_pmd_scan_annotation=PMD Realtime Scan Error diff --git a/pmd-netbeans/src/pmd/RunPMDAction.java b/pmd-netbeans/src/pmd/RunPMDAction.java index cd7dd2f895..6131a215c4 100644 --- a/pmd-netbeans/src/pmd/RunPMDAction.java +++ b/pmd-netbeans/src/pmd/RunPMDAction.java @@ -277,11 +277,11 @@ public class RunPMDAction extends CookieAction { private List getDataObjects( Node[] node ) { ArrayList list = new ArrayList(); for( int i = 0; i < node.length; i++ ) { - SourceCookie cookie = ( SourceCookie )node[i].getCookie( SourceCookie.class ); - + DataObject data = (DataObject)node[i].getCookie( DataObject.class ); + //Checks to see if it's a java source file - if( cookie != null ) { - list.add( ( DataObject )node[i].getCookie( DataObject.class ) ); + if( data.getPrimaryFile().hasExt( "java" ) ) { + list.add( data ); } //Or if it's a folder else { @@ -289,8 +289,7 @@ public class RunPMDAction extends CookieAction { Enumeration enumeration = folder.children( true ); while( enumeration.hasMoreElements() ) { DataObject dataobject = ( DataObject )enumeration.nextElement(); - cookie = ( SourceCookie )dataobject.getCookie( SourceCookie.class ); - if( cookie != null ) { + if( dataobject.getPrimaryFile().hasExt( "java" ) ) { list.add( dataobject ); } } diff --git a/pmd-netbeans/src/pmd/config/Bundle.properties b/pmd-netbeans/src/pmd/config/Bundle.properties index ec478edc2b..ed9d5147c8 100644 --- a/pmd-netbeans/src/pmd/config/Bundle.properties +++ b/pmd-netbeans/src/pmd/config/Bundle.properties @@ -37,3 +37,11 @@ PROP_classpath=Classpath PROP_rulesets=Rulesets HINT_rulesets=The custom rulesets to use + +PROP_enablescan=Enable scan + +HINT_enablescan=Enable realtime pmd scanning? + +PROP_scanInterval=Scan interval + +HINT_scanInterval=The number of seconds between each scan diff --git a/pmd-netbeans/src/pmd/config/PMDOptionsSettings.java b/pmd-netbeans/src/pmd/config/PMDOptionsSettings.java index 25930c65ea..d98b375de2 100644 --- a/pmd-netbeans/src/pmd/config/PMDOptionsSettings.java +++ b/pmd-netbeans/src/pmd/config/PMDOptionsSettings.java @@ -46,6 +46,10 @@ public class PMDOptionsSettings extends SystemOption { public final static String PROP_RULESETS = "rulesetz"; + public final static String PROP_SCAN_INTERVAL = "interval"; + + public final static String PROP_ENABLE_SCAN = "EnableScan"; + /** The default rules.*/ private static final String DEFAULT_RULES = "AvoidDuplicateLiterals, StringToString, StringInstantiation, JUnitStaticSuite, " + @@ -59,6 +63,7 @@ public class PMDOptionsSettings extends SystemOption { "AvoidReassigningParametersRule, OnlyOneReturn, UseSingletonRule, " + "DontImportJavaLang, UnusedImports, DuplicateImports, "; + // No constructor please! /** Sets the default rulesets and initializes the option */ @@ -134,4 +139,36 @@ public class PMDOptionsSettings extends SystemOption { putProperty( PROP_RULESETS, rulesets, true ); } + /** Getter for property scanEnabled. + * @return Value of property scanEnabled. + * + */ + public Boolean isScanEnabled() { + return (Boolean)getProperty( PROP_ENABLE_SCAN ); + } + + /** Setter for property scanEnabled. + * @param scanEnabled New value of property scanEnabled. + * + */ + public void setScanEnabled(Boolean scanEnabled) { + putProperty( PROP_ENABLE_SCAN, scanEnabled ); + } + + /** Getter for property scanInterval. + * @return Value of property scanInterval. + * + */ + public Integer getScanInterval() { + return (Integer)getProperty( PROP_SCAN_INTERVAL); + } + + /** Setter for property scanInterval. + * @param scanInterval New value of property scanInterval. + * + */ + public void setScanInterval(Integer scanInterval) { + putProperty( PROP_SCAN_INTERVAL, scanInterval ); + } + } diff --git a/pmd-netbeans/src/pmd/config/PMDOptionsSettingsBeanInfo.java b/pmd-netbeans/src/pmd/config/PMDOptionsSettingsBeanInfo.java index c9fc1fa06f..e7a263b4b7 100644 --- a/pmd-netbeans/src/pmd/config/PMDOptionsSettingsBeanInfo.java +++ b/pmd-netbeans/src/pmd/config/PMDOptionsSettingsBeanInfo.java @@ -27,6 +27,7 @@ package pmd.config; import java.awt.Image; +import java.awt.*; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; @@ -52,8 +53,9 @@ public class PMDOptionsSettingsBeanInfo extends SimpleBeanInfo { * @return the description of the rulesets property */ public PropertyDescriptor[] getPropertyDescriptors() { - PropertyDescriptor descriptor[] = new PropertyDescriptor[2]; + PropertyDescriptor descriptor[] = new PropertyDescriptor[4]; try { + PropertyDescriptor rules = new PropertyDescriptor( "rules", PMDOptionsSettings.class, "getRules", "setRules" ); rules.setDisplayName( NbBundle.getMessage( PMDOptionsSettingsBeanInfo.class, "PROP_rules" ) ); rules.setShortDescription( NbBundle.getMessage( PMDOptionsSettingsBeanInfo.class, "HINT_rules" ) ); @@ -66,6 +68,17 @@ public class PMDOptionsSettingsBeanInfo extends SimpleBeanInfo { rulesets.setPropertyEditorClass( RuleSetChooserEditor.class ); rulesets.setExpert(true); descriptor[1] = rulesets; + + PropertyDescriptor enableScan = new PropertyDescriptor( "scanEnabled", PMDOptionsSettings.class, "isScanEnabled", "setScanEnabled" ); + enableScan.setDisplayName( NbBundle.getMessage( PMDOptionsSettingsBeanInfo.class, "PROP_enablescan" ) ); + enableScan.setShortDescription( NbBundle.getMessage( PMDOptionsSettingsBeanInfo.class, "HINT_enablescan" ) ); + descriptor[2] = enableScan; + + PropertyDescriptor scanInterval = new PropertyDescriptor( "scanInterval", PMDOptionsSettings.class, "getScanInterval", "setScanInterval" ); + scanInterval.setDisplayName( NbBundle.getMessage( PMDOptionsSettingsBeanInfo.class, "PROP_scanInterval" ) ); + scanInterval.setShortDescription( NbBundle.getMessage( PMDOptionsSettingsBeanInfo.class, "HINT_scanInterval" ) ); + descriptor[3] = scanInterval; + } catch( IntrospectionException ie ) { ErrorManager.getDefault().notify( ie ); diff --git a/pmd-netbeans/src/pmd/config/ui/RuleEnabler.java b/pmd-netbeans/src/pmd/config/ui/RuleEnabler.java index be35241ae0..680d4bee4c 100644 --- a/pmd-netbeans/src/pmd/config/ui/RuleEnabler.java +++ b/pmd-netbeans/src/pmd/config/ui/RuleEnabler.java @@ -30,6 +30,7 @@ import java.beans.PropertyEditorSupport; import javax.swing.JPanel; import net.sourceforge.pmd.Rule; import java.awt.event.MouseEvent; +import org.apache.oro.text.perl.Perl5Util; /** The JPanel used to edit the Rule property * @author ole martin mørk @@ -37,6 +38,8 @@ import java.awt.event.MouseEvent; public class RuleEnabler extends JPanel { private final PropertyEditorSupport editor; + + private final static Perl5Util regex = new Perl5Util(); /** Creates a new editor * @param editor The object to be notified of changes in the property */ @@ -392,8 +395,8 @@ public class RuleEnabler extends JPanel { private void chosenListValueChanged() {//GEN-FIRST:event_chosenListValueChanged Rule rule = (Rule)chosenList.getSelectedValue(); if( rule != null ) { - example.setText( rule.getExample().trim()); - information.setText( rule.getDescription().trim() ); + example.setText( regex.substitute( "s/ +/ /g", rule.getExample().trim() ) ); + information.setText( regex.substitute( "s/ +/ /g", rule.getDescription().trim() ) ); properties.setModel( new PropertiesModel( rule ) ); } }//GEN-LAST:event_chosenListValueChanged @@ -404,8 +407,8 @@ public class RuleEnabler extends JPanel { private void availableListValueChanged() {//GEN-FIRST:event_availableListValueChanged Rule rule = (Rule)availableList.getSelectedValue(); if( rule != null ) { - example.setText( rule.getExample().trim() ); - information.setText( rule.getDescription().trim() ); + example.setText( regex.substitute( "s/ +/ /g", rule.getExample().trim() ) ); + information.setText( regex.substitute( "s/ +/ /g", rule.getDescription().trim() ) ); properties.setModel( new PropertiesModel( rule ) ); } }//GEN-LAST:event_availableListValueChanged diff --git a/pmd-netbeans/src/pmd/mf-layer.xml b/pmd-netbeans/src/pmd/mf-layer.xml index e1f4f21493..26c47a97a2 100644 --- a/pmd-netbeans/src/pmd/mf-layer.xml +++ b/pmd-netbeans/src/pmd/mf-layer.xml @@ -26,6 +26,7 @@ + diff --git a/pmd-netbeans/src/pmd/resources/annotation-scan.xml b/pmd-netbeans/src/pmd/resources/annotation-scan.xml new file mode 100644 index 0000000000..fd9e30fcb2 --- /dev/null +++ b/pmd-netbeans/src/pmd/resources/annotation-scan.xml @@ -0,0 +1,13 @@ + + + + diff --git a/pmd-netbeans/src/pmd/scan/EditorChangeListener.java b/pmd-netbeans/src/pmd/scan/EditorChangeListener.java index 0979b881ca..e3e857ad55 100644 --- a/pmd-netbeans/src/pmd/scan/EditorChangeListener.java +++ b/pmd-netbeans/src/pmd/scan/EditorChangeListener.java @@ -26,11 +26,13 @@ */ package pmd.scan; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.openide.ErrorManager; -import org.openide.cookies.SourceCookie; +import org.openide.cookies.EditorCookie; import org.openide.nodes.Node; import org.openide.windows.TopComponent.Registry; +import pmd.config.PMDOptionsSettings; /** * @@ -45,20 +47,22 @@ public class EditorChangeListener implements PropertyChangeListener { } - public void propertyChange(java.beans.PropertyChangeEvent propertyChangeEvent) { - Node node[] = registry.getActivatedNodes(); - SourceCookie cookie = null; - int i = 0; - for( i = 0; i < node.length; i++ ) { - ErrorManager.getDefault().log(ErrorManager.ERROR, "checking cookie " + node[i]); - cookie = (SourceCookie)node[i].getCookie( SourceCookie.class ); - if( cookie != null ) { - break; + public void propertyChange(PropertyChangeEvent propertyChangeEvent) { + if( PMDOptionsSettings.getDefault().isScanEnabled().equals( Boolean.TRUE ) ) { + Node node[] = registry.getActivatedNodes(); + EditorCookie cookie = null; + int i = 0; + for( i = 0; i < node.length; i++ ) { + ErrorManager.getDefault().log(ErrorManager.ERROR, "checking cookie " + node[i]); + cookie = (EditorCookie)node[i].getCookie( EditorCookie.class ); + if( cookie != null ) { + break; + } + } + if( cookie != null ) { + ErrorManager.getDefault().log(ErrorManager.ERROR, "starting scan"); + startScan( node[i] ); } - } - if( cookie != null ) { - ErrorManager.getDefault().log(ErrorManager.ERROR, "starting scan"); - startScan( node[i] ); } } @@ -71,7 +75,6 @@ public class EditorChangeListener implements PropertyChangeListener { Thread thread = new Thread( scanner ); thread.setPriority( Thread.MIN_PRIORITY ); thread.start(); - int i; } } diff --git a/pmd-netbeans/src/pmd/scan/PMDScanAnnotation.java b/pmd-netbeans/src/pmd/scan/PMDScanAnnotation.java new file mode 100644 index 0000000000..d886c42e1a --- /dev/null +++ b/pmd-netbeans/src/pmd/scan/PMDScanAnnotation.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2002-2003, Ole-Martin Mørk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +package pmd.scan; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.openide.text.Annotation; +import org.openide.text.Line; + +/** + * Just a class thats mission is to mark the line where the error is. It's using + * pmd-annotation type to mark the line + * + * @author ole martin mørk + * @created 3. november 2002 + */ +public class PMDScanAnnotation extends Annotation implements PropertyChangeListener { + + /** The error message shown on mouseover on the pmd icon */ + private String errormessage = null; + private static List annotations = new ArrayList(); + + private PMDScanAnnotation() {} + + public static final PMDScanAnnotation getNewInstance() { + PMDScanAnnotation pmd = new PMDScanAnnotation(); + annotations.add( pmd ); + return pmd; + } + + public static final void clearAll() { + Iterator iterator = annotations.iterator(); + while( iterator.hasNext() ) { + ((Annotation)iterator.next()).detach(); + } + annotations.clear(); + } + + /** + * The annotation type. + * + * @return pmd-annotation + */ + public String getAnnotationType() { + return "pmd-scan-annotation"; + } + + + /** + * Sets the current errormessage + * + * @param message the errormessage + */ + public void setErrorMessage( String message ) { + errormessage = message; + } + + + /** + * A short description of this annotation + * + * @return the short description + */ + public String getShortDescription() { + return errormessage; + } + + + /** + * Invoked when the user change the content on the line where the annotation is + * attached + * + * @param propertyChangeEvent the event fired + */ + public void propertyChange( PropertyChangeEvent propertyChangeEvent ) { + Line line = ( Line )propertyChangeEvent.getSource(); + line.removePropertyChangeListener( this ); + detach(); + } +} diff --git a/pmd-netbeans/src/pmd/scan/Scanner.java b/pmd-netbeans/src/pmd/scan/Scanner.java index 064af0d390..a32708efd0 100644 --- a/pmd-netbeans/src/pmd/scan/Scanner.java +++ b/pmd-netbeans/src/pmd/scan/Scanner.java @@ -38,6 +38,8 @@ import org.openide.text.Line.Set; import pmd.Fault; import pmd.PMDAnnotation; import pmd.RunPMDAction; +import pmd.config.PMDOptionsSettings; +import pmd.scan.PMDScanAnnotation; /** * @@ -60,11 +62,8 @@ public class Scanner implements Runnable { list.add( object ); List faults = RunPMDAction.checkCookies(list ); ErrorManager.getDefault().log(ErrorManager.ERROR, ""+faults); - - + PMDScanAnnotation.clearAll(); LineCookie cookie = ( LineCookie )object.getCookie( LineCookie.class ); - - Set lineset = cookie.getLineSet(); for( int i = 0; i < faults.size(); i++ ) { Fault fault = (Fault)faults.get( i ); @@ -72,7 +71,7 @@ public class Scanner implements Runnable { Line line = lineset.getOriginal( lineNum - 1 ); ErrorManager.getDefault().log( ErrorManager.ERROR, "count: " + line.getAnnotationCount() ); if( line.getAnnotationCount() <= 0 ) { - PMDAnnotation annotation = PMDAnnotation.getNewInstance(); + PMDScanAnnotation annotation = PMDScanAnnotation.getNewInstance(); String msg = fault.getMessage(); annotation.setErrorMessage( msg ); annotation.attach( line ); @@ -80,7 +79,7 @@ public class Scanner implements Runnable { line.addPropertyChangeListener( annotation ); } } - Thread.sleep( 3000 ); + Thread.sleep( PMDOptionsSettings.getDefault().getScanInterval().intValue() * 1000 ); } } catch( IOException e ) {