Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2011 JBoss Inc
   *
   * Licensed 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.
  */
 
 package org.drools.planner.core.domain.solution;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 
 public class SolutionDescriptor {
 
     private final Class<? extends SolutionsolutionClass;
     private final BeanInfo solutionBeanInfo;
     
     private final Map<StringPropertyDescriptorpropertyDescriptorMap;
 
 
     public SolutionDescriptor(Class<? extends SolutionsolutionClass) {
         this. = solutionClass;
         try {
              = Introspector.getBeanInfo(solutionClass);
         } catch (IntrospectionException e) {
             throw new IllegalStateException("The solutionClass (" + solutionClass + ") is not a valid java bean."e);
         }
         int mapSize = .getPropertyDescriptors().length;
          = new HashMap<StringPropertyDescriptor>(mapSize);
          = new HashMap<StringPropertyDescriptor>(mapSize);
          = new HashMap<Class<?>, PlanningEntityDescriptor>(mapSize);
         processPropertyAnnotations();
     }
 
     private void processPropertyAnnotations() {
         boolean noPlanningEntityPropertyAnnotation = true;
         for (PropertyDescriptor propertyDescriptor : .getPropertyDescriptors()) {
             .put(propertyDescriptor.getName(), propertyDescriptor);
             Method propertyGetter = propertyDescriptor.getReadMethod();
             if (propertyGetter.isAnnotationPresent(PlanningEntityProperty.class)) {
                 noPlanningEntityPropertyAnnotation = false;
                 .put(propertyDescriptor.getName(), propertyDescriptor);
             } else if (propertyGetter.isAnnotationPresent(PlanningEntityCollectionProperty.class)) {
                 noPlanningEntityPropertyAnnotation = false;
                 if (!Collection.class.isAssignableFrom(propertyDescriptor.getPropertyType())) {
                     throw new IllegalStateException("The solutionClass (" + 
                             + ") has a PlanningEntityCollection annotated property ("
                             + propertyDescriptor.getName() + ") that does not return a Collection.");
                 }
                 .put(propertyDescriptor.getName(), propertyDescriptor);
             }
         }
         if (noPlanningEntityPropertyAnnotation) {
             throw new IllegalStateException("The solutionClass (" + 
                     + ") should have at least 1 getter with a PlanningEntityCollection or PlanningEntityProperty"
                     + " annotation.");
         }
     }
 
     public Class<? extends SolutiongetSolutionClass() {
         return ;
     }
 
     public PropertyDescriptor getPropertyDescriptor(String propertyName) {
         return .get(propertyName);
     }
 
     public void addPlanningEntityDescriptor(PlanningEntityDescriptor planningEntityDescriptor) {
         .put(planningEntityDescriptor.getPlanningEntityClass(), planningEntityDescriptor);
     }
        return .keySet();
    }
    public PlanningEntityDescriptor getPlanningEntityDescriptor(Class<?> planningEntityImplementationClass) {
        PlanningEntityDescriptor planningEntityDescriptor = null;
        Class<?> planningEntityClass = planningEntityImplementationClass;
        while (planningEntityClass != null) {
            planningEntityDescriptor = .get(planningEntityClass);
            if (planningEntityDescriptor != null) {
                return planningEntityDescriptor;
            }
            planningEntityClass = planningEntityClass.getSuperclass();
        }
        return null;
    }
    public Collection<ObjectgetAllFacts(Solution solution) {
        Collection<Objectfacts = new ArrayList<Object>();
        facts.addAll(solution.getProblemFacts());
        for (PropertyDescriptor entityPropertyDescriptor : .values()) {
            Object entity = extractPlanningEntity(entityPropertyDescriptorsolution);
            if (entity != null) {
                PlanningEntityDescriptor planningEntityDescriptor = getPlanningEntityDescriptor(entity.getClass());
                if (planningEntityDescriptor.isInitialized(entity)) {
                    facts.add(entity);
                }
            }
        }
        for (PropertyDescriptor entityCollectionPropertyDescriptor : .values()) {
            Collection<?> entityCollection = extractPlanningEntityCollection(
                    entityCollectionPropertyDescriptorsolution);
            for (Object entity : entityCollection) {
                PlanningEntityDescriptor planningEntityDescriptor = getPlanningEntityDescriptor(entity.getClass());
                if (planningEntityDescriptor.isInitialized(entity)) {
                    facts.add(entity);
                }
            }
        }
        return facts;
    }
    public List<ObjectgetPlanningEntityList(Solution solution) {
        List<ObjectplanningEntityList = new ArrayList<Object>();
        for (PropertyDescriptor entityPropertyDescriptor : .values()) {
            Object entity = extractPlanningEntity(entityPropertyDescriptorsolution);
            if (entity != null) {
                planningEntityList.add(entity);
            }
        }
        for (PropertyDescriptor entityCollectionPropertyDescriptor : .values()) {
            Collection<?> entityCollection = extractPlanningEntityCollection(
                    entityCollectionPropertyDescriptorsolution);
            planningEntityList.addAll(entityCollection);
        }
        return planningEntityList;
    }

    

Parameters:
solution never null
Returns:
true if all the planning entities are initialized
    public boolean isInitialized(Solution solution) {
        for (PropertyDescriptor entityPropertyDescriptor : .values()) {
            Object entity = extractPlanningEntity(entityPropertyDescriptorsolution);
            if (entity == null) {
                return false;
            }
            PlanningEntityDescriptor planningEntityDescriptor = getPlanningEntityDescriptor(entity.getClass());
            if (!planningEntityDescriptor.isInitialized(entity)) {
                return false;
            }
        }
        for (PropertyDescriptor entityCollectionPropertyDescriptor : .values()) {
            Collection<?> entityCollection = extractPlanningEntityCollection(
                    entityCollectionPropertyDescriptorsolution);
            for (Object entity : entityCollection) {
                PlanningEntityDescriptor planningEntityDescriptor = getPlanningEntityDescriptor(entity.getClass());
                if (!planningEntityDescriptor.isInitialized(entity)) {
                    return false;
                }
            }
        }
        return true;
    }
    private Object extractPlanningEntity(PropertyDescriptor entityPropertyDescriptorSolution solution) {
        return DescriptorUtils.executeGetter(entityPropertyDescriptorsolution);
    }
            PropertyDescriptor entityCollectionPropertyDescriptorSolution solution) {
        Collection<?> entityCollection = (Collection<?>)
                DescriptorUtils.executeGetter(entityCollectionPropertyDescriptorsolution);
        if (entityCollection == null) {
            throw new IllegalArgumentException("The solutionClass (" + 
                    + ")'s entityCollectionProperty ("
                    + entityCollectionPropertyDescriptor.getName() + ") should never return null.");
        }
        return entityCollection;
    }
New to GrepCode? Check out our FAQ X