/*******************************************************************************
* Copyright 2014 Tobias Welther
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.loadingerrors;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;
import de.tobiyas.racesandclasses.RacesAndClasses;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractTraitHolder;
import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.exceptions.HolderTraitParseException;
public class TraitHolderLoadingErrorHandler {
private static final RacesAndClasses plugin = RacesAndClasses.getPlugin();
/**
* The List of error messages
*/
private final List<String> raceProblemMessages;
/**
* The List of error messages
*/
private final List<String> classProblemMessages;
/**
*
*/
public TraitHolderLoadingErrorHandler() {
this.raceProblemMessages = new LinkedList<String>();
this.classProblemMessages = new LinkedList<String>();
}
/**
* Rescans all TraitHolders (Races / Classes) for setup Errors.
*/
public void rescanErrors(){
raceProblemMessages.clear();
classProblemMessages.clear();
rescanRaceErrors();
rescanClassErrors();
}
/**
* Rescans all Races for loading errors.
*/
private void rescanRaceErrors(){
List<String> holders = plugin.getRaceManager().listAllVisibleHolders();
for(String holderName : holders){
AbstractTraitHolder holder = plugin.getRaceManager().getHolderByName(holderName);
if(holder == null) continue;
List<HolderTraitParseException> messages = holder.getParsingExceptionsHappened();
if(messages.size() == 0) continue;
for(HolderTraitParseException exp : messages){
raceProblemMessages.add(exp.getMessage());
}
}
}
/**
* Rescans all Classes for loading errors.
*/
private void rescanClassErrors(){
List<String> holders = plugin.getClassManager().listAllVisibleHolders();
for(String holderName : holders){
AbstractTraitHolder holder = plugin.getClassManager().getHolderByName(holderName);
if(holder == null) continue;
List<HolderTraitParseException> messages = holder.getParsingExceptionsHappened();
if(messages.size() == 0) continue;
for(HolderTraitParseException exp : messages){
classProblemMessages.add(exp.getMessage());
}
}
}
/**
* Saves the occurred errors to a file passed.
*
* @param file
*/
public void saveErrorsToFile(File file){
if(raceProblemMessages.size() <= 0 &&
classProblemMessages.size() <= 0) return;
if(!file.exists()){
try{
file.createNewFile();
}catch(IOException exp){
plugin.getDebugLogger().logWarning("Could not create " + file.getAbsolutePath() + " for Startup Error logging.");
return;
}
}
try {
PrintWriter writer = new PrintWriter(file, "UTF-8");
writer.println("Errors occured on Startup While reading Races / Classes:");
if(raceProblemMessages.size() > 0){
writer.println();
writer.println();
writer.println("Race errors:");
writer.println();
for(String message : raceProblemMessages){
writer.println(message);
}
}
if(classProblemMessages.size() > 0){
writer.println();
writer.println();
writer.println("Class errors:");
writer.println();
for(String message : classProblemMessages){
writer.println(message);
}
}
writer.close();
} catch (Exception exp) {
plugin.getDebugLogger().logWarning("Could not write to: " + file.getAbsolutePath() + " for Startup Error logging." +
" Error was: " + exp.getLocalizedMessage());
plugin.getDebugLogger().logStackTrace(exp);
return;
}
}
/**
* Saves the Setup errors to a predefined File:
* <br>plugin.getDataFolder() + File.separator + "HolderStartupErrors.log"
* <br>
* <br>
* Early out when no errors where found.
* The File is deleted but not created new.
*/
public void saveErrorsToFile(){
File file = new File(plugin.getDataFolder() + File.separator + "HolderStartupErrors.log");
if(file.exists()){
file.delete();
}
if(this.classProblemMessages.size() == 0 &&
this.raceProblemMessages.size() == 0) return;
try{
file.createNewFile();
}catch(Exception exp){}
saveErrorsToFile(file);
}
/**
* Rescans all Errors and saves them.
*/
public void rescanAndSave(){
rescanErrors();
saveErrorsToFile();
}
/**
* Returns true if any Errors where found.
* Returns false if no Errors recorded.
* <br>
* WARNING: false can also indicate that it has not been scanned!
*
* @return true if any errors present
*/
public boolean hasErrors(){
return this.classProblemMessages.size() > 0 ||
this.raceProblemMessages.size() > 0;
}
/**
* Evaluates all Errors and saves them.
*
* @return true if any error found, false otherwise.
*/
public static boolean evalAndSave(){
TraitHolderLoadingErrorHandler errorHandler = new TraitHolderLoadingErrorHandler();
errorHandler.rescanAndSave();
return errorHandler.hasErrors();
}
}