content: /* ========================================================================
   * JCommon : a free general purpose class library for the Java(tm) platform
   * ========================================================================
   *
   * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
   * 
   * Project Info:  http://www.jfree.org/jcommon/index.html
   *
   * This library is free software; you can redistribute it and/or modify it 
   * under the terms of the GNU Lesser General Public License as published by 
   * the Free Software Foundation; either version 2.1 of the License, or 
   * (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful, but 
   * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
   * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
   * License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
   * USA.  
   *
   * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
   * in the United States and other countries.]
   * 
   * ---------------------
   * DescriptionModel.java
   * ---------------------
   * (C)opyright 2003, 2004, by Thomas Morgner and Contributors.
   *
   * Original Author:  Thomas Morgner;
   * Contributor(s):   David Gilbert (for Object Refinery Limited);
   *
   * $Id: DescriptionModel.java,v 1.3 2005/10/18 13:32:37 mungady Exp $
   *
   * Changes
   * -------
   * 21-Jun-2003 : Initial version (TM);
   *
   */
  
  package org.jfree.xml.generator.model;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  
  import org.jfree.util.Log;
  
  /**
   * A model containing class descriptions.
   */
  public class DescriptionModel {
  
      /** The sources. */
      private ArrayList sources;
      
      /** The classes. */
      private ArrayList classes;
  
      /** Maps classes to class descriptions. */
      private HashMap classesMap;
      
      /** The mapping model. */
      private MappingModel mappingModel;
      
      /** Model comments. */
      private Comments modelComments;
      
      /** Include comments. */
      private HashMap includeComments;
  
      /**
       * Creates a new class description model.
       */
      public DescriptionModel() {
          this.classes = new ArrayList();
          this.classesMap = new HashMap();
          this.mappingModel = new MappingModel();
          this.sources = new ArrayList();
          this.includeComments = new HashMap();
      }
  
      /**
       * Adds a class description to the model.
       * 
       * @param cd  the class description.
       */
      public void addClassDescription(final ClassDescription cd) {
          this.classesMap.put(cd.getObjectClass(), cd);
          if (!this.classes.contains(cd)) {
              this.classes.add(cd);
          }
      }
  
      /**
       * Removes a class description from the model.
       * 
       * @param cd  the class description.
       */
      public void removeClassDescription(final ClassDescription cd) {
          this.classesMap.remove(cd.getObjectClass());
          this.classes.remove(cd);
      }
  
      /**
       * Returns a class description.
       * 
       * @param index  the description index (zero-based).
       * 
       * @return a class description.
       */
      public ClassDescription get(final int index) {
          return (ClassDescription) this.classes.get(index);
      }
  
      /**
       * Returns a class description for the given class name.
       * 
       * @param key  the class name.
       * 
       * @return the class description.
       */
      public ClassDescription get(final Class key) {
          return (ClassDescription) this.classesMap.get(key);
      }
  
      /**
       * Returns the number of classes in the model.
       * 
       * @return the number of classes in the model.
       */
      public int size() {
          return this.classes.size();
      }
  
      /**
       * Returns the mapping model.
       * 
       * @return the mapping model.
       */
      public MappingModel getMappingModel() {
          return this.mappingModel;
      }
  
      /**
       * Adds a source to the model description.
       * 
       * @param source  the source.
       */
      public void addSource(final String source) {
          this.sources.add(source);
      }
  
      /**
       * Returns the sources for the model description.
       * 
       * @return The sources.
       */
      public String[] getSources() {
          return (String[]) this.sources.toArray(new String[this.sources.size()]);
      }
  
      /**
       * Removes any class descriptions that are not fully defined.
       */
      public void prune() {
          final ClassDescription[] cds = (ClassDescription[]) this.classes.toArray(new ClassDescription[0]);
          for (int i = 0; i < cds.length; i++) {
              if (cds[i].isUndefined()) {
                  removeClassDescription(cds[i]);
                  Log.debug("Pruned: " + cds[i].getName());
              }
          }
      }
  
      /**
       * Adds an include comment.
       * 
       * @param source  the source.
       * @param comments  the comments.
       */
      public void addIncludeComment(final String source, final Comments comments) {
          this.includeComments.put(source, comments);
      }
  
      /**
       * Returns the include comment for the specified source.
       * 
       * @param source  the source.
       * 
       * @return The include comment.
       */
      public Comments getIncludeComment(final String source) {
          return (Comments) this.includeComments.get(source);
      }
  
      /**
       * Returns the model comments.
       * 
       * @return The model comments.
       */
      public Comments getModelComments() {
          return this.modelComments;
      }
  
      /**
       * Sets the model comments.
       * 
       * @param modelComments  the model comments.
       */
      public void setModelComments(final Comments modelComments) {
          Log.debug ("Model: Comment set: " + modelComments);
          this.modelComments = modelComments;
      }
      
  }
  