001/*
002 * jPOS Project [http://jpos.org]
003 * Copyright (C) 2000-2026 jPOS Software SRL
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jpos.tlv.packager;
020
021
022import org.jpos.core.Configurable;
023import org.jpos.core.Configuration;
024import org.jpos.core.ConfigurationException;
025import org.jpos.iso.ISOComponent;
026import org.jpos.iso.ISOException;
027import org.jpos.util.LogEvent;
028import org.jpos.util.LogSource;
029import org.jpos.util.Logger;
030
031import java.io.ByteArrayOutputStream;
032import java.io.PrintStream;
033
034
035/**
036 * Default {@link PackagerErrorHandler} that records pack/unpack failures to a
037 * dedicated logger instead of aborting the operation.
038 *
039 * @author Vishnu Pillai
040 */
041public class PackagerErrorLogger implements PackagerErrorHandler, Configurable, LogSource {
042    /** Default constructor; no instance state to initialise. */
043    public PackagerErrorLogger() {}
044
045    private Logger logger = Logger.getLogger("PACKAGER_ERROR_LOGGER");
046    private String realm;
047
048    @Override
049    public void setLogger(Logger logger, String realm) {
050        this.logger = logger;
051    }
052
053    @Override
054    public String getRealm() {
055        return realm;
056    }
057
058    @Override
059    public Logger getLogger() {
060        return logger;
061    }
062
063    @Override
064    public void setConfiguration(Configuration cfg) throws ConfigurationException {
065        String loggerName = cfg.get("packager-error-logger");
066        logger = Logger.getLogger(loggerName);
067        realm = cfg.get("realm", "packager-error");
068    }
069
070    @Override
071    public void handlePackError(ISOComponent m, ISOException e) {
072        StringBuilder sb = new StringBuilder("Error packing message:\n");
073        ByteArrayOutputStream baos = new ByteArrayOutputStream();
074        PrintStream ps = new PrintStream(baos);
075        m.dump(ps, "");
076        sb.append(e.toString()).append("\n");
077        sb.append("Message dump:\n").append(new String(baos.toByteArray())).append("\n");
078        LogEvent logEvent = new LogEvent(this, "pack-error");
079        logEvent.addMessage(sb.toString());
080        logEvent.addMessage(e);
081        Logger.log(logEvent);
082    }
083
084    @Override
085    public void handleUnpackError(ISOComponent isoComponent, byte[] msg, ISOException e) {
086        StringBuilder sb = new StringBuilder("Error unpacking message:\n");
087        sb.append(e.toString()).append("\n");
088        sb.append("Raw data:\n").append(new String(msg)).append("\n");
089        LogEvent logEvent = new LogEvent(this, "unpack-error");
090        logEvent.addMessage(sb.toString());
091        logEvent.addMessage(e);
092        Logger.log(logEvent);
093    }
094}