Example usage for com.google.common.collect Multiset elementSet

List of usage examples for com.google.common.collect Multiset elementSet

Introduction

In this page you can find the example usage for com.google.common.collect Multiset elementSet.

Prototype

Set<E> elementSet();

Source Link

Document

Returns the set of distinct elements contained in this multiset.

Usage

From source file:org.dllearner.algorithms.qtl.experiments.QTLEvaluation.java

private RDFResourceTree applyBaseLine(ExamplesWrapper examples, Baseline baselineApproach) {
    Collection<RDFResourceTree> posExamples = examples.posExamplesMapping.values();
    Collection<RDFResourceTree> negExamples = examples.negExamplesMapping.values();

    switch (baselineApproach) {
    case RANDOM:// 1.
        String query = "SELECT ?cls WHERE {?cls a owl:Class .} ORDER BY RAND() LIMIT 1";
        QueryExecution qe = qef.createQueryExecution(query);
        ResultSet rs = qe.execSelect();
        if (rs.hasNext()) {
            QuerySolution qs = rs.next();
            Resource cls = qs.getResource("cls");
            RDFResourceTree solution = new RDFResourceTree();
            solution.addChild(new RDFResourceTree(cls.asNode()), RDF.type.asNode());
            return solution;
        }/*from   w  w w  .  j  av a2 s. c  o m*/
    case MOST_POPULAR_TYPE_IN_KB:// 2.
        query = "SELECT ?cls WHERE {?cls a owl:Class . ?s a ?cls .} ORDER BY DESC(COUNT(?s)) LIMIT 1";
        qe = qef.createQueryExecution(query);
        rs = qe.execSelect();
        if (rs.hasNext()) {
            QuerySolution qs = rs.next();
            Resource cls = qs.getResource("cls");
            RDFResourceTree solution = new RDFResourceTree();
            solution.addChild(new RDFResourceTree(cls.asNode()), RDF.type.asNode());
            return solution;
        }
    case MOST_FREQUENT_TYPE_IN_EXAMPLES:// 3.
        Multiset<Node> types = HashMultiset.create();
        for (RDFResourceTree ex : posExamples) {
            List<RDFResourceTree> children = ex.getChildren(RDF.type.asNode());
            for (RDFResourceTree child : children) {
                types.add(child.getData());
            }
        }
        Node mostFrequentType = Ordering.natural().onResultOf(new Function<Multiset.Entry<Node>, Integer>() {
            @Override
            public Integer apply(Multiset.Entry<Node> entry) {
                return entry.getCount();
            }
        }).max(types.entrySet()).getElement();
        RDFResourceTree solution = new RDFResourceTree();
        solution.addChild(new RDFResourceTree(mostFrequentType), RDF.type.asNode());
        return solution;
    case MOST_FREQUENT_EDGE_IN_EXAMPLES:// 4.
    {
        Multiset<Pair<Node, Node>> pairs = HashMultiset.create();
        for (RDFResourceTree ex : posExamples) {
            SortedSet<Node> edges = ex.getEdges();
            for (Node edge : edges) {
                List<RDFResourceTree> children = ex.getChildren(edge);
                for (RDFResourceTree child : children) {
                    pairs.add(new Pair<>(edge, child.getData()));
                }
            }
        }
        Pair<Node, Node> mostFrequentPair = Ordering.natural()
                .onResultOf(new Function<Multiset.Entry<Pair<Node, Node>>, Integer>() {
                    @Override
                    public Integer apply(Multiset.Entry<Pair<Node, Node>> entry) {
                        return entry.getCount();
                    }
                }).max(pairs.entrySet()).getElement();
        solution = new RDFResourceTree();
        solution.addChild(new RDFResourceTree(mostFrequentPair.getValue()), mostFrequentPair.getKey());
        return solution;
    }
    case MOST_INFORMATIVE_EDGE_IN_EXAMPLES:
        // get all p-o in pos examples
        Multiset<Pair<Node, Node>> edgeObjectPairs = HashMultiset.create();
        for (RDFResourceTree ex : posExamples) {
            SortedSet<Node> edges = ex.getEdges();
            for (Node edge : edges) {
                List<RDFResourceTree> children = ex.getChildren(edge);
                for (RDFResourceTree child : children) {
                    edgeObjectPairs.add(new Pair<>(edge, child.getData()));
                }
            }
        }

        double bestAccuracy = -1;
        solution = new RDFResourceTree();

        for (Pair<Node, Node> pair : edgeObjectPairs.elementSet()) {
            Node edge = pair.getKey();
            Node childValue = pair.getValue();

            // compute accuracy
            int tp = edgeObjectPairs.count(pair);
            int fn = posExamples.size() - tp;
            int fp = 0;
            for (RDFResourceTree ex : negExamples) { // compute false positives
                List<RDFResourceTree> children = ex.getChildren(edge);
                if (children != null) {
                    for (RDFResourceTree child : children) {
                        if (child.getData().equals(childValue)) {
                            fp++;
                            break;
                        }
                    }
                }
            }
            int tn = negExamples.size() - fp;

            double accuracy = Heuristics.getPredictiveAccuracy(posExamples.size(), negExamples.size(), tp, tn,
                    1.0);
            // update best solution
            if (accuracy >= bestAccuracy) {
                solution = new RDFResourceTree();
                solution.addChild(new RDFResourceTree(childValue), edge);
                bestAccuracy = accuracy;
            }
        }
        return solution;
    case LGG:
        LGGGenerator lggGenerator = new LGGGeneratorSimple();
        RDFResourceTree lgg = lggGenerator.getLGG(Lists.newArrayList(posExamples));
        return lgg;

    default:
        break;

    }
    return null;
}

From source file:edu.umd.cs.submitServer.servlets.AnalyzeArchives.java

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    Connection conn = null;/* w ww .ja  v  a  2s . c om*/
    response.setContentType("text/plain");
    PrintWriter writer = response.getWriter();

    Project project = (Project) request.getAttribute("project");
    Course course = (Course) request.getAttribute("course");

    long totalArchiveSpace = 0;
    long totalDistinctArchiveSpace = 0;
    HashSet<Integer> seen = new HashSet<Integer>();

    HashMap<String, FileContents> archiveContents = new HashMap<String, FileContents>();
    Multiset<String> files = HashMultiset.create();
    Multiset<String> checksums = HashMultiset.create();
    try {
        conn = getConnection();
        List<Integer> archives = Submission.getAllArchivesForProject(project.getProjectPK(), conn);
        writer.printf("Analyzing %d submissions for %s project %s%n", archives.size(), course.getCourseName(),
                project.getProjectNumber());
        for (Integer archivePK : archives) {
            byte[] bytes = Archive.downloadBytesFromArchive((String) Submission.SUBMISSION_ARCHIVES,
                    (Integer) archivePK, (Connection) conn);
            totalArchiveSpace += bytes.length;
            if (!seen.add(archivePK))
                continue;
            totalDistinctArchiveSpace += bytes.length;
            TreeMap<String, byte[]> contents = Archive.unzip(new ByteArrayInputStream(bytes));

            for (Map.Entry<String, byte[]> e : contents.entrySet()) {
                byte[] archiveBytes = e.getValue();
                String checksum = Checksums.getChecksum(archiveBytes);
                String name = e.getKey();
                files.add(name);
                checksums.add(checksum);
                FileContents info = archiveContents.get(checksum);
                if (info == null) {

                    info = new FileContents(name, TextUtilities.isText(TextUtilities.simpleName(name)),
                            archiveBytes.length, checksum, null);
                    archiveContents.put(checksum, info);
                }

            }

        }

    } catch (SQLException e) {
        throw new ServletException(e);
    } finally {
        releaseConnection(conn);
    }
    long totalSize = 0;
    TreeSet<FileContents> ordered = new TreeSet<FileContents>(archiveContents.values());
    writer.printf("%5s %9s %s%n", "#", "size", "name");

    String prevName = null;
    for (FileContents info : ordered) {
        if (prevName == null || !prevName.equals(info.name)) {
            if (prevName != null)
                writer.println();
            writer.printf("%5d %9s %s%n", files.count(info.name), " ", info.name);
            prevName = info.name;
        }
        int count = checksums.count(info.checksum);
        writer.printf("%5d %9d %s%n", count, info.size, info.name);
        totalSize += info.size;
    }
    writer.printf("%n");
    writer.printf("%d distinct archives%n", seen.size());
    writer.printf("%d distinct files%n", files.elementSet().size());
    writer.printf("%d total files%n", files.size());

    writer.printf("%d bytes in distinct archives%n", totalDistinctArchiveSpace);
    writer.printf("%d bytes in repeated archives%n", totalArchiveSpace);
    writer.printf("%d bytes as files%n", totalSize);
}

From source file:org.apache.mahout.classifier.sgd.TrainASFEmail.java

@Override
public int run(String[] args) throws Exception {
    addInputOption();/*from   w  w  w .j a v  a 2  s . c  o m*/
    addOutputOption();
    addOption("categories", "nc", "The number of categories to train on", true);
    addOption("cardinality", "c", "The size of the vectors to use", "100000");
    addOption("threads", "t", "The number of threads to use in the learner", "20");
    addOption("poolSize", "p", "The number of CrossFoldLearners to use in the AdaptiveLogisticRegression. "
            + "Higher values require more memory.", "5");
    if (parseArguments(args) == null) {
        return -1;
    }

    File base = new File(getInputPath().toString());

    Multiset<String> overallCounts = HashMultiset.create();
    File output = new File(getOutputPath().toString());
    output.mkdirs();
    int numCats = Integer.parseInt(getOption("categories"));
    int cardinality = Integer.parseInt(getOption("cardinality", "100000"));
    int threadCount = Integer.parseInt(getOption("threads", "20"));
    int poolSize = Integer.parseInt(getOption("poolSize", "5"));
    Dictionary asfDictionary = new Dictionary();
    AdaptiveLogisticRegression learningAlgorithm = new AdaptiveLogisticRegression(numCats, cardinality,
            new L1(), threadCount, poolSize);
    learningAlgorithm.setInterval(800);
    learningAlgorithm.setAveragingWindow(500);

    //We ran seq2encoded and split input already, so let's just build up the dictionary
    Configuration conf = new Configuration();
    PathFilter trainFilter = new PathFilter() {
        @Override
        public boolean accept(Path path) {
            return path.getName().contains("training");
        }
    };
    SequenceFileDirIterator<Text, VectorWritable> iter = new SequenceFileDirIterator<Text, VectorWritable>(
            new Path(base.toString()), PathType.LIST, trainFilter, null, true, conf);
    long numItems = 0;
    while (iter.hasNext()) {
        Pair<Text, VectorWritable> next = iter.next();
        asfDictionary.intern(next.getFirst().toString());
        numItems++;
    }

    System.out.println(numItems + " training files");

    SGDInfo info = new SGDInfo();

    iter = new SequenceFileDirIterator<Text, VectorWritable>(new Path(base.toString()), PathType.LIST,
            trainFilter, null, true, conf);
    int k = 0;
    while (iter.hasNext()) {
        Pair<Text, VectorWritable> next = iter.next();
        String ng = next.getFirst().toString();
        int actual = asfDictionary.intern(ng);
        //we already have encoded
        learningAlgorithm.train(actual, next.getSecond().get());
        k++;
        State<AdaptiveLogisticRegression.Wrapper, CrossFoldLearner> best = learningAlgorithm.getBest();

        SGDHelper.analyzeState(info, 0, k, best);
    }
    learningAlgorithm.close();
    //TODO: how to dissection since we aren't processing the files here
    //SGDHelper.dissect(leakType, asfDictionary, learningAlgorithm, files, overallCounts);
    System.out.println("exiting main, writing model to " + output);

    ModelSerializer.writeBinary(output + "/asf.model",
            learningAlgorithm.getBest().getPayload().getLearner().getModels().get(0));

    List<Integer> counts = Lists.newArrayList();
    System.out.println("Word counts");
    for (String count : overallCounts.elementSet()) {
        counts.add(overallCounts.count(count));
    }
    Collections.sort(counts, Ordering.natural().reverse());
    k = 0;
    for (Integer count : counts) {
        System.out.println(k + "\t" + count);
        k++;
        if (k > 1000) {
            break;
        }
    }
    return 0;
}

From source file:de.andreasschoknecht.LS3.DocumentCollection.java

/**
 * Insert a model to a model collection. This means that the underlying Term-Document Matrix has to be updated.
 *
 * @param modelPath the path to the model to be inserted.
 *//*from   w  w  w  .j a  v a2 s. c  o  m*/
