<?xml version="1.0"?>
<!--

       Copyright (c) 2009, Adobe Systems, Incorporated
       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.
         * Neither the name of the Adobe Systems, Incorporated. nor the names of
           its  contributors  may be used to endorse or promote products derived
           from this software without specific prior written permission.

       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 COPYRIGHT HOLDER
       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.

-->
<ruleset name="All Flex Rules" xmlns="http://pmd.sf.net/ruleset/1.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
	xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">

	<description>Every Flex Rule in FlexPMD</description>
	
	<!-- Architecture -->
	<rule class="com.adobe.ac.pmd.rules.architecture.ViewComponentReferencedInModelRule"
		message="A view component should not be referenced in a model class">
		<description></description>
		<priority>3</priority>
		<example>
package com.adobe.ac
{
   import mx.controls.ComboBox; // VIOLATION

   public class MyModelClass
   {
   }
} 		
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.architecture.MonkeyPatchingRule"
		message="This class looks to be duplicated with a SDK class">
		<description>Monkey patching can be a risky undertaking because it is not using intended extensibility points and thus may have unintended consequences or make migration to newer versions of the SDK more difficult</description>
		<priority>1</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.architecture.UseInternalClassOutsideApiClass"
		message="This class imports an internal class ({0}) from another function area ({1})">
		<description>If you have different functionalities, you probably don't want every class of each to be accessible from any other functional areas.
So you probably want to use this packaging:
[org].[project].func1.api
[org].[project].func1.restricted
[org].[project].func2.api
[org].[project].func2.restricted
This rule makes sure that no restricted classes is accessed from outside its own function area.
 </description>
		<priority>1</priority>
		<example>
package functional
{
	import functional.func1.api.Func1ExposedClass;
	import functional.func1.restricted.Func1RestrictedClass; // VIOLATION
	import functional.func2.api.Func2ExposedClass;
	import functional.func2.restricted.Func2RestrictedClass; // VIOLATION
	
	public class FunctionClient
	{
	}
}
package functional.func1.api

{
	import functional.func1.restricted.Func1RestrictedClass; 
	import functional.func2.api.Func2ExposedClass;
	import functional.func2.restricted.Func2RestrictedClass; // VIOLATION
	
	public class Func1ExposedClass
	{
	}
}
package functional.func1.restricted
{
	import functional.func1.api.Func1ExposedClass;
	import functional.func2.api.Func2ExposedClass;
	import functional.func2.restricted.Func2RestrictedClass; // VIOLATION
	
	public class Func1RestrictedClass
	{
	}
}
package functional.func2.api
{
	import functional.func1.api.Func1ExposedClass;
	import functional.func1.restricted.Func1RestrictedClass; // VIOLATION
	import functional.func2.restricted.Func2RestrictedClass;
	
	public class Func2ExposedClass
	{
	}
}
package functional.func2.restricted
{
	import functional.func1.api.Func1ExposedClass;
	import functional.func1.restricted.Func1RestrictedClass; // VIOLATION
	import functional.func2.api.Func2ExposedClass;
	
	public class Func2RestrictedClass
	{
	}
}		
		</example>
	</rule>
	
	<!-- AsDocs -->
	<rule 
		class="com.adobe.ac.pmd.rules.asdocs.AttributeAsDocMissingRule"
		message="This attribute ({0}) should be documented with AsDocs.">
		<priority>3</priority>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.asdocs.ClassAsDocMissingRule"
		message="This class ({0}) should be documented with AsDocs.">
		<priority>3</priority>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.asdocs.MethodAsDocMissingRule"
		message="This method ({0}) should be documented with AsDocs.">
		<priority>3</priority>
	</rule>
	
	<!-- Basic MXML -->
	<rule class="com.adobe.ac.pmd.rules.mxml.MoreThanOneEntryPointInMxmlRule"
		message="There is more than 1 public variable in this MXML component">
		<priority>5</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.mxml.MoreThanTwoEntryPointsInMxmlRule"
		message="There are more than 2 public variables in this MXML component">
		<priority>3</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.mxml.TooLongScriptBlockRule"
		message="This script block is too long ({0} maximum, but {1} actually)">
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>50</value>
			</property>
		</properties>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.mxml.CodeBehindInMxmlRule"
		message="Avoid using code behind files">
		<description>Code behind files are tightly coupled with the view, not unit-testable, not easy to navigate the code code base and not reusable. Try using presentation model pattern, or observer pattern</description>
		<priority>5</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.mxml.TooManyStatesInMxmlRule"
	message="Having too many states does not help visibility. Try to refactor this view component.">
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>5</value>
			</property>
		</properties>
	</rule>
	
	<!-- Bindings -->
	<rule class="com.adobe.ac.pmd.rules.binding.BindingUtilsRule"
		message="BindingUtils class uses hard coded strings, which won't be picked up by the compiler if you rename this attribute. You should probably consider refactoring using events">
		<description></description>
		<priority>1</priority>
		<example>
