package net.rainbowcode.jpixelface.profile; import com.google.gson.JsonParseException; import net.rainbowcode.jpixelface.StringUtil; import net.rainbowcode.jpixelface.exceptions.MojangException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.util.Queue; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedQueue; public class ProfileRequestThread extends Thread implements Runnable { Queue<ProfileFuture> futureQueue = new ConcurrentLinkedQueue<>(); private final Logger log = LogManager.getLogger(); @Override public void run() { while (true) { if (!futureQueue.isEmpty()) { for (ProfileFuture future : futureQueue) { try { if (future.getType().equals(ProfileType.NAME)) { Profile profileFromName = ProfileManager.getProfileFromName(future.getId()); future.setProfile(profileFromName); future.setDone(true); } else if (future.getType().equals(ProfileType.MOJANGUUID)) { Profile profileFromUUID = ProfileManager.getProfileFromUUID(UUID.fromString(StringUtil.addDashes(future.getId()))); future.setProfile(profileFromUUID); future.setDone(true); } else if (future.getType().equals(ProfileType.UUID)) { Profile profileFromUUID = ProfileManager.getProfileFromUUID(UUID.fromString(future.getId())); future.setProfile(profileFromUUID); future.setDone(true); } } catch (MojangException | IOException | JsonParseException ex) { log.info("Failed processing profile request: Type: " + future.getType().name() + ", id: " + future.getId() + ", exception class:" + ex.getClass()); future.setException(ex); future.setDone(true); } if (future.getException() == null) { log.info("Done processing profile request: Type: " + future.getType().name() + ", id: " + future.getId()); } } futureQueue.removeIf(ProfileFuture::isDone); } try { sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } public ProfileFuture getProfileByName(String name) { ProfileFuture future = new ProfileFuture(ProfileType.NAME, name); futureQueue.add(future); return future; } public ProfileFuture getProfileByMojangID(String id) { ProfileFuture future = new ProfileFuture(ProfileType.MOJANGUUID, id); futureQueue.add(future); return future; } public ProfileFuture getProfileByUUID(String id) { ProfileFuture future = new ProfileFuture(ProfileType.UUID, id); futureQueue.add(future); return future; } }