public void insertModel(String modelPath) {
    // Make sure file name is correct
    if (!modelPath.endsWith(".pnml"))
        modelPath = modelPath + ".pnml";

    // Create new LS3Document object and add it to the document collection list of documents
    System.out.println("------------------------");
    System.out.println("Model to insert:");
    System.out.println("------------------------");
    System.out.println(modelPath.substring(modelPath.lastIndexOf(File.separator) + 1));
    System.out.println("------------------------");
    System.out.println("Models in list:");
    System.out.println("------------------------");

    String[] updatedFileList = new String[fileList.length + 1];
    for (int i = 0; i <= fileList.length; i++) {
        if (i != fileList.length)
            updatedFileList[i] = fileList[i];
        else
            updatedFileList[i] = modelPath.substring(modelPath.lastIndexOf(File.separator) + 1);

        System.out.println(updatedFileList[i]);

    }

    documentNumber++;

    LS3Document newDocument = new LS3Document(modelPath);
    PNMLReader pnmlReader = new PNMLReader();
    try {
        pnmlReader.processDocument(newDocument);
    } catch (JDOMException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("------------------------");
    System.out.println("New LS3Document data:");
    System.out.println("------------------------");
    System.out.println(newDocument.getPNMLPath());
    System.out.println("Amount of terms = " + newDocument.getAmountTerms());
    for (String term : newDocument.getTermCollection()) {
        System.out.println(term);
    }

    // Add new column to the Term-Document Matrix
    int t = tdMatrix.getRowNumber();
    double[] termFrequencies = new double[t];
    String[] termCollectionArray = new String[termCollection.size()];
    termCollection.toArray(termCollectionArray);

    Multiset<String> termsM = newDocument.getTermCollection();
    for (int i = 0; i < t; i++) {
        termFrequencies[i] = termsM.count(termCollectionArray[i]);
        termsM.remove(termCollectionArray[i]);
    }
    System.out.println("------------------------");
    System.out.println("Term frequencies:");
    System.out.println("------------------------");
    System.out.println(Arrays.toString(termFrequencies));

    System.out.println("------------------------");
    System.out.println("Old TD Matrix:");
    System.out.println("------------------------");
    for (int i = 0, k = tdMatrix.getRowNumber(); i < k; i++) {
        System.out.print(tdMatrix.getTermArray()[i] + " ");
        for (int j = 0, l = tdMatrix.getColumnNumber(); j < l; j++) {
            System.out.print(" " + tdMatrix.getMatrix()[i][j] + " ");
        }
        System.out.println("");
    }
    System.out.println("---------------------\r\n\r\n");

    tdMatrix.addColumn(termFrequencies);

    System.out.println("------------------------");
    System.out.println("New TD Matrix:");
    System.out.println("------------------------");
    for (int i = 0, k = tdMatrix.getRowNumber(); i < k; i++) {
        System.out.print(tdMatrix.getTermArray()[i] + " ");
        for (int j = 0, l = tdMatrix.getColumnNumber(); j < l; j++) {
            System.out.print(" " + tdMatrix.getMatrix()[i][j] + " ");
        }
        System.out.println("");
    }
    System.out.println("---------------------\r\n\r\n");

    // Add new terms of the new model to the term list of the document collection
    System.out.println("------------------------");
    System.out.println("Old term collection:");
    System.out.println("------------------------");
    for (String term : termCollection) {
        System.out.println(term);
    }

    System.out.println("------------------------");
    System.out.println("Terms remaining in insertion model:");
    System.out.println("------------------------");
    System.out.println(Arrays.toString(termsM.toArray(new String[termsM.size()])));

    Set<String> termSet = termsM.elementSet();
    String[] newTerms = termSet.toArray(new String[termSet.size()]);
    for (String term : newTerms) {
        termCollection.add(term);
    }

    System.out.println("------------------------");
    System.out.println("New term collection:");
    System.out.println("------------------------");
    for (String term : termCollection) {
        System.out.println(term);
    }

    System.out.println("------------------------");
    System.out.println("New term collection TD Matrix:");
    System.out.println("------------------------");
    for (String term : tdMatrix.getTermArray()) {
        System.out.println(term);
    }

    //  Add one row for each new term and add the corresponding Term-Document Matrix entries
    double[] newTermsFrequencies = new double[newTerms.length];
    for (int i = 0; i < newTerms.length; i++) {
        newTermsFrequencies[i] = termsM.count(newTerms[i]);
    }

    System.out.println("------------------------");
    System.out.println("New term frequencies:");
    System.out.println("------------------------");
    System.out.println(Arrays.toString(newTermsFrequencies));

    int n = tdMatrix.getColumnNumber();
    for (int i = 0; i < newTermsFrequencies.length; i++) {
        double[] newRow = new double[n];
        for (int j = 0; j < n - 2; j++)
            newRow[j] = 0;

        newRow[n - 1] = newTermsFrequencies[i];
        tdMatrix.addRow(newRow);
    }

    // Update term list of TDMatrix object
    tdMatrix.setTermArray(termCollection.toArray(new String[0]));

    System.out.println("------------------------");
    System.out.println("Final TD Matrix:");
    System.out.println("------------------------");
    for (int i = 0, k = tdMatrix.getRowNumber(); i < k; i++) {
        System.out.print(tdMatrix.getTermArray()[i] + " ");
        for (int j = 0, l = tdMatrix.getColumnNumber(); j < l; j++) {
            System.out.print(" " + tdMatrix.getMatrix()[i][j] + " ");
        }
        System.out.println("");
    }
    System.out.println("---------------------\r\n\r\n");

}

From source file:fr.obeo.releng.targetplatform.validation.TargetPlatformValidator.java

private void reportDuplicatedEnvironmentOptions(final TargetPlatform targetPlatform,
        final Multiset<String> valuesInFile, final String msg) {
    if (((valuesInFile.size() > 1) || IterableExtensions.<Multiset.Entry<String>>exists(valuesInFile.entrySet(),
            new Function1<Multiset.Entry<String>, Boolean>() {
                @Override/*from w ww  .  ja v  a  2 s .  c om*/
                public Boolean apply(final Multiset.Entry<String> it) {
                    int _count = it.getCount();
                    return Boolean.valueOf((_count > 1));
                }
            }))) {
        final Consumer<String> _function = new Consumer<String>() {
            @Override
            public void accept(final String e) {
                final Consumer<Environment> _function = new Consumer<Environment>() {
                    @Override
                    public void accept(final Environment env) {
                        for (int i = 0; (i < env.getEnv().size()); i++) {
                            {
                                final String it = env.getEnv().get(i);
                                boolean _equals = e.equals(it);
                                if (_equals) {
                                    TargetPlatformValidator.this.error(msg, env,
                                            TargetPlatformPackage.Literals.ENVIRONMENT__ENV, i,
                                            TargetPlatformValidator.CHECK__NO_DUPLICATE_ENVIRONMENT_OPTIONS);
                                }
                            }
                        }
                    }
                };
                Iterables.<Environment>filter(targetPlatform.getContents(), Environment.class)
                        .forEach(_function);
            }
        };
        valuesInFile.elementSet().forEach(_function);
    }
}

From source file:com.wasteofplastic.acidisland.commands.AdminCmd.java

public boolean onCommand(final CommandSender sender, final Command command, final String label,
        final String[] split) {
    // Console commands
    Player player;/*w  w w .ja v a  2s . c om*/
    if (sender instanceof Player) {
        player = (Player) sender;
        if (split.length > 0) {
            // Admin-only commands : reload, register, delete and purge
            if (split[0].equalsIgnoreCase("reload") || split[0].equalsIgnoreCase("register")
                    || split[0].equalsIgnoreCase("delete") || split[0].equalsIgnoreCase("purge")
                    || split[0].equalsIgnoreCase("confirm") || split[0].equalsIgnoreCase("setspawn")
                    || split[0].equalsIgnoreCase("deleteisland") || split[0].equalsIgnoreCase("setrange")
                    || split[0].equalsIgnoreCase("unregister")) {
                if (!checkAdminPerms(player, split)) {
                    player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission);
                    return true;
                }
            } else {
                // Mod commands
                if (!checkModPerms(player, split)) {
                    player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission);
                    return true;
                }
            }
        }
    }
    // Check for zero parameters e.g., /asadmin
    switch (split.length) {
    case 0:
        help(sender, label);
        return true;
    case 1:
        if (Settings.teamChat && split[0].equalsIgnoreCase("spy")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.spy") || player.isOp()) {
                if (plugin.getChatListener().toggleSpy(player.getUniqueId())) {
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale().teamChatStatusOn);
                } else {
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale().teamChatStatusOff);
                }
                return true;
            }
        } else if (split[0].equalsIgnoreCase("lock")) {
            // Just /asadmin lock
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            Island island = plugin.getGrid().getIslandAt(player.getLocation());
            // Check if island exists
            if (island == null) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNotOnIsland);
                return true;
            } else {
                Player owner = plugin.getServer().getPlayer(island.getOwner());
                if (island.isLocked()) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().lockUnlocking);
                    island.setLocked(false);
                    if (owner != null) {
                        owner.sendMessage(plugin.myLocale(owner.getUniqueId()).adminLockadminUnlockedIsland);
                    } else {
                        plugin.getMessages().setMessage(island.getOwner(),
                                plugin.myLocale(island.getOwner()).adminLockadminUnlockedIsland);
                    }
                } else {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().lockLocking);
                    island.setLocked(true);
                    if (owner != null) {
                        owner.sendMessage(plugin.myLocale(owner.getUniqueId()).adminLockadminLockedIsland);
                    } else {
                        plugin.getMessages().setMessage(island.getOwner(),
                                plugin.myLocale(island.getOwner()).adminLockadminLockedIsland);
                    }
                }
                return true;
            }
        } else
        // Find farms
        if (split[0].equalsIgnoreCase("topbreeders")) {
            // Go through each island and find how many farms there are
            sender.sendMessage(plugin.myLocale().adminTopBreedersFinding);
            //TreeMap<Integer, List<UUID>> topEntityIslands = new TreeMap<Integer, List<UUID>>();
            // Generate the stats
            sender.sendMessage(plugin.myLocale().adminTopBreedersChecking.replace("[number]",
                    String.valueOf(plugin.getGrid().getOwnershipMap().size())));
            // Try just finding every entity
            final List<Entity> allEntities = ASkyBlock.getIslandWorld().getEntities();
            final World islandWorld = ASkyBlock.getIslandWorld();
            final World netherWorld = ASkyBlock.getNetherWorld();
            plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {

                @Override
                public void run() {
                    Map<UUID, Multiset<EntityType>> result = new HashMap<UUID, Multiset<EntityType>>();
                    // Find out where the entities are
                    for (Entity entity : allEntities) {
                        //System.out.println("DEBUG " + entity.getType().toString());
                        if (entity.getLocation().getWorld().equals(islandWorld)
                                || entity.getLocation().getWorld().equals(netherWorld)) {
                            //System.out.println("DEBUG in world");
                            if (entity instanceof Creature && !(entity instanceof Player)) {
                                //System.out.println("DEBUG creature");
                                // Find out where it is
                                Island island = plugin.getGrid().getIslandAt(entity.getLocation());
                                if (island != null && !island.isSpawn()) {
                                    //System.out.println("DEBUG on island");
                                    // Add to result
                                    UUID owner = island.getOwner();
                                    Multiset<EntityType> count = result.get(owner);
                                    if (count == null) {
                                        // New entry for owner
                                        //System.out.println("DEBUG new entry for owner");
                                        count = HashMultiset.create();
                                    }
                                    count.add(entity.getType());
                                    result.put(owner, count);
                                }
                            }
                        }
                    }
                    // Sort by the number of entities on each island
                    TreeMap<Integer, List<UUID>> topEntityIslands = new TreeMap<Integer, List<UUID>>();
                    for (Entry<UUID, Multiset<EntityType>> entry : result.entrySet()) {
                        int numOfEntities = entry.getValue().size();
                        List<UUID> players = topEntityIslands.get(numOfEntities);
                        if (players == null) {
                            players = new ArrayList<UUID>();
                        }
                        players.add(entry.getKey());
                        topEntityIslands.put(numOfEntities, players);
                    }
                    final TreeMap<Integer, List<UUID>> topBreeders = topEntityIslands;
                    final Map<UUID, Multiset<EntityType>> finalResult = result;
                    // Now display results in sync thread
                    plugin.getServer().getScheduler().runTask(plugin, new Runnable() {

                        @Override
                        public void run() {
                            if (topBreeders.isEmpty()) {
                                sender.sendMessage(plugin.myLocale().adminTopBreedersNothing);
                                return;
                            }
                            int rank = 1;
                            // Display, largest first
                            for (int numOfEntities : topBreeders.descendingKeySet()) {
                                // Only bother if there's more that 5 animals
                                if (numOfEntities > 5) {
                                    // There can be multiple owners in the same position
                                    List<UUID> owners = topBreeders.get(numOfEntities);
                                    // Go through the owners one by one
                                    for (UUID owner : owners) {
                                        sender.sendMessage("#" + rank + " " + plugin.getPlayers().getName(owner)
                                                + " = " + numOfEntities);
                                        String content = "";
                                        Multiset<EntityType> entityCount = finalResult.get(owner);
                                        for (EntityType entity : entityCount.elementSet()) {
                                            int num = entityCount.count(entity);
                                            String color = ChatColor.GREEN.toString();
                                            if (num > 10 && num <= 20) {
                                                color = ChatColor.YELLOW.toString();
                                            } else if (num > 20 && num <= 40) {
                                                color = ChatColor.GOLD.toString();
                                            } else if (num > 40) {
                                                color = ChatColor.RED.toString();
                                            }
                                            content += Util.prettifyText(entity.toString()) + " x " + color
                                                    + num + ChatColor.WHITE + ", ";
                                        }
                                        int lastComma = content.lastIndexOf(",");
                                        // plugin.getLogger().info("DEBUG: last comma " +
                                        // lastComma);
                                        if (lastComma > 0) {
                                            content = content.substring(0, lastComma);
                                        }
                                        sender.sendMessage("  " + content);

                                    }
                                    rank++;
                                    if (rank > 10) {
                                        break;
                                    }
                                }
                            }
                            // If we didn't show anything say so
                            if (rank == 1) {
                                sender.sendMessage(plugin.myLocale().adminTopBreedersNothing);
                            }

                        }
                    });

                }
            });
            return true;
        }
        // Delete island
        if (split[0].equalsIgnoreCase("deleteisland")) {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().adminDeleteIslandError);
            return true;
        }
        // Set spawn
        if (split[0].equalsIgnoreCase("setspawn")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            player = (Player) sender;
            // Island spawn must be in the island world
            if (!player.getLocation().getWorld().getName().equals(Settings.worldName)) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorWrongWorld);
                return true;
            }
            // The island location is calculated based on the grid
            Location closestIsland = getClosestIsland(player.getLocation());
            Island oldSpawn = plugin.getGrid().getSpawn();
            Island newSpawn = plugin.getGrid().getIslandAt(closestIsland);
            if (newSpawn != null && newSpawn.isSpawn()) {
                // Already spawn, so just set the world spawn coords
                plugin.getGrid().setSpawnPoint(player.getLocation());
                //ASkyBlock.getIslandWorld().setSpawnLocation(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminSetSpawnset);
                return true;
            }
            // Space otherwise occupied - find if anyone owns it
            if (newSpawn != null && newSpawn.getOwner() != null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnownedBy.replace("[name]",
                        plugin.getPlayers().getName(newSpawn.getOwner())));
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnmove);
                return true;
            }
            if (oldSpawn != null) {
                sender.sendMessage(ChatColor.GOLD
                        + "Changing spawn island location. Warning: old spawn island location at "
                        + oldSpawn.getCenter().getBlockX() + "," + oldSpawn.getCenter().getBlockZ()
                        + " will be at risk of being overwritten with new islands. Recommend to clear that old area.");
                plugin.getGrid().deleteSpawn();
            }
            // New spawn site is free, so make it official
            if (newSpawn == null) {
                // Make the new spawn
                newSpawn = plugin.getGrid().addIsland(closestIsland.getBlockX(), closestIsland.getBlockZ());
            }
            plugin.getGrid().setSpawn(newSpawn);
            plugin.getGrid().setSpawnPoint(player.getLocation());
            //ASkyBlock.getIslandWorld().setSpawnLocation(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
            player.sendMessage(ChatColor.GREEN + plugin.myLocale().adminSetSpawnsetting.replace("[location]",
                    player.getLocation().getBlockX() + "," + player.getLocation().getBlockZ()));
            player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawncenter.replace("[location]",
                    newSpawn.getCenter().getBlockX() + "," + newSpawn.getCenter().getBlockZ()));
            player.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawnlimits.replace("[min]",
                    newSpawn.getMinX() + "," + newSpawn.getMinZ())).replace("[max]",
                            (newSpawn.getMinX() + newSpawn.getIslandDistance() - 1) + ","
                                    + (newSpawn.getMinZ() + newSpawn.getIslandDistance() - 1)));
            player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnrange.replace("[number]",
                    String.valueOf(newSpawn.getProtectionSize())));
            player.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawncoords.replace("[min]",
                    newSpawn.getMinProtectedX() + ", " + newSpawn.getMinProtectedZ())).replace("[max]",
                            +(newSpawn.getMinProtectedX() + newSpawn.getProtectionSize() - 1) + ", "
                                    + (newSpawn.getMinProtectedZ() + newSpawn.getProtectionSize() - 1)));
            if (newSpawn.isLocked()) {
                player.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnlocked);
            }
            return true;
        } else if (split[0].equalsIgnoreCase("info") || split[0].equalsIgnoreCase("setrange")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            Location closestIsland = getClosestIsland(((Player) sender).getLocation());
            if (closestIsland == null) {
                sender.sendMessage(ChatColor.RED + "Sorry, could not find an island. Move closer?");
                return true;
            }
            Island island = plugin.getGrid().getIslandAt(closestIsland);
            if (island != null && island.isSpawn()) {
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminInfotitle);
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawncenter.replace(
                        "[location]", island.getCenter().getBlockX() + "," + island.getCenter().getBlockZ()));
                sender.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawnlimits.replace("[min]",
                        island.getMinX() + "," + island.getMinZ())).replace("[max]",
                                (island.getMinX() + island.getIslandDistance() - 1) + ","
                                        + (island.getMinZ() + island.getIslandDistance() - 1)));
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnrange.replace("[number]",
                        String.valueOf(island.getProtectionSize())));
                sender.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawncoords.replace("[min]",
                        island.getMinProtectedX() + ", " + island.getMinProtectedZ())).replace("[max]",
                                +(island.getMinProtectedX() + island.getProtectionSize() - 1) + ", "
                                        + (island.getMinProtectedZ() + island.getProtectionSize() - 1)));
                if (island.isLocked()) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnlocked);
                }
                return true;
            }
            if (island == null) {
                plugin.getLogger().info("Get island at was null" + closestIsland);
            }
            UUID target = plugin.getPlayers().getPlayerFromIslandLocation(closestIsland);
            if (target == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminInfounowned);
                return true;
            }
            showInfo(target, sender);
            return true;
        } else if (split[0].equalsIgnoreCase("resetsign")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            player = (Player) sender;
            if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.signadmin") && !player.isOp()) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission);
                return true;
            }
            // Find out whether the player is looking at a warp sign
            // Look at what the player was looking at
            BlockIterator iter = new BlockIterator(player, 10);
            Block lastBlock = iter.next();
            while (iter.hasNext()) {
                lastBlock = iter.next();
                if (lastBlock.getType() == Material.AIR)
                    continue;
                break;
            }
            if (!lastBlock.getType().equals(Material.SIGN_POST)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminResetSignNoSign);
                return true;
            }
            // Check if it is a warp sign
            Sign sign = (Sign) lastBlock.getState();
            sender.sendMessage(ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).adminResetSignFound);
            // Find out whose island this is
            // plugin.getLogger().info("DEBUG: closest bedrock: " +
            // closestBedRock.toString());
            UUID target = plugin.getPlayers().getPlayerFromIslandLocation(player.getLocation());
            if (target == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminInfounowned);
                return true;
            }
            if (plugin.getWarpSignsListener().addWarp(target, lastBlock.getLocation())) {
                // Change sign color to green
                sign.setLine(0, ChatColor.GREEN + plugin.myLocale().warpswelcomeLine);
                sign.update();
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).adminResetSignRescued
                        .replace("[name]", plugin.getPlayers().getName(target)));
                return true;
            }
            // Warp already exists
            sender.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminResetSignErrorExists
                    .replace("[name]", plugin.getWarpSignsListener().getWarpOwner(lastBlock.getLocation())));
            return true;

        } else if (split[0].equalsIgnoreCase("reload")) {
            plugin.reloadConfig();
            plugin.loadPluginConfig();
            plugin.getChallenges().reloadChallengeConfig();
            if (Settings.useEconomy && VaultHelper.setupEconomy()) {
                ControlPanel.loadShop();
            } else {
                Settings.useEconomy = false;
            }
            ControlPanel.loadControlPanel();
            if (Settings.updateCheck) {
                plugin.checkUpdates();
            } else {
                plugin.setUpdateCheck(null);
            }
            plugin.getIslandCmd().loadSchematics();
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().reloadconfigReloaded);
            return true;
        } else if (split[0].equalsIgnoreCase("topten")) {
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminTopTengenerating);
            TopTen.topTenCreate(sender);
            return true;
        } else if (split[0].equalsIgnoreCase("purge")) {
            if (purgeFlag) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgealreadyRunning);
                return true;
            }
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgeusage.replace("[label]", label));
            return true;
        } else if (split[0].equalsIgnoreCase("confirm")) {
            if (!confirmReq) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().confirmerrorTimeLimitExpired);
                return true;
            } else {
                // Tell purge routine to go
                confirmOK = true;
                confirmReq = false;
            }
            return true;
        } else {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            return false;
        }
    case 2:
        // Resetsign <player> - makes a warp sign for player
        if (split[0].equalsIgnoreCase("resetsign")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            Player p = (Player) sender;
            if (!VaultHelper.checkPerm(p, Settings.PERMPREFIX + "mod.signadmin") && !p.isOp()) {
                p.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).errorNoPermission);
                return true;
            }
            // Convert target name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID) && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Has an island
                // Find out whether the player is looking at a warp sign
                // Look at what the player was looking at
                BlockIterator iter = new BlockIterator(p, 10);
                Block lastBlock = iter.next();
                while (iter.hasNext()) {
                    lastBlock = iter.next();
                    if (lastBlock.getType() == Material.AIR)
                        continue;
                    break;
                }
                // Check if it is a sign
                if (!lastBlock.getType().equals(Material.SIGN_POST)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).adminResetSignNoSign);
                    return true;
                }
                Sign sign = (Sign) lastBlock.getState();
                // Check if the sign is within the right island boundary
                Location islandLoc = plugin.getPlayers().getIslandLocation(playerUUID);
                if (!plugin.getGrid().getIslandAt(islandLoc).inIslandSpace(sign.getLocation())) {
                    p.sendMessage(
                            ChatColor.RED + plugin.myLocale(p.getUniqueId()).adminSetHomeNotOnPlayersIsland);
                } else {
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminResetSignFound);
                    // Find out if this player is allowed to have a sign on this island
                    if (plugin.getWarpSignsListener().addWarp(playerUUID, lastBlock.getLocation())) {
                        // Change sign color to green
                        sign.setLine(0, ChatColor.GREEN + plugin.myLocale().warpswelcomeLine);
                        sign.update();
                        p.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminResetSignRescued
                                .replace("[name]", plugin.getPlayers().getName(playerUUID)));
                        return true;
                    }
                    // Warp already exists
                    sender.sendMessage(ChatColor.RED
                            + plugin.myLocale(p.getUniqueId()).adminResetSignErrorExists.replace("[name]",
                                    plugin.getWarpSignsListener().getWarpOwner(lastBlock.getLocation())));
                }
            }
            return true;
        }
        // Delete the island you are on
        else if (split[0].equalsIgnoreCase("deleteisland")) {
            if (!split[1].equalsIgnoreCase("confirm")) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminDeleteIslandError);
                return true;
            }
            // Get the island I am on
            Island island = plugin.getGrid().getIslandAt(((Player) sender).getLocation());
            if (island == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminDeleteIslandnoid);
                return true;
            }
            // Try to get the owner of this island
            UUID owner = island.getOwner();
            String name = "unknown";
            if (owner != null) {
                name = plugin.getPlayers().getName(owner);
                sender.sendMessage(
                        ChatColor.RED + plugin.myLocale().adminSetSpawnownedBy.replace("[name]", name));
                sender.sendMessage(
                        ChatColor.RED + plugin.myLocale().adminDeleteIslanduse.replace("[name]", name));
                return true;
            } else {
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().deleteremoving.replace("[name]", name));
                deleteIslands(island, sender);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("resethome")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID) && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Has an island
                Location safeHome = plugin.getGrid().getSafeHomeLocation(playerUUID, 1);
                if (safeHome == null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetHomeNoneFound);
                } else {
                    plugin.getPlayers().setHomeLocation(playerUUID, safeHome);
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminSetHomeHomeSet.replace(
                            "[location]",
                            safeHome.getBlockX() + ", " + safeHome.getBlockY() + "," + safeHome.getBlockZ()));
                }
            }
            return true;
        } else if (split[0].equalsIgnoreCase("sethome")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID) && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    player.sendMessage(
                            ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIslandOther);
                    return true;
                }
                // Has an island
                Location islandLoc = plugin.getPlayers().getIslandLocation(playerUUID);
                // Check the player is within the island boundaries
                if (!plugin.getGrid().getIslandAt(islandLoc).inIslandSpace(player.getLocation())) {
                    player.sendMessage(ChatColor.RED
                            + plugin.myLocale(player.getUniqueId()).adminSetHomeNotOnPlayersIsland);
                } else {
                    // Check that the location is safe
                    if (!GridManager.isSafeLocation(player.getLocation())) {
                        // Not safe
                        player.sendMessage(
                                ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminSetHomeNoneFound);
                    } else {
                        // Success
                        plugin.getPlayers().setHomeLocation(playerUUID, player.getLocation());
                        player.sendMessage(
                                ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).adminSetHomeHomeSet
                                        .replace("[location]",
                                                player.getLocation().getBlockX() + ", "
                                                        + player.getLocation().getBlockY() + ","
                                                        + player.getLocation().getBlockZ()));
                    }
                }
            }
            return true;
        } else
        // Set protection for the island the player is on
        if (split[0].equalsIgnoreCase("setrange")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            UUID playerUUID = player.getUniqueId();
            Island island = plugin.getGrid().getIslandAt(player.getLocation());
            // Check if island exists
            if (island == null) {
                player.sendMessage(ChatColor.RED + plugin.myLocale().errorNotOnIsland);
                return true;
            } else {
                int newRange = 10;
                int maxRange = Settings.islandDistance;
                // If spawn do something different
                if (island.isSpawn()) {
                    try {
                        newRange = Integer.valueOf(split[1]);
                    } catch (Exception e) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeInvalid);
                        return true;
                    }
                    player.sendMessage(ChatColor.GREEN + plugin.myLocale(playerUUID).adminSetRangeSet
                            .replace("[number]", String.valueOf(newRange)));
                    if (newRange > maxRange) {
                        player.sendMessage(ChatColor.RED + "" + ChatColor.BOLD
                                + plugin.myLocale(playerUUID).adminSetRangeWarning.replace("[max]",
                                        String.valueOf(maxRange)));
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeWarning2);
                    }
                    island.setProtectionSize(newRange);
                    player.sendMessage(
                            ChatColor.YELLOW + plugin.myLocale().adminSetSpawncenter.replace("[location]",
                                    island.getCenter().getBlockX() + "," + island.getCenter().getBlockZ()));
                    player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnlimits
                            .replace("[min]", island.getMinX() + "," + island.getMinZ())
                            .replace("[max]", (island.getMinX() + island.getIslandDistance() - 1) + ","
                                    + (island.getMinZ() + island.getIslandDistance() - 1)));
                    player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnrange
                            .replace("[number]", String.valueOf(island.getProtectionSize())));
                    player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawncoords
                            .replace("[min]", island.getMinProtectedX() + ", " + island.getMinProtectedZ())
                            .replace("[max]", +(island.getMinProtectedX() + island.getProtectionSize() - 1)
                                    + ", " + (island.getMinProtectedZ() + island.getProtectionSize() - 1)));
                    if (island.isLocked()) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnlocked);
                    }
                } else {
                    if (!plugin.getConfig().getBoolean("island.overridelimit")) {
                        maxRange -= 16;
                    }
                    try {
                        newRange = Integer.valueOf(split[1]);
                    } catch (Exception e) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeInvalid
                                + " " + plugin.myLocale(playerUUID).adminSetRangeTip.replace("[max]",
                                        String.valueOf(maxRange)));
                        return true;
                    }
                    if (newRange < 10 || newRange > maxRange) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeInvalid
                                + " " + plugin.myLocale(playerUUID).adminSetRangeTip.replace("[max]",
                                        String.valueOf(maxRange)));
                        return true;
                    }
                    island.setProtectionSize(newRange);
                    player.sendMessage(ChatColor.GREEN + plugin.myLocale(playerUUID).adminSetRangeSet
                            .replace("[number]", String.valueOf(newRange)));
                    showInfo(island.getOwner(), sender);
                }
                return true;
            }
        }
        if (split[0].equalsIgnoreCase("purge")) {
            // PURGE Command
            // Check for "allow" or "disallow" flags
            // Protect island from purging
            if (split[1].equalsIgnoreCase("allow") || split[1].equalsIgnoreCase("disallow")) {
                // Find the closest island
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                    return true;
                }
                Player p = (Player) sender;
                // Island spawn must be in the island world
                if (!p.getLocation().getWorld().equals(ASkyBlock.getIslandWorld())
                        && !p.getLocation().getWorld().equals(ASkyBlock.getNetherWorld())) {
                    p.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).errorWrongWorld);
                    return true;
                }
                Island island = plugin.getGrid().getIslandAt(p.getLocation());
                if (island == null) {
                    p.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).errorNoIslandOther);
                    return true;
                }
                if (split[1].equalsIgnoreCase("allow")) {
                    island.setPurgeProtected(true);
                } else {
                    island.setPurgeProtected(false);
                }
                if (island.isPurgeProtected()) {
                    p.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminAllowPurge);
                } else {
                    p.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminPreventPurge);
                }
                return true;
            }

            // Purge runs in the background so if one is already running
            // this flag stops a repeat
            if (purgeFlag) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgealreadyRunning);
                return true;
            }

            if (split[1].equalsIgnoreCase("unowned")) {
                countUnowned(sender);
                return true;
            }
            // Set the flag
            purgeFlag = true;
            // See if this purge unowned

            // Convert days to hours - no other limit checking?
            final int time;
            try {
                time = Integer.parseInt(split[1]) * 24;
            } catch (Exception e) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgeusage.replace("[label]", label));
                purgeFlag = false;
                return true;
            }
            sender.sendMessage(
                    ChatColor.YELLOW + plugin.myLocale().purgecalculating.replace("[time]", split[1]));
            // Check who has not been online since the time
            for (Entry<UUID, Island> entry : plugin.getGrid().getOwnershipMap().entrySet()) {
                //plugin.getLogger().info("UUID = " + entry.getKey());
                // Only do this if it isn't protected
                if (entry.getKey() != null && !entry.getValue().isPurgeProtected()) {
                    if (Bukkit.getOfflinePlayer(entry.getKey()).hasPlayedBefore()) {
                        long offlineTime = Bukkit.getOfflinePlayer(entry.getKey()).getLastPlayed();
                        offlineTime = (System.currentTimeMillis() - offlineTime) / 3600000L;
                        if (offlineTime > time) {
                            //if (plugin.getPlayers().getIslandLevel(entry.getKey()) < Settings.abandonedIslandLevel) {
                            // Check level later
                            removeList.add(entry.getKey());
                            //}
                        }
                    } else {
                        removeList.add(entry.getKey());
                    }
                }
            }
            if (removeList.isEmpty()) {
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgenoneFound);
                purgeFlag = false;
                return true;
            }
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgethisWillRemove
                    .replace("[number]", String.valueOf(removeList.size()))
                    .replace("[level]", String.valueOf(Settings.abandonedIslandLevel)));
            sender.sendMessage(ChatColor.RED + plugin.myLocale().purgewarning);
            sender.sendMessage(ChatColor.RED + plugin.myLocale().purgetypeConfirm.replace("[label]", label));
            confirmReq = true;
            confirmOK = false;
            confirmTimer = 0;
            new BukkitRunnable() {
                @Override
                public void run() {
                    // This waits for 10 seconds and if no
                    // confirmation received, then it
                    // cancels
                    if (confirmTimer++ > 10) {
                        // Ten seconds is up!
                        confirmReq = false;
                        confirmOK = false;
                        purgeFlag = false;
                        removeList.clear();
                        sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgepurgeCancelled);
                        this.cancel();
                    } else if (confirmOK) {
                        // Set up a repeating task to run every 2
                        // seconds to remove
                        // islands one by one and then cancel when
                        // done
                        final int total = removeList.size();
                        new BukkitRunnable() {
                            @Override
                            public void run() {
                                if (removeList.isEmpty() && purgeFlag) {
                                    purgeFlag = false;
                                    sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgefinished);
                                    this.cancel();
                                }

                                if (removeList.size() > 0 && purgeFlag) {
                                    // Check the level
                                    if (plugin.getPlayers().getIslandLevel(
                                            removeList.get(0)) < Settings.abandonedIslandLevel) {
                                        sender.sendMessage(ChatColor.YELLOW + "["
                                                + (total - removeList.size() + 1) + "/" + total + "] "
                                                + plugin.myLocale().purgeremovingName.replace("[name]",
                                                        plugin.getPlayers().getName(removeList.get(0))));
                                        plugin.deletePlayerIsland(removeList.get(0), true);
                                    }
                                    removeList.remove(0);
                                }
                                //sender.sendMessage("Now waiting...");
                            }
                        }.runTaskTimer(plugin, 0L, 20L);
                        confirmReq = false;
                        confirmOK = false;
                        this.cancel();
                    }
                }
            }.runTaskTimer(plugin, 0L, 40L);
            return true;
        } else if (split[0].equalsIgnoreCase("lock")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                Island island = plugin.getGrid().getIsland(playerUUID);
                if (island != null) {
                    Player owner = plugin.getServer().getPlayer(island.getOwner());
                    if (island.isLocked()) {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().lockUnlocking);
                        island.setLocked(false);
                        if (owner != null) {
                            owner.sendMessage(
                                    plugin.myLocale(owner.getUniqueId()).adminLockadminUnlockedIsland);
                        } else {
                            plugin.getMessages().setMessage(island.getOwner(),
                                    plugin.myLocale(island.getOwner()).adminLockadminUnlockedIsland);
                        }
                    } else {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().lockLocking);
                        island.setLocked(true);
                        if (owner != null) {
                            owner.sendMessage(plugin.myLocale(owner.getUniqueId()).adminLockadminLockedIsland);
                        } else {
                            plugin.getMessages().setMessage(island.getOwner(),
                                    plugin.myLocale(island.getOwner()).adminLockadminLockedIsland);
                        }
                    }
                } else {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                }
                return true;
            }
        } else if (split[0].equalsIgnoreCase("clearreset")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                plugin.getPlayers().setResetsLeft(playerUUID, Settings.resetLimit);
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().clearedResetLimit + " ["
                        + Settings.resetLimit + "]");
                return true;
            }
        } else if (split[0].equalsIgnoreCase("tp")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
                return true;
            }
            player = (Player) sender;
            // Convert name to a UUID
            final UUID targetUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(targetUUID)) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer);
                return true;
            } else {
                if (plugin.getPlayers().hasIsland(targetUUID) || plugin.getPlayers().inTeam(targetUUID)) {
                    // Teleport to the over world
                    Location warpSpot = plugin.getPlayers().getIslandLocation(targetUUID).toVector()
                            .toLocation(ASkyBlock.getIslandWorld());
                    String failureMessage = ChatColor.RED
                            + plugin.myLocale(player.getUniqueId()).adminTpManualWarp.replace("[location]",
                                    warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " "
                                            + warpSpot.getBlockZ());
                    // Try the player's home first
                    Location home = plugin.getPlayers().getHomeLocation(targetUUID);
                    plugin.getGrid();
                    if (home.getWorld().equals(ASkyBlock.getIslandWorld())
                            && GridManager.isSafeLocation(home)) {
                        player.teleport(home);
                        return true;
                    }
                    // Other wise, go to a safe spot
                    new SafeSpotTeleport(plugin, player, warpSpot, failureMessage);
                    return true;
                }
                sender.sendMessage(plugin.myLocale().errorNoIslandOther);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("tpnether")) {
            if (!Settings.createNether || !Settings.newNether) {
                return false;
            }
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
                return true;
            }
            player = (Player) sender;
            // Convert name to a UUID
            final UUID targetUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(targetUUID)) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer);
                return true;
            } else {
                if (plugin.getPlayers().hasIsland(targetUUID) || plugin.getPlayers().inTeam(targetUUID)) {
                    // Teleport to the nether
                    Location warpSpot = plugin.getPlayers().getIslandLocation(targetUUID).toVector()
                            .toLocation(ASkyBlock.getNetherWorld());
                    String failureMessage = ChatColor.RED
                            + plugin.myLocale(player.getUniqueId()).adminTpManualWarp.replace("[location]",
                                    warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " "
                                            + warpSpot.getBlockZ());
                    // Try the player's home first
                    Location home = plugin.getPlayers().getHomeLocation(targetUUID);
                    plugin.getGrid();
                    if (home.getWorld().equals(ASkyBlock.getNetherWorld())
                            && GridManager.isSafeLocation(home)) {
                        player.teleport(home);
                        return true;
                    }
                    new SafeSpotTeleport(plugin, player, warpSpot, failureMessage);
                    return true;
                }
                sender.sendMessage(plugin.myLocale().errorNoIslandOther);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("delete")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                // This now deletes the player and cleans them up even if
                // they don't have an island
                sender.sendMessage(
                        ChatColor.YELLOW + plugin.myLocale().deleteremoving.replace("[name]", split[1]));
                // If they are online and in ASkyBlock then delete their
                // stuff too
                Player target = plugin.getServer().getPlayer(playerUUID);
                if (target != null) {
                    // Clear any coop inventories
                    // CoopPlay.getInstance().returnAllInventories(target);
                    // Remove any of the target's coop invitees and grab
                    // their stuff
                    CoopPlay.getInstance().clearMyInvitedCoops(target);
                    CoopPlay.getInstance().clearMyCoops(target);
                    plugin.resetPlayer(target);
                }
                // plugin.getLogger().info("DEBUG: deleting player");
                plugin.deletePlayerIsland(playerUUID, true);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("register")) {
            if (sender instanceof Player) {
                // Convert name to a UUID
                final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
                if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                    return true;
                } else {
                    if (adminSetPlayerIsland(sender, ((Player) sender).getLocation(), playerUUID)) {
                        sender.sendMessage(ChatColor.GREEN
                                + plugin.myLocale().registersettingIsland.replace("[name]", split[1]));
                        plugin.getGrid().saveGrid();
                    } else {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().registererrorBedrockNotFound);
                    }
                    return true;
                }
            } else {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            }
            return true;
        } else if (split[0].equalsIgnoreCase("unregister")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                if (plugin.getPlayers().inTeam(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminUnregisterOnTeam);
                    return true;
                }
                Location island = plugin.getPlayers().getIslandLocation(playerUUID);
                if (island == null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Delete player, but keep blocks
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminUnregisterKeepBlocks
                        .replace("[location]", +plugin.getPlayers().getIslandLocation(playerUUID).getBlockX()
                                + "," + plugin.getPlayers().getIslandLocation(playerUUID).getBlockZ()));
                plugin.deletePlayerIsland(playerUUID, false);
                plugin.getGrid().saveGrid();
                return true;
            }
        } else if (split[0].equalsIgnoreCase("info")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            // plugin.getLogger().info("DEBUG: console player info UUID = "
            // + playerUUID);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                showInfo(playerUUID, sender);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("resetallchallenges")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            plugin.getPlayers().resetAllChallenges(playerUUID);
            sender.sendMessage(
                    ChatColor.YELLOW + plugin.myLocale().resetChallengessuccess.replace("[name]", split[1]));
            return true;
        } else {
            return false;
        }
    case 3:
        // Confirm purge unowned
        if (split[0].equalsIgnoreCase("purge")) {
            if (purgeFlag) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgealreadyRunning);
                return true;
            }
            // Check if this is purge unowned
            if (split[1].equalsIgnoreCase("unowned") && split[2].equalsIgnoreCase("confirm")) {
                if (!purgeUnownedConfirm) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().confirmerrorTimeLimitExpired);
                    return true;
                } else {
                    purgeUnownedConfirm = false;
                    // Purge the unowned islands
                    purgeUnownedIslands(sender);
                    return true;
                }
            }

        }
        // Set protection
        if (split[0].equalsIgnoreCase("setrange")) {
            // Convert name to a UUID
            UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            // Check if player exists
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            // Check if the target is in a team and if so, the leader needs to be adjusted
            if (plugin.getPlayers().inTeam(playerUUID)) {
                playerUUID = plugin.getPlayers().getTeamLeader(playerUUID);
            }
            // Get the range that this player has now
            Island island = plugin.getGrid().getIsland(playerUUID);
            if (island == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                return true;
            } else {
                int newRange = 0;
                int maxRange = Settings.islandDistance;
                if (!plugin.getConfig().getBoolean("island.overridelimit")) {
                    maxRange -= 16;
                }
                try {
                    newRange = Integer.valueOf(split[2]);
                } catch (Exception e) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetRangeInvalid + " "
                            + plugin.myLocale().adminSetRangeTip.replace("[max]", String.valueOf(maxRange)));

                    return true;
                }
                if (newRange < 10 || newRange > maxRange) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetRangeInvalid + " "
                            + plugin.myLocale().adminSetRangeTip.replace("[max]", String.valueOf(maxRange)));

                    return true;
                }
                island.setProtectionSize(newRange);
                sender.sendMessage(ChatColor.GREEN
                        + plugin.myLocale().adminSetRangeSet.replace("[number]", String.valueOf(newRange)));
                showInfo(playerUUID, sender);
                plugin.getGrid().saveGrid();
                return true;
            }
        }
        // Change biomes
        if (split[0].equalsIgnoreCase("setbiome")) {
            // Convert name to a UUID
            UUID playerUUID = plugin.getPlayers().getUUID(split[1]);
            // Check if player exists
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            // Check if the target is in a team and if so, the leader
            if (plugin.getPlayers().inTeam(playerUUID)) {
                playerUUID = plugin.getPlayers().getTeamLeader(playerUUID);
            }
            // Check if biome is valid
            Biome biome = null;
            String biomeName = split[2].toUpperCase();
            try {
                biome = Biome.valueOf(biomeName);
                biomeName = biome.name();
                if (!plugin.getConfig().contains("biomes." + biomeName)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().biomeUnknown);
                    // Doing it this way ensures that only valid biomes are
                    // shown
                    for (Biome b : Biome.values()) {
                        if (plugin.getConfig().contains("biomes." + b.name())) {
                            sender.sendMessage(b.name());
                        }
                    }
                    return true;
                }
                // Get friendly name
                biomeName = plugin.getConfig().getString("biomes." + biomeName + ".friendlyname",
                        Util.prettifyText(biomeName));

            } catch (Exception e) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().biomeUnknown);
                for (Biome b : Biome.values()) {
                    if (plugin.getConfig().contains("biomes." + b.name())) {
                        sender.sendMessage(b.name());
                    }
                }
                return true;
            }
            // Okay clear to set biome
            // Actually set the biome
            if (plugin.getPlayers().inTeam(playerUUID)
                    && plugin.getPlayers().getTeamIslandLocation(playerUUID) != null) {
                plugin.getBiomes().setIslandBiome(plugin.getPlayers().getTeamIslandLocation(playerUUID), biome);
            } else {
                plugin.getBiomes().setIslandBiome(plugin.getPlayers().getIslandLocation(playerUUID), biome);
            }
            sender.sendMessage(ChatColor.GREEN + plugin.myLocale().biomeSet.replace("[biome]", biomeName));
            Player targetPlayer = plugin.getServer().getPlayer(playerUUID);
            if (targetPlayer != null) {
                // Online
                targetPlayer.sendMessage("[Admin] " + ChatColor.GREEN
                        + plugin.myLocale(playerUUID).biomeSet.replace("[biome]", biomeName));
            } else {
                plugin.getMessages().setMessage(playerUUID, "[Admin] " + ChatColor.GREEN
                        + plugin.myLocale(playerUUID).biomeSet.replace("[biome]", biomeName));
            }
            return true;
        } else
        // team kick <player> and team delete <leader>
        if (split[0].equalsIgnoreCase("team")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (split[1].equalsIgnoreCase("kick")) {
                // Remove player from team
                if (!plugin.getPlayers().inTeam(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoTeam);
                    return true;
                }
                UUID teamLeader = plugin.getPlayers().getTeamLeader(playerUUID);
                if (teamLeader == null) {
                    // Player is apparently in a team, but there is no team leader
                    // Remove their team status
                    // Clear the player of all team-related items
                    plugin.getPlayers().setLeaveTeam(playerUUID);
                    plugin.getPlayers().setHomeLocation(playerUUID, null);
                    plugin.getPlayers().setIslandLocation(playerUUID, null);
                    // Remove any warps
                    plugin.getWarpSignsListener().removeWarp(playerUUID);
                    sender.sendMessage(
                            ChatColor.RED + plugin.myLocale().kicknameRemoved.replace("[name]", split[2]));
                    return true;
                }
                // Payer is not a team leader
                if (!teamLeader.equals(playerUUID)) {
                    // Clear the player of all team-related items
                    plugin.getPlayers().setLeaveTeam(playerUUID);
                    plugin.getPlayers().setHomeLocation(playerUUID, null);
                    plugin.getPlayers().setIslandLocation(playerUUID, null);
                    // Clear the leader of this player and if they now have
                    // no team, remove the team
                    plugin.getPlayers().removeMember(teamLeader, playerUUID);
                    if (plugin.getPlayers().getMembers(teamLeader).size() < 2) {
                        plugin.getPlayers().setLeaveTeam(teamLeader);
                    }
                    // Remove any warps
                    plugin.getWarpSignsListener().removeWarp(playerUUID);
                    sender.sendMessage(
                            ChatColor.RED + plugin.myLocale().kicknameRemoved.replace("[name]", split[2]));
                    return true;
                } else {
                    sender.sendMessage(
                            ChatColor.RED + (plugin.myLocale().adminTeamKickLeader.replace("[label]", label))
                                    .replace("[name]", split[2]));
                    return true;
                }
            } else {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
                return false;
            }
        } else if (split[0].equalsIgnoreCase("completechallenge")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (plugin.getPlayers().checkChallenge(playerUUID, split[1].toLowerCase())
                    || !plugin.getPlayers().get(playerUUID).challengeExists(split[1].toLowerCase())) {
                sender.sendMessage(
                        ChatColor.RED + plugin.myLocale().completeChallengeerrorChallengeDoesNotExist);
                return true;
            }
            plugin.getPlayers().get(playerUUID).completeChallenge(split[1].toLowerCase());
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().completeChallengechallangeCompleted
                    .replace("[challengename]", split[1].toLowerCase()).replace("[name]", split[2]));
            return true;
        } else if (split[0].equalsIgnoreCase("resetchallenge")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (!plugin.getPlayers().checkChallenge(playerUUID, split[1].toLowerCase())
                    || !plugin.getPlayers().get(playerUUID).challengeExists(split[1].toLowerCase())) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().resetChallengeerrorChallengeDoesNotExist);
                return true;
            }
            plugin.getPlayers().resetChallenge(playerUUID, split[1].toLowerCase());
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().resetChallengechallengeReset
                    .replace("[challengename]", split[1].toLowerCase()).replace("[name]", split[2]));
            return true;
        } else if (split[0].equalsIgnoreCase("info") && split[1].equalsIgnoreCase("challenges")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2]);
            // plugin.getLogger().info("DEBUG: console player info UUID = "
            // + playerUUID);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                showInfoChallenges(playerUUID, sender);
                return true;
            }
        }
        return false;
    case 4:
        // Team add <player> <leader>
        if (split[0].equalsIgnoreCase("team") && split[1].equalsIgnoreCase("add")) {
            // Convert names to UUIDs
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2]);
            final Player targetPlayer = plugin.getServer().getPlayer(playerUUID);
            final UUID teamLeader = plugin.getPlayers().getUUID(split[3]);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)
                    || !plugin.getPlayers().isAKnownPlayer(teamLeader)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (playerUUID.equals(teamLeader)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminTeamAddLeaderToOwn);
                return true;
            }
            // See if leader has an island
            if (!plugin.getPlayers().hasIsland(teamLeader)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminTeamAddLeaderNoIsland);
                return true;
            }
            // Check to see if this player is already in a team
            if (plugin.getPlayers().inTeam(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().inviteerrorThatPlayerIsAlreadyInATeam);
                return true;
            }
            // If the leader's member list does not contain their own name
            // then
            // add it
            if (!plugin.getPlayers().getMembers(teamLeader).contains(teamLeader)) {
                // Set up the team leader
                plugin.getPlayers().setJoinTeam(teamLeader, teamLeader,
                        plugin.getPlayers().getIslandLocation(teamLeader));
                plugin.getPlayers().addTeamMember(teamLeader, teamLeader);
                sender.sendMessage(ChatColor.GOLD + plugin.myLocale().adminTeamAddedLeader);
            }
            // This is a hack to clear any pending invitations
            if (targetPlayer != null) {
                targetPlayer.performCommand(Settings.ISLANDCOMMAND + " decline");
            }
            // If the invitee has an island of their own
            if (plugin.getPlayers().hasIsland(playerUUID)) {
                Location islandLoc = plugin.getPlayers().getIslandLocation(playerUUID);
                if (islandLoc != null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminTeamNowUnowned
                            .replace("[name]", plugin.getPlayers().getName(playerUUID))
                            .replace("[location]", islandLoc.getBlockX() + " " + islandLoc.getBlockZ()));
                }
            }
            // Remove their old island affiliation - do not delete the
            // island just in case
            plugin.deletePlayerIsland(playerUUID, false);
            // Join the team and set the team island location and leader
            plugin.getPlayers().setJoinTeam(playerUUID, teamLeader,
                    plugin.getPlayers().getIslandLocation(teamLeader));
            // Configure the best home location for this player
            if (plugin.getPlayers().getHomeLocation(teamLeader) != null) {
                plugin.getPlayers().setHomeLocation(playerUUID,
                        plugin.getPlayers().getHomeLocation(teamLeader));
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminTeamSettingHome);
            } else {
                plugin.getPlayers().setHomeLocation(playerUUID,
                        plugin.getPlayers().getIslandLocation(teamLeader));
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminTeamSettingHome);
            }
            // If the leader's member list does not contain player then add
            // it
            if (!plugin.getPlayers().getMembers(teamLeader).contains(playerUUID)) {
                plugin.getPlayers().addTeamMember(teamLeader, playerUUID);
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminTeamAddingPlayer);
            } else {
                sender.sendMessage(ChatColor.GOLD + plugin.myLocale().adminTeamAlreadyOnTeam);
            }
            // Teleport the player if they are online
            if (targetPlayer != null) {
                plugin.getGrid().homeTeleport(targetPlayer);
            }
            plugin.getGrid().saveGrid();
            return true;
        } else {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            return false;
        }
    default:
        return false;
    }
}

From source file:com.wasteofplastic.askyblock.commands.AdminCmd.java

@Override
public boolean onCommand(final CommandSender sender, final Command command, final String label,
        final String[] split) {
    // Console commands
    Player player;/*from  ww w.  j av a 2 s  .  c o  m*/
    if (sender instanceof Player) {
        player = (Player) sender;
        if (split.length > 0) {
            // Admin-only commands : reload, register, delete and purge
            if (split[0].equalsIgnoreCase("reload") || split[0].equalsIgnoreCase("register")
                    || split[0].equalsIgnoreCase("delete") || split[0].equalsIgnoreCase("purge")
                    || split[0].equalsIgnoreCase("confirm") || split[0].equalsIgnoreCase("setspawn")
                    || split[0].equalsIgnoreCase("deleteisland") || split[0].equalsIgnoreCase("setrange")
                    || split[0].equalsIgnoreCase("reserve") || split[0].equalsIgnoreCase("unregister")
                    || split[0].equalsIgnoreCase("clearresetall")
                    || split[0].equalsIgnoreCase("settingsreset")) {
                if (!checkAdminPerms(player, split)) {
                    player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission);
                    return true;
                }
            } else {
                // Mod commands
                if (!checkModPerms(player, split)) {
                    player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission);
                    return true;
                }
            }
        }
    }
    // Island name (can have spaces)
    if (split.length > 1 && split[0].equalsIgnoreCase("name")) {
        final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
        // plugin.getLogger().info("DEBUG: console player info UUID = "
        // + playerUUID);
        if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            return true;
        } else {
            if (split.length == 2) {
                // Say the island name
                sender.sendMessage(plugin.getGrid().getIslandName(playerUUID));
            } else {
                String name = split[2];
                for (int i = 3; i < split.length; i++) {
                    name = name + " " + split[i];
                }
                if (name.length() < Settings.minNameLength) {
                    sender.sendMessage(ChatColor.RED + (plugin.myLocale().errorTooShort).replace("[length]",
                            String.valueOf(Settings.minNameLength)));
                    return true;
                }
                if (name.length() > Settings.maxNameLength) {
                    sender.sendMessage(ChatColor.RED + (plugin.myLocale().errorTooLong).replace("[length]",
                            String.valueOf(Settings.maxNameLength)));
                    return true;
                }
                plugin.getGrid().setIslandName(playerUUID, ChatColor.translateAlternateColorCodes('&', name));
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().generalSuccess);
            }
            return true;
        }
    }

    // Check for zero parameters e.g., /asadmin
    switch (split.length) {
    case 0:
        help(sender, label);
        return true;
    case 1:
        if (split[0].equalsIgnoreCase("setdeaths")) {
            sender.sendMessage(ChatColor.YELLOW + label + " setdeaths <player> <number>:" + ChatColor.WHITE
                    + " " + plugin.myLocale().adminHelpsetDeaths);
            return true;
        } else if (split[0].equalsIgnoreCase("settingsreset")) {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().adminHelpSettingsReset);
            return true;
        } else if (Settings.teamChat && split[0].equalsIgnoreCase("spy")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            if (VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.spy") || player.isOp()) {
                if (plugin.getChatListener().toggleSpy(player.getUniqueId())) {
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale().teamChatStatusOn);
                } else {
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale().teamChatStatusOff);
                }
                return true;
            }
        } else if (split[0].equalsIgnoreCase("lock")) {
            // Just /asadmin lock
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            Island island = plugin.getGrid().getIslandAt(player.getLocation());
            // Check if island exists
            if (island == null) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNotOnIsland);
                return true;
            } else {
                Player owner = plugin.getServer().getPlayer(island.getOwner());
                if (island.isLocked()) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().lockUnlocking);
                    island.setLocked(false);
                    if (owner != null) {
                        owner.sendMessage(plugin.myLocale(owner.getUniqueId()).adminLockadminUnlockedIsland);
                    } else {
                        plugin.getMessages().setMessage(island.getOwner(),
                                plugin.myLocale(island.getOwner()).adminLockadminUnlockedIsland);
                    }
                } else {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().lockLocking);
                    island.setLocked(true);
                    if (owner != null) {
                        owner.sendMessage(plugin.myLocale(owner.getUniqueId()).adminLockadminLockedIsland);
                    } else {
                        plugin.getMessages().setMessage(island.getOwner(),
                                plugin.myLocale(island.getOwner()).adminLockadminLockedIsland);
                    }
                }
                return true;
            }
        } else
        // Find farms
        if (split[0].equalsIgnoreCase("topbreeders")) {
            // Go through each island and find how many farms there are
            sender.sendMessage(plugin.myLocale().adminTopBreedersFinding);
            //TreeMap<Integer, List<UUID>> topEntityIslands = new TreeMap<Integer, List<UUID>>();
            // Generate the stats
            sender.sendMessage(plugin.myLocale().adminTopBreedersChecking.replace("[number]",
                    String.valueOf(plugin.getGrid().getOwnershipMap().size())));
            // Try just finding every entity
            final List<Entity> allEntities = ASkyBlock.getIslandWorld().getEntities();
            final World islandWorld = ASkyBlock.getIslandWorld();
            final World netherWorld = ASkyBlock.getNetherWorld();
            plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {

                @Override
                public void run() {
                    Map<UUID, Multiset<EntityType>> result = new HashMap<UUID, Multiset<EntityType>>();
                    // Find out where the entities are
                    for (Entity entity : allEntities) {
                        //System.out.println("DEBUG " + entity.getType().toString());
                        if (entity.getLocation().getWorld().equals(islandWorld)
                                || entity.getLocation().getWorld().equals(netherWorld)) {
                            //System.out.println("DEBUG in world");
                            if (entity instanceof Creature && !(entity instanceof Player)) {
                                //System.out.println("DEBUG creature");
                                // Find out where it is
                                Island island = plugin.getGrid().getIslandAt(entity.getLocation());
                                if (island != null && !island.isSpawn()) {
                                    //System.out.println("DEBUG on island");
                                    // Add to result
                                    UUID owner = island.getOwner();
                                    Multiset<EntityType> count = result.get(owner);
                                    if (count == null) {
                                        // New entry for owner
                                        //System.out.println("DEBUG new entry for owner");
                                        count = HashMultiset.create();
                                    }
                                    count.add(entity.getType());
                                    result.put(owner, count);
                                }
                            }
                        }
                    }
                    // Sort by the number of entities on each island
                    TreeMap<Integer, List<UUID>> topEntityIslands = new TreeMap<Integer, List<UUID>>();
                    for (Entry<UUID, Multiset<EntityType>> entry : result.entrySet()) {
                        int numOfEntities = entry.getValue().size();
                        List<UUID> players = topEntityIslands.get(numOfEntities);
                        if (players == null) {
                            players = new ArrayList<UUID>();
                        }
                        players.add(entry.getKey());
                        topEntityIslands.put(numOfEntities, players);
                    }
                    final TreeMap<Integer, List<UUID>> topBreeders = topEntityIslands;
                    final Map<UUID, Multiset<EntityType>> finalResult = result;
                    // Now display results in sync thread
                    plugin.getServer().getScheduler().runTask(plugin, new Runnable() {

                        @Override
                        public void run() {
                            if (topBreeders.isEmpty()) {
                                sender.sendMessage(plugin.myLocale().adminTopBreedersNothing);
                                return;
                            }
                            int rank = 1;
                            // Display, largest first
                            for (int numOfEntities : topBreeders.descendingKeySet()) {
                                // Only bother if there's more that 5 animals
                                if (numOfEntities > 5) {
                                    // There can be multiple owners in the same position
                                    List<UUID> owners = topBreeders.get(numOfEntities);
                                    // Go through the owners one by one
                                    for (UUID owner : owners) {
                                        sender.sendMessage("#" + rank + " " + plugin.getPlayers().getName(owner)
                                                + " = " + numOfEntities);
                                        String content = "";
                                        Multiset<EntityType> entityCount = finalResult.get(owner);
                                        for (EntityType entity : entityCount.elementSet()) {
                                            int num = entityCount.count(entity);
                                            String color = ChatColor.GREEN.toString();
                                            if (num > 10 && num <= 20) {
                                                color = ChatColor.YELLOW.toString();
                                            } else if (num > 20 && num <= 40) {
                                                color = ChatColor.GOLD.toString();
                                            } else if (num > 40) {
                                                color = ChatColor.RED.toString();
                                            }
                                            content += Util.prettifyText(entity.toString()) + " x " + color
                                                    + num + ChatColor.WHITE + ", ";
                                        }
                                        int lastComma = content.lastIndexOf(",");
                                        // plugin.getLogger().info("DEBUG: last comma " +
                                        // lastComma);
                                        if (lastComma > 0) {
                                            content = content.substring(0, lastComma);
                                        }
                                        sender.sendMessage("  " + content);

                                    }
                                    rank++;
                                    if (rank > 10) {
                                        break;
                                    }
                                }
                            }
                            // If we didn't show anything say so
                            if (rank == 1) {
                                sender.sendMessage(plugin.myLocale().adminTopBreedersNothing);
                            }

                        }
                    });

                }
            });
            return true;
        }
        // Delete island
        if (split[0].equalsIgnoreCase("deleteisland")) {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().adminDeleteIslandError);
            return true;
        }
        // Set spawn
        if (split[0].equalsIgnoreCase("setspawn")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            player = (Player) sender;
            // Island spawn must be in the island world
            if (!player.getLocation().getWorld().getName().equals(Settings.worldName)) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorWrongWorld);
                return true;
            }
            // The island location is calculated based on the grid
            Location closestIsland = getClosestIsland(player.getLocation());
            Island oldSpawn = plugin.getGrid().getSpawn();
            Island newSpawn = plugin.getGrid().getIslandAt(closestIsland);
            if (newSpawn != null && newSpawn.isSpawn()) {
                // Already spawn, so just set the world spawn coords
                plugin.getGrid().setSpawnPoint(player.getLocation());
                //ASkyBlock.getIslandWorld().setSpawnLocation(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminSetSpawnset);
                return true;
            }
            // Space otherwise occupied - find if anyone owns it
            if (newSpawn != null && newSpawn.getOwner() != null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnownedBy.replace("[name]",
                        plugin.getPlayers().getName(newSpawn.getOwner())));
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnmove);
                return true;
            }
            if (oldSpawn != null) {
                sender.sendMessage(ChatColor.GOLD
                        + "Changing spawn island location. Warning: old spawn island location at "
                        + oldSpawn.getCenter().getBlockX() + "," + oldSpawn.getCenter().getBlockZ()
                        + " will be at risk of being overwritten with new islands. Recommend to clear that old area.");
                plugin.getGrid().deleteSpawn();
            }
            // New spawn site is free, so make it official
            if (newSpawn == null) {
                // Make the new spawn
                newSpawn = plugin.getGrid().addIsland(closestIsland.getBlockX(), closestIsland.getBlockZ(),
                        Environment.NORMAL);
            }
            plugin.getGrid().setSpawn(newSpawn);
            plugin.getGrid().setSpawnPoint(player.getLocation());
            //ASkyBlock.getIslandWorld().setSpawnLocation(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
            player.sendMessage(ChatColor.GREEN + plugin.myLocale().adminSetSpawnsetting.replace("[location]",
                    player.getLocation().getBlockX() + "," + player.getLocation().getBlockZ()));
            player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawncenter.replace("[location]",
                    newSpawn.getCenter().getBlockX() + "," + newSpawn.getCenter().getBlockZ()));
            player.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawnlimits.replace("[min]",
                    newSpawn.getMinX() + "," + newSpawn.getMinZ())).replace("[max]",
                            (newSpawn.getMinX() + newSpawn.getIslandDistance() - 1) + ","
                                    + (newSpawn.getMinZ() + newSpawn.getIslandDistance() - 1)));
            player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnrange.replace("[number]",
                    String.valueOf(newSpawn.getProtectionSize())));
            player.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawncoords.replace("[min]",
                    newSpawn.getMinProtectedX() + ", " + newSpawn.getMinProtectedZ())).replace("[max]",
                            +(newSpawn.getMinProtectedX() + newSpawn.getProtectionSize() - 1) + ", "
                                    + (newSpawn.getMinProtectedZ() + newSpawn.getProtectionSize() - 1)));
            if (newSpawn.isLocked()) {
                player.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnlocked);
            }
            return true;
        } else if (split[0].equalsIgnoreCase("info") || split[0].equalsIgnoreCase("setrange")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            Location closestIsland = getClosestIsland(((Player) sender).getLocation());
            if (closestIsland == null) {
                sender.sendMessage(ChatColor.RED + "Sorry, could not find an island. Move closer?");
                return true;
            }
            Island island = plugin.getGrid().getIslandAt(closestIsland);
            if (island != null && island.isSpawn()) {
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminInfotitle);
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawncenter.replace(
                        "[location]", island.getCenter().getBlockX() + "," + island.getCenter().getBlockZ()));
                sender.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawnlimits.replace("[min]",
                        island.getMinX() + "," + island.getMinZ())).replace("[max]",
                                (island.getMinX() + island.getIslandDistance() - 1) + ","
                                        + (island.getMinZ() + island.getIslandDistance() - 1)));
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnrange.replace("[number]",
                        String.valueOf(island.getProtectionSize())));
                sender.sendMessage(ChatColor.YELLOW + (plugin.myLocale().adminSetSpawncoords.replace("[min]",
                        island.getMinProtectedX() + ", " + island.getMinProtectedZ())).replace("[max]",
                                +(island.getMinProtectedX() + island.getProtectionSize() - 1) + ", "
                                        + (island.getMinProtectedZ() + island.getProtectionSize() - 1)));
                if (island.isLocked()) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnlocked);
                }
                return true;
            }
            if (island == null) {
                plugin.getLogger().info("Get island at was null" + closestIsland);
            }
            UUID target = plugin.getPlayers().getPlayerFromIslandLocation(closestIsland);
            if (target == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminInfounowned);
                return true;
            }
            showInfo(target, sender);
            return true;
        } else if (split[0].equalsIgnoreCase("resetsign")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            player = (Player) sender;
            if (!VaultHelper.checkPerm(player, Settings.PERMPREFIX + "mod.signadmin") && !player.isOp()) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoPermission);
                return true;
            }
            // Find out whether the player is looking at a warp sign
            // Look at what the player was looking at
            BlockIterator iter = new BlockIterator(player, 10);
            Block lastBlock = iter.next();
            while (iter.hasNext()) {
                lastBlock = iter.next();
                if (lastBlock.getType() == Material.AIR)
                    continue;
                break;
            }
            if (!lastBlock.getType().equals(Material.SIGN_POST)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminResetSignNoSign);
                return true;
            }
            // Check if it is a warp sign
            Sign sign = (Sign) lastBlock.getState();
            sender.sendMessage(ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).adminResetSignFound);
            // Find out whose island this is
            // plugin.getLogger().info("DEBUG: closest bedrock: " +
            // closestBedRock.toString());
            UUID target = plugin.getPlayers().getPlayerFromIslandLocation(player.getLocation());
            if (target == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminInfounowned);
                return true;
            }
            if (plugin.getWarpSignsListener().addWarp(target, lastBlock.getLocation())) {
                // Change sign color to green
                sign.setLine(0, ChatColor.GREEN + plugin.myLocale().warpswelcomeLine);
                sign.update();
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).adminResetSignRescued
                        .replace("[name]", plugin.getPlayers().getName(target)));
                return true;
            }
            // Warp already exists
            sender.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminResetSignErrorExists
                    .replace("[name]", plugin.getWarpSignsListener().getWarpOwner(lastBlock.getLocation())));
            return true;

        } else if (split[0].equalsIgnoreCase("reload")) {
            plugin.reloadConfig();
            plugin.loadPluginConfig();
            plugin.getChallenges().reloadChallengeConfig();
            if (Settings.useEconomy && VaultHelper.setupEconomy()) {
                ControlPanel.loadShop();
            } else {
                Settings.useEconomy = false;
            }
            ControlPanel.loadControlPanel();
            if (Settings.updateCheck) {
                plugin.checkUpdates();
            } else {
                plugin.setUpdateCheck(null);
            }
            plugin.getIslandCmd().loadSchematics();
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().reloadconfigReloaded);
            return true;
        } else if (split[0].equalsIgnoreCase("topten")) {
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminTopTengenerating);
            TopTen.topTenCreate(sender);
            return true;
        } else if (split[0].equalsIgnoreCase("purge")) {
            if (purgeFlag) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgealreadyRunning);
                return true;
            }
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgeusage.replace("[label]", label));
            return true;
        } else if (split[0].equalsIgnoreCase("confirm")) {
            if (!confirmReq) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().confirmerrorTimeLimitExpired);
                return true;
            } else {
                // Tell purge routine to go
                confirmOK = true;
                confirmReq = false;
            }
            return true;
        } else
        // clearesetall - clears all player resets
        if (split[0].equalsIgnoreCase("clearresetall")) {
            if (asyncPending) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorCommandNotReady);
                return true;
            }
            // Do online players first
            plugin.getPlayers().clearResets(Settings.resetLimit);
            // Do offline players
            final File playerFolder = plugin.getPlayersFolder();
            // Set the pending flag
            asyncPending = true;
            // Check against player files
            plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {

                @Override
                public void run() {
                    //System.out.println("DEBUG: Running async task");
                    int done = 0;
                    // Check files against potentialUnowned
                    FilenameFilter ymlFilter = new FilenameFilter() {
                        @Override
                        public boolean accept(File dir, String name) {
                            String lowercaseName = name.toLowerCase();
                            if (lowercaseName.endsWith(".yml")) {
                                return true;
                            } else {
                                return false;
                            }
                        }
                    };
                    for (File file : playerFolder.listFiles(ymlFilter)) {
                        List<String> playerFileContents = new ArrayList<String>();
                        done++;
                        try {
                            Scanner scanner = new Scanner(file);
                            while (scanner.hasNextLine()) {
                                final String lineFromFile = scanner.nextLine();
                                if (lineFromFile.contains("resetsLeft:")) {
                                    playerFileContents.add("resetsLeft: " + Settings.resetLimit);
                                } else {
                                    playerFileContents.add(lineFromFile);
                                }
                            }
                            scanner.close();
                            // Write file
                            FileWriter writer = new FileWriter(file);
                            for (String str : playerFileContents) {
                                writer.write(str + "\n");
                            }
                            writer.close();
                            if (done % 500 == 0) {
                                final int update = done;
                                plugin.getServer().getScheduler().runTask(plugin, new Runnable() {

                                    @Override
                                    public void run() {
                                        // Tell player
                                        sender.sendMessage(ChatColor.GREEN + plugin.myLocale().clearedResetLimit
                                                + " [" + update + " players]...");
                                    }
                                });
                            }
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    //System.out.println("DEBUG: scanning done");
                    asyncPending = false;
                    sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().clearedResetLimit + " [" + done
                            + " players] completed.");
                }
            });
            return true;
        } else {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            return false;
        }
    case 2:
        if (!plugin.getServer().getVersion().contains("(MC: 1.7")) {
            if (split[0].equalsIgnoreCase("level")) {
                // Convert name to a UUID
                final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
                // plugin.getLogger().info("DEBUG: console player info UUID = "
                // + playerUUID);
                if (playerUUID == null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                    return true;
                } else {
                    if (sender instanceof Player) {
                        plugin.getIslandCmd().calculateIslandLevel(sender, playerUUID, false);
                    } else {
                        plugin.getIslandCmd().calculateIslandLevel(sender, playerUUID, true);
                    }
                    return true;
                }
            }
        }
        if (split[0].equalsIgnoreCase("settingsreset")) {
            if (split[1].equalsIgnoreCase("confirm")) {
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().settingsResetInProgress);
                plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {

                    @Override
                    public void run() {
                        for (Collection<Island> islands : plugin.getGrid().getOwnedIslands().values()) {
                            for (Island island : islands) {
                                island.setDefaults();
                            }
                        }
                        for (Island island : plugin.getGrid().getUnownedIslands().values()) {
                            island.setDefaults();
                        }
                        sender.sendMessage(ChatColor.GREEN + plugin.myLocale().settingsResetDone);
                        plugin.getGrid().saveGrid();
                    }
                });
                return true;
            } else {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminHelpSettingsReset);
                return true;
            }
        }
        // Resetsign <player> - makes a warp sign for player
        if (split[0].equalsIgnoreCase("resetsign")) {
            // Find the closest island
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUseInGame);
                return true;
            }
            Player p = (Player) sender;
            if (!VaultHelper.checkPerm(p, Settings.PERMPREFIX + "mod.signadmin") && !p.isOp()) {
                p.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).errorNoPermission);
                return true;
            }
            // Convert target name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID, ((Player) sender).getWorld().getEnvironment())
                        && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Has an island
                // Find out whether the player is looking at a warp sign
                // Look at what the player was looking at
                BlockIterator iter = new BlockIterator(p, 10);
                Block lastBlock = iter.next();
                while (iter.hasNext()) {
                    lastBlock = iter.next();
                    if (lastBlock.getType() == Material.AIR)
                        continue;
                    break;
                }
                // Check if it is a sign
                if (!lastBlock.getType().equals(Material.SIGN_POST)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).adminResetSignNoSign);
                    return true;
                }
                Sign sign = (Sign) lastBlock.getState();
                // Check if the sign is within the right island boundary
                Location islandLoc = plugin.getPlayers().getIslandLocation(playerUUID);
                if (!plugin.getGrid().getIslandAt(islandLoc).inIslandSpace(sign.getLocation())) {
                    p.sendMessage(
                            ChatColor.RED + plugin.myLocale(p.getUniqueId()).adminSetHomeNotOnPlayersIsland);
                } else {
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminResetSignFound);
                    // Find out if this player is allowed to have a sign on this island
                    if (plugin.getWarpSignsListener().addWarp(playerUUID, lastBlock.getLocation())) {
                        // Change sign color to green
                        sign.setLine(0, ChatColor.GREEN + plugin.myLocale().warpswelcomeLine);
                        sign.update();
                        p.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminResetSignRescued
                                .replace("[name]", plugin.getPlayers().getName(playerUUID)));
                        return true;
                    }
                    // Warp already exists
                    sender.sendMessage(ChatColor.RED
                            + plugin.myLocale(p.getUniqueId()).adminResetSignErrorExists.replace("[name]",
                                    plugin.getWarpSignsListener().getWarpOwner(lastBlock.getLocation())));
                }
            }
            return true;
        }
        // Delete the island you are on
        else if (split[0].equalsIgnoreCase("deleteisland")) {
            if (!split[1].equalsIgnoreCase("confirm")) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminDeleteIslandError);
                return true;
            }
            // Get the island I am on
            Island island = plugin.getGrid().getIslandAt(((Player) sender).getLocation());
            if (island == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminDeleteIslandnoid);
                return true;
            }
            // Try to get the owner of this island
            UUID owner = island.getOwner();
            String name = "unknown";
            if (owner != null) {
                name = plugin.getPlayers().getName(owner);
                sender.sendMessage(
                        ChatColor.RED + plugin.myLocale().adminSetSpawnownedBy.replace("[name]", name));
                sender.sendMessage(
                        ChatColor.RED + plugin.myLocale().adminDeleteIslanduse.replace("[name]", name));
                return true;
            } else {
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().deleteremoving.replace("[name]", name));
                deleteIslands(island, sender);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("resetname")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID, ((Player) sender).getWorld().getEnvironment())
                        && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Has an island
                plugin.getGrid().setIslandName(playerUUID, null);
                sender.sendMessage(plugin.myLocale().generalSuccess);
            }
            return true;
        } else if (split[0].equalsIgnoreCase("resethome")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID, ((Player) sender).getWorld().getEnvironment())
                        && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Has an island
                Location safeHome = plugin.getGrid().getSafeHomeLocation(playerUUID, 1);
                if (safeHome == null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetHomeNoneFound);
                } else {
                    plugin.getPlayers().setHomeLocation(playerUUID, safeHome);
                    sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminSetHomeHomeSet.replace(
                            "[location]",
                            safeHome.getBlockX() + ", " + safeHome.getBlockY() + "," + safeHome.getBlockZ()));
                }
            }
            return true;
        } else if (split[0].equalsIgnoreCase("sethome")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
            } else {
                // Check if this player has an island
                if (!plugin.getPlayers().hasIsland(playerUUID, player.getWorld().getEnvironment())
                        && !plugin.getPlayers().inTeam(playerUUID)) {
                    // No island
                    player.sendMessage(
                            ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorNoIslandOther);
                    return true;
                }
                // Has an island
                Location islandLoc = plugin.getPlayers().getIslandLocation(playerUUID);
                // Check the player is within the island boundaries
                if (!plugin.getGrid().getIslandAt(islandLoc).inIslandSpace(player.getLocation())) {
                    player.sendMessage(ChatColor.RED
                            + plugin.myLocale(player.getUniqueId()).adminSetHomeNotOnPlayersIsland);
                } else {
                    // Check that the location is safe
                    if (!GridManager.isSafeLocation(player.getLocation())) {
                        // Not safe
                        player.sendMessage(
                                ChatColor.RED + plugin.myLocale(player.getUniqueId()).adminSetHomeNoneFound);
                    } else {
                        // Success
                        plugin.getPlayers().setHomeLocation(playerUUID, player.getLocation());
                        player.sendMessage(
                                ChatColor.GREEN + plugin.myLocale(player.getUniqueId()).adminSetHomeHomeSet
                                        .replace("[location]",
                                                player.getLocation().getBlockX() + ", "
                                                        + player.getLocation().getBlockY() + ","
                                                        + player.getLocation().getBlockZ()));
                    }
                }
            }
            return true;
        } else
        // Set protection for the island the player is on
        if (split[0].equalsIgnoreCase("setrange")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                return true;
            }
            player = (Player) sender;
            UUID playerUUID = player.getUniqueId();
            Island island = plugin.getGrid().getIslandAt(player.getLocation());
            // Check if island exists
            if (island == null) {
                player.sendMessage(ChatColor.RED + plugin.myLocale().errorNotOnIsland);
                return true;
            } else {
                int newRange = 10;
                int maxRange = Settings.islandDistance;
                // If spawn do something different
                if (island.isSpawn()) {
                    try {
                        newRange = Integer.valueOf(split[1]);
                    } catch (Exception e) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeInvalid);
                        return true;
                    }
                    player.sendMessage(ChatColor.GREEN + plugin.myLocale(playerUUID).adminSetRangeSet
                            .replace("[number]", String.valueOf(newRange)));
                    if (newRange > maxRange) {
                        player.sendMessage(ChatColor.RED + "" + ChatColor.BOLD
                                + plugin.myLocale(playerUUID).adminSetRangeWarning.replace("[max]",
                                        String.valueOf(maxRange)));
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeWarning2);
                    }
                    island.setProtectionSize(newRange);
                    player.sendMessage(
                            ChatColor.YELLOW + plugin.myLocale().adminSetSpawncenter.replace("[location]",
                                    island.getCenter().getBlockX() + "," + island.getCenter().getBlockZ()));
                    player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnlimits
                            .replace("[min]", island.getMinX() + "," + island.getMinZ())
                            .replace("[max]", (island.getMinX() + island.getIslandDistance() - 1) + ","
                                    + (island.getMinZ() + island.getIslandDistance() - 1)));
                    player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawnrange
                            .replace("[number]", String.valueOf(island.getProtectionSize())));
                    player.sendMessage(ChatColor.YELLOW + plugin.myLocale().adminSetSpawncoords
                            .replace("[min]", island.getMinProtectedX() + ", " + island.getMinProtectedZ())
                            .replace("[max]", +(island.getMinProtectedX() + island.getProtectionSize() - 1)
                                    + ", " + (island.getMinProtectedZ() + island.getProtectionSize() - 1)));
                    if (island.isLocked()) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale().adminSetSpawnlocked);
                    }
                } else {
                    if (!plugin.getConfig().getBoolean("island.overridelimit")) {
                        maxRange -= 16;
                    }
                    try {
                        newRange = Integer.valueOf(split[1]);
                    } catch (Exception e) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeInvalid
                                + " " + plugin.myLocale(playerUUID).adminSetRangeTip.replace("[max]",
                                        String.valueOf(maxRange)));
                        return true;
                    }
                    if (newRange < 10 || newRange > maxRange) {
                        player.sendMessage(ChatColor.RED + plugin.myLocale(playerUUID).adminSetRangeInvalid
                                + " " + plugin.myLocale(playerUUID).adminSetRangeTip.replace("[max]",
                                        String.valueOf(maxRange)));
                        return true;
                    }
                    island.setProtectionSize(newRange);
                    player.sendMessage(ChatColor.GREEN + plugin.myLocale(playerUUID).adminSetRangeSet
                            .replace("[number]", String.valueOf(newRange)));
                    showInfo(island.getOwner(), sender);
                }
                return true;
            }
        }
        if (split[0].equalsIgnoreCase("purge")) {
            // PURGE Command
            // Check for "allow" or "disallow" flags
            // Protect island from purging
            if (split[1].equalsIgnoreCase("allow") || split[1].equalsIgnoreCase("disallow")) {
                // Find the closest island
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminLockerrorInGame);
                    return true;
                }
                Player p = (Player) sender;
                // Island spawn must be in the island world
                if (!p.getLocation().getWorld().equals(ASkyBlock.getIslandWorld())
                        && !p.getLocation().getWorld().equals(ASkyBlock.getNetherWorld())) {
                    p.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).errorWrongWorld);
                    return true;
                }
                Island island = plugin.getGrid().getIslandAt(p.getLocation());
                if (island == null) {
                    p.sendMessage(ChatColor.RED + plugin.myLocale(p.getUniqueId()).errorNoIslandOther);
                    return true;
                }
                if (split[1].equalsIgnoreCase("allow")) {
                    island.setPurgeProtected(true);
                } else {
                    island.setPurgeProtected(false);
                }
                if (island.isPurgeProtected()) {
                    p.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminAllowPurge);
                } else {
                    p.sendMessage(ChatColor.GREEN + plugin.myLocale(p.getUniqueId()).adminPreventPurge);
                }
                return true;
            }

            // Purge runs in the background so if one is already running
            // this flag stops a repeat
            if (purgeFlag) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgealreadyRunning);
                return true;
            }

            if (split[1].equalsIgnoreCase("unowned")) {
                countUnowned(sender);
                return true;
            }
            // Set the flag
            purgeFlag = true;
            // See if this purge unowned

            // Convert days to hours - no other limit checking?
            final int time;
            try {
                time = Integer.parseInt(split[1]) * 24;
            } catch (Exception e) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgeusage.replace("[label]", label));
                purgeFlag = false;
                return true;
            }
            sender.sendMessage(
                    ChatColor.YELLOW + plugin.myLocale().purgecalculating.replace("[time]", split[1]));
            // Check who has not been online since the time
            for (Entry<UUID, Collection<Island>> entry : plugin.getGrid().getOwnershipMap().asMap()
                    .entrySet()) {
                for (Island island : entry.getValue()) {
                    if (entry.getKey() != null && !island.isPurgeProtected()) {
                        if (Bukkit.getOfflinePlayer(entry.getKey()).hasPlayedBefore()) {
                            long offlineTime = Bukkit.getOfflinePlayer(entry.getKey()).getLastPlayed();
                            offlineTime = (System.currentTimeMillis() - offlineTime) / 3600000L;
                            if (offlineTime > time) {
                                //if (plugin.getPlayers().getIslandLevel(entry.getKey()) < Settings.abandonedIslandLevel) {
                                // Check level later
                                removeList.add(entry.getKey());
                                //}
                            }
                        } else {
                            removeList.add(entry.getKey());
                        }
                    }
                }
                //plugin.getLogger().info("UUID = " + entry.getKey());
                // Only do this if it isn't protected
            }
            if (removeList.isEmpty()) {
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgenoneFound);
                purgeFlag = false;
                return true;
            }
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgethisWillRemove
                    .replace("[number]", String.valueOf(removeList.size()))
                    .replace("[level]", String.valueOf(Settings.abandonedIslandLevel)));
            sender.sendMessage(ChatColor.RED + plugin.myLocale().purgewarning);
            sender.sendMessage(ChatColor.RED + plugin.myLocale().purgetypeConfirm.replace("[label]", label));
            confirmReq = true;
            confirmOK = false;
            confirmTimer = 0;
            new BukkitRunnable() {
                @Override
                public void run() {
                    // This waits for 10 seconds and if no
                    // confirmation received, then it
                    // cancels
                    if (confirmTimer++ > 10) {
                        // Ten seconds is up!
                        confirmReq = false;
                        confirmOK = false;
                        purgeFlag = false;
                        removeList.clear();
                        sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgepurgeCancelled);
                        this.cancel();
                    } else if (confirmOK) {
                        // Set up a repeating task to run every 2
                        // seconds to remove
                        // islands one by one and then cancel when
                        // done
                        final int total = removeList.size();
                        new BukkitRunnable() {
                            @Override
                            public void run() {
                                if (removeList.isEmpty() && purgeFlag) {
                                    purgeFlag = false;
                                    sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().purgefinished);
                                    this.cancel();
                                }

                                if (removeList.size() > 0 && purgeFlag) {
                                    // Check if the player is online
                                    if (plugin.getServer().getPlayer(removeList.get(0)) == null) {
                                        //plugin.getLogger().info("DEBUG: player is offline");
                                        // Check the level
                                        if (plugin.getPlayers().getIslandLevel(
                                                removeList.get(0)) < Settings.abandonedIslandLevel) {
                                            sender.sendMessage(ChatColor.YELLOW + "["
                                                    + (total - removeList.size() + 1) + "/" + total + "] "
                                                    + plugin.myLocale().purgeremovingName.replace("[name]",
                                                            plugin.getPlayers().getName(removeList.get(0))));
                                            plugin.deletePlayerIsland(removeList.get(0), true,
                                                    plugin.getServer().getPlayer(removeList.get(0)).getWorld()
                                                            .getEnvironment());
                                        }
                                    } else {
                                        sender.sendMessage(
                                                ChatColor.YELLOW + "[" + (total - removeList.size() + 1) + "/"
                                                        + total + "] " + "Skipping online player...");
                                    }
                                    removeList.remove(0);
                                }
                                //sender.sendMessage("Now waiting...");
                            }
                        }.runTaskTimer(plugin, 0L, 20L);
                        confirmReq = false;
                        confirmOK = false;
                        this.cancel();
                    }
                }
            }.runTaskTimer(plugin, 0L, 40L);
            return true;
        } else if (split[0].equalsIgnoreCase("lock")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                Island island = plugin.getGrid().getIsland(playerUUID,
                        plugin.getServer().getPlayer(playerUUID).getWorld().getEnvironment());
                if (island != null) {
                    Player owner = plugin.getServer().getPlayer(island.getOwner());
                    if (island.isLocked()) {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().lockUnlocking);
                        island.setLocked(false);
                        if (owner != null) {
                            owner.sendMessage(
                                    plugin.myLocale(owner.getUniqueId()).adminLockadminUnlockedIsland);
                        } else {
                            plugin.getMessages().setMessage(island.getOwner(),
                                    plugin.myLocale(island.getOwner()).adminLockadminUnlockedIsland);
                        }
                    } else {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().lockLocking);
                        island.setLocked(true);
                        if (owner != null) {
                            owner.sendMessage(plugin.myLocale(owner.getUniqueId()).adminLockadminLockedIsland);
                        } else {
                            plugin.getMessages().setMessage(island.getOwner(),
                                    plugin.myLocale(island.getOwner()).adminLockadminLockedIsland);
                        }
                    }
                } else {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                }
                return true;
            }
        } else if (split[0].equalsIgnoreCase("setdeaths")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                sender.sendMessage(ChatColor.GREEN + plugin.getPlayers().getName(playerUUID) + " "
                        + plugin.getPlayers().getDeaths(playerUUID) + " " + plugin.myLocale().deaths);
                sender.sendMessage(ChatColor.YELLOW + label + " setdeaths <player> <number>:" + ChatColor.WHITE
                        + " " + plugin.myLocale().adminHelpsetDeaths);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("clearreset")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                plugin.getPlayers().setResetsLeft(playerUUID, Settings.resetLimit);
                sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().clearedResetLimit + " ["
                        + Settings.resetLimit + "]");
                return true;
            }
        } else if (split[0].equalsIgnoreCase("tp")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
                return true;
            }
            player = (Player) sender;
            // Convert name to a UUID
            final UUID targetUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(targetUUID)) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer);
                return true;
            } else {
                if (plugin.getPlayers().hasIsland(targetUUID, player.getWorld().getEnvironment())
                        || plugin.getPlayers().inTeam(targetUUID)) {
                    // Teleport to the over world
                    Location warpSpot = plugin.getPlayers().getIslandLocation(targetUUID).toVector()
                            .toLocation(ASkyBlock.getIslandWorld());
                    String failureMessage = ChatColor.RED
                            + plugin.myLocale(player.getUniqueId()).adminTpManualWarp.replace("[location]",
                                    warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " "
                                            + warpSpot.getBlockZ());
                    // Try the player's home first
                    Location home = plugin.getPlayers().getHomeLocation(targetUUID);
                    plugin.getGrid();
                    if (home != null && home.getWorld().equals(ASkyBlock.getIslandWorld())
                            && GridManager.isSafeLocation(home)) {
                        player.teleport(home);
                        return true;
                    }
                    // Other wise, go to a safe spot
                    new SafeSpotTeleport(plugin, player, warpSpot, failureMessage);
                    return true;
                }
                sender.sendMessage(plugin.myLocale().errorNoIslandOther);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("tpnether")) {
            if (!Settings.createNether || !Settings.newNether || ASkyBlock.getNetherWorld() == null) {
                return false;
            }
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
                return true;
            }
            player = (Player) sender;
            // Convert name to a UUID
            final UUID targetUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(targetUUID)) {
                player.sendMessage(ChatColor.RED + plugin.myLocale(player.getUniqueId()).errorUnknownPlayer);
                return true;
            } else {
                if (plugin.getPlayers().hasIsland(targetUUID, player.getWorld().getEnvironment())
                        || plugin.getPlayers().inTeam(targetUUID)) {
                    // Teleport to the nether
                    Location warpSpot = plugin.getPlayers().getIslandLocation(targetUUID).toVector()
                            .toLocation(ASkyBlock.getNetherWorld());
                    String failureMessage = ChatColor.RED
                            + plugin.myLocale(player.getUniqueId()).adminTpManualWarp.replace("[location]",
                                    warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " "
                                            + warpSpot.getBlockZ());
                    // Try the player's home first
                    Location home = plugin.getPlayers().getHomeLocation(targetUUID);
                    plugin.getGrid();
                    if (home != null && home.getWorld().equals(ASkyBlock.getNetherWorld())
                            && GridManager.isSafeLocation(home)) {
                        player.teleport(home);
                        return true;
                    }
                    new SafeSpotTeleport(plugin, player, warpSpot, failureMessage);
                    return true;
                }
                sender.sendMessage(plugin.myLocale().errorNoIslandOther);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("delete")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                // This now deletes the player and cleans them up even if
                // they don't have an island
                sender.sendMessage(
                        ChatColor.YELLOW + plugin.myLocale().deleteremoving.replace("[name]", split[1]));
                // If they are online and in ASkyBlock then delete their
                // stuff too
                Player target = plugin.getServer().getPlayer(playerUUID);
                if (target != null) {
                    // Clear any coop inventories
                    // CoopPlay.getInstance().returnAllInventories(target);
                    // Remove any of the target's coop invitees and grab
                    // their stuff
                    CoopPlay.getInstance().clearMyInvitedCoops(target);
                    CoopPlay.getInstance().clearMyCoops(target);
                    plugin.resetPlayer(target);
                }
                // plugin.getLogger().info("DEBUG: deleting player");
                plugin.deletePlayerIsland(playerUUID, true, Environment.NETHER);
                plugin.deletePlayerIsland(playerUUID, true, Environment.NORMAL);

                return true;
            }
        } else if (split[0].equalsIgnoreCase("reserve")) {
            // Reserves a spot for the player's next island
            if (sender instanceof Player) {
                player = (Player) sender;
                // Convert name to a UUID
                final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
                if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                    return true;
                } else {
                    // Check the spot
                    Location islandLoc = plugin.getGrid().getClosestIsland(player.getLocation());
                    Island island = plugin.getGrid().getIslandAt(islandLoc);
                    if (island == null) {
                        // Empty spot, reserve it!
                        plugin.getIslandCmd().reserveLocation(playerUUID, islandLoc);
                        sender.sendMessage(ChatColor.GREEN + " [" + islandLoc.getBlockX() + ", "
                                + islandLoc.getBlockZ() + "] " + plugin.myLocale().generalSuccess);
                    } else {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().adminReserveIslandExists);
                    }
                    return true;
                }
            } else {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            }
            return true;
        } else if (split[0].equalsIgnoreCase("register")) {
            if (sender instanceof Player) {
                // Convert name to a UUID
                final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
                if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                    return true;
                } else {
                    if (adminSetPlayerIsland(sender, ((Player) sender).getLocation(), playerUUID)) {
                        sender.sendMessage(ChatColor.GREEN
                                + plugin.myLocale().registersettingIsland.replace("[name]", split[1]));
                        plugin.getGrid().saveGrid();
                    } else {
                        sender.sendMessage(ChatColor.RED + plugin.myLocale().registererrorBedrockNotFound);
                    }
                    return true;
                }
            } else {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            }
            return true;
        } else if (split[0].equalsIgnoreCase("unregister")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                if (plugin.getPlayers().inTeam(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminUnregisterOnTeam);
                    return true;
                }
                Location island = plugin.getPlayers().getIslandLocation(playerUUID);
                if (island == null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                    return true;
                }
                // Delete player, but keep blocks
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminUnregisterKeepBlocks
                        .replace("[location]", +plugin.getPlayers().getIslandLocation(playerUUID).getBlockX()
                                + "," + plugin.getPlayers().getIslandLocation(playerUUID).getBlockZ()));
                plugin.deletePlayerIsland(playerUUID, false, Environment.NORMAL);
                plugin.deletePlayerIsland(playerUUID, false, Environment.NETHER);
                plugin.getGrid().saveGrid();
                return true;
            }
        } else if (split[0].equalsIgnoreCase("info")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            // plugin.getLogger().info("DEBUG: console player info UUID = "
            // + playerUUID);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                showInfo(playerUUID, sender);
                return true;
            }
        } else if (split[0].equalsIgnoreCase("resetallchallenges")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            plugin.getPlayers().resetAllChallenges(playerUUID, true);
            sender.sendMessage(
                    ChatColor.YELLOW + plugin.myLocale().resetChallengessuccess.replace("[name]", split[1]));
            return true;
        } else {
            return false;
        }
    case 3:
        // Confirm purge unowned
        if (split[0].equalsIgnoreCase("purge")) {
            if (purgeFlag) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().purgealreadyRunning);
                return true;
            }
            // Check if this is purge unowned
            if (split[1].equalsIgnoreCase("unowned") && split[2].equalsIgnoreCase("confirm")) {
                if (!purgeUnownedConfirm) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().confirmerrorTimeLimitExpired);
                    return true;
                } else {
                    purgeUnownedConfirm = false;
                    // Purge the unowned islands
                    purgeUnownedIslands(sender);
                    return true;
                }
            }

        }
        // Set protection
        if (split[0].equalsIgnoreCase("setrange")) {
            // Convert name to a UUID
            UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            // Check if player exists
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            // Check if the target is in a team and if so, the leader needs to be adjusted
            if (plugin.getPlayers().inTeam(playerUUID)) {
                playerUUID = plugin.getPlayers().getTeamLeader(playerUUID);
            }
            // Get the range that this player has now
            Island island = plugin.getGrid().getIsland(playerUUID,
                    ((Player) sender).getWorld().getEnvironment());
            if (island == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIslandOther);
                return true;
            } else {
                int newRange = 0;
                int maxRange = Settings.islandDistance;
                if (!plugin.getConfig().getBoolean("island.overridelimit")) {
                    maxRange -= 16;
                }
                try {
                    newRange = Integer.valueOf(split[2]);
                } catch (Exception e) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetRangeInvalid + " "
                            + plugin.myLocale().adminSetRangeTip.replace("[max]", String.valueOf(maxRange)));

                    return true;
                }
                if (newRange < 10 || newRange > maxRange) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminSetRangeInvalid + " "
                            + plugin.myLocale().adminSetRangeTip.replace("[max]", String.valueOf(maxRange)));
                    return true;
                }
                island.setProtectionSize(newRange);
                sender.sendMessage(ChatColor.GREEN
                        + plugin.myLocale().adminSetRangeSet.replace("[number]", String.valueOf(newRange)));
                showInfo(playerUUID, sender);
                plugin.getGrid().saveGrid();
                return true;
            }
        } else if (split[0].equalsIgnoreCase("setdeaths")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                try {
                    int newDeaths = Integer.valueOf(split[2]);
                    int oldDeaths = plugin.getPlayers().getDeaths(playerUUID);
                    plugin.getPlayers().setDeaths(playerUUID, newDeaths);
                    sender.sendMessage(ChatColor.GREEN + plugin.getPlayers().getName(playerUUID) + " "
                            + oldDeaths + " >>> " + newDeaths + " " + plugin.myLocale().deaths);
                } catch (Exception e) {
                    sender.sendMessage(ChatColor.GREEN + plugin.getPlayers().getName(playerUUID) + " "
                            + plugin.getPlayers().getDeaths(playerUUID) + " " + plugin.myLocale().deaths);
                    sender.sendMessage(ChatColor.YELLOW + label + " setdeaths <player> <number>:"
                            + ChatColor.WHITE + " " + plugin.myLocale().adminHelpsetDeaths);
                    return true;
                }
                return true;
            }
        }
        // Change biomes
        if (split[0].equalsIgnoreCase("setbiome")) {
            // Convert name to a UUID
            UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            // Check if player exists
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            // Check if the target is in a team and if so, the leader
            if (plugin.getPlayers().inTeam(playerUUID)) {
                playerUUID = plugin.getPlayers().getTeamLeader(playerUUID);
            }
            Island island = plugin.getGrid().getIsland(playerUUID,
                    ((Player) sender).getLocation().getWorld().getEnvironment());
            if (island == null) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoIsland);
                return true;
            }
            // Check if biome is valid
            Biome biome = null;
            String biomeName = split[2].toUpperCase();
            try {
                biome = Biome.valueOf(biomeName);
                biomeName = biome.name();
                if (!plugin.getConfig().contains("biomes." + biomeName)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().biomeUnknown);
                    // Doing it this way ensures that only valid biomes are
                    // shown
                    for (Biome b : Biome.values()) {
                        if (plugin.getConfig().contains("biomes." + b.name())) {
                            sender.sendMessage(b.name());
                        }
                    }
                    return true;
                }
                // Get friendly name
                biomeName = plugin.getConfig().getString("biomes." + biomeName + ".friendlyname",
                        Util.prettifyText(biomeName));

            } catch (Exception e) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().biomeUnknown);
                for (Biome b : Biome.values()) {
                    if (plugin.getConfig().contains("biomes." + b.name())) {
                        sender.sendMessage(b.name());
                    }
                }
                return true;
            }
            // Okay clear to set biome
            // Actually set the biome
            plugin.getBiomes().setIslandBiome(island, biome);
            sender.sendMessage(ChatColor.GREEN + plugin.myLocale().biomeSet.replace("[biome]", biomeName));
            Player targetPlayer = plugin.getServer().getPlayer(playerUUID);
            if (targetPlayer != null) {
                // Online
                targetPlayer.sendMessage("[Admin] " + ChatColor.GREEN
                        + plugin.myLocale(playerUUID).biomeSet.replace("[biome]", biomeName));
            } else {
                plugin.getMessages().setMessage(playerUUID, "[Admin] " + ChatColor.GREEN
                        + plugin.myLocale(playerUUID).biomeSet.replace("[biome]", biomeName));
            }
            return true;
        } else
        // team kick <player> and team delete <leader>
        if (split[0].equalsIgnoreCase("team")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (split[1].equalsIgnoreCase("kick")) {
                // Remove player from team
                if (!plugin.getPlayers().inTeam(playerUUID)) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().errorNoTeam);
                    return true;
                }
                UUID teamLeader = plugin.getPlayers().getTeamLeader(playerUUID);
                if (teamLeader == null) {
                    // Player is apparently in a team, but there is no team leader
                    // Remove their team status
                    // Clear the player of all team-related items
                    plugin.getPlayers().setLeaveTeam(playerUUID);
                    plugin.getPlayers().setHomeLocation(playerUUID, null);
                    plugin.getPlayers().setIslandLocation(playerUUID, null);
                    // Remove any warps
                    plugin.getWarpSignsListener().removeWarp(playerUUID);
                    sender.sendMessage(
                            ChatColor.RED + plugin.myLocale().kicknameRemoved.replace("[name]", split[2]));
                    return true;
                }
                // Payer is not a team leader
                if (!teamLeader.equals(playerUUID)) {
                    // Clear the player of all team-related items
                    plugin.getPlayers().setLeaveTeam(playerUUID);
                    plugin.getPlayers().setHomeLocation(playerUUID, null);
                    plugin.getPlayers().setIslandLocation(playerUUID, null);
                    // Clear the leader of this player and if they now have
                    // no team, remove the team
                    plugin.getPlayers().removeMember(teamLeader, playerUUID);
                    if (plugin.getPlayers().getMembers(teamLeader).size() < 2) {
                        plugin.getPlayers().setLeaveTeam(teamLeader);
                    }
                    // Remove any warps
                    plugin.getWarpSignsListener().removeWarp(playerUUID);
                    sender.sendMessage(
                            ChatColor.RED + plugin.myLocale().kicknameRemoved.replace("[name]", split[2]));
                    return true;
                } else {
                    sender.sendMessage(
                            ChatColor.RED + (plugin.myLocale().adminTeamKickLeader.replace("[label]", label))
                                    .replace("[name]", split[2]));
                    return true;
                }
            } else {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
                return false;
            }
        } else if (split[0].equalsIgnoreCase("completechallenge")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (plugin.getPlayers().checkChallenge(playerUUID, split[2].toLowerCase())
                    || !plugin.getPlayers().get(playerUUID).challengeExists(split[2].toLowerCase())) {
                sender.sendMessage(
                        ChatColor.RED + plugin.myLocale().completeChallengeerrorChallengeDoesNotExist);
                return true;
            }
            plugin.getPlayers().get(playerUUID).completeChallenge(split[2].toLowerCase());
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().completeChallengechallangeCompleted
                    .replace("[challengename]", split[2].toLowerCase()).replace("[name]", split[1]));
            return true;
        } else if (split[0].equalsIgnoreCase("resetchallenge")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[1], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (!plugin.getPlayers().checkChallenge(playerUUID, split[2].toLowerCase())
                    || !plugin.getPlayers().get(playerUUID).challengeExists(split[2].toLowerCase())) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().resetChallengeerrorChallengeDoesNotExist);
                return true;
            }
            plugin.getPlayers().resetChallenge(playerUUID, split[2].toLowerCase());
            sender.sendMessage(ChatColor.YELLOW + plugin.myLocale().resetChallengechallengeReset
                    .replace("[challengename]", split[2].toLowerCase()).replace("[name]", split[1]));
            return true;
        } else if (split[0].equalsIgnoreCase("info") && split[1].equalsIgnoreCase("challenges")) {
            // Convert name to a UUID
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2], true);
            // plugin.getLogger().info("DEBUG: console player info UUID = "
            // + playerUUID);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            } else {
                showInfoChallenges(playerUUID, sender);
                return true;
            }
        }
        return false;
    case 4:
        // Team add <player> <leader>
        if (split[0].equalsIgnoreCase("team") && split[1].equalsIgnoreCase("add")) {
            // Convert names to UUIDs
            final UUID playerUUID = plugin.getPlayers().getUUID(split[2], true);
            final Player targetPlayer = plugin.getServer().getPlayer(playerUUID);
            final UUID teamLeader = plugin.getPlayers().getUUID(split[3], true);
            if (!plugin.getPlayers().isAKnownPlayer(playerUUID)
                    || !plugin.getPlayers().isAKnownPlayer(teamLeader)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownPlayer);
                return true;
            }
            if (playerUUID.equals(teamLeader)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminTeamAddLeaderToOwn);
                return true;
            }
            // See if leader has an island
            if (!plugin.getPlayers().hasIsland(teamLeader, ((Player) sender).getWorld().getEnvironment())) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().adminTeamAddLeaderNoIsland);
                return true;
            }
            // Check to see if this player is already in a team
            if (plugin.getPlayers().inTeam(playerUUID)) {
                sender.sendMessage(ChatColor.RED + plugin.myLocale().inviteerrorThatPlayerIsAlreadyInATeam);
                return true;
            }
            // If the leader's member list does not contain their own name
            // then
            // add it
            if (!plugin.getPlayers().getMembers(teamLeader).contains(teamLeader)) {
                // Set up the team leader
                plugin.getPlayers().setJoinTeam(teamLeader, teamLeader,
                        plugin.getPlayers().getIslandLocation(teamLeader));
                plugin.getPlayers().addTeamMember(teamLeader, teamLeader);
                sender.sendMessage(ChatColor.GOLD + plugin.myLocale().adminTeamAddedLeader);
            }
            // This is a hack to clear any pending invitations
            if (targetPlayer != null) {
                targetPlayer.performCommand(Settings.ISLANDCOMMAND + " decline");
            }
            // If the invitee has an island of their own
            if (plugin.getPlayers().hasIsland(playerUUID, ((Player) sender).getWorld().getEnvironment())) {
                Location islandLoc = plugin.getPlayers().getIslandLocation(playerUUID);
                if (islandLoc != null) {
                    sender.sendMessage(ChatColor.RED + plugin.myLocale().adminTeamNowUnowned
                            .replace("[name]", plugin.getPlayers().getName(playerUUID))
                            .replace("[location]", islandLoc.getBlockX() + " " + islandLoc.getBlockZ()));
                }
            }
            // Remove their old island affiliation - do not delete the
            // island just in case
            plugin.deletePlayerIsland(playerUUID, false, Environment.NETHER);
            plugin.deletePlayerIsland(playerUUID, false, Environment.NORMAL);
            // Join the team and set the team island location and leader
            plugin.getPlayers().setJoinTeam(playerUUID, teamLeader,
                    plugin.getPlayers().getIslandLocation(teamLeader));
            // Configure the best home location for this player
            if (plugin.getPlayers().getHomeLocation(teamLeader) != null) {
                plugin.getPlayers().setHomeLocation(playerUUID,
                        plugin.getPlayers().getHomeLocation(teamLeader));
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminTeamSettingHome);
            } else {
                plugin.getPlayers().setHomeLocation(playerUUID,
                        plugin.getPlayers().getIslandLocation(teamLeader));
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminTeamSettingHome);
            }
            // If the leader's member list does not contain player then add
            // it
            if (!plugin.getPlayers().getMembers(teamLeader).contains(playerUUID)) {
                plugin.getPlayers().addTeamMember(teamLeader, playerUUID);
                sender.sendMessage(ChatColor.GREEN + plugin.myLocale().adminTeamAddingPlayer);
            } else {
                sender.sendMessage(ChatColor.GOLD + plugin.myLocale().adminTeamAlreadyOnTeam);
            }
            // Teleport the player if they are online
            if (targetPlayer != null) {
                plugin.getGrid().homeTeleport(targetPlayer, targetPlayer.getWorld().getEnvironment());
            }
            plugin.getGrid().saveGrid();
            return true;
        } else {
            sender.sendMessage(ChatColor.RED + plugin.myLocale().errorUnknownCommand);
            return false;
        }
    default:
        return false;
    }
}

From source file:edu.uci.ics.sourcerer.tools.java.component.identifier.stats.CoverageCalculator.java

public static void calculateJarCoverage() {
    TaskProgressLogger task = TaskProgressLogger.get();

    task.start("Calculating coverage by " + JAR_REPO.getValue().getPath() + " of external imports from "
            + EXTERNAL_REPO.getValue() + " and missing imports from " + MISSING_REPO.getValue());

    // Load the jar repo
    JavaRepository jarRepo = JavaRepositoryFactory.INSTANCE.loadJavaRepository(JAR_REPO);

    task.start("Populating the prefix tree");
    SourcedFqnNode root = SourcedFqnNode.createRoot();

    boolean loaded = false;
    if (SOURCED_CACHE.getValue().exists()) {
        task.start("Loading cache");
        try (BufferedReader reader = IOUtils.createBufferedReader(SOURCED_CACHE.getValue())) {
            root.createLoader().load(reader);
            loaded = true;/* w  w  w.java  2  s  . com*/
        } catch (IOException | NoSuchElementException e) {
            logger.log(Level.SEVERE, "Error loading cache", e);
            root = SourcedFqnNode.createRoot();
        }
        task.finish();
    }
    if (!loaded) {
        int nonEmptyMaven = 0;
        task.start("Processing maven jars", "jars processed", 10_000);
        for (JarFile jar : jarRepo.getMavenJarFiles()) {
            boolean go = true;
            for (String fqn : FileUtils.getClassFilesFromJar(jar.getFile().toFile())) {
                if (go) {
                    nonEmptyMaven++;
                    go = false;
                }
                root.getChild(fqn.replace('$', '/'), '/').addSource(Source.MAVEN,
                        jar.getProperties().HASH.getValue());
            }
            task.progress();
        }
        task.finish();

        int nonEmptyProject = 0;
        task.start("Processing project jars", "jars processed", 10_000);
        for (JarFile jar : jarRepo.getProjectJarFiles()) {
            boolean go = true;
            for (String fqn : FileUtils.getClassFilesFromJar(jar.getFile().toFile())) {
                if (go) {
                    nonEmptyProject++;
                    go = false;
                }
                root.getChild(fqn.replace('$', '/'), '/').addSource(Source.PROJECT,
                        jar.getProperties().HASH.getValue());
            }
            task.progress();
        }
        task.finish();

        // Save the prefix tree
        task.start("Saving prefix tree cache");
        try (BufferedWriter writer = IOUtils
                .makeBufferedWriter(FileUtils.ensureWriteable(SOURCED_CACHE.getValue()))) {
            root.createSaver().save(writer);
        } catch (IOException e) {
            logger.log(Level.SEVERE, "Error writing log", e);
            FileUtils.delete(SOURCED_CACHE.getValue());
        }
        task.finish();

        int mavenClassFiles = 0;
        int projectClassFiles = 0;
        int mavenUnique = 0;
        int projectUnique = 0;
        Set<SourcedFqnNode> mavenPackages = new HashSet<>();
        Set<SourcedFqnNode> projectPackages = new HashSet<>();
        for (SourcedFqnNode node : root.getPostOrderIterable()) {
            if (node.has(Source.MAVEN)) {
                mavenClassFiles += node.getCount(Source.MAVEN);
                mavenUnique++;
                mavenPackages.add(node.getParent());
            }
            if (node.has(Source.PROJECT)) {
                projectClassFiles += node.getCount(Source.PROJECT);
                projectUnique++;
                projectPackages.add(node.getParent());
            }
        }
        task.start("Reporting statistics on jars");
        task.start("Maven");
        task.report(nonEmptyMaven + " non-empty jars");
        task.report(mavenClassFiles + " class files");
        task.report(mavenUnique + " unique types");
        task.report(mavenPackages.size() + " packages");
        task.finish();

        task.start("Project");
        task.report(nonEmptyProject + " non-empty jars");
        task.report(projectClassFiles + " class files");
        task.report(projectUnique + " unique types");
        task.report(projectPackages.size() + " packages");
        task.finish();
        task.finish();
    }
    task.finish();

    // Load the external repo
    ExtractedJavaRepository externalRepo = JavaRepositoryFactory.INSTANCE
            .loadExtractedJavaRepository(EXTERNAL_REPO);
    // load the missing repo
    ExtractedJavaRepository missingRepo = JavaRepositoryFactory.INSTANCE
            .loadExtractedJavaRepository(MISSING_REPO);

    NumberFormat format = NumberFormat.getNumberInstance();
    format.setMaximumFractionDigits(2);
    {
        task.start("Processing extracted projects for missing and external types", "projects processed",
                10_000);
        // Averager for external FQNs per project
        Averager<Integer> externalFqns = Averager.create();
        // Averager for missing FQNs per project
        Averager<Integer> missingFqns = Averager.create();
        for (ExtractedJavaProject externalProject : externalRepo.getProjects()) {
            String loc = externalProject.getLocation().toString();
            ExtractedJavaProject missingProject = missingRepo.getProject(externalProject.getLocation());

            ReaderBundle externalBundle = ReaderBundle.create(externalProject.getExtractionDir().toFile(),
                    externalProject.getCompressedFile().toFile());
            ReaderBundle missingBundle = ReaderBundle.create(missingProject.getExtractionDir().toFile(),
                    missingProject.getCompressedFile().toFile());

            int externalCount = 0;
            int missingCount = 0;

            // Add all the imports for this project
            for (ImportEX imp : externalBundle.getTransientImports()) {
                root.getChild(imp.getImported(), '.').addSource(Source.IMPORTED, loc);
            }

            Set<String> validMissing = new HashSet<>();
            // Add the external types
            for (MissingTypeEX missing : externalBundle.getTransientMissingTypes()) {
                validMissing.add(missing.getFqn());
                root.getChild(missing.getFqn(), '.').addSource(Source.EXTERNAL, loc);
                externalCount++;
            }

            // Add the missing types
            for (MissingTypeEX missing : missingBundle.getTransientMissingTypes()) {
                if (validMissing.contains(missing.getFqn())) {
                    root.getChild(missing.getFqn(), '.').addSource(Source.MISSING, loc);
                    missingCount++;
                }
            }

            externalFqns.addValue(externalCount);
            missingFqns.addValue(missingCount);

            task.progress();
        }
        task.finish();

        //      Averager<Integer> projectsPerFQN = Averager.create();
        //      for (SourcedFqnNode fqn : root.getPreOrderIterable()) {
        //        if (fqn.getCount(Source.MISSING) > 0) {
        //          projectsPerFQN.addValue(fqn.getCount(Source.MISSING));
        //        }
        //      }

        Percenterator percent = Percenterator.create(externalRepo.getProjectCount());
        task.start("Reporting missing type information");
        task.report(percent.format(externalFqns.getNonZeroCount()) + " projects with external types");
        task.report(percent.format(missingFqns.getNonZeroCount()) + " projects with missing types");
        task.report(format.format(externalFqns.getMean()) + " ("
                + format.format(externalFqns.getStandardDeviation())
                + ") imported external types per project, on average");
        task.report(format.format(externalFqns.getNonZeroMean()) + " ("
                + format.format(externalFqns.getNonZeroStandardDeviation())
                + ") imported external types per project containing at least one external type, on average");
        task.report(
                format.format(missingFqns.getMean()) + " (" + format.format(missingFqns.getStandardDeviation())
                        + ") imported missing types per project, on average");
        task.report(format.format(missingFqns.getNonZeroMean()) + " ("
                + format.format(missingFqns.getNonZeroStandardDeviation())
                + ") missing FQNs per project containing at least one missing FQN, on average");
        task.finish();

        //      missingFqns.writeValueMap(MISSING_FQNS_PER_PROJECT.getValue());
        //      projectsPerFQN.writeValueMap(PROJECTS_PER_MISSING_FQN.getValue());
    }

    // Report general statistics
    {
        int uniqueTotal = 0;
        Multiset<Source> uniqueByType = EnumMultiset.create(Source.class);
        Multiset<Source> totalByType = EnumMultiset.create(Source.class);
        for (SourcedFqnNode node : root.getPostOrderIterable()) {
            if (node.hasSource()) {
                uniqueTotal++;
            }
            for (Source source : Source.values()) {
                int count = node.getCount(source);
                if (count > 0) {
                    uniqueByType.add(source);
                    totalByType.add(source, count);
                }
            }
        }

        Percenterator uniqueP = Percenterator.create(uniqueTotal);

        task.start("Reporting FQN counts broken down by source");
        for (Source source : Source.values()) {
            task.report(source.name() + ":");
            task.report("  Unique: " + uniqueP.format(uniqueByType.count(source)));
            task.report("  Total:  " + totalByType.count(source));
        }
        task.report("Sum:");
        task.report("  Unique: " + uniqueTotal);
        task.finish();
    }

    // Identify the most popular imported types and packages
    {
        for (final Source source : EnumSet.of(Source.IMPORTED, Source.EXTERNAL, Source.MISSING)) {
            {
                TreeSet<SourcedFqnNode> popularTypes = new TreeSet<>(new Comparator<SourcedFqnNode>() {
                    @Override
                    public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
                        int cmp = Integer.compare(o1.getCount(source), o2.getCount(source));
                        if (cmp == 0) {
                            return o1.compareTo(o2);
                        } else {
                            return cmp;
                        }
                    }
                });

                for (SourcedFqnNode fqn : root.getPostOrderIterable()) {
                    if (fqn.has(source)) {
                        popularTypes.add(fqn);
                    }
                }

                task.start("Logging popular types listing for " + source.name());
                try (LogFileWriter writer = IOUtils.createLogFileWriter(
                        new File(Arguments.OUTPUT.getValue(), source.name() + "-popular-types.txt"))) {
                    for (SourcedFqnNode fqn : popularTypes.descendingSet()) {
                        writer.write(fqn.getCount(source) + "\t" + fqn.getFqn());
                    }
                } catch (IOException e) {
                    logger.log(Level.SEVERE, "Error writing file", e);
                }
                task.finish();
            }

            {
                final Multimap<SourcedFqnNode, String> packages = HashMultimap.create();

                for (SourcedFqnNode fqn : root.getPostOrderIterable()) {
                    if (fqn.has(source)) {
                        packages.putAll(fqn.getParent(), fqn.getSourceIDs(source));
                    }
                }

                List<SourcedFqnNode> sorted = new ArrayList<>(packages.keySet());
                Collections.sort(sorted, new Comparator<SourcedFqnNode>() {
                    @Override
                    public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
                        int cmp = -Integer.compare(packages.get(o1).size(), packages.get(o2).size());
                        if (cmp == 0) {
                            return o1.compareTo(o2);
                        } else {
                            return cmp;
                        }
                    }
                });

                task.start("Logging popular packages listing for " + source.name());
                try (LogFileWriter writer = IOUtils.createLogFileWriter(
                        new File(Arguments.OUTPUT.getValue(), source.name() + "-popular-packages.txt"))) {
                    for (SourcedFqnNode fqn : sorted) {
                        writer.write(packages.get(fqn).size() + "\t" + fqn.getFqn());
                    }
                } catch (IOException e) {
                    logger.log(Level.SEVERE, "Error writing file", e);
                }
                task.finish();
            }
        }
    }

    // Identify the most popular external types found in only maven, project and nothing
    {
        {
            TreeSet<SourcedFqnNode> popularJoint = new TreeSet<>(
                    SourcedFqnNode.createComparator(Source.EXTERNAL));
            TreeSet<SourcedFqnNode> popularMaven = new TreeSet<>(
                    SourcedFqnNode.createComparator(Source.EXTERNAL));
            TreeSet<SourcedFqnNode> popularProject = new TreeSet<>(
                    SourcedFqnNode.createComparator(Source.EXTERNAL));
            TreeSet<SourcedFqnNode> popularMissing = new TreeSet<>(
                    SourcedFqnNode.createComparator(Source.EXTERNAL));

            for (SourcedFqnNode fqn : root.getPostOrderIterable()) {
                if (fqn.has(Source.EXTERNAL)) {
                    boolean maven = fqn.has(Source.MAVEN);
                    boolean project = fqn.has(Source.PROJECT);
                    if (maven && project) {
                        popularJoint.add(fqn);
                    } else {
                        if (maven) {
                            popularMaven.add(fqn);
                        } else if (project) {
                            popularProject.add(fqn);
                        } else {
                            popularMissing.add(fqn);
                        }
                    }
                }
            }

            task.start("Logging popular external joint types");
            try (LogFileWriter writer = IOUtils
                    .createLogFileWriter(new File(Arguments.OUTPUT.getValue(), "joint-popular-types.txt"))) {
                for (SourcedFqnNode fqn : popularJoint.descendingSet()) {
                    writer.write(fqn.getCount(Source.EXTERNAL) + "\t" + fqn.getFqn());
                }
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Error writing file", e);
            }
            task.finish();

            task.start("Logging popular external types unique to maven");
            try (LogFileWriter writer = IOUtils.createLogFileWriter(
                    new File(Arguments.OUTPUT.getValue(), "maven-unique-popular-types.txt"))) {
                for (SourcedFqnNode fqn : popularMaven.descendingSet()) {
                    writer.write(fqn.getCount(Source.EXTERNAL) + "\t" + fqn.getFqn());
                }
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Error writing file", e);
            }
            task.finish();

            task.start("Logging popular external types unique to project");
            try (LogFileWriter writer = IOUtils.createLogFileWriter(
                    new File(Arguments.OUTPUT.getValue(), "project-unique-popular-types.txt"))) {
                for (SourcedFqnNode fqn : popularProject.descendingSet()) {
                    writer.write(fqn.getCount(Source.EXTERNAL) + "\t" + fqn.getFqn());
                }
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Error writing file", e);
            }
            task.finish();

            task.start("Logging popular missing external types");
            try (LogFileWriter writer = IOUtils.createLogFileWriter(
                    new File(Arguments.OUTPUT.getValue(), "missing-unique-popular-types.txt"))) {
                for (SourcedFqnNode fqn : popularMissing.descendingSet()) {
                    writer.write(fqn.getCount(Source.EXTERNAL) + "\t" + fqn.getFqn());
                }
            } catch (IOException e) {
                logger.log(Level.SEVERE, "Error writing file", e);
            }
            task.finish();
        }
        {
            final Multimap<SourcedFqnNode, String> jointPackages = HashMultimap.create();
            final Multimap<SourcedFqnNode, String> mavenPackages = HashMultimap.create();
            final Multimap<SourcedFqnNode, String> projectPackages = HashMultimap.create();
            final Multimap<SourcedFqnNode, String> missingPackages = HashMultimap.create();

            for (SourcedFqnNode fqn : root.getPostOrderIterable()) {
                if (fqn.has(Source.EXTERNAL)) {
                    boolean maven = fqn.has(Source.MAVEN);
                    boolean project = fqn.has(Source.PROJECT);
                    if (maven && project) {
                        jointPackages.putAll(fqn.getParent(), fqn.getSourceIDs(Source.EXTERNAL));
                    } else {
                        if (maven) {
                            mavenPackages.putAll(fqn.getParent(), fqn.getSourceIDs(Source.EXTERNAL));
                        } else if (project) {
                            projectPackages.putAll(fqn.getParent(), fqn.getSourceIDs(Source.EXTERNAL));
                        } else {
                            missingPackages.putAll(fqn.getParent(), fqn.getSourceIDs(Source.EXTERNAL));
                        }
                    }
                }
            }

            {
                List<SourcedFqnNode> sorted = new ArrayList<>(jointPackages.keySet());
                Collections.sort(sorted, new Comparator<SourcedFqnNode>() {
                    @Override
                    public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
                        int cmp = -Integer.compare(jointPackages.get(o1).size(), jointPackages.get(o2).size());
                        if (cmp == 0) {
                            return o1.compareTo(o2);
                        } else {
                            return cmp;
                        }
                    }
                });

                task.start("Logging popular external joint packages");
                try (LogFileWriter writer = IOUtils.createLogFileWriter(
                        new File(Arguments.OUTPUT.getValue(), "joint-popular-packages.txt"))) {
                    for (SourcedFqnNode fqn : sorted) {
                        writer.write(jointPackages.get(fqn).size() + "\t" + fqn.getFqn());
                    }
                } catch (IOException e) {
                    logger.log(Level.SEVERE, "Error writing file", e);
                }
                task.finish();
            }

            {
                List<SourcedFqnNode> sorted = new ArrayList<>(mavenPackages.keySet());
                Collections.sort(sorted, new Comparator<SourcedFqnNode>() {
                    @Override
                    public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
                        int cmp = -Integer.compare(mavenPackages.get(o1).size(), mavenPackages.get(o2).size());
                        if (cmp == 0) {
                            return o1.compareTo(o2);
                        } else {
                            return cmp;
                        }
                    }
                });

                task.start("Logging popular packages unique to maven");
                try (LogFileWriter writer = IOUtils.createLogFileWriter(
                        new File(Arguments.OUTPUT.getValue(), "maven-unique-popular-packages.txt"))) {
                    for (SourcedFqnNode fqn : sorted) {
                        writer.write(mavenPackages.get(fqn).size() + "\t" + fqn.getFqn());
                    }
                } catch (IOException e) {
                    logger.log(Level.SEVERE, "Error writing file", e);
                }
                task.finish();
            }

            {
                List<SourcedFqnNode> sorted = new ArrayList<>(projectPackages.keySet());
                Collections.sort(sorted, new Comparator<SourcedFqnNode>() {
                    @Override
                    public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
                        int cmp = -Integer.compare(projectPackages.get(o1).size(),
                                projectPackages.get(o2).size());
                        if (cmp == 0) {
                            return o1.compareTo(o2);
                        } else {
                            return cmp;
                        }
                    }
                });

                task.start("Logging popular packages unique to project");
                try (LogFileWriter writer = IOUtils.createLogFileWriter(
                        new File(Arguments.OUTPUT.getValue(), "project-unique-popular-packages.txt"))) {
                    for (SourcedFqnNode fqn : sorted) {
                        writer.write(projectPackages.get(fqn).size() + "\t" + fqn.getFqn());
                    }
                } catch (IOException e) {
                    logger.log(Level.SEVERE, "Error writing file", e);
                }
                task.finish();
            }

            {
                List<SourcedFqnNode> sorted = new ArrayList<>(missingPackages.keySet());
                Collections.sort(sorted, new Comparator<SourcedFqnNode>() {
                    @Override
                    public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
                        int cmp = -Integer.compare(missingPackages.get(o1).size(),
                                missingPackages.get(o2).size());
                        if (cmp == 0) {
                            return o1.compareTo(o2);
                        } else {
                            return cmp;
                        }
                    }
                });

                task.start("Logging popular packages unique to missing");
                try (LogFileWriter writer = IOUtils.createLogFileWriter(
                        new File(Arguments.OUTPUT.getValue(), "missing-unique-popular-packages.txt"))) {
                    for (SourcedFqnNode fqn : sorted) {
                        writer.write(missingPackages.get(fqn).size() + "\t" + fqn.getFqn());
                    }
                } catch (IOException e) {
                    logger.log(Level.SEVERE, "Error writing file", e);
                }
                task.finish();
            }
        }
    }

    for (int threshold : new int[] { 1, 2, 10, 50, 100 }) {
        Multiset<String> externalUniqueByString = HashMultiset.create(6);
        Multiset<String> externalTotalByString = HashMultiset.create(6);
        Multiset<String> missingUniqueByString = HashMultiset.create(6);
        Multiset<String> missingTotalByString = HashMultiset.create(6);

        int externalUniqueTotal = 0;
        int externalTotalTotal = 0;
        int missingUniqueTotal = 0;
        int missingTotalTotal = 0;
        for (SourcedFqnNode node : root.getPostOrderIterable()) {
            int externalCount = node.getCount(Source.EXTERNAL);
            if (externalCount >= threshold) {
                externalUniqueTotal++;
                externalTotalTotal += externalCount;
                boolean maven = node.has(Source.MAVEN);
                boolean project = node.has(Source.PROJECT);
                if (maven) {
                    externalUniqueByString.add("Maven");
                    externalTotalByString.add("Maven", externalCount);
                    if (!project) {
                        externalUniqueByString.add("Maven only");
                        externalTotalByString.add("Maven only", externalCount);
                    } else {
                        externalUniqueByString.add("Project");
                        externalTotalByString.add("Project", externalCount);
                        externalUniqueByString.add("Maven and Project");
                        externalTotalByString.add("Maven and Project", externalCount);
                    }
                } else if (project) {
                    externalUniqueByString.add("Project");
                    externalTotalByString.add("Project", externalCount);
                    externalUniqueByString.add("Project only");
                    externalTotalByString.add("Project only", externalCount);
                } else {
                    externalUniqueByString.add("Nothing");
                    externalTotalByString.add("Nothing", externalCount);
                }
            }

            int missingCount = node.getCount(Source.MISSING);
            if (missingCount >= threshold) {
                missingUniqueTotal++;
                missingTotalTotal += missingCount;
                boolean maven = node.has(Source.MAVEN);
                boolean project = node.has(Source.PROJECT);
                if (maven) {
                    missingUniqueByString.add("Maven");
                    missingTotalByString.add("Maven", missingCount);
                    if (!project) {
                        missingUniqueByString.add("Maven only");
                        missingTotalByString.add("Maven only", missingCount);
                    } else {
                        missingUniqueByString.add("Project");
                        missingTotalByString.add("Project", missingCount);
                        missingUniqueByString.add("Maven and Project");
                        missingTotalByString.add("Maven and Project", missingCount);
                    }
                } else if (project) {
                    missingUniqueByString.add("Project");
                    missingTotalByString.add("Project", missingCount);
                    missingUniqueByString.add("Project only");
                    missingTotalByString.add("Project only", missingCount);
                } else {
                    missingUniqueByString.add("Nothing");
                    missingTotalByString.add("Nothing", missingCount);
                }
            }
        }

        Percenterator externalUniqueP = Percenterator.create(externalUniqueTotal);
        Percenterator missingUniqueP = Percenterator.create(missingUniqueTotal);
        Percenterator externalTotalP = Percenterator.create(externalTotalTotal);
        Percenterator missingTotalP = Percenterator.create(externalTotalTotal);

        task.start("Reporting external import coverage for threshold " + threshold);
        for (String condition : externalUniqueByString.elementSet()) {
            task.report(condition + ":");
            task.report("  Unique: " + externalUniqueP.format(externalUniqueByString.count(condition)));
            task.report("  Total:  " + externalTotalP.format(externalTotalByString.count(condition)));
        }
        task.report("Sum:");
        task.report("  Unique: " + externalUniqueTotal);
        task.report("  Total: " + externalTotalTotal);
        task.finish();
        task.start("Reporting missing import coverage for threshold " + threshold);
        for (String condition : missingUniqueByString.elementSet()) {
            task.report(condition + ":");
            task.report("  Unique: " + missingUniqueP.format(missingUniqueByString.count(condition)));
            task.report("  Total:  " + missingTotalP.format(missingTotalByString.count(condition)));
        }
        task.report("Sum:");
        task.report("  Unique: " + missingUniqueTotal);
        task.report("  Total: " + missingTotalTotal);
        task.finish();
    }

    {
        Set<String> maven = new HashSet<>();
        Set<String> mavenImported = new HashSet<>();

        Set<String> project = new HashSet<>();
        Set<String> projectImported = new HashSet<>();
        // Find the coverage of the maven and project jars
        for (SourcedFqnNode fqn : root.getPostOrderIterable()) {
            maven.addAll(fqn.getSourceIDs(Source.MAVEN));
            project.addAll(fqn.getSourceIDs(Source.PROJECT));
            if (fqn.has(Source.IMPORTED)) {
                mavenImported.addAll(fqn.getSourceIDs(Source.MAVEN));
                projectImported.addAll(fqn.getSourceIDs(Source.PROJECT));
            }
        }

        Percenterator mavenP = Percenterator.create(maven.size());
        Percenterator projectP = Percenterator.create(project.size());
        task.start("Reporting coverage of jars");
        task.report(mavenP.format(mavenImported.size()) + " maven jars had at least one type imported");
        task.report(projectP.format(projectImported.size()) + " project jars had at least one type imported");
        task.finish();
    }

    //    {
    //      // Find all the most popular fqns per source
    //      for (final Source source : Source.values()) {
    //        TreeSet<SourcedFqnNode> sorted = new TreeSet<>(new Comparator<SourcedFqnNode>() {
    //          @Override
    //          public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
    //            int cmp = Integer.compare(o1.getCount(source), o2.getCount(source));
    //            if (cmp == 0) {
    //              return o1.compareTo(o2);
    //            } else {
    //              return cmp;
    //            }
    //          }
    //        });
    //        
    //        for (SourcedFqnNode node : root.getPostOrderIterable()) {
    //          if (node.has(source)) {
    //            sorted.add(node);
    //          }
    //        }
    //        
    //        task.start("Logging popular types listing for " + source.name());
    //        try (LogFileWriter writer = IOUtils.createLogFileWriter(new File(Arguments.OUTPUT.getValue(), source.name() + "-popular.txt"))) {
    //          for (SourcedFqnNode fqn : sorted.descendingSet()) {
    //            writer.write(fqn.getCount(source) + "\t" + fqn.getFqn());
    //          }
    //        } catch (IOException e) {
    //          logger.log(Level.SEVERE, "Error writing file", e);
    //        }
    //        task.finish();
    //      }
    //    }
    //    
    //    {
    //      // Find all the fqns unique to that source
    //      for (final Source source : Source.values()) {
    //        TreeSet<SourcedFqnNode> sorted = new TreeSet<>(new Comparator<SourcedFqnNode>() {
    //          @Override
    //          public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
    //            int cmp = Integer.compare(o1.getCount(source), o2.getCount(source));
    //            if (cmp == 0) {
    //              return o1.compareTo(o2);
    //            } else {
    //              return cmp;
    //            }
    //          }
    //        });
    //        
    //        Set<Source> expected = EnumSet.of(Source.MISSING, source);
    //        for (SourcedFqnNode node : root.getPostOrderIterable()) {
    //          Set<Source> sources = node.getSources();
    //          if (sources.containsAll(expected) && expected.containsAll(sources)) {
    //            sorted.add(node);
    //          }
    //        }
    //        
    //        task.start("Logging missing types listing");
    //        try (LogFileWriter writer = IOUtils.createLogFileWriter(new File(Arguments.OUTPUT.getValue(), source.name() + "-missing.txt"))) {
    //          for (SourcedFqnNode fqn : sorted.descendingSet()) {
    //            writer.write(fqn.getCount(Source.MISSING) + "\t" + fqn.getFqn());
    //          }
    //        } catch (IOException e) {
    //          logger.log(Level.SEVERE, "Error writing file", e);
    //        }
    //        task.finish();
    //      }
    //    }
    //    
    //    {
    //      final Multiset<SourcedFqnNode> maven = HashMultiset.create();
    //      final Multiset<SourcedFqnNode> project = HashMultiset.create();
    //      final Multiset<SourcedFqnNode> mavenProject= HashMultiset.create();
    //      final Multiset<SourcedFqnNode> missing = HashMultiset.create();
    //      
    //      
    //      // Find the package specific info
    //      for (SourcedFqnNode node : root.getPostOrderIterable()) {
    //        int missingCount = node.getCount(Source.MISSING);
    //        if (missingCount > 0) {
    //          int mavenCount = node.getCount(Source.MAVEN);
    //          int projectCount = node.getCount(Source.PROJECT);
    //          if (mavenCount > 0) {
    //            if (projectCount == 0) {
    //              maven.add(node.getParent());
    //            } else {
    //              mavenProject.add(node.getParent());
    //            }
    //          } else if (projectCount > 0) {
    //            project.add(node.getParent());
    //          } else {
    //            missing.add(node.getParent());
    //          }
    //        }
    //      }
    //      
    //      task.start("Reporting package breakdown");
    //      task.report("Maven only:        " + maven.elementSet().size());
    //      task.report("Project only:      " + project.elementSet().size());
    //      task.report("Maven and Project: " + mavenProject.elementSet().size());
    //      task.report("Missing:           " + missing.elementSet().size());
    //      task.finish();
    //      
    //      task.start("Logging package popularity");
    //      // Maven
    //      SourcedFqnNode[] nodes = maven.elementSet().toArray(new SourcedFqnNode[maven.elementSet().size()]);
    //      Arrays.sort(nodes, new Comparator<SourcedFqnNode>() {
    //        @Override
    //        public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
    //          int cmp = Integer.compare(maven.count(o2), maven.count(o1));
    //          if (cmp == 0) {
    //            return o1.compareTo(o2);
    //          } else {
    //            return cmp;
    //          }
    //        }
    //      });
    //      try (LogFileWriter writer = IOUtils.createLogFileWriter(new File(Arguments.OUTPUT.getValue(), "maven-pkgs.txt"))) {
    //        for (SourcedFqnNode pkg : nodes) {
    //          writer.write(maven.count(pkg) + "\t" + pkg.getFqn());
    //        }
    //      } catch (IOException e) {
    //        logger.log(Level.SEVERE, "Error writing file", e);
    //      }
    //      
    //      // Project
    //      nodes = project.elementSet().toArray(new SourcedFqnNode[project.elementSet().size()]);
    //      Arrays.sort(nodes, new Comparator<SourcedFqnNode>() {
    //        @Override
    //        public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
    //          int cmp = Integer.compare(project.count(o2), project.count(o1));
    //          if (cmp == 0) {
    //            return o1.compareTo(o2);
    //          } else {
    //            return cmp;
    //          }
    //        }
    //      });
    //      try (LogFileWriter writer = IOUtils.createLogFileWriter(new File(Arguments.OUTPUT.getValue(), "project-pkgs.txt"))) {
    //        for (SourcedFqnNode pkg : nodes) {
    //          writer.write(project.count(pkg) + "\t" + pkg.getFqn());
    //        }
    //      } catch (IOException e) {
    //        logger.log(Level.SEVERE, "Error writing file", e);
    //      }
    //      
    //      // Maven/Project
    //      nodes = mavenProject.elementSet().toArray(new SourcedFqnNode[mavenProject.elementSet().size()]);
    //      Arrays.sort(nodes, new Comparator<SourcedFqnNode>() {
    //        @Override
    //        public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
    //          int cmp = Integer.compare(mavenProject.count(o2), mavenProject.count(o1));
    //          if (cmp == 0) {
    //            return o1.compareTo(o2);
    //          } else {
    //            return cmp;
    //          }
    //        }
    //      });
    //      try (LogFileWriter writer = IOUtils.createLogFileWriter(new File(Arguments.OUTPUT.getValue(), "maven-project-pkgs.txt"))) {
    //        for (SourcedFqnNode pkg : nodes) {
    //          writer.write(mavenProject.count(pkg) + "\t" + pkg.getFqn());
    //        }
    //      } catch (IOException e) {
    //        logger.log(Level.SEVERE, "Error writing file", e);
    //      }
    //      
    //      nodes = missing.elementSet().toArray(new SourcedFqnNode[missing.elementSet().size()]);
    //      Arrays.sort(nodes, new Comparator<SourcedFqnNode>() {
    //        @Override
    //        public int compare(SourcedFqnNode o1, SourcedFqnNode o2) {
    //          int cmp = Integer.compare(missing.count(o2), missing.count(o1));
    //          if (cmp == 0) {
    //            return o1.compareTo(o2);
    //          } else {
    //            return cmp;
    //          }
    //        }
    //      });
    //      try (LogFileWriter writer = IOUtils.createLogFileWriter(new File(Arguments.OUTPUT.getValue(), "missing-pkgs.txt"))) {
    //        for (SourcedFqnNode pkg : nodes) {
    //          writer.write(missing.count(pkg) + "\t" + pkg.getFqn());
    //        }
    //      } catch (IOException e) {
    //        logger.log(Level.SEVERE, "Error writing file", e);
    //      }
    //      task.finish();
    //    }

    task.finish();
}