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

enterprises.orbital.evekit.model.character.sync.CharacterAssetsSync Maven / Gradle / Ivy

package enterprises.orbital.evekit.model.character.sync;

import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Queue;
import java.util.Set;
import java.util.logging.Logger;

import enterprises.orbital.evekit.account.SynchronizedEveAccount;
import enterprises.orbital.evekit.model.AssetSyncUtil;
import enterprises.orbital.evekit.model.CachedData;
import enterprises.orbital.evekit.model.CapsuleerSyncTracker;
import enterprises.orbital.evekit.model.SyncTracker;
import enterprises.orbital.evekit.model.SyncTracker.SyncState;
import enterprises.orbital.evekit.model.SynchronizerUtil;
import enterprises.orbital.evekit.model.SynchronizerUtil.SyncStatus;
import enterprises.orbital.evekit.model.character.Capsuleer;
import enterprises.orbital.evexmlapi.chr.ICharacterAPI;
import enterprises.orbital.evexmlapi.shared.IAsset;

public class CharacterAssetsSync extends AbstractCharacterSync {
  protected static final Logger log = Logger.getLogger(CharacterAssetsSync.class.getName());

  @Override
  public boolean isRefreshed(
                             CapsuleerSyncTracker tracker) {
    return tracker.getAssetListStatus() != SyncTracker.SyncState.NOT_PROCESSED;
  }

  @Override
  public long getExpiryTime(
                            Capsuleer container) {
    return container.getAssetListExpiry();
  }

  @Override
  public void updateStatus(
                           CapsuleerSyncTracker tracker,
                           SyncState status,
                           String detail) {
    tracker.setAssetListStatus(status);
    tracker.setAssetListDetail(detail);
    CapsuleerSyncTracker.updateTracker(tracker);
  }

  @Override
  public void updateExpiry(
                           Capsuleer container,
                           long expiry) {
    container.setAssetListExpiry(expiry);
    CachedData.updateData(container);
  }

  @Override
  protected Object getServerData(
                                 ICharacterAPI charRequest)
    throws IOException {
    // First retrieve nested assets
    Collection assetList = charRequest.requestAssets();
    if (charRequest.isError()) return Collections.emptyList();
    // Then retrieve flat asset list and add in any assets that were not present in the initial request
    Collection flat = charRequest.requestAssets(true);
    if (charRequest.isError()) return Collections.emptyList();
    // Build a map of all assets contained in the nested call
    Set itemSet = new HashSet<>();
    Queue processQueue = new ArrayDeque<>();
    processQueue.addAll(assetList);
    while (!processQueue.isEmpty()) {
      IAsset next = processQueue.remove();
      itemSet.add(next.getItemID());
      processQueue.addAll(next.getContainedAssets());
    }
    // Add any assets in the flat list that we haven't seen yet
    for (IAsset next : flat) {
      if (!itemSet.contains(next.getItemID())) assetList.add(next);
    }
    return assetList;
  }

  @Override
  protected long processServerData(
                                   long time,
                                   SynchronizedEveAccount syncAccount,
                                   ICharacterAPI charRequest,
                                   Object data,
                                   List updates)
    throws IOException {
    @SuppressWarnings("unchecked")
    Collection assetList = (Collection) data;
    AssetSyncUtil.updateAssets(time, syncAccount, assetList, updates);
    return charRequest.getCachedUntil().getTime();
  }

  private static final CharacterAssetsSync syncher = new CharacterAssetsSync();

  public static SyncStatus syncAssets(
                                      long time,
                                      SynchronizedEveAccount syncAccount,
                                      SynchronizerUtil syncUtil,
                                      ICharacterAPI charRequest) {
    return syncher.syncData(time, syncAccount, syncUtil, charRequest, "CharacterAssets");
  }

  public static SyncStatus exclude(
                                   SynchronizedEveAccount syncAccount,
                                   SynchronizerUtil syncUtil) {
    return syncher.excludeState(syncAccount, syncUtil, "CharacterAssets", SyncTracker.SyncState.SYNC_ERROR);
  }

  public static SyncStatus notAllowed(
                                      SynchronizedEveAccount syncAccount,
                                      SynchronizerUtil syncUtil) {
    return syncher.excludeState(syncAccount, syncUtil, "CharacterAssets", SyncTracker.SyncState.NOT_ALLOWED);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy