/** {@inheritDoc} */
  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    super.endElement(uri, localName, qName);
    if ("userprofile".equals(qName)) {
      Profile profile;
      profile = profileHandler.getProfile();
      profileManager.createProfileWithoutBags(profile);
      try {
        Map<String, Set<BagValue>> bagValues = profileHandler.getBagsValues();
        for (StorableBag bag : profile.getAllBags().values()) {
          bag.saveWithBagValues(profile.getUserId(), bagValues.get(bag.getName()));
        }
      } catch (ObjectStoreException ose) {
        throw new SAXException(ose);
      }
      // Must come after the bags themselves have been stored.
      try {
        SharedBagManager.getInstance(profileManager);
        profileHandler.getInvitationHandler().storeInvites(profile);
      } catch (SQLException e) {
        LOG.error("Cannot store invitations", e);
        if (abortOnError) {
          throw new SAXException(e);
        }
      }
      Set<Tag> tags = profileHandler.getTags();
      TagManager tagManager = new TagManagerFactory(profile.getProfileManager()).getTagManager();
      for (Tag tag : tags) {
        try {
          tagManager.addTag(tag.getTagName(), tag.getObjectIdentifier(), tag.getType(), profile);
        } catch (TagManager.TagException e) {
          LOG.error("Cannot add tag: " + tag.toString(), e);
          if (abortOnError) {
            throw new SAXException(e);
          }
        } catch (RuntimeException e) {
          LOG.error("Error adding tag: " + tag.toString(), e);
          if (abortOnError) {
            throw new SAXException(e);
          }
        }
      }
      profile.getSearchRepository().receiveEvent(new MassTaggingEvent());
      profileHandler = null;
      long totalTime = System.currentTimeMillis() - startTime;
      LOG.info("Finished profile: " + profile.getUsername() + " took " + totalTime + "ms.");
    }
    if ("userprofiles".equals(qName)) {
      if (!sharedBagsByUsers.isEmpty()) {
        SharedBagManager sharedBagManager = SharedBagManager.getInstance(profileManager);
        String bagName, dateCreated;
        for (String user : sharedBagsByUsers.keySet()) {
          List<Map<String, String>> sharedBags = sharedBagsByUsers.get(user);
          if (!sharedBags.isEmpty()) {
            for (Map<String, String> sharedBag : sharedBags) {
              bagName = sharedBag.get("name");
              dateCreated = sharedBag.get("dateCreated");
              sharedBagManager.shareBagWithUser(bagName, dateCreated, user);
            }
          }
        }
      }
    }
    if (profileHandler != null) {
      profileHandler.endElement(uri, localName, qName);
    }

    if (trackHandler != null) {
      trackHandler.endElement(uri, localName, qName);
    }
  }