<!--

Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->
<ruleset name="All Flex Rules" 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" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <description/>
  <rule since="" 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 since="" class="com.adobe.ac.pmd.rules.mxml.MoreThanOneEntryPointInMxmlRule" message="There is more than 1 public variable in this MXML component">
    <description/>
    <priority>3</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.mxml.MoreThanTwoEntryPointsInMxmlRule" message="There are more than 2 public variables in this MXML component">
    <description/>
    <priority>1</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.mxml.TooLongScriptBlockRule" message="This script block is too long ({0} maximum, but {1} actually)">
    <description/>
    <priority>3</priority>
    <properties>
      <property name="maximum">
        <value>50</value>
      </property>
    </properties>
  </rule>
  <rule since="" 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 base and not reusable. Try using presentation model pattern, or observer pattern</description>
    <priority>5</priority>
  </rule>
  <rule since="" 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/>
    <priority>1</priority>
    <example><![CDATA[public class Controller extends FrontController
{
   public function Controller()
   {
   	 BindingUtils.bindSetter(setContent, value, "content"); // VIOLATION
   }
}]]></example>
  </rule>
  <rule since="" 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">
    <description/>
    <priority>1</priority>
    <example><![CDATA[public final class Title 
{
	private var watcher : ChangeWatcher; // VIOLATION
}]]></example>
  </rule>
  <rule since="" 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>
  <rule since="" 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>
  </rule>
  <rule since="" 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>
  <rule since="" 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 since="" class="com.adobe.ac.pmd.rules.css.UseCssInsteadOfEmbedMetaDataRule" message="Embed metadata detected in source code where a stylesheet may be cleaner">
    <description/>
    <priority>5</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.empty.EmptyCatchStatementRule" message="This catch statement is empty">
    <description/>
    <priority>3</priority>
    <example><![CDATA[public class Foo 
{
   public function bar( x : int ) : void
   {
      try
      {
      }
      catch( e : Exception )         // VIOLATION
      {
      }
   }
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[public class Foo 
{
   public function bar( x : int ) : void
   {
      if ( x == 0 ) 
      {
         // VIOLATION
      }
   }
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[public class FirstCustomEvent   // VIOLATION - clone method is missing
{
   public var lala : String;
   
   public function FirstCustomEvent()
   {         
   }
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[public class FirstCustomEvent   {   public var lala : String; // VIOLATION      public function FirstCustomEvent( dfsfd)   {            }}]]></example>
  </rule>
  <rule since="" 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><![CDATA[public class BigModel   
{
   public function BigModel()
   {    
      dispatchEvent( new Event( "pointlessEvent" ) );     
   }
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[public class Foo 
{
   public function bar() : void
   {
      addEventListener( "myHardCodedEvent", handleMyHardCodedEvent ); // VIOLATION
   }
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.event.UnboundTypeInMetadataRule" message="This type ({0}) was not found within the scope against which PMD was run">
    <description/>
    <priority>1</priority>
    <example><![CDATA[[Event(name="myTypeEvent",type="UnknownType")] // VIOLATION
public class UnboundMetadata
{
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[[Event(name="myTypeEvent")] // VIOLATION
public class UnTypedMetadata
{
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[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 since="" class="com.adobe.ac.pmd.rules.maintanability.TrueFalseConditionRule" message="This test contains a hard coded boolean value. You could remove it by having '{0}'">
    <description/>
    <priority>3</priority>
    <example><![CDATA[if ( true ) // VIOLATION
{
   if ( myCondition == false ) // VIOLATION
   {
   }
}]]></example>
  </rule>
  <rule since="" 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>3</priority>
    <example><![CDATA[dynamic public class DynamicObject // VIOLATION
{
}]]></example>
  </rule>
  <rule since="" 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>5</priority>
    <example><![CDATA[public class Foo
{
   public var bar : Object; // VIOLATION      
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.NonStaticConstantFieldRule" message="A constant field should be static ({0})">
    <description/>
    <priority>1</priority>
    <example><![CDATA[public class MyObject {
   public static const MY_STATIC_CONSTANT : String = "myStaticConstant";
   public const MY_NON_STATIC_CONSTANT : String = "myStaticConstant"; // VIOLATION
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[override protected function createChildren() : void
{
   super.createChildren();
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.AvoidProtectedFieldInFinalClassRule" message="Protected accessors are useless in a final class. Make it private ({0})">
    <description/>
    <priority>3</priority>
    <example><![CDATA[final public class Foo
{
   protected var bar : int; // VIOLATION      
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.AvoidUsingWithKeyWordRule" message="You should not use the with keyword. It does not help readability">
    <description/>
    <priority>3</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.ArrayFieldWithNoArrayElementTypeRule" message="ArrayElementType metadata is not specified for this array-type field ({0})">
    <description/>
    <priority>3</priority>
    <example><![CDATA[public class ArrayVO {
   public var items:Array; //VIOLATION

   [ArrayElementType("model.vo.MenuItemVO")]
   public var menuItems : Array;
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.ClassAndExtensionAreIdenticalRule" message="The extension name is the same as the class name">
    <description/>
    <priority>3</priority>
    <example><![CDATA[package com.MyCompany
{
   public class SomeClass extends mx.SomeClass // VIOLATION
   {
   }
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.ProtectedStaticMethodRule" message="This method ({0}) should be private">
    <description/>
    <priority>3</priority>
    <example><![CDATA[protected static function foo() : void // VIOLATION
{
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.maintanability.EmptyStatementRule" message="This statement is empty">
    <description/>
    <priority>5</priority>
    <example><![CDATA[protected function foo() : void
{
   var i : int = 0;
   
   ; // VIOLATION
}]]></example>
  </rule>
  <rule since="" 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>1</priority>
    <properties>
      <property name="minimum">
        <value>3</value>
      </property>
    </properties>
    <example><![CDATA[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 since="" 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 since="" 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})">
    <description/>
    <priority>3</priority>
    <example><![CDATA[
public class SomeClass 
{
   public var correctField1 : int = 0; // VIOLATION <- numeric suffix is forbidden
}		
		]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.naming.PropertyHiddenByLocalVariableRule" message="A class property is hidden by this local variable ({0})">
    <description/>
    <priority>3</priority>
    <example><![CDATA[public class SomeClass 
{
   public var myField : int = 0;
   
   public function foo() : void
   {
   	var myField : int = 9; // VIOLATION
   }
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.naming.WronglyNamedVariableRule" message="This variable ({0}) seems to be incorrectly named. Let your creativity flow">
    <description/>
    <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 since="" 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><![CDATA[[MessageHandler]
private function doSomething() : void // VIOLATION 
{      
}]]></example>
  </rule>
  <rule since="" 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><![CDATA[[Event(name="message", type="my.package.MyEvemt")]
[ManagedEvents(names="messag")] // VIOLATION
public class MyClass  
{      
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.parsley.MessageInterceptorSignatureRule" message="The signature of the message interceptor {0} is not correct. {1}.">
    <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 since="" class="com.adobe.ac.pmd.rules.parsley.MisplacedMetaDataRule" message="This metadata {0} is misplaced">
    <description/>
    <priority>1</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.parsley.RedundantMessageHandlerTypeAttributeRule" message="This type metadata argument is redundant with the handler argument type">
    <description/>
    <priority>3</priority>
    <example><![CDATA[
[MessageHandler(type="a.b.MyMessage")] // VIOLATION
public function doSomething( message : MyMessage ) : void
{
   message.toString();
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.parsley.RedundantMethodAttributeRule" message="This method metadata argument is redundant with the handler name">
    <description/>
    <priority>3</priority>
    <example><![CDATA[
[MessageHandler(method="doSomething")] // VIOLATION
public function doSomething( message : MyMessage ) : void
{
   message.toString();
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.parsley.UnknownMetaDataAttributeRule" message="This metadata attribute {0} is unknown">
    <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>
  <rule since="" 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>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.performance.CyclomaticComplexityRule" message="This method is too complex. Maximum complexity is {0}, but its cyclomatic complexity was {1}">
    <description/>
    <priority>3</priority>
    <properties>
      <property name="maximum">
        <value>10</value>
      </property>
    </properties>
  </rule>
  <rule since="" 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>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 since="" class="com.adobe.ac.pmd.rules.performance.CreationPolicySetToAllRule" message="creationPolicy to ALL impacts the performance significantly">
    <description/>
    <priority>1</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.performance.DeeplyNestedIfRule" message="Nested if statements are not a good design">
    <description/>
    <priority>3</priority>
  </rule>
  <rule since="" 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 since="" 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>25</value>
      </property>
    </properties>
    <example><![CDATA[public class Foo 
   {
      public function doWork() : void {}
      public function doMoreWork() : void {}
      public function doWorkAgain() : void {}
      // [... more more public methods ...]
   }]]></example>
  </rule>
  <rule since="" 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><![CDATA[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 since="" 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><![CDATA[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 since="" 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><![CDATA[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 since="" 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>15</value>
      </property>
    </properties>
    <example><![CDATA[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 since="" 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>15</value>
      </property>
    </properties>
    <example><![CDATA[public class Person 
   {
      private var one : String;
      private var two : int;
      private var three : int;

      [... many more public fields ...]

   }]]></example>
  </rule>
  <rule since="" 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><![CDATA[public class VoidConstructor   
   {
      public function VoidConstructor() : void // VIOLATION
      {         
      }      
   }]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.style.OverLongLineRule" message="Too long line ({0} maximum, but {1} actually)">
    <description/>
    <priority>5</priority>
    <properties>
      <property name="maximum">
        <value>120</value>
      </property>
    </properties>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.style.ImportFromSamePackageRule" message="Imports from the same package are not necessary">
    <description/>
    <priority>5</priority>
    <example><![CDATA[package com.adobe.ac
{
   import com.adobe.ac.MyModel; // VIOLATION HERE

   public class BigModel   
   {
      public var model : MyModel = null;
   }
}]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.style.BadFormatLoggerRule" message="The logger is not correctly formatted because {0}">
    <description/>
    <priority>5</priority>
  </rule>
  <rule since="" 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><![CDATA[public class Foo 
   {
      public funciton bar() : void 
      {
         var  x : int = 2;
         switch (x) 
         {
            case 2: var j : int = 8;
         }
      }
   }]]></example>
  </rule>
  <rule since="" 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><![CDATA[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 since="" 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>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.switchrules.IdenticalSwitchCasesRule" message="Two switch cases should not be identical">
    <description/>
    <priority>1</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.flexunit.EmptyUnitTest" message="A test should contain at least one assertion">
    <description/>
    <priority>3</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.unused.UnusedParameterRule" message="This parameter ({0}) of this function is not used">
    <description/>
    <priority>1</priority>
    <example><![CDATA[public function foo( param1 : Number, param2 : Number, param3 : Number, param4 : Number, param5 : Number ) : void // 4 violations
      {
         var i : int = param1;
      }]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.unused.UnusedLocalVariableRule" message="This variable ({0}) is not used">
    <description/>
    <priority>3</priority>
    <example><![CDATA[public function foo() : void
      {
         var i : int = 0;// 1 violation
      }]]></example>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.unused.UnusedPrivateMethodRule" message="This private method ({0}) does not seem to be used">
    <description/>
    <priority>1</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.unused.UnusedFieldRule" message="This private attribute ({0}) does not seem to be used">
    <description/>
    <priority>1</priority>
  </rule>
  <rule since="" class="com.adobe.ac.pmd.rules.unused.EmptyPrivateMethodRule" message="This private method ({0}) is used but its content is empty">
    <description/>
    <priority>1</priority>
  </rule>
    
</ruleset>