All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.mpxj.ProjectEntityContainer Maven / Gradle / Ivy

Go to download

Library that provides facilities to allow project information to be manipulated in Java and .Net. Supports a range of data formats: Microsoft Project Exchange (MPX), Microsoft Project (MPP,MPT), Microsoft Project Data Interchange (MSPDI XML), Microsoft Project Database (MPD), Planner (XML), Primavera (PM XML, XER, and database), Asta Powerproject (PP, MDB), Asta Easyplan (PP), Phoenix Project Manager (PPX), FastTrack Schedule (FTS), and the Standard Data Exchange Format (SDEF).

There is a newer version: 13.6.0
Show newest version
/*
 * file:       ProjectEntityContainer.java
 * author:     Jon Iles
 * copyright:  (c) Packwood Software 2002-2015
 * date:       20/04/2015
 */

/*
 * 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.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 */

package net.sf.mpxj;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.mpxj.common.ObjectSequence;

/**
 * Common implementation shared by project entities, providing storage, iteration and lookup.
 *
 * @param  concrete entity type
 */
public abstract class ProjectEntityContainer extends ListWithCallbacks
{
   /**
    * Constructor.
    *
    * @param projectFile parent project
    */
   public ProjectEntityContainer(ProjectFile projectFile)
   {
      m_projectFile = projectFile;
   }

   /**
    * Returns the value of the first Unique ID to use when renumbering Unique IDs.
    *
    * @return first Unique ID value
    */
   protected int firstUniqueID()
   {
      return 1;
   }

   /**
    * Retrieve an entity by its Unique ID.
    *
    * @param id entity Unique ID
    * @return entity instance or null
    */
   public T getByUniqueID(Integer id)
   {
      return m_uniqueIDMap.get(id);
   }

   @Override protected void added(T element)
   {
      if (element.getUniqueID() == null)
      {
         return;
      }

      Integer uniqueID = element.getUniqueID();
      T currentElement = m_uniqueIDMap.get(uniqueID);
      if (currentElement == element)
      {
         return;
      }

      if (currentElement instanceof ProjectEntityWithMutableUniqueID)
      {
         m_uniqueIDClashList.add((ProjectEntityWithMutableUniqueID) element);
      }

      m_uniqueIDMap.put(element.getUniqueID(), element);
   }

   /**
    * Called to notify subclasses of item removal.
    *
    * @param element removed item
    */
   @Override protected void removed(T element)
   {
      m_uniqueIDMap.remove(element.getUniqueID());
   }

   /**
    * Updates an entry in the unique ID map when a unique ID is changed.
    *
    * @param element entity whose unique ID is changing
    * @param oldUniqueID old unique ID value
    * @param newUniqueID new unique ID value
    */
   public void updateUniqueID(T element, Integer oldUniqueID, Integer newUniqueID)
   {
      if (oldUniqueID != null)
      {
         m_uniqueIDMap.remove(oldUniqueID);
      }

      T currentElement = m_uniqueIDMap.get(newUniqueID);
      if (currentElement == element)
      {
         return;
      }

      if (currentElement instanceof ProjectEntityWithMutableUniqueID)
      {
         m_uniqueIDClashList.add((ProjectEntityWithMutableUniqueID) element);
      }

      m_uniqueIDMap.put(newUniqueID, element);
      m_projectFile.getUniqueIdObjectSequence(element.getClass()).sync(newUniqueID);
   }

   /**
    * Provide new Unique ID values for entity instances
    * which were found to be duplicated.
    */
   public void fixUniqueIdClashes()
   {
      if (m_uniqueIDClashList.isEmpty())
      {
         return;
      }

      ObjectSequence sequence = m_projectFile.getUniqueIdObjectSequence(m_uniqueIDClashList.get(0).getClass());
      m_uniqueIDClashList.forEach(i -> i.setUniqueID(sequence.getNext()));
      m_uniqueIDClashList.clear();
      m_uniqueIDMap.clear();
      forEach(i -> m_uniqueIDMap.put(i.getUniqueID(), i));
   }

   protected final ProjectFile m_projectFile;
   private final Map m_uniqueIDMap = new HashMap<>();
   private final List m_uniqueIDClashList = new ArrayList<>();
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy