container/components/components/src/main/java/org/mobicents/slee/container/component/validator/ProfileSpecificationComponentValidator.java
boolean validateAbstractClass() {
		boolean passed = true;
		String errorBuffer = new String("");

		try {

			if (this.component.getDescriptor().getProfileAbstractClass() == null) {

				if (this.requiredProfileAbstractClass) {
          passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile management abstract class must be present",
							"3.X", errorBuffer);
					return passed;
				}

			} else {

				if (this.component.getProfileAbstractClass() == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile management abstract class has not been loaded",
							"3.X", errorBuffer);
					return passed;
				}

			}

			Class profileAbstractClass = this.component.getProfileAbstractClass();

			// FIXME: Alexandre: Added this, was making some tests fail. Review!
			if(profileAbstractClass == null)
			{
			  return passed;
			}
			
			// if (profileAbstractClass.isInterface()
			// || profileAbstractClass.isEnum()) {
			// passed = false;
			// errorBuffer = appendToBuffer(
			// "Profile specification profile abstract class in not a clas.",
			// "10.11", errorBuffer);
			// return passed;
			// }

			if (this.component.isSlee11()) {

				if (profileAbstractClass.getPackage() == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must be defined in package.",
							"10.11", errorBuffer);

				}

				// FIXME: what about 1.0 ?
				// public, no arg constructor without throws clause
				Constructor c = null;
				try {
					c = profileAbstractClass.getConstructor(null);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					// e.printStackTrace();
				}

				if (c == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must define public no arg constructor.",
							"10.11", errorBuffer);
				} else {
					if (!Modifier.isPublic(c.getModifiers())) {

						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must define public no arg constructor.",
								"10.11", errorBuffer);

					}

					if (c.getExceptionTypes().length > 0) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must define public no arg constructor without throws clause.",
								"10.11", errorBuffer);
					}
				}

			}

			int modifiers = profileAbstractClass.getModifiers();

			if (!Modifier.isAbstract(modifiers)) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must be defined abstract.",
						"10.11", errorBuffer);
			}

			if (!Modifier.isPublic(modifiers)) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must be defined public.",
						"10.11", errorBuffer);
			}

			// in case of 1.0 it has to implement as concrete methods from
			// javax.slee.profile.ProfileManagement - section 10.8 of 1.0 specs
			Map<String, Method> requiredLifeCycleMethods = null;
			Set<String> ignore = new HashSet<String>();
			ignore.add("java.lang.Object");
			if (this.component.isSlee11()) {
				Class javaxSleeProfileProfileClass = ClassUtils
						.checkInterfaces(profileAbstractClass,
								"javax.slee.profile.Profile");
				if (javaxSleeProfileProfileClass == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement javax.slee.profile.Profile.",
							"10.11", errorBuffer);

					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javax.slee.profile.ProfileLocalObject.class,
									ignore);
				} else {
					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javaxSleeProfileProfileClass, ignore);
				}
			} else {
				Class javaxSleeProfileProfileManagement = ClassUtils
						.checkInterfaces(profileAbstractClass,
								"javax.slee.profile.ProfileManagement");
				if (javaxSleeProfileProfileManagement == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement javax.slee.profile.ProfileManagement.",
							"10.8", errorBuffer);
					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javax.slee.profile.ProfileManagement.class,
									ignore);
				} else {
					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javaxSleeProfileProfileManagement, ignore);
				}
			}

			Map<String, Method> abstractMethods = ClassUtils
					.getAbstractMethodsFromClass(profileAbstractClass);
			Map<String, Method> abstractMethodsFromSuperClasses = ClassUtils
					.getAbstractMethodsFromSuperClasses(profileAbstractClass);

			Map<String, Method> concreteMethods = ClassUtils
					.getConcreteMethodsFromClass(profileAbstractClass);
			Map<String, Method> concreteMethodsFromSuperClasses = ClassUtils
					.getConcreteMethodsFromSuperClasses(profileAbstractClass);

			// FIXME: Alexandre: Verify if this is correct
			// The isProfileDirty, markProfileDirty and  isProfileValid methods must not be 
			// implemented as they are implemented by the SLEE. These three methods are implemented by the 
			// SLEE at deployment time.  
			Set<String> toBeImplementedBySlee = new HashSet<String>();
      toBeImplementedBySlee.add("isProfileDirty");
      toBeImplementedBySlee.add("markProfileDirty");
      toBeImplementedBySlee.add("isProfileValid");
			
			for (Entry<String, Method> entry : requiredLifeCycleMethods
					.entrySet()) {

				Method m = entry.getValue();
				//
				Method methodFromClass = ClassUtils.getMethodFromMap(m
						.getName(), m.getParameterTypes(), concreteMethods,
						concreteMethodsFromSuperClasses);

        if (methodFromClass == null)
        {
          if(this.component.isSlee11() || (!this.component.isSlee11() && !toBeImplementedBySlee.contains(m.getName())))
          {
            passed = false;
            errorBuffer = appendToBuffer(
              "Profile specification profile abstract class must implement certain lifecycle methods. Method not found in concrete(non private) methods: "
                  + m.getName(), "10.11", errorBuffer);
          }
          continue;
        }
				if ( methodFromClass != null && toBeImplementedBySlee.contains(m.getName()) )
				{
          passed = false;
          errorBuffer = appendToBuffer(
              "[JAIN SLEE 1.0] The " + m.getName() + " method must not be implemented as they are implemented by the SLEE.", "10.11", errorBuffer);
          continue;				  
				}

				// it concrete - must check return type
				if (!m.getReturnType().getName().equals(methodFromClass.getReturnType().getName())) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods has different return type: "
									+ methodFromClass.getReturnType()
									+ ", than one declared in interface: "
									+ m.getReturnType(), "10.11", errorBuffer);
				}

				if (!Arrays.equals(m.getExceptionTypes(), methodFromClass
						.getExceptionTypes())) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods has different throws clause than one found in class.",
							"10.11", errorBuffer);
				}

				// must be public, not abstract, not final, not static
				modifiers = methodFromClass.getModifiers();
				if (!Modifier.isPublic(modifiers)) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods must be public.",
							"10.11", errorBuffer);
				}
				if (Modifier.isStatic(modifiers)) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods must not be static.",
							"10.11", errorBuffer);
				}
				if (Modifier.isFinal(modifiers)) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods must not be final.",
							"10.11", errorBuffer);
				}

				// FIXME: native?

			}

			// in 1.1 and 1.0 it must implement CMP interfaces, but methods
			// defined there MUST stay abstract
			Class profileCMPInterface = ClassUtils.checkInterfaces(
					profileAbstractClass, this.component
							.getProfileCmpInterfaceClass().getName());

			if (profileCMPInterface == null) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must implement profile CMP interface.",
						"10.11", errorBuffer);
				return passed;
			}
			// abstract class implements CMP Interface, but leaves all methods
			// as abstract

			Map<String, Method> cmpInterfaceMethods = ClassUtils
					.getAllInterfacesMethods(profileCMPInterface, ignore);

			if (profileCMPInterface == null) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must implement defined profile CMP interface.",
						"10.11", errorBuffer);
			} else {

				for (Entry<String, Method> entry : cmpInterfaceMethods
						.entrySet()) {

					Method m = entry.getValue();
					//
					Method methodFromClass = ClassUtils.getMethodFromMap(m
							.getName(), m.getParameterTypes(), concreteMethods,
							concreteMethodsFromSuperClasses);

					if (methodFromClass != null) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must leave CMP interface methods as abstract, it can not be concrete: "
										+ m.getName(), "10.11", errorBuffer);
						continue;
					}

					methodFromClass = ClassUtils.getMethodFromMap(m.getName(),
							m.getParameterTypes(), abstractMethods,
							abstractMethodsFromSuperClasses);

					// it concrete - must check return type
					if (m.getReturnType().getName().compareTo(
							methodFromClass.getReturnType().getName()) != 0) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must not decalre methods from CMP interface with different return type. Method with name: "
										+ m.getName()
										+ " found in (non private) class methods has different return type: "
										+ methodFromClass.getReturnType()
										+ ", than one declared in interface: "
										+ m.getReturnType(), "10.11",
								errorBuffer);
					}

					if (!Arrays.equals(m.getExceptionTypes(), methodFromClass
							.getExceptionTypes())) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must not change throws clause. Method with name: "
										+ m.getName()
										+ " found in (non private) class methods has different throws clause than one found in class.",
								"10.11", errorBuffer);
					}

					// FIXME: should we do that?
					abstractMethods.remove(entry.getKey());
					abstractMethodsFromSuperClasses.remove(entry.getKey());
				}

			}

			// those checks are......
			// 1.0 and 1.1 if we define management interface we have to
			// implement it, and all methods that are not CMPs
			if (this.component.getDescriptor().getProfileManagementInterface() != null) {
				Class profileManagementInterfaceClass = this.component
						.getProfileManagementInterfaceClass();
				
				// if abstract class and management interface are both defined than abstract class must implement the management interface
				if (this.component.getProfileAbstractClass() != null && !profileManagementInterfaceClass.isAssignableFrom(this.component.getProfileAbstractClass())) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile abstract class must implement profile management interface if both are specified", "10.11",
							errorBuffer);
				}
				
				Map<String, Method> profileManagementInterfaceMethods = ClassUtils
						.getAllInterfacesMethods(
								profileManagementInterfaceClass, ignore);
				// methods except those defined in CMP interface must be
				// concrete

				for (Entry<String, Method> entry : profileManagementInterfaceMethods
						.entrySet()) {

					Method m = entry.getValue();

					// CMP methods must stay abstract
					// check if this method is the same as in CMP interface is
					// done elsewhere
					// that check shoudl be ok to run this one!!! XXX
					if (cmpInterfaceMethods.containsKey(entry.getKey())) {
						// we do nothing, cmp interface is validate above

					} else {
						// 10.8/10.11

						Method concreteMethodFromAbstractClass = ClassUtils
								.getMethodFromMap(m.getName(), m
										.getParameterTypes(), concreteMethods,
										concreteMethodsFromSuperClasses);
						if (concreteMethodFromAbstractClass == null) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement as non private methods from profile management interface other than CMP methods",
									"10.11", errorBuffer);
							continue;
						}

						int concreteMethodModifiers = concreteMethodFromAbstractClass
								.getModifiers();
						// public, and cannot be static,abstract, or final.
						if (!Modifier.isPublic(concreteMethodModifiers)) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement methods from profile management interface as public, offending method: "
											+ concreteMethodFromAbstractClass
													.getName(), "10.11",
									errorBuffer);
						}

						if (Modifier.isStatic(concreteMethodModifiers)) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement methods from profile management interface as not static, offending method: "
											+ concreteMethodFromAbstractClass
													.getName(), "10.11",
									errorBuffer);
						}

						if (Modifier.isFinal(concreteMethodModifiers)) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement methods from profile management interface as not final, offending method: "
											+ concreteMethodFromAbstractClass
													.getName(), "10.11",
									errorBuffer);
						}
					}

				}

			}

			if (this.component.isSlee11()) {
				// ProfileLocalObject and UsageInterface are domains of 1.1
				// uff, ProfileLocal again that stupid check cross two
				// interfaces and one abstract class.....

				if (this.component.getDescriptor().getProfileLocalInterface() != null) {

					// abstract class MUST NOT implement it
					if (ClassUtils.checkInterfaces(profileAbstractClass,
							this.component.getDescriptor()
									.getProfileLocalInterface()
									.getProfileLocalInterfaceName()) != null
							|| ClassUtils.checkInterfaces(profileAbstractClass,
									"javax.slee.profile.ProfileLocalObject") != null) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must not implement profile local interface in any way(only methods must be implemented)",
								"10.11", errorBuffer);
					}

					Class profileLocalObjectClass = this.component
							.getProfileLocalInterfaceClass();
					ignore.add("javax.slee.profile.ProfileLocalObject");
					Map<String, Method> profileLocalObjectInterfaceMethods = ClassUtils
							.getAllInterfacesMethods(profileLocalObjectClass,
									ignore);
					ignore.remove("javax.slee.profile.ProfileLocalObject");
					// methods except those defined in CMP interface must be
					// concrete

					for (Entry<String, Method> entry : profileLocalObjectInterfaceMethods
							.entrySet()) {

						Method m = entry.getValue();

						// CMP methods must stay abstract
						// check if this method is the same as in CMP interface
						// is done elsewhere
						// that check shoudl be ok to run this one!!! XXX
						if (cmpInterfaceMethods.containsKey(entry.getKey())) {
							// we do nothing, cmp interface is validate above

						} else {
							// 10.8/10.11
							Method concreteMethodFromAbstractClass = ClassUtils
									.getMethodFromMap(m.getName(), m
											.getParameterTypes(),
											concreteMethods,
											concreteMethodsFromSuperClasses);
							if (concreteMethodFromAbstractClass == null) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement as non private methods from profile local interface other than CMP methods",
										"10.11", errorBuffer);
								continue;
							}

							int concreteMethodModifiers = concreteMethodFromAbstractClass
									.getModifiers();
							// public, and cannot be static,abstract, or final.
							if (!Modifier.isPublic(concreteMethodModifiers)) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement methods from profile local interface as public, offending method: "
												+ concreteMethodFromAbstractClass
														.getName(), "10.11",
										errorBuffer);
							}

							if (Modifier.isStatic(concreteMethodModifiers)) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement methods from profile local interface as not static, offending method: "
												+ concreteMethodFromAbstractClass
														.getName(), "10.11",
										errorBuffer);
							}

							if (Modifier.isFinal(concreteMethodModifiers)) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement methods from profile management interface as not final, offending method: "
												+ concreteMethodFromAbstractClass
														.getName(), "10.11",
										errorBuffer);
							}
						}

					}
				}

				// usage parameters
				if (this.component.getDescriptor()
						.getProfileUsageParameterInterface() != null) {
					if (!validateProfileUsageInterface(abstractMethods,
							abstractMethodsFromSuperClasses)) {
						passed = false;
					}

				}

			}

			// FIXME: add check on abstract methods same as in SBB ?

		} finally {

			if (!passed) {
				if(logger.isEnabledFor(Level.ERROR))
					logger.error(errorBuffer);
				//System.err.println(errorBuffer);
			}

		}

		return passed;
	}
