/** * Find existing TdbAu with same Id as another one. * * @param otherAu another TdbAu * @return an existing TdbAu already in thisTdb */ protected TdbAu findExistingTdbAu(TdbAu otherAu) { // check for duplicate AU with same plugin for this Tdb Collection<TdbAu.Id> auIds = getTdbAuIds(otherAu.getPluginId()); for (TdbAu.Id auId : auIds) { if (auId.equals(otherAu.getId())) { return auId.getTdbAu(); } } return null; }
/** * Unregister the au with this Tdb for its plugin. * * @param au the TdbAu * @return <code>false</code> if au was not registered, otherwise <code>true</code> */ private boolean removeTdbAuForPlugin(TdbAu au) { // if can't add au to title, we need to undo the au // registration and re-throw the exception we just caught String pluginId = au.getPluginId(); Collection<TdbAu.Id> c = pluginIdTdbAuIdsMap.get(pluginId); if (c.remove(au.getId())) { if (c.isEmpty()) { pluginIdTdbAuIdsMap.remove(c); } tdbAuCount--; return true; } return false; }
/** * Register the au with this Tdb for its plugin. * * @param au the TdbAu * @return <code>false</code> if already registered, otherwise <code>true</code> */ private boolean addTdbAuForPlugin(TdbAu au) { // add AU to list for plugins String pluginId = au.getPluginId(); Collection<TdbAu.Id> auids = pluginIdTdbAuIdsMap.get(pluginId); if (auids == null) { auids = new HashSet<TdbAu.Id>(); pluginIdTdbAuIdsMap.put(pluginId, auids); } if (!auids.add(au.getId())) { return false; } // increment the total AU count; tdbAuCount++; return true; }
/** * Merge other Tdb into this one. Makes copies of otherTdb's non-duplicate TdbPublisher, TdbTitle, * and TdbAu objects and their non-duplicate children. The object themselves are not merged. * * @param otherTdb the other Tdb * @throws TdbException if Tdb is sealed */ public void copyFrom(Tdb otherTdb) throws TdbException { // ignore inappropriate Tdb values if ((otherTdb == null) || (otherTdb == this)) { return; } if (isSealed()) { throw new TdbException("Cannot add otherTdb AUs to sealed Tdb"); } // merge non-duplicate publishers of otherTdb boolean tdbIsNew = tdbPublisherMap.isEmpty(); for (TdbPublisher otherPublisher : otherTdb.getAllTdbPublishers().values()) { String pubName = otherPublisher.getName(); TdbPublisher thisPublisher; boolean publisherIsNew = true; if (tdbIsNew) { // no need to check for existing publisher if TDB is new thisPublisher = new TdbPublisher(pubName); tdbPublisherMap.put(pubName, thisPublisher); } else { thisPublisher = tdbPublisherMap.get(pubName); publisherIsNew = (thisPublisher == null); if (publisherIsNew) { // copy publisher if not present in this Tdb thisPublisher = new TdbPublisher(pubName); tdbPublisherMap.put(pubName, thisPublisher); } } // merge non-duplicate titles of otherPublisher into thisPublisher for (TdbTitle otherTitle : otherPublisher.getTdbTitles()) { String otherId = otherTitle.getId(); TdbTitle thisTitle; boolean titleIsNew = true; if (publisherIsNew) { // no need to check for existing title if publisher is new thisTitle = otherTitle.copyForTdbPublisher(thisPublisher); thisPublisher.addTdbTitle(thisTitle); } else { thisTitle = thisPublisher.getTdbTitleById(otherId); titleIsNew = (thisTitle == null); if (titleIsNew) { // copy title if not present in this publisher thisTitle = otherTitle.copyForTdbPublisher(thisPublisher); thisPublisher.addTdbTitle(thisTitle); } else if (!thisTitle.getName().equals(otherTitle.getName())) { // error because it could lead to a missing title -- one probably has a typo // (what about checking other title elements too?) logger.error( "Ignorning duplicate title entry: \"" + otherTitle.getName() + "\" with the same ID as \"" + thisTitle.getName() + "\""); } } // merge non-duplicate TdbAus of otherTitle into thisTitle for (TdbAu otherAu : otherTitle.getTdbAus()) { // no need to check for existing au if title is new String pluginId = otherAu.getPluginId(); if (titleIsNew || !getTdbAuIds(pluginId).contains(otherAu.getId())) { // always succeeds we've already checked for duplicate TdbAu thisAu = otherAu.copyForTdbTitle(thisTitle); addTdbAuForPlugin(thisAu); } else { TdbAu thisAu = findExistingTdbAu(otherAu); if (!thisAu.getTdbTitle().getName().equals(otherAu.getTdbTitle().getName())) { if (!thisAu.getName().equals(otherAu.getName())) { logger.error( "Ignorning duplicate au entry: \"" + otherAu.getName() + "\" for title \"" + otherAu.getTdbTitle().getName() + "\" with same definion as existing au entry: \"" + thisAu.getName() + "\" for title \"" + thisAu.getTdbTitle().getName() + "\""); } else { logger.error( "Ignorning duplicate au entry: \"" + otherAu.getName() + "\" for title \"" + otherAu.getTdbTitle().getName() + "\" with same definion as existing one for title \"" + thisAu.getTdbTitle().getName() + "\""); } } else if (!thisAu.getName().equals(otherAu.getName())) { // error because it could lead to a missing AU -- one probably has a typo logger.error( "Ignorning duplicate au entry: \"" + otherAu.getName() + "\" with the same definition as \"" + thisAu.getName() + "\" for title \"" + otherAu.getTdbTitle().getName()); } else { logger.warning( "Ignoring duplicate au entry: \"" + otherAu.getName() + "\" for title \"" + otherAu.getTdbTitle().getName()); } } } } } }