@Override
 public int countItems(Context context, Community community) throws SQLException {
   int total = 0;
   // add collection counts
   List<Collection> cols = community.getCollections();
   for (Collection col : cols) {
     total += itemService.countItems(context, col);
   }
   // add sub-community counts
   List<Community> comms = community.getSubcommunities();
   for (int j = 0; j < comms.size(); j++) {
     total += countItems(context, comms.get(j));
   }
   return total;
 }
  public void registerItem(Player player, int itemUniqueId, long price, int itemCount) {
    Map<Integer, BrokerItem> brokerItems = getRaceBrokerItems(player.getCommonData().getRace());

    List<BrokerItem> registeredItems = new ArrayList<BrokerItem>();
    int playerId = player.getObjectId();

    for (BrokerItem item : brokerItems.values()) {
      if (item != null
          && item.getItem() != null
          && !item.isSold()
          && !item.isSettled()
          && playerId == item.getSellerId()) registeredItems.add(item);
    }

    if (registeredItems.size() >= 15) {
      PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1300653));
      return;
    }

    Item itemToRegister = player.getInventory().getItemByObjId(itemUniqueId);
    Race playerRace = player.getCommonData().getRace();

    if (itemToRegister == null) return;

    if (!itemToRegister.getItemTemplate().isTradeable()) {
      PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1300652));
      return;
    }

    if (itemToRegister.isSoulBound()) return;

    BrokerRace brRace;

    if (playerRace == Race.ASMODIANS) brRace = BrokerRace.ASMODIAN;
    else if (playerRace == Race.ELYOS) brRace = BrokerRace.ELYOS;
    else return;

    double priceRate = player.getPrices().getGlobalPrices(player.getCommonData().getRace()) * .01;
    double taxRate = player.getPrices().getTaxes(player.getCommonData().getRace()) * .01;
    double priceMod = player.getPrices().getGlobalPricesModifier() * .01;
    double priceFactor = 0.02 * priceRate * taxRate * priceMod;
    long registrationCommition =
        (long) (price * priceFactor * (registeredItems.size() >= 10 ? 2 : 1));

    if (registrationCommition < 10) registrationCommition = 10;

    if (player.getInventory().getKinahItem().getItemCount() < registrationCommition) {
      PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(1300647));
      return;
    }

    if (itemCount < itemToRegister.getItemCount() && itemCount > 0) {
      Item newItem =
          ItemService.newItem(
              itemToRegister.getItemTemplate().getTemplateId(),
              itemCount,
              itemToRegister.getCrafterName(),
              playerId,
              itemToRegister.getTempItemTimeLeft(),
              itemToRegister.getTempTradeTimeLeft());
      player.getInventory().decreaseItemCount(itemToRegister, itemCount);
      PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(itemToRegister));
      itemToRegister = newItem;
    } else {
      boolean removeResult = player.getInventory().removeFromBag(itemToRegister, false);
      if (!removeResult) return;
      PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(itemToRegister.getObjectId()));
    }

    boolean decreaseResult = player.getInventory().decreaseKinah(registrationCommition);
    if (!decreaseResult) return;

    itemToRegister.setItemLocation(126);

    BrokerItem newBrokerItem =
        new BrokerItem(
            player, itemToRegister, price, player.getName(), player.getObjectId(), brRace);

    switch (brRace) {
      case ASMODIAN:
        asmodianBrokerItems.put(newBrokerItem.getItemUniqueId(), newBrokerItem);
        break;

      case ELYOS:
        elyosBrokerItems.put(newBrokerItem.getItemUniqueId(), newBrokerItem);
        break;
    }

    BrokerOpSaveTask bost =
        new BrokerOpSaveTask(
            newBrokerItem,
            itemToRegister,
            player.getInventory().getKinahItem(),
            player.getObjectId());
    saveManager.add(bost);

    BrokerItem[] brokerItem = new BrokerItem[1];
    brokerItem[0] = newBrokerItem;
    PacketSendUtility.sendPacket(
        player, new SM_BROKER_ITEMS(brokerItem, registeredItems.size() + 1, 3));
  }