boolean validateAbstractClass() {
		boolean passed = true;
		String errorBuffer = new String("");

		try {

			if (this.component.getDescriptor().getProfileAbstractClass() == null) {

				if (this.requiredProfileAbstractClass) {
          passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile management abstract class must be present",
							"3.X", errorBuffer);
					return passed;
				}

			} else {

				if (this.component.getProfileAbstractClass() == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile management abstract class has not been loaded",
							"3.X", errorBuffer);
					return passed;
				}

			}

			Class profileAbstractClass = this.component.getProfileAbstractClass();

			// FIXME: Alexandre: Added this, was making some tests fail. Review!
			if(profileAbstractClass == null)
			{
			  return passed;
			}
			
			// if (profileAbstractClass.isInterface()
			// || profileAbstractClass.isEnum()) {
			// passed = false;
			// errorBuffer = appendToBuffer(
			// "Profile specification profile abstract class in not a clas.",
			// "10.11", errorBuffer);
			// return passed;
			// }

			if (this.component.isSlee11()) {

				if (profileAbstractClass.getPackage() == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must be defined in package.",
							"10.11", errorBuffer);

				}

				// FIXME: what about 1.0 ?
				// public, no arg constructor without throws clause
				Constructor c = null;
				try {
					c = profileAbstractClass.getConstructor(null);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					// e.printStackTrace();
				}

				if (c == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must define public no arg constructor.",
							"10.11", errorBuffer);
				} else {
					if (!Modifier.isPublic(c.getModifiers())) {

						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must define public no arg constructor.",
								"10.11", errorBuffer);

					}

					if (c.getExceptionTypes().length > 0) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must define public no arg constructor without throws clause.",
								"10.11", errorBuffer);
					}
				}

			}

			int modifiers = profileAbstractClass.getModifiers();

			if (!Modifier.isAbstract(modifiers)) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must be defined abstract.",
						"10.11", errorBuffer);
			}

			if (!Modifier.isPublic(modifiers)) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must be defined public.",
						"10.11", errorBuffer);
			}

			// in case of 1.0 it has to implement as concrete methods from
			// javax.slee.profile.ProfileManagement - section 10.8 of 1.0 specs
			Map<String, Method> requiredLifeCycleMethods = null;
			Set<String> ignore = new HashSet<String>();
			ignore.add("java.lang.Object");
			if (this.component.isSlee11()) {
				Class javaxSleeProfileProfileClass = ClassUtils
						.checkInterfaces(profileAbstractClass,
								"javax.slee.profile.Profile");
				if (javaxSleeProfileProfileClass == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement javax.slee.profile.Profile.",
							"10.11", errorBuffer);

					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javax.slee.profile.ProfileLocalObject.class,
									ignore);
				} else {
					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javaxSleeProfileProfileClass, ignore);
				}
			} else {
				Class javaxSleeProfileProfileManagement = ClassUtils
						.checkInterfaces(profileAbstractClass,
								"javax.slee.profile.ProfileManagement");
				if (javaxSleeProfileProfileManagement == null) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement javax.slee.profile.ProfileManagement.",
							"10.8", errorBuffer);
					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javax.slee.profile.ProfileManagement.class,
									ignore);
				} else {
					requiredLifeCycleMethods = ClassUtils
							.getAllInterfacesMethods(
									javaxSleeProfileProfileManagement, ignore);
				}
			}

			Map<String, Method> abstractMethods = ClassUtils
					.getAbstractMethodsFromClass(profileAbstractClass);
			Map<String, Method> abstractMethodsFromSuperClasses = ClassUtils
					.getAbstractMethodsFromSuperClasses(profileAbstractClass);

			Map<String, Method> concreteMethods = ClassUtils
					.getConcreteMethodsFromClass(profileAbstractClass);
			Map<String, Method> concreteMethodsFromSuperClasses = ClassUtils
					.getConcreteMethodsFromSuperClasses(profileAbstractClass);

			// FIXME: Alexandre: Verify if this is correct
			// The isProfileDirty, markProfileDirty and  isProfileValid methods must not be 
			// implemented as they are implemented by the SLEE. These three methods are implemented by the 
			// SLEE at deployment time.  
			Set<String> toBeImplementedBySlee = new HashSet<String>();
      toBeImplementedBySlee.add("isProfileDirty");
      toBeImplementedBySlee.add("markProfileDirty");
      toBeImplementedBySlee.add("isProfileValid");
			
			for (Entry<String, Method> entry : requiredLifeCycleMethods
					.entrySet()) {

				Method m = entry.getValue();
				//
				Method methodFromClass = ClassUtils.getMethodFromMap(m
						.getName(), m.getParameterTypes(), concreteMethods,
						concreteMethodsFromSuperClasses);

        if (methodFromClass == null)
        {
          if(this.component.isSlee11() || (!this.component.isSlee11() && !toBeImplementedBySlee.contains(m.getName())))
          {
            passed = false;
            errorBuffer = appendToBuffer(
              "Profile specification profile abstract class must implement certain lifecycle methods. Method not found in concrete(non private) methods: "
                  + m.getName(), "10.11", errorBuffer);
          }
          continue;
        }
				if ( methodFromClass != null && toBeImplementedBySlee.contains(m.getName()) )
				{
          passed = false;
          errorBuffer = appendToBuffer(
              "[JAIN SLEE 1.0] The " + m.getName() + " method must not be implemented as they are implemented by the SLEE.", "10.11", errorBuffer);
          continue;				  
				}

				// it concrete - must check return type
				if (!m.getReturnType().getName().equals(methodFromClass.getReturnType().getName())) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods has different return type: "
									+ methodFromClass.getReturnType()
									+ ", than one declared in interface: "
									+ m.getReturnType(), "10.11", errorBuffer);
				}

				if (!Arrays.equals(m.getExceptionTypes(), methodFromClass
						.getExceptionTypes())) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods has different throws clause than one found in class.",
							"10.11", errorBuffer);
				}

				// must be public, not abstract, not final, not static
				modifiers = methodFromClass.getModifiers();
				if (!Modifier.isPublic(modifiers)) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods must be public.",
							"10.11", errorBuffer);
				}
				if (Modifier.isStatic(modifiers)) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods must not be static.",
							"10.11", errorBuffer);
				}
				if (Modifier.isFinal(modifiers)) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile specification profile abstract class must implement certain lifecycle methods. Method with name: "
									+ m.getName()
									+ " found in concrete(non private) methods must not be final.",
							"10.11", errorBuffer);
				}

				// FIXME: native?

			}

			// in 1.1 and 1.0 it must implement CMP interfaces, but methods
			// defined there MUST stay abstract
			Class profileCMPInterface = ClassUtils.checkInterfaces(
					profileAbstractClass, this.component
							.getProfileCmpInterfaceClass().getName());

			if (profileCMPInterface == null) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must implement profile CMP interface.",
						"10.11", errorBuffer);
				return passed;
			}
			// abstract class implements CMP Interface, but leaves all methods
			// as abstract

			Map<String, Method> cmpInterfaceMethods = ClassUtils
					.getAllInterfacesMethods(profileCMPInterface, ignore);

			if (profileCMPInterface == null) {
				passed = false;
				errorBuffer = appendToBuffer(
						"Profile specification profile abstract class must implement defined profile CMP interface.",
						"10.11", errorBuffer);
			} else {

				for (Entry<String, Method> entry : cmpInterfaceMethods
						.entrySet()) {

					Method m = entry.getValue();
					//
					Method methodFromClass = ClassUtils.getMethodFromMap(m
							.getName(), m.getParameterTypes(), concreteMethods,
							concreteMethodsFromSuperClasses);

					if (methodFromClass != null) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must leave CMP interface methods as abstract, it can not be concrete: "
										+ m.getName(), "10.11", errorBuffer);
						continue;
					}

					methodFromClass = ClassUtils.getMethodFromMap(m.getName(),
							m.getParameterTypes(), abstractMethods,
							abstractMethodsFromSuperClasses);

					// it concrete - must check return type
					if (m.getReturnType().getName().compareTo(
							methodFromClass.getReturnType().getName()) != 0) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must not decalre methods from CMP interface with different return type. Method with name: "
										+ m.getName()
										+ " found in (non private) class methods has different return type: "
										+ methodFromClass.getReturnType()
										+ ", than one declared in interface: "
										+ m.getReturnType(), "10.11",
								errorBuffer);
					}

					if (!Arrays.equals(m.getExceptionTypes(), methodFromClass
							.getExceptionTypes())) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must not change throws clause. Method with name: "
										+ m.getName()
										+ " found in (non private) class methods has different throws clause than one found in class.",
								"10.11", errorBuffer);
					}

					// FIXME: should we do that?
					abstractMethods.remove(entry.getKey());
					abstractMethodsFromSuperClasses.remove(entry.getKey());
				}

			}

			// those checks are......
			// 1.0 and 1.1 if we define management interface we have to
			// implement it, and all methods that are not CMPs
			if (this.component.getDescriptor().getProfileManagementInterface() != null) {
				Class profileManagementInterfaceClass = this.component
						.getProfileManagementInterfaceClass();
				
				// if abstract class and management interface are both defined than abstract class must implement the management interface
				if (this.component.getProfileAbstractClass() != null && !profileManagementInterfaceClass.isAssignableFrom(this.component.getProfileAbstractClass())) {
					passed = false;
					errorBuffer = appendToBuffer(
							"Profile abstract class must implement profile management interface if both are specified", "10.11",
							errorBuffer);
				}
				
				Map<String, Method> profileManagementInterfaceMethods = ClassUtils
						.getAllInterfacesMethods(
								profileManagementInterfaceClass, ignore);
				// methods except those defined in CMP interface must be
				// concrete

				for (Entry<String, Method> entry : profileManagementInterfaceMethods
						.entrySet()) {

					Method m = entry.getValue();

					// CMP methods must stay abstract
					// check if this method is the same as in CMP interface is
					// done elsewhere
					// that check shoudl be ok to run this one!!! XXX
					if (cmpInterfaceMethods.containsKey(entry.getKey())) {
						// we do nothing, cmp interface is validate above

					} else {
						// 10.8/10.11

						Method concreteMethodFromAbstractClass = ClassUtils
								.getMethodFromMap(m.getName(), m
										.getParameterTypes(), concreteMethods,
										concreteMethodsFromSuperClasses);
						if (concreteMethodFromAbstractClass == null) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement as non private methods from profile management interface other than CMP methods",
									"10.11", errorBuffer);
							continue;
						}

						int concreteMethodModifiers = concreteMethodFromAbstractClass
								.getModifiers();
						// public, and cannot be static,abstract, or final.
						if (!Modifier.isPublic(concreteMethodModifiers)) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement methods from profile management interface as public, offending method: "
											+ concreteMethodFromAbstractClass
													.getName(), "10.11",
									errorBuffer);
						}

						if (Modifier.isStatic(concreteMethodModifiers)) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement methods from profile management interface as not static, offending method: "
											+ concreteMethodFromAbstractClass
													.getName(), "10.11",
									errorBuffer);
						}

						if (Modifier.isFinal(concreteMethodModifiers)) {
							passed = false;
							errorBuffer = appendToBuffer(
									"Profile specification profile abstract class must implement methods from profile management interface as not final, offending method: "
											+ concreteMethodFromAbstractClass
													.getName(), "10.11",
									errorBuffer);
						}
					}

				}

			}

			if (this.component.isSlee11()) {
				// ProfileLocalObject and UsageInterface are domains of 1.1
				// uff, ProfileLocal again that stupid check cross two
				// interfaces and one abstract class.....

				if (this.component.getDescriptor().getProfileLocalInterface() != null) {

					// abstract class MUST NOT implement it
					if (ClassUtils.checkInterfaces(profileAbstractClass,
							this.component.getDescriptor()
									.getProfileLocalInterface()
									.getProfileLocalInterfaceName()) != null
							|| ClassUtils.checkInterfaces(profileAbstractClass,
									"javax.slee.profile.ProfileLocalObject") != null) {
						passed = false;
						errorBuffer = appendToBuffer(
								"Profile specification profile abstract class must not implement profile local interface in any way(only methods must be implemented)",
								"10.11", errorBuffer);
					}

					Class profileLocalObjectClass = this.component
							.getProfileLocalInterfaceClass();
					ignore.add("javax.slee.profile.ProfileLocalObject");
					Map<String, Method> profileLocalObjectInterfaceMethods = ClassUtils
							.getAllInterfacesMethods(profileLocalObjectClass,
									ignore);
					ignore.remove("javax.slee.profile.ProfileLocalObject");
					// methods except those defined in CMP interface must be
					// concrete

					for (Entry<String, Method> entry : profileLocalObjectInterfaceMethods
							.entrySet()) {

						Method m = entry.getValue();

						// CMP methods must stay abstract
						// check if this method is the same as in CMP interface
						// is done elsewhere
						// that check shoudl be ok to run this one!!! XXX
						if (cmpInterfaceMethods.containsKey(entry.getKey())) {
							// we do nothing, cmp interface is validate above

						} else {
							// 10.8/10.11
							Method concreteMethodFromAbstractClass = ClassUtils
									.getMethodFromMap(m.getName(), m
											.getParameterTypes(),
											concreteMethods,
											concreteMethodsFromSuperClasses);
							if (concreteMethodFromAbstractClass == null) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement as non private methods from profile local interface other than CMP methods",
										"10.11", errorBuffer);
								continue;
							}

							int concreteMethodModifiers = concreteMethodFromAbstractClass
									.getModifiers();
							// public, and cannot be static,abstract, or final.
							if (!Modifier.isPublic(concreteMethodModifiers)) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement methods from profile local interface as public, offending method: "
												+ concreteMethodFromAbstractClass
														.getName(), "10.11",
										errorBuffer);
							}

							if (Modifier.isStatic(concreteMethodModifiers)) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement methods from profile local interface as not static, offending method: "
												+ concreteMethodFromAbstractClass
														.getName(), "10.11",
										errorBuffer);
							}

							if (Modifier.isFinal(concreteMethodModifiers)) {
								passed = false;
								errorBuffer = appendToBuffer(
										"Profile specification profile abstract class must implement methods from profile management interface as not final, offending method: "
												+ concreteMethodFromAbstractClass
														.getName(), "10.11",
										errorBuffer);
							}
						}

					}
				}

				// usage parameters
				if (this.component.getDescriptor()
						.getProfileUsageParameterInterface() != null) {
					if (!validateProfileUsageInterface(abstractMethods,
							abstractMethodsFromSuperClasses)) {
						passed = false;
					}

				}

			}

			// FIXME: add check on abstract methods same as in SBB ?

		} finally {

			if (!passed) {
				if(logger.isEnabledFor(Level.ERROR))
					logger.error(errorBuffer);
				//System.err.println(errorBuffer);
			}

		}

		return passed;
	}
