package com.gmail.dpierron.calibre.opds;
/*
* Calss that is used when in batch mode for logging information on progress
*/
import com.gmail.dpierron.calibre.configuration.ConfigurationManager;
import com.gmail.dpierron.calibre.configuration.CustomCatalogEntry;
import com.gmail.dpierron.calibre.configuration.GetConfigurationInterface;
import com.gmail.dpierron.calibre.gui.CatalogCallbackInterface;
import com.gmail.dpierron.calibre.gui.GenerationStoppedException;
import com.gmail.dpierron.tools.i18n.Localization;
import com.gmail.dpierron.tools.i18n.LocalizationHelper;
import com.gmail.dpierron.tools.Helper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
public class Log4jCatalogCallback implements CatalogCallbackInterface {
private final static Logger logger = LogManager.getLogger(Catalog.class);
private final static String doNot = Localization.Main.getText("config.negate");
private final static String yes = Localization.Main.getText("boolean.yes");
private final static String no = Localization.Main.getText("boolean.no");
// step progress indicator
ProgressIndicator progressStep = new ProgressIndicator().setIndicator('*');
protected boolean continueGenerating = true;
private boolean startGui = true;
private long stageStart;
/**
* Dump the value for the given option to the log file
* <p/>
* Makes the following assumptions about entries in the localization
* properties files for each option to be dumped:
* - The name in the localization file is of the form config.xxxx.label
* - The text associated with the name is the text to be used for dumping
* - If the xxxx part starts with "No" (or the localised equivalent)
* then any boolean should be inverted
*
* @param option Name of the option
* @param value The value of the option
*/
private void dumpOption(String option, Object value) {
String label = Localization.Main.getText("config." + option + ".label");
label = Helper.pad(label, ' ', 50) + " : ";
// For yes/no boolean values negate displayed value if name starts
// with 'Do not' (or its localized equivalent)
if (label.startsWith(doNot)) {
if (value.toString().equalsIgnoreCase(yes))
value = no;
else
value = yes;
}
logger.info(label + value);
}
/**
* Dump all the configuration options listed as get methods in the
* configuration interface.
*/
public void dumpOptions() {
logger.info("");
for (Method getter : GetConfigurationInterface.class.getMethods()) {
String getterName = getter.getName();
try {
Object result = getter.invoke(ConfigurationManager.getCurrentProfile());
if (result instanceof Boolean) {
result = LocalizationHelper.getYesOrNo((Boolean) result);
}
// Check for special case of Custom Catalogs!
if (result instanceof List) {
for (int i = 0 ; i < ((List) result).size() ; i++) {
assert ((List)result).get(i) instanceof CustomCatalogEntry;
CustomCatalogEntry c = ((List<CustomCatalogEntry>)result).get(i);
String OptionName = Helper.pad(Localization.Main.getText("gui.tab6.label") + " [" + (i+1) + "], " + c.getAtTop().toString(), ' ', 50) + " : ";
logger.info(OptionName + c.getLabel() + " (" + c.getValue().toString() + "), " + c.getAtTop().toString());
}
} else {
String optionName = getterName.substring(3);
dumpOption(optionName, result);
}
} catch (IllegalAccessException e) {
logger.warn("", e);
} catch (InvocationTargetException e) {
logger.warn("", e);
}
}
logger.info("");
}
public void setStartGui (boolean startGui) {
this.startGui = startGui;
}
// ---------------------------
// CatalogCallBackInterface
// --------------------------
long stageStartTime;
private void startStage(long nb, String localizationKey) {
stageStartTime = System.currentTimeMillis();
logger.info(Localization.Main.getText(localizationKey));
progressStep.setMaxScale(nb);
}
private void endStage(String localizationKey) {
logger.info(Localization.Main.getText("info.step.donein", System.currentTimeMillis() - stageStartTime));
stageStartTime = System.currentTimeMillis();
progressStep.reset(); // Not sure this is necessary!
}
private void setCount(String summary) {
logger.info(summary);
}
public void startInitializeMainCatalog() {
startStage(0, "info.step.started");
}
public void endInitializeMainCatalog() {
endStage("info.step.started");
}
public void startFinalizeMainCatalog() {
startStage(0 ,"info.step.done");
}
public void endFinalizeMainCatalog(String where, long timeInHtml) {
endStage("info.step.done");
if (timeInHtml > 1000)
logger.info(Localization.Main.getText("info.html.donein", timeInHtml / 1000));
logger.info(Localization.Main.getText("info.step.done", where));
}
public void startReadDatabase() {
startStage(0, "info.step.database");
}
public void endReadDatabase() {
endStage( "info.step.database");
}
public void setDatabaseCount(String s) { setCount(s);}
public void setAuthorCount(String s) {
setCount(s);
}
public void setSeriesCount(String s) {
setCount(s);
}
public void setTagCount(String s) {
setCount(s);
}
public void setFeaturedCount(String s) {
setCount(s);
}
public void setRecentCount(String s) { setCount(s); }
public void setAllBooksCount(String s) { setCount(s); }
public void setCopyLibCount(String s) {
setCount(s);
}
public void setCopyCatCount(String s) {
setCount(s);
}
public void startCreateTags(long nb) {
startStage(nb, "info.step.tags");
}
public void endCreateTags() {
endStage("info.step.tags");
}
public void disableCreateTags() {}
public void startCreateAuthors(long nb) {
startStage(nb, "info.step.authors");
}
public void endCreateAuthors() {
endStage("info.step.authors");
}
public void disableCreateAuthors() {}
public void startCreateSeries(long nb) {
startStage(nb, "info.step.series");
}
public void endCreateSeries() {
endStage("info.step.series");
}
public void disableCreateSeries() {}
public void startCreateRecent(long nb) {
startStage(nb, "info.step.recent");
}
public void endCreateRecent() {
endStage("info.step.recent");
}
public void disableCreateRecent() {}
public void startCreateRated(long nb) {
startStage(nb, "info.step.rated");
}
public void endCreateRated() {
endStage("info.step.rated");
}
public void disableCreateRated() {}
public void startCreateAllbooks(long nb) {
startStage(nb, "info.step.allbooks");
}
public void endCreateAllbooks() {
endStage("info.step.allbooks");
}
public void disableCreateAllBooks() {}
public void startCreateFeaturedBooks(long nb) {
startStage(nb, "info.step.featuredbooks");
}
public void endCreateFeaturedBooks() {
endStage("info.step.featuredbooks");
}
public void disableCreateFeaturedBooks() {}
public void startCreateCustomCatalogs(long nb) {
startStage(nb, "info.step.customcatalogs");
}
public void endCreateCustomCatalogs() {
endStage("info.step.customcatalogs");
}
public void disableCreateCustomCatalogs() {}
public void startReprocessingEpubMetadata(long nb) {
startStage(nb, "info.step.reprocessingEpubMetadata");
}
public void endReprocessingEpubMetadata() {
endStage("info.step.reprocessingEpubMetadata");
}
public void disableReprocessingEpubMetadata() {}
public void startCreateJavascriptDatabase(long nb) {
startStage(nb, "info.step.index");
}
public void endCreateJavascriptDatabase() {
endStage("info.step.index");
}
public void disableCreateJavascriptDatabase() {}
public void startCopyLibToTarget(long nb) {
startStage(nb, "info.step.copylib");
}
public void endCopyLibToTarget() {
endStage("info.step.copylib");
}
public void startCopyCatToTarget(long nb) {
startStage(nb, "info.step.copycat");
}
public void endCopyCatToTarget() {
endStage("info.step.copycat");
}
public void disableCopyLibToTarget() {}
public void startZipCatalog(long nb) {
startStage(nb, "info.step.zipCatalog");
}
public void endZipCatalog() {
endStage("info.step.zipCatalog");
}
public void disableZipCatalog() {}
public void setProgressMax (long maxSteps) { }
public void incStepProgressIndicatorPosition() {
if (startGui) {
checkIfContinueGenerating();
progressStep.incPosition();
}
}
public void errorOccured(String message, Throwable error) {
logger.error(message, error);
}
public int askUser(String message, String... possibleAnswers) {
System.out.println(message);
int num = 1;
for (String possibleAnswer : possibleAnswers) {
String s = "" + num++ + ". " + possibleAnswer;
System.out.println(s);
}
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
int nAnswer = 0;
try {
String answer = in.readLine();
nAnswer = Integer.parseInt(answer);
} catch (IOException e) {
// do nothing
}
if (nAnswer > 0) {
String logMessage = message + " (answered " + possibleAnswers[nAnswer - 1] + ")";
logger.info(logMessage);
}
return nAnswer - 1;
}
public void showMessage(String message) {
progressStep.actOnMessage(message);
}
public void checkIfContinueGenerating() throws GenerationStoppedException {
if (!continueGenerating)
throw new GenerationStoppedException();
}
private int warnCount;
public void resetWarnCount() {
warnCount = 0;
}
public int getWarnCount() {
return warnCount;
}
public void incrementWarnCount() {
warnCount++;
return;
}
public void setStopGenerating() {};
public void clearStopGenerating() {};
}