/*
* Copyright (C) 2014 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.urnnbn;
import cz.cas.lib.proarc.common.fedora.SearchView.Item;
import cz.cas.lib.proarc.common.object.DigitalObjectElement;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* It handles warnings, errors and registered URN:NBNs.
*
* @author Jan Pokorsky
*/
public class UrnNbnStatusHandler {
public static final UrnNbnStatusHandler DEFAULT = new UrnNbnStatusHandler() {
@Override
public void log(LogType logType, DigitalObjectElement elm, Status status, String msg) {
}
@Override
public void log(LogType logType, String pid, Status status, String msg) {
}
@Override
public void ok(DigitalObjectElement elm, String urnNbn) {
}
};
private Map<String, PidResult> pids = new LinkedHashMap<String, PidResult>();
public void error(DigitalObjectElement elm, Throwable t) {
error(elm, null, t);
}
@Deprecated
public void error(String pid, Throwable t) {
error(null, pid, t);
}
private void error(DigitalObjectElement elm, String pid, Throwable t) {
StringWriter dump = new StringWriter();
PrintWriter pw = new PrintWriter(dump);
t.printStackTrace(pw);
pw.close();
if (elm != null) {
error(elm, Status.EXCEPTION, dump.toString());
} else {
error(pid, Status.EXCEPTION, dump.toString());
}
}
@Deprecated
public void error(String pid, Status status, String msg) {
log(LogType.ERROR, pid, status, msg);
}
public void error(DigitalObjectElement elm, Status status, String msg) {
log(LogType.ERROR, elm, status, msg);
}
public void warning(DigitalObjectElement elm, Status status, String msg) {
log(LogType.WARNING, elm, status, msg);
}
@Deprecated
public void warning(String pid, Status status, String msg) {
log(LogType.WARNING, pid, status, msg);
}
public void ok(DigitalObjectElement elm, String urnNbn) {
getEntry(elm.getPid()).setPid(elm.getItem()).ok(urnNbn);
}
public void log(LogType logType, DigitalObjectElement elm, Status status, String msg) {
getEntry(elm.getPid())
.setPid(elm.getItem())
.getLogs(logType)
.add(new StatusEntry(status, msg));
}
public void log(LogType logType, String pid, Status status, String msg) {
PidResult entry = getEntry(pid);
if (entry.getPid() == null) {
entry.setPid(new Item(pid));
}
entry.getLogs(logType).add(new StatusEntry(status, msg));
}
public Map<String, PidResult> getPids() {
return pids;
}
private PidResult getEntry(String pid) {
PidResult pe = pids.get(pid);
if (pe == null) {
pe = new PidResult();
pids.put(pid, pe);
}
return pe;
}
public enum Status {
EXCEPTION, MISSING_DATASTREAM, MISSING_MIX,
MISSING_PARENT, NO_PAGE_FOUND, NOT_PROCESSED,
UNEXPECTED_PARENT,
URNNBN_EXISTS, XML_REQUEST_NOT_VALID
}
public enum LogType { ERROR, REGISTERED, WARNING}
public static class PidResult {
private Map<LogType, List<StatusEntry>> logs = new HashMap<LogType, List<StatusEntry>>();
private String urnNbn;
private Item pid;
List<StatusEntry> getLogs(LogType type) {
List<StatusEntry> entries = logs.get(type);
if (entries == null) {
entries = new ArrayList<StatusEntry>();
logs.put(type, entries);
}
return entries;
}
public PidResult ok(String urnNbn) {
this.urnNbn = urnNbn;
return this;
}
public String getUrnNbn() {
return urnNbn;
}
public Item getPid() {
return pid;
}
public PidResult setPid(Item pid) {
this.pid = pid;
return this;
}
public List<StatusEntry> getErrors() {
List<StatusEntry> errors = logs.get(LogType.ERROR);
return errors != null ? errors : Collections.<StatusEntry>emptyList();
}
public List<StatusEntry> getWarnings() {
List<StatusEntry> warnings = logs.get(LogType.WARNING);
return warnings != null ? warnings : Collections.<StatusEntry>emptyList();
}
}
public static class StatusEntry {
private Status status;
private String message;
private String log;
private List<String> params;
public StatusEntry(Status status, String message) {
this.status = status;
this.message = message;
}
public Status getStatus() {
return status;
}
public String getMessage() {
return message;
}
}
}