boolean validateAbstractClass ( ) { boolean passed = true ; String errorBuffer = new String ( "" ) ; try { if ( this . component . getDescriptor ( ) . getProfileAbstractClass ( ) == null ) { if ( this . requiredProfileAbstractClass ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile management abstract class must be present" , "3.X" , errorBuffer ) ; return passed ; } } else { if ( this . component . getProfileAbstractClass ( ) == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile management abstract class has not been loaded" , "3.X" , errorBuffer ) ; return passed ; } } Class profileAbstractClass = this . component . getProfileAbstractClass ( ) ; // FIXME: Alexandre: Added this, was making some tests fail. Review!
 if ( profileAbstractClass == null ) { return passed ; } // if (profileAbstractClass.isInterface()
 // || profileAbstractClass.isEnum()) {
 // passed = false;
 // errorBuffer = appendToBuffer(
 // "Profile specification profile abstract class in not a clas.",
 // "10.11", errorBuffer);
 // return passed;
 // }
 if ( this . component . isSlee11 ( ) ) { if ( profileAbstractClass . getPackage ( ) == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must be defined in package." , "10.11" , errorBuffer ) ; } // FIXME: what about 1.0 ?
 // public, no arg constructor without throws clause
 Constructor c = null ; try { c = profileAbstractClass . getConstructor ( null ) ; } catch ( Exception e ) { // TODO Auto-generated catch block
 // e.printStackTrace();
 } if ( c == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must define public no arg constructor." , "10.11" , errorBuffer ) ; } else { if ( ! Modifier . isPublic ( c . getModifiers ( ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must define public no arg constructor." , "10.11" , errorBuffer ) ; } if ( c . getExceptionTypes ( ) . length > 0 ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must define public no arg constructor without throws clause." , "10.11" , errorBuffer ) ; } } } int modifiers = profileAbstractClass . getModifiers ( ) ; if ( ! Modifier . isAbstract ( modifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must be defined abstract." , "10.11" , errorBuffer ) ; } if ( ! Modifier . isPublic ( modifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must be defined public." , "10.11" , errorBuffer ) ; } // in case of 1.0 it has to implement as concrete methods from
 // javax.slee.profile.ProfileManagement - section 10.8 of 1.0 specs
 Map < String , Method > requiredLifeCycleMethods = null ; Set < String > ignore = new HashSet < String > ( ) ; ignore . add ( "java.lang.Object" ) ; if ( this . component . isSlee11 ( ) ) { Class javaxSleeProfileProfileClass = ClassUtils . checkInterfaces ( profileAbstractClass , "javax.slee.profile.Profile" ) ; if ( javaxSleeProfileProfileClass == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement javax.slee.profile.Profile." , "10.11" , errorBuffer ) ; requiredLifeCycleMethods = ClassUtils . getAllInterfacesMethods ( javax . slee . profile . ProfileLocalObject . class , ignore ) ; } else { requiredLifeCycleMethods = ClassUtils . getAllInterfacesMethods ( javaxSleeProfileProfileClass , ignore ) ; } } else { Class javaxSleeProfileProfileManagement = ClassUtils . checkInterfaces ( profileAbstractClass , "javax.slee.profile.ProfileManagement" ) ; if ( javaxSleeProfileProfileManagement == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement javax.slee.profile.ProfileManagement." , "10.8" , errorBuffer ) ; requiredLifeCycleMethods = ClassUtils . getAllInterfacesMethods ( javax . slee . profile . ProfileManagement . class , ignore ) ; } else { requiredLifeCycleMethods = ClassUtils . getAllInterfacesMethods ( javaxSleeProfileProfileManagement , ignore ) ; } } Map < String , Method > abstractMethods = ClassUtils . getAbstractMethodsFromClass ( profileAbstractClass ) ; Map < String , Method > abstractMethodsFromSuperClasses = ClassUtils . getAbstractMethodsFromSuperClasses ( profileAbstractClass ) ; Map < String , Method > concreteMethods = ClassUtils . getConcreteMethodsFromClass ( profileAbstractClass ) ; Map < String , Method > concreteMethodsFromSuperClasses = ClassUtils . getConcreteMethodsFromSuperClasses ( profileAbstractClass ) ; // FIXME: Alexandre: Verify if this is correct
 // The isProfileDirty, markProfileDirty and  isProfileValid methods must not be 
 // implemented as they are implemented by the SLEE. These three methods are implemented by the 
 // SLEE at deployment time.  
 Set < String > toBeImplementedBySlee = new HashSet < String > ( ) ; toBeImplementedBySlee . add ( "isProfileDirty" ) ; toBeImplementedBySlee . add ( "markProfileDirty" ) ; toBeImplementedBySlee . add ( "isProfileValid" ) ; for ( Entry < String , Method > entry : requiredLifeCycleMethods . entrySet ( ) ) { Method m = entry . getValue ( ) ; //
 Method methodFromClass = ClassUtils . getMethodFromMap ( m . getName ( ) , m . getParameterTypes ( ) , concreteMethods , concreteMethodsFromSuperClasses ) ; if ( methodFromClass == null ) { if ( this . component . isSlee11 ( ) || ( ! this . component . isSlee11 ( ) && ! toBeImplementedBySlee . contains ( m . getName ( ) ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement certain lifecycle methods. Method not found in concrete(non private) methods: " + m . getName ( ) , "10.11" , errorBuffer ) ; } continue ; } if ( methodFromClass != null && toBeImplementedBySlee . contains ( m . getName ( ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "[JAIN SLEE 1.0] The " + m . getName ( ) + " method must not be implemented as they are implemented by the SLEE." , "10.11" , errorBuffer ) ; continue ; } // it concrete - must check return type
 if ( ! m . getReturnType ( ) . getName ( ) . equals ( methodFromClass . getReturnType ( ) . getName ( ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement certain lifecycle methods. Method with name: " + m . getName ( ) + " found in concrete(non private) methods has different return type: " + methodFromClass . getReturnType ( ) + ", than one declared in interface: " + m . getReturnType ( ) , "10.11" , errorBuffer ) ; } if ( ! Arrays . equals ( m . getExceptionTypes ( ) , methodFromClass . getExceptionTypes ( ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement certain lifecycle methods. Method with name: " + m . getName ( ) + " found in concrete(non private) methods has different throws clause than one found in class." , "10.11" , errorBuffer ) ; } // must be public, not abstract, not final, not static
 modifiers = methodFromClass . getModifiers ( ) ; if ( ! Modifier . isPublic ( modifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement certain lifecycle methods. Method with name: " + m . getName ( ) + " found in concrete(non private) methods must be public." , "10.11" , errorBuffer ) ; } if ( Modifier . isStatic ( modifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement certain lifecycle methods. Method with name: " + m . getName ( ) + " found in concrete(non private) methods must not be static." , "10.11" , errorBuffer ) ; } if ( Modifier . isFinal ( modifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement certain lifecycle methods. Method with name: " + m . getName ( ) + " found in concrete(non private) methods must not be final." , "10.11" , errorBuffer ) ; } // FIXME: native?
 } // in 1.1 and 1.0 it must implement CMP interfaces, but methods
 // defined there MUST stay abstract
 Class profileCMPInterface = ClassUtils . checkInterfaces ( profileAbstractClass , this . component . getProfileCmpInterfaceClass ( ) . getName ( ) ) ; if ( profileCMPInterface == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement profile CMP interface." , "10.11" , errorBuffer ) ; return passed ; } // abstract class implements CMP Interface, but leaves all methods
 // as abstract
 Map < String , Method > cmpInterfaceMethods = ClassUtils . getAllInterfacesMethods ( profileCMPInterface , ignore ) ; if ( profileCMPInterface == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement defined profile CMP interface." , "10.11" , errorBuffer ) ; } else { for ( Entry < String , Method > entry : cmpInterfaceMethods . entrySet ( ) ) { Method m = entry . getValue ( ) ; //
 Method methodFromClass = ClassUtils . getMethodFromMap ( m . getName ( ) , m . getParameterTypes ( ) , concreteMethods , concreteMethodsFromSuperClasses ) ; if ( methodFromClass != null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must leave CMP interface methods as abstract, it can not be concrete: " + m . getName ( ) , "10.11" , errorBuffer ) ; continue ; } methodFromClass = ClassUtils . getMethodFromMap ( m . getName ( ) , m . getParameterTypes ( ) , abstractMethods , abstractMethodsFromSuperClasses ) ; // it concrete - must check return type
 if ( m . getReturnType ( ) . getName ( ) . compareTo ( methodFromClass . getReturnType ( ) . getName ( ) ) != 0 ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must not decalre methods from CMP interface with different return type. Method with name: " + m . getName ( ) + " found in (non private) class methods has different return type: " + methodFromClass . getReturnType ( ) + ", than one declared in interface: " + m . getReturnType ( ) , "10.11" , errorBuffer ) ; } if ( ! Arrays . equals ( m . getExceptionTypes ( ) , methodFromClass . getExceptionTypes ( ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must not change throws clause. Method with name: " + m . getName ( ) + " found in (non private) class methods has different throws clause than one found in class." , "10.11" , errorBuffer ) ; } // FIXME: should we do that?
 abstractMethods . remove ( entry . getKey ( ) ) ; abstractMethodsFromSuperClasses . remove ( entry . getKey ( ) ) ; } } // those checks are......
 // 1.0 and 1.1 if we define management interface we have to
 // implement it, and all methods that are not CMPs
 if ( this . component . getDescriptor ( ) . getProfileManagementInterface ( ) != null ) { Class profileManagementInterfaceClass = this . component . getProfileManagementInterfaceClass ( ) ; // if abstract class and management interface are both defined than abstract class must implement the management interface
 if ( this . component . getProfileAbstractClass ( ) != null && ! profileManagementInterfaceClass . isAssignableFrom ( this . component . getProfileAbstractClass ( ) ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile abstract class must implement profile management interface if both are specified" , "10.11" , errorBuffer ) ; } Map < String , Method > profileManagementInterfaceMethods = ClassUtils . getAllInterfacesMethods ( profileManagementInterfaceClass , ignore ) ; // methods except those defined in CMP interface must be
 // concrete
 for ( Entry < String , Method > entry : profileManagementInterfaceMethods . entrySet ( ) ) { Method m = entry . getValue ( ) ; // CMP methods must stay abstract
 // check if this method is the same as in CMP interface is
 // done elsewhere
 // that check shoudl be ok to run this one!!! XXX
 if ( cmpInterfaceMethods . containsKey ( entry . getKey ( ) ) ) { // we do nothing, cmp interface is validate above
 } else { // 10.8/10.11
 Method concreteMethodFromAbstractClass = ClassUtils . getMethodFromMap ( m . getName ( ) , m . getParameterTypes ( ) , concreteMethods , concreteMethodsFromSuperClasses ) ; if ( concreteMethodFromAbstractClass == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement as non private methods from profile management interface other than CMP methods" , "10.11" , errorBuffer ) ; continue ; } int concreteMethodModifiers = concreteMethodFromAbstractClass . getModifiers ( ) ; // public, and cannot be static,abstract, or final.
 if ( ! Modifier . isPublic ( concreteMethodModifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement methods from profile management interface as public, offending method: " + concreteMethodFromAbstractClass . getName ( ) , "10.11" , errorBuffer ) ; } if ( Modifier . isStatic ( concreteMethodModifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement methods from profile management interface as not static, offending method: " + concreteMethodFromAbstractClass . getName ( ) , "10.11" , errorBuffer ) ; } if ( Modifier . isFinal ( concreteMethodModifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement methods from profile management interface as not final, offending method: " + concreteMethodFromAbstractClass . getName ( ) , "10.11" , errorBuffer ) ; } } } } if ( this . component . isSlee11 ( ) ) { // ProfileLocalObject and UsageInterface are domains of 1.1
 // uff, ProfileLocal again that stupid check cross two
 // interfaces and one abstract class.....
 if ( this . component . getDescriptor ( ) . getProfileLocalInterface ( ) != null ) { // abstract class MUST NOT implement it
 if ( ClassUtils . checkInterfaces ( profileAbstractClass , this . component . getDescriptor ( ) . getProfileLocalInterface ( ) . getProfileLocalInterfaceName ( ) ) != null || ClassUtils . checkInterfaces ( profileAbstractClass , "javax.slee.profile.ProfileLocalObject" ) != null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must not implement profile local interface in any way(only methods must be implemented)" , "10.11" , errorBuffer ) ; } Class profileLocalObjectClass = this . component . getProfileLocalInterfaceClass ( ) ; ignore . add ( "javax.slee.profile.ProfileLocalObject" ) ; Map < String , Method > profileLocalObjectInterfaceMethods = ClassUtils . getAllInterfacesMethods ( profileLocalObjectClass , ignore ) ; ignore . remove ( "javax.slee.profile.ProfileLocalObject" ) ; // methods except those defined in CMP interface must be
 // concrete
 for ( Entry < String , Method > entry : profileLocalObjectInterfaceMethods . entrySet ( ) ) { Method m = entry . getValue ( ) ; // CMP methods must stay abstract
 // check if this method is the same as in CMP interface
 // is done elsewhere
 // that check shoudl be ok to run this one!!! XXX
 if ( cmpInterfaceMethods . containsKey ( entry . getKey ( ) ) ) { // we do nothing, cmp interface is validate above
 } else { // 10.8/10.11
 Method concreteMethodFromAbstractClass = ClassUtils . getMethodFromMap ( m . getName ( ) , m . getParameterTypes ( ) , concreteMethods , concreteMethodsFromSuperClasses ) ; if ( concreteMethodFromAbstractClass == null ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement as non private methods from profile local interface other than CMP methods" , "10.11" , errorBuffer ) ; continue ; } int concreteMethodModifiers = concreteMethodFromAbstractClass . getModifiers ( ) ; // public, and cannot be static,abstract, or final.
 if ( ! Modifier . isPublic ( concreteMethodModifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement methods from profile local interface as public, offending method: " + concreteMethodFromAbstractClass . getName ( ) , "10.11" , errorBuffer ) ; } if ( Modifier . isStatic ( concreteMethodModifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement methods from profile local interface as not static, offending method: " + concreteMethodFromAbstractClass . getName ( ) , "10.11" , errorBuffer ) ; } if ( Modifier . isFinal ( concreteMethodModifiers ) ) { passed = false ; errorBuffer = appendToBuffer ( "Profile specification profile abstract class must implement methods from profile management interface as not final, offending method: " + concreteMethodFromAbstractClass . getName ( ) , "10.11" , errorBuffer ) ; } } } } // usage parameters
 if ( this . component . getDescriptor ( ) . getProfileUsageParameterInterface ( ) != null ) { if ( ! validateProfileUsageInterface ( abstractMethods , abstractMethodsFromSuperClasses ) ) { passed = false ; } } } // FIXME: add check on abstract methods same as in SBB ?
 } finally { if ( ! passed ) { if ( logger . isEnabledFor ( Level . ERROR ) ) logger . error ( errorBuffer ) ; //System.err.println(errorBuffer);
 } } return passed ; }
shoudl not be run if other interfaces vaildation fails.

@return
shoudl not be run if other interfaces vaildation fails .