public class Controller extends FrontController
{
   public function Controller()
   {
   	 BindingUtils.bindSetter(setContent, value, "content"); // VIOLATION
   }
}	 
      	 </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.binding.ChangeWatcherRule"
		message="ChangeWatcher class uses hard coded strings to specify the attribute name, to listen to. Prefer listening to events or setters">
		<priority>1</priority>
		<example>
public final class Title 
{
	private var watcher : ChangeWatcher; // VIOLATION
}		
		</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.binding.TooLongBindingExpressionRule"
		message="This binding expression is too long ({0} dots maximum, but {1} actually)">
		<description>A Binding expression is executed as soon as one of the bindable attributes changed. If a binding expression contains too many expression, there could be some performance issue.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>3</value>
			</property>
		</properties>
		<example>
		<![CDATA[
<mx:Label text="{ vfrfr.frfr.frf.lala }"/> <!-- Violation-->
		]]>
		</example>
	</rule>
	
	<!-- Cairngorm -->
	<rule class="com.adobe.ac.pmd.rules.cairngorm.BindableModelLocatorRule"
		message="A modelLocator must not be Bindable at a class level">
		<description>A bindable ModelLocator could leads to performance issues due to bindings</description>
		<priority>1</priority>
		<example>
[Bindable]
public class BindableModelLocator // VIOLATION 
{      
}      
      </example>
	</rule>
	
	<rule
		class="com.adobe.ac.pmd.rules.cairngorm.ReferenceModelLocatorOutsideTheMainApplicationRule"
		message="The ModelLocator should be only accessible from the main application file">
		<description>The ModelLocator should be only accessible from the main application file. Then sub-models should be injected to the nested views.</description>
		<priority>3</priority>
		<example>
package business
{
   import model.MyModelLocator; // VIOLATION
   
   public class MyBusinessClass 
   {
   } 
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.cairngorm.FatControllerRule"
		message="A FrontController must nor add all its commands within the Controller constructor">
		<description>Try split them into methods where you add commands depending on their functional area.</description>
		<priority>3</priority>
		<example>
package control
{
   import control.GetItems1Command;
   import control.GetItems1Event;
   import control.GetItems2Command;
   import control.GetItems2Event;
   // A lot of other imports
   
   public class MyFrontController // VIOLATION
   {
      public function MyFrontController()
      {
         addCommand( 
            GetItems1Event.EVENT_NAME,
            GetItems1Command );

         addCommand( 
            GetItems2Event.EVENT_NAME,
            GetItems2Command );

         // A lot of other addCommand
      }
   } 
}
      </example>
	</rule>

	<rule
		class="com.adobe.ac.pmd.rules.cairngorm.BadCairngormEventNameFormatRule"
		message="A Cairngorm event name should contain the function area name before the actual event name">
		<description>You would have something like 'productManagement.getProducts' as an event name.</description>
		<priority>3</priority>
		<example>

public class UncorrectConstructorEvent extends CairngormEvent
{
   public function UncorrectConstructorEvent( model : IModel )
   {
      super( "eventName", model ); // VIOLATION. It should be "functionalArea.eventName" instead
   }
}
public class UncorrectConstantEvent extends CairngormEnterpriseEvent
{
   public static const EVENT_NAME : String = "eventName";
   
   public function UncorrectConstantEvent( model : IModel )
   {
      super( EVENT_NAME, model ); // VIOLATION
   }
}
       </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.cairngorm.CairngormEventDispatcherCallExplicitlyRule"
		  message="CairngormEventDispatcher is called explicitly. {0}">
		  <priority>3</priority>
		  <example>
		  <![CDATA[
public function foo() : void
{
   CairngormEventDispatcher.getInstance().dispatchEvent(new Event(CONSTANT)); // VIOLATION <- use cairngormEvent.dispatch();
   CairngormEventDispatcher.getInstance().addEventListener(CONSTANT, onHearing); // VIOLATION <- MVC broken
}  
		  ]]>
		  </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.cairngorm.ModelLocatorReferencedMoreThanOncePerClassRule"
		message="Only one reference of ModelLocator is allowed per class">
		<priority>3</priority>
	</rule>
	
	<!-- Component -->
	<rule
		class="com.adobe.ac.pmd.rules.component.UpdateChildrenNumberInUpdateDisplayListRule"
		message="Flex specific - Do not add or remove displayable children from updateDisplayList">
		<description>UpdateDisplayList is called everytime a child is invalidated. So calling addChild or removeChild in this function could be really CPU consuming</description>
		<priority>1</priority>
		<example></example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.component.CallLaterDirectlyRule"
		message="Flex specific - Don't call 'callLater' explicitly">
		<description>If you needed to call 'callLater' explicitly, then you probably did not extend the correct component life cycle.</description>
		<priority>1</priority>
	</rule>
	
	<!-- CSS -->
	<rule class="com.adobe.ac.pmd.rules.css.StyleBlockInMxmlRule"
		message="The style block is embed in the MXML file">
		<description>It is not a good practice to embed style blocks inside the MXML component. Prefer using external CSS files.</description>
		<priority>3</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.css.UseCssInsteadOfEmbedMetaDataRule"
		message="Embed metadata detected in source code where a stylesheet may be cleaner">
		<priority>5</priority>
	</rule>
	
	<!-- Empty -->
	<rule class="com.adobe.ac.pmd.rules.empty.EmptyCatchStatementRule"
		message="This catch statement is empty">
		<priority>3</priority>
		<example>
public class Foo 
{
   public function bar( x : int ) : void
   {
      try
      {
      }
      catch( e : Exception )         // VIOLATION
      {
      }
   }
} 		
		</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.empty.EmptyIfStmtRule"
		message="No statements in this if statement">
		<description>Empty If Statement finds instances where a condition is checked but nothing is done about it. </description>
		<priority>3</priority>
		<example>
public class Foo 
{
   public function bar( x : int ) : void
   {
      if ( x == 0 ) 
      {
         // VIOLATION
      }
   }
} 
      </example>
	</rule>
	
	<!-- Event -->
	<rule class="com.adobe.ac.pmd.rules.event.EventMissingCloneFunctionRule"
		message="The clone event must be overiden in a custom event">
		<description>When creating your own custom Event class, you must override the inherited Event.clone() method in order for it to duplicate the properties of your custom class. If you do not set all the properties that you add in your event subclass, those properties will not have the correct values when the event is cloned. This is important because the Flex SDK clones events whenever redispatching takes place. </description>
		<priority>1</priority>
		<example>
public class FirstCustomEvent   // VIOLATION - clone method is missing
{
   public var lala : String;
   
   public function FirstCustomEvent()
   {         
   }
}
      </example>
	</rule>
	
	<rule
		class="com.adobe.ac.pmd.rules.event.PublicVariableInCustomEventRule"
		message="No public variables should be inside a custom event. This variable ({0}) is public">
		<description>In order to improve encapsulation in your custom event, it is better not to have public variable in your event. Prefer having read-only attributes, set by the event constructor.</description>
		<priority>3</priority>
		<example>
public class FirstCustomEvent   
{
   public var lala : String; // VIOLATION
   
   public function FirstCustomEvent()
   {         
   }
}      
	   </example>
	</rule>
	
	<rule
		class="com.adobe.ac.pmd.rules.event.ConstructorDispatchingEventRule"
		message="An event is dispatched in a constructor">
		<description>This is pointless, since event listeners cannot be attached to an object before it has been constructed, so nothing can ever hear the event</description>
		<priority>1</priority>
		<example>
public class BigModel   
{
   public function BigModel()
   {    
      dispatchEvent( new Event( "pointlessEvent" ) );     
   }
}
		</example>
	</rule>
	<rule class="com.adobe.ac.pmd.rules.event.DefaultEventNameRule"
		message="Event name should be set explicitly">
		<priority>3</priority>
		<example>
public class DefaultNameEvent extends Event	
{
	public function DefaultNameEvent( type : String = "" )
	{
		super( type );
	}
}		
		</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.event.DispatchHardCodedEventNameRule"
		message="DispatchEvent function must dispatch constant strings">
		<description>You should not dispatch a plain string. If you rename this string, you need to replace the string listener as well. Use constants instead</description>
		<priority>1</priority>
		<example>
public class Foo 
{
   public function bar() : void
   {
      dispatch( new Event( "myHardCodedEvent" ) ); // VIOLATION
   }
}
      </example>
	</rule>
	
	<rule
		class="com.adobe.ac.pmd.rules.event.ListenForHardCodedEventNameRule"
		message="addEventListener must not contain hard coded strings">
		<description>You should not listen for a plain string. If you rename this string, you need to replace the string listener as well. Use constants instead</description>
		<priority>1</priority>
		<example>
public class Foo 
{
   public function bar() : void
   {
      addEventListener( "myHardCodedEvent", handleMyHardCodedEvent ); // VIOLATION
   }
}      
      </example>
	</rule>
	
	<rule
		class="com.adobe.ac.pmd.rules.event.UnboundTypeInMetadataRule"
		message="This type ({0}) was not found within the scope against which PMD was run">
		<priority>1</priority>
		<example>
[Event(name="myTypeEvent",type="UnknownType")] // VIOLATION
public class UnboundMetadata
{
}		
		</example>
	</rule>
	
	<rule
		class="com.adobe.ac.pmd.rules.event.UntypedEventMetadataRule"
		message="This event type is not specified">
		<description>Specifying a type will allow Flash builder and the class to have this event exposed in its API</description>
		<priority>3</priority>
		<example>
[Event(name="myTypeEvent")] // VIOLATION
public class UnTypedMetadata
{
}		
		</example>
	</rule>
	
	<!-- Maintanability -->
	<rule since="1.1" class="com.adobe.ac.pmd.rules.maintanability.OnlyOneReturnRule" message="A method should have only one exit point, and that should be the last statement in the method">
		<priority>3</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.maintanability.AlertShowRule" message="Do not call Alert.show directly">
		<description>You should not Alert.show() directly. If an error occurred in the system, you should probably use an ErrorManager to have a consistent way to manage those errors.</description>
		<priority>1</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.ExcessiveImportRule"
		message="A high number of imports can indicate a high degree of coupling within an object. ({0} maximum but {1} actually)">
		<description>A high number of imports can indicate a high degree of coupling within an object. Rule counts the number of unique imports and reports a violation if the count is above the user defined threshold.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>15</value>
			</property>
		</properties>
		<example>
import blah.blah.Baz;
import blah.blah.Bif;
// 18 others from the same package elided
public class Foo 
{
   public function doWork() : void 
   {
   }
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.TrueFalseConditionRule"
		message="This test contains a hard coded boolean value. You could remove it by having '{0}'">
		<priority>3</priority>
		<example>
if ( true ) // VIOLATION
{
   if ( myCondition == false ) // VIOLATION
   {
   }
}		
		</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.AvoidUsingPublicStaticFieldRule"
	message="If this field ({0}) was meant to be a constant, make it constant. Otherwise, if it is used as a global variable, you may want to redesign this class">
		<priority>3</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.DynamicClassRule" message="A class must not be dynamic">
		<description>When using dynamic classes, you cannot control how the developer will use your class. It makes refactoring really difficult</description>
		<priority>1</priority>
		<example>
dynamic public class DynamicObject // VIOLATION
{
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.forbiddentypes.UseObjectTypeRule"
		message="Do not use Object class">
		<description>It is a bad practice to use the dynamic class Object. Prefer using strongly typed object, or marker interface in order to avoid silent compilation errors while refactoring</description>
		<priority>1</priority>
		<example>
public class Foo
{
   public var bar : Object; // VIOLATION      
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.forbiddentypes.UseDictionaryTypeRule"
		message="Do not use Dictionnary class">
		<description>It is a bad practice to use the dynamic class Dictionary. Prefer using strongly typed object, or marker interface in order to avoid silent compilation errors while refactoring</description>
		<priority>1</priority>
		<example>
public class Foo
{
   public var bar : Dictionnary; // VIOLATION      
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.NonStaticConstantFieldRule"
		message="A constant field should be static ({0})">
		<description>
      </description>
		<priority>1</priority>
		<example>
public class MyObject {
   public static const MY_STATIC_CONSTANT : String = "myStaticConstant";
   public const MY_NON_STATIC_CONSTANT : String = "myStaticConstant"; // VIOLATION
}     
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.forbiddentypes.UseGenericTypeRule"
		message="Use strongly typed objects instead of *">
		<description></description>
		<priority>1</priority>
		<example>
public class Foo
{
   public var bar : *; // VIOLATION      
}
        </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.UselessOverridenFunctionRule"
		message="This method is empty. This should be removed ({0})">
		<description>This function is not needed.</description>
		<priority>3</priority>
		<example>
override protected function createChildren() : void
{
   super.createChildren();
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.AvoidProtectedFieldInFinalClassRule"
		message="Protected accessors are useless in a final class. Make it private ({0})">
		<priority>3</priority>
		<example>
final public class Foo
{
   protected var bar : int; // VIOLATION      
}
        </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.AvoidUsingWithKeyWordRule"
		message="You should not use the with keyword. It does not help readability">
		<priority>3</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.ArrayFieldWithNoArrayElementTypeRule"
		message="ArrayElementType metadata is not specified for this array-type field ({0})">
		<description>
        </description>
		<priority>3</priority>
		<example>
public class ArrayVO {
   public var items:Array; //VIOLATION

   [ArrayElementType("model.vo.MenuItemVO")]
   public var menuItems : Array;
}      
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.ClassAndExtensionAreIdenticalRule"
		message="The extension name is the same as the class name">
		<description/>
		<priority>3</priority>
		<example>
package com.MyCompany
{
   public class SomeClass extends mx.SomeClass // VIOLATION
   {
   }
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.ProtectedStaticMethodRule"
		message="This method ({0}) should be private">
		<description/>
		<priority>3</priority>
		<example>
protected static function foo() : void // VIOLATION
{
}
		</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.EmptyStatementRule"
		message="This statement is empty">
		<description/>
		<priority>5</priority>
		<example>
protected function foo() : void
{
   var i : int = 0;
   
   ; // VIOLATION
}
		</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.maintanability.ReferenceToVariableBindingFromItsInitializerRule"
		message="The initializer refers to its variable. Its value will be null.">
		<priority>1</priority>
		<example>
package
{
	public class Foo
	{
		public static const XYZ:String = XYZ; // meant to be "xyz"
	}
} 		
		</example>
	</rule>
	
	<!-- Multitouch -->
	<rule since="1.2" class="com.adobe.ac.pmd.rules.multiscreen.AvoidRollMouseEventRule" 
			message="Roll mouse events are not getting caught by a multi-touch device.">
		<priority>1</priority>
	</rule>

	<rule since="1.2" class="com.adobe.ac.pmd.rules.multiscreen.AvoidTooltipRule" 
			message="Tooltip cannot be visible on a multi-touch device.">
		<priority>1</priority>
	</rule>
	
	<!-- Naming -->
	<rule class="com.adobe.ac.pmd.rules.naming.TooShortVariableRule"
		message="This variable name is too short ({0} characters minimum, but {1} actually)">
		<description>Detects when a field, local, or parameter has a very short name.</description>
		<priority>5</priority>
		<properties>
			<property name="minimum">
				<value>3</value>
			</property>
		</properties>
		<example>
public class Something 
{
   private var q : int = 15; // VIOLATION - Field

   public function foo( as : String ) : void // VIOLATION - Formal 
   {
      var r : int = 20 + q; // VIOLATION - Local
   }
}
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.naming.PackageCaseRule"
		message="A package name should be lower case ({0})">
		<description>Detects when a package definition contains upper case characters.</description>
		<priority>3</priority>
		<example>
         <![CDATA[
package com.MyCompany  // VIOLATION <- should be lower case name
{
   public class SomeClass 
   {
   }
}
         ]]>
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.naming.VariableNameEndingWithNumericRule"
		message="Using digits at the end of a symbol does not help understanging the meaning of it. ({0})">
		<priority>3</priority>
		<example>
		<![CDATA[
public class SomeClass 
{
   public var correctField1 : int = 0; // VIOLATION <- numeric suffix is forbidden
}		
		]]>
		</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.naming.PropertyHiddenByLocalVariableRule"
		message="A class property is hidden by this local variable ({0})">
		<priority>3</priority>
		<example>
public class SomeClass 
{
   public var myField : int = 0;
   
   public function foo() : void
   {
   	var myField : int = 9; // VIOLATION
   }
}
		</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.naming.IncorrectClassCase"
		message="A class name must start by a majuscule character">
		<description></description>
		<priority>3</priority>
		<example>
public class foo // VIOLATION
{
}      
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.naming.WronglyNamedVariableRule"
		message="This variable ({0}) seems to be incorrectly named. Let your creativity flow">
		<priority>3</priority>	
		<example>
         <![CDATA[
public class SomeClass 
{
   public var myField : int = 0; // VIOLATION <- my prefix is forbidden
   
   public function tmpFoo() : void // VIOLATION <- tmp prefix is forbidden
   {
   	var tempFoo : int = 9; // VIOLATION <- temp prefix is forbidden
   }
}		
		]]>
		</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.naming.BooleanAttributeShouldContainIsHasRule"
		message="Differentiate the Boolean variables from other variable types ({0}); for example: canAnimate, isConnected, or hasChildren.">
		<priority>5</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.naming.CapitalizeConstantsRule"
		message="Constant variables should be in all CAPS with each word separated by an underscore ({0})">
		<priority>3</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.naming.InterfaceNamingRule"
		message="Interface name should start with I">
		<priority>1</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.naming.TooLongFunctionNameRule"
		message="This function name ({0}) is too long ({1} characters minimum, but {2} actually)">
		<priority>5</priority>
		<properties>
			<property name="minimum">
				<value>3</value>
			</property>
		</properties>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.naming.IncorrectEventHandlerNameRule"
		message="This event handler name ({0}) is not correct. You should use [{1}] as prefix and [{2}] as suffix">
		<priority>5</priority>
		<properties>
			<property name="prefix">
				<value>on</value>
			</property>
			<property name="suffix">
				<value></value>
			</property>
		</properties>
	</rule>
	
	<!-- Parsley -->
	<rule 
		class="com.adobe.ac.pmd.rules.parsley.InaccessibleMetaDataRule"
		message="Parsley metadata should not be placed on inaccessible members.">
		<description>Parsley can only process metadata that is placed onto public members.</description>
		<priority>1</priority>
		<example>
[MessageHandler]
private function doSomething() : void // VIOLATION 
{      
}      
      </example>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.parsley.MismatchedManagedEventRule"
		message="Managed events should have matching [Event] metadata">
		<description>Each managed event should have matching [Event] metadata.</description>
		<priority>1</priority>
		<example>
[Event(name="message", type="my.package.MyEvemt")]
[ManagedEvents(names="messag")] // VIOLATION
public class MyClass  
{      
}      
      </example>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.parsley.MessageInterceptorSignatureRule"
		message="The signature of the message interceptor {0} is not correct. {1}.">
		<description></description>
		<priority>1</priority>
		<example>
		<![CDATA[
[MessageInterceptor(type="a.b.MyMessage")]
public function messageInterceptor( processor : MessageProcessor ) : void
{
   processor.proceed();
}

[MessageInterceptor(type="a.b.MyMessage")]
public function messageInterceptor() : void // VIOLATION
{
}

[MessageInterceptor(type="a.b.MyMessage")]
public function messageInterceptor( type : MyMessage ) : void // VIOLATION
{
   type.something();
}

[MessageInterceptor(type="a.b.MyMessage")]
public function messageInterceptor( processor : MessageProcessor, type : MyMessage ) : void // VIOLATION
{
}]]>
              </example>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.parsley.MisplacedMetaDataRule"
		message="This metadata {0} is misplaced">
		<description></description>
		<priority>1</priority>
		<example>
        </example>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.parsley.RedundantMessageHandlerTypeAttributeRule"
		message="This type metadata argument is redundant with the handler argument type">
		<description></description>
		<priority>3</priority>
		<example>
		<![CDATA[
[MessageHandler(type="a.b.MyMessage")] // VIOLATION
public function doSomething( message : MyMessage ) : void
{
   message.toString();
}]]>
        </example>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.parsley.RedundantMethodAttributeRule"
		message="This method metadata argument is redundant with the handler name">
		<priority>3</priority>
		<example> <![CDATA[
[MessageHandler(method="doSomething")] // VIOLATION
public function doSomething( message : MyMessage ) : void
{
   message.toString();
}]]>
        </example>
	</rule>

	<rule 
		class="com.adobe.ac.pmd.rules.parsley.UnknownMetaDataAttributeRule"
		message="This metadata attribute {0} is unknown">
		<description></description>
		<priority>1</priority>
		<example>
		<![CDATA[
[AsyncInit(x="y")] // VIOLATION
public class UnknownMetaDataAttribute
{
   [Inject(x="y")] // VIOLATION
   public var inject;

   [MessageHandler(x="y")] // VIOLATION
   public function messageHandler() : void
   {
   }
}]]>
        </example>
	</rule>
	
	<!-- Performance -->
	<rule class="com.adobe.ac.pmd.rules.performance.DynamicFiltersUsedInPopup"
		message="A popup should not use dynamic filters">
		<description>Prefer using embed filters in assets</description>
		<priority>3</priority>
		<example>
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.performance.CyclomaticComplexityRule"
		message="This method is too complex. Maximum complexity is {0}, but its cyclomatic complexity was {1}">
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>10</value>
			</property>
		</properties>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.performance.HeavyConstructorRule"
		message="Constructor must be as lightweight as possible. No control statement allowed, whereas a cyclomatic complexe of {0} has been detected">
		<description><![CDATA[The Just-In-Time compiler does not compile constructors. Make them as lightweight as possible, or move the complexity of the code to a method called by the constructor. Then the complexity will be compiled by the JIT.]]></description>
		<priority>3</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.performance.CreationPolicySetToAllRule"
		message="creationPolicy to ALL impacts the performance significantly">
		<priority>1</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.performance.BindableClassRule"
		message="Globally bindable classes can lead to unexpected behaviour especially when you have a setter to a property, and hits the performance of the application">
		<priority>3</priority>	
	</rule>

	<rule class="com.adobe.ac.pmd.rules.performance.AvoidInstanciationInLoopRule"
		message="Instanciating a variable in a loop can be expensive">
		<description></description>
		<priority>5</priority>
		<example>
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.performance.DeeplyNestedIfRule"
		message="Nested if statements are not a good design">
		<priority>3</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.performance.RecursiveStyleManagerRule"
		message="Detect calls to the StyleManager that don’t pass “false” as the second parameter">
		<description>A recursive style manager call can be a very expensive operation, causing parts of the UI to flicker visibly. Instead it is preferable to defer the creation of parts of the UI that depend on a runtime CSS SWF until after the SWF has been loaded. In this case a recursive call is not required.</description>
		<priority>3</priority>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.performance.AvoidUsingMathFloorRule"
		message="VM will automatically do the rounding when using an int, so it should be : var position:int = floatingValue;">
		<priority>5</priority>
		<example>
var position:Number = Math.floor ( floatingValue ); 
		</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.performance.AvoidUsingMathCeilRule"
		message="VM will automatically do the rounding when using an int, so should be : var position:int = floatingValue + 1;">
		<priority>5</priority>
		<example>
var position:Number = Math.ceil ( floatingValue );
		</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.performance.AvoidUsingMathRoundRule"
		message="manual calculation will be much faster : var position:int = (floatingValue > 0.0) ? int(floatingValue + 0.5) : int(floatingValue - 0.5);">
		<priority>5</priority>
		<example>
var position:Number = Math.round ( floatingValue );
		</example>
	</rule>
	
	<!-- Security -->
	<rule class="com.adobe.ac.pmd.rules.security.InsecureExactSettingsRule"
		message="Security.exactSettings is set to an insecure value">
		<description>The security.exactSettings value should remain set at the default true value. Setting this value to false could make the SWF vulnerable to cross-domain attacks.</description>
		<priority>1</priority>
		<example>
			//exactSettings should be left as the default
   			Security.exactSettings = true;
      	</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.security.AllowAllSecureDomainRule"
		message="Security.allowDomain is set to an insecure value">
		<description>The security.allowDomain value of "*" will allow any domain to cross-script into the domain of this SWF and exercise its functionality.</description>
		<priority>1</priority>
		<example>
			//The allowDomain settings should be specific
   			Security.allowDomain("www.example.org");
      	</example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.security.LocalConnectionStarRule"
		message="LocalConnection.allowDomain is set to an insecure value">
		<description>The LocalConnection.allowDomain value of "*" will allow any domain to connect to this SWF and call its functions.</description>
		<priority>1</priority>
		<example>
			//The allowDomain setting should be specific
   			LocalConnection.allowDomain("www.example.org");
      	</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.security.AllowInsecureDomainRule"
		message="Potentially unnecessary use of allowInsecureDomain">
		<description>Using allowInsecureDomain will allow untrusted content from an HTTP site to inject data into a trusted HTTPS connection which may comprimise the integrity of the HTTPS connection. The use of allowDomain is preferred.</description>
		<priority>1</priority>
		<example>
			//Use the allowDomain setting instead
   			LocalConnection.allowDomain("www.example.org");
			Security.allowDomain("www.example.org");
      	</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.security.LSOSecureFalseRule"
		message="The secure flag is set to false">
		<description>If this SWF is being served over HTTPS then the secure flag should be set to true. This can help prevent sensitive SSL protected information from being shared within insecure HTTP content. If this SWF is served over HTTP then you can ignore this warning.</description>
		<priority>5</priority>
		<example>
			//Setting secure values for LSOs
   			LSO.getLocal(name, null, true);
      	</example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.security.ImportLoadBestPracticeRule"
		message="Set allowCodeImport to false when import loading images">
		<description>If this loader is only intended to load image files (GIF,JPG,PNG) then be sure to set the allowCodeImport value to false. Setting this flag will reduce the chances of an untrusted SWF gaining access to your site. If your intent is to load a SWF, the URL for the request is a static value for a trusted site and/or you have already set the allowCodeImport flag, then you can ignore this warning.</description>
		<priority>5</priority>
	</rule>
	
	<!-- Sizing -->
	<rule class="com.adobe.ac.pmd.rules.sizing.TooManyFunctionRule"
		message="Too many methods detected ({0} maximum, but {1} actually)">
		<description>A class with too many methods is probably a good suspect for refactoring, in order to reduce its complexity and find a way to have more fine grained objects.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>10</value>
			</property>
		</properties>
		<example>
   public class Foo 
   {
      public function doWork() : void {}
      public function doMoreWork() : void {}
      public function doWorkAgain() : void {}
      // [... more more public methods ...]
   }
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.sizing.TooLongFunctionRule"
		message="This function is far too long ({0} maximum, but {1} actually)">
		<description>Violations of this rule usually indicate that the method has too much responsibility. Try to reduce the method size by creating helper methods and removing any copy/pasted code.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>20</value>
			</property>
		</properties>
		<example>
   public class Foo 
   {
      public function doSomething() : void
      {
         System.out.println("Hello world!");
         System.out.println("Hello world!");
         // 98 copies omitted for brevity.
      }
   }
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.sizing.TooLongSwitchCaseRule"
		message="Long switch case detected ({0} lines maximum, but {1} actually)">
		<description>A switch case statement should be either empty, or contain a break, or call another method.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>3</value>
			</property>
		</properties>
		<example>
   public class Bar   
   {
      public function foo() : void
      {
          var i : int = 4;
          
          switch( i )
          {
             case 1:
                handleFirstCase();
                break;
             case 2: // VIOLATION
                googleResquest.url = "";
                handleSecondCaseFirstPart();
                handleSecondCaseSecondPart();
                break;
          }
      }
   }
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.sizing.TooManyParametersRule"
		message="Long parameter list detected ({0} maximum, but {1} actually)">
		<description>Long parameter lists can indicate that a new object should be created to wrap the numerous parameters.  Basically, try to group the parameters together.
      </description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>4</value>
			</property>
		</properties>
		<example>
   public class Foo 
   {
      public function addData( p0 : int, p1 : int, p2 : int, p3 : int, p4 : int, p5 : int,
                                             p6 : int, p7 : int, p8 : int, p9 : int, p10 : int ) : void 
      {
      }
   }
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.sizing.TooManyPublicRule"
		message="Too many public fields or functions detected ({0} maximum, but {1} actually)">
		<description>A large number of public methods and attributes declared in a class can indicate the class may need to be broken up as increased effort will be required to thoroughly test it.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>10</value>
			</property>
		</properties>
		<example>
   public class Foo 
   {
      public var value : String;
      public var something : Bar;
      public var variable : Variable;

      // [... more more public attributes ...]

      public function doWork() : void {}
      public function doMoreWork() : void {}
      public function doWorkAgain() : void {}

      // [... more more public methods ...]
   }
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.sizing.TooManyFieldsRule"
		message="Too many field detected ({0} maximum, but {1} actually)">
		<description>Classes that have too many fields could be redesigned to have fewer fields, possibly  through some nested object grouping of some of the information.  For example, a class with  city/state/zipcode fields could instead have one Address field.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>5</value>
			</property>
		</properties>
		<example>
   public class Person 
   {
      private var one : String;
      private var two : int;
      private var three : int;

      [... many more public fields ...]

   }      
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.sizing.TooManyFieldInVORule"
		message="Too many field detected ({0} maximum, but {1} actually)">
		<priority>3</priority>
	</rule>
	
	<!-- Style -->
	<rule class="com.adobe.ac.pmd.rules.style.ConstructorNonEmptyReturnTypeRule"
		message="A constructor should not have a return type">
		<description>Even if this is syntactically correct, there should not be a return type for a constructor.</description>
		<priority>5</priority>
		<example>
   public class VoidConstructor   
   {
      public function VoidConstructor() : void // VIOLATION
      {         
      }      
   }
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.style.OverLongLineRule"
		message="Too long line ({0} maximum, but {1} actually)">
		<description></description>
		<priority>5</priority>
		<properties>
			<property name="maximum">
				<value>200</value>
			</property>
		</properties>
		<example>
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.style.ImportFromSamePackageRule"
		message="Imports from the same package are not necessary">
		<description></description>
		<priority>5</priority>
		<example>
package com.adobe.ac
{
   import com.adobe.ac.MyModel; // VIOLATION HERE

   public class BigModel   
   {
      public var model : MyModel = null;
   }
}         
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.style.CopyrightMissingRule"
		message="The copyright header is missing in this file">
		<priority>5</priority>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.style.BadFormatLoggerRule"
		message="The logger is not correctly formatted because {0}">
		<description></description>
		<priority>5</priority>
		<example>
      </example>
	</rule>
	
	<!-- Switches -->
	<rule
		class="com.adobe.ac.pmd.rules.switchrules.SwitchStatementsShouldHaveDefaultRule"
		message="A switch statement does not contain a default statement">
		<description>Switch statements should have a default label in order to detect corner cases.</description>
		<priority>1</priority>
		<example>
public class Foo 
{
   public funciton bar() : void 
   {
      var  x : int = 2;
      switch (x) 
      {
         case 2: var j : int = 8;
      }
   }
}     
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.switchrules.NestedSwitchRule"
		message="Switch must not be nested">
		<description>As a general practice, switch statement should not be used. Prefer using inheritance. It is even harder to read when switch statements are nested.</description>
		<priority>3</priority>
		<example>
public function foo( a : Number, b : Number ) : void
{
    switch( a )
    {
       case 1:
          break;
       case 2:                   
          switch ( b ) 
          {
            case 3 :
               break;
            case 4 :
               break;
          }
          break;                     
    }
}
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.switchrules.NonBreakableSwitchCaseRule"
		message="Switch case must include break statement">
		<priority>1</priority>
		<example>
switch(event.type){
  case GoogleSearchPanel.LAUNCH_GOOGLE_WEB_SEARCH:
	  googleResquest.url = ""; // VIOLATION
  case GoogleSearchPanel.LAUNCH_GOOGLE_IMAGE_SEARCH:                   
  case GoogleSearchPanel.LAUNCH_GOOGLE_IMAGE_SEARCH2:                   
	  googleResquest.url = "";
	  break;
  default:
	  return;
}
      </example>
	</rule>

	
	<rule
		class="com.adobe.ac.pmd.rules.switchrules.TooFewBrancheInSwitchStatementRule"
		message="There are too few branches in this switch statement ({0} minimum, but {1} actual)">
		<description>Switch statements are designed for complex branches, and allow branches to share treatment. Using a switch for only 2 branches is ill advised, as switches are not as easy to understand as if. In this case, it's most likely is a good idea to use a if statement</description>
		<priority>5</priority>
		<properties>
			<property name="minimum">
				<value>3</value>
			</property>
		</properties>
		<example>
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.switchrules.IdenticalSwitchCasesRule"
		message="Two switch cases should not be identical">
		<priority>1</priority>
	</rule>
	
	<!-- Unit Tests -->
	<rule class="com.adobe.ac.pmd.rules.flexunit.EmptyUnitTest"
		message="A test should contain at least one assertion">
		<priority>3</priority>
	</rule>
	
	<!-- Unused -->
	<rule class="com.adobe.ac.pmd.rules.unused.UnusedParameterRule"
		message="This parameter ({0}) of this function is not used">
		<description>
      </description>
		<priority>1</priority>
		<example>
      public function foo( param1 : Number, param2 : Number, param3 : Number, param4 : Number, param5 : Number ) : void // 4 violations
      {
         var i : int = param1;
      }
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.unused.UnusedLocalVariableRule"
		message="This variable ({0}) is not used">
		<description>
      </description>
		<priority>3</priority>
		<example>
      public function foo() : void
      {
         var i : int = 0;// 1 violation
      }
      </example>
	</rule>
	
	<rule class="com.adobe.ac.pmd.rules.unused.UnusedPrivateMethodRule"
		message="This private method ({0}) does not seem to be used">
		<description>
      </description>
		<priority>1</priority>
		<example>
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.unused.UnusedFieldRule"
		message="This private attribute ({0}) does not seem to be used">
		<description>
      </description>
		<priority>1</priority>
		<example>
      </example>
	</rule>

	<rule class="com.adobe.ac.pmd.rules.unused.EmptyPrivateMethodRule"
		message="This private method ({0}) is used but its content is empty">
		<description>
      </description>
		<priority>1</priority>
		<example>
      </example>
	</rule>
</ruleset>