/**
 *  '$RCSfile$'
 *  Copyright: 2000-2015 Regents of the University of California and the
 *              National Center for Ecological Analysis and Synthesis
 *
 *   '$Author:  $'
 *     '$Date:  $'
 *
 * 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 2 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package edu.ucsb.nceas.metacat.dataone.convert;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import org.dataone.exceptions.MarshallingException;
import org.dataone.service.types.v1.Event;
import org.dataone.service.types.v2.Log;
import org.dataone.service.types.v2.LogEntry;

/**
 * This class represents a converter to convert an DataONE v2 Log object to a v1 Log object.
 * It probably will be removed to d1_common_java in the future. 
 * @author tao
 *
 */
public class LogV2toV1Converter {
    
    /**
     * Default constructor
     */
    public LogV2toV1Converter() {
        
    }
    
    /**
     * Convert a v2 Log object to a v1 Log object
     * @param logV2  - the v2 Log object which needs to be converted
     * @return a v1 Log object. If the logV2 is null, null will be returned.
     * @throws IOException 
     * @throws JiBXException 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     */
    public org.dataone.service.types.v1.Log convert(Log logV2) 
            throws InstantiationException, IllegalAccessException, InvocationTargetException, MarshallingException, IOException {
        org.dataone.service.types.v1.Log logV1 = null;
        int removedLogCount =0;
        if(logV2 != null) {
            //System.out.println("====================== logV2 is not null and the size is "+logV2.getCount());
            LogEntryV2toV1Converter converter = new LogEntryV2toV1Converter();
            logV1 = new org.dataone.service.types.v1.Log();
            for(int i=0; i<logV2.getCount(); i++) {
                LogEntry v2LogEntry = logV2.getLogEntry(i);
                org.dataone.service.types.v1.LogEntry v1LogEntry = converter.convert(v2LogEntry);
                if(v1LogEntry.getEvent() != null) {
                    logV1.addLogEntry(v1LogEntry);
                } else {
                    removedLogCount ++;
                }
                
            }
            logV1.setCount(logV2.getCount()-removedLogCount);
            logV1.setStart(logV2.getStart());
            logV1.setTotal(logV2.getTotal()-removedLogCount);
        }
        return logV1;
    }
    
    /**
     * A class to convert a v2 LogEntry object to a v1 LogEntry object
     * @author tao
     *
     */
    public static class LogEntryV2toV1Converter {
        /**
         * Default constructor
         */
        public LogEntryV2toV1Converter(){
            
        }
        
        /**
         * Convert a v2 LogEntry object to a v1 LogEntry object
         * @param logV2  - the v2 Log object which needs to be converted
         * @return a v1 Log object. If the logV2 is null, null will be returned.
         * @throws IOException 
         * @throws JiBXException 
         * @throws InvocationTargetException 
         * @throws IllegalAccessException 
         * @throws InstantiationException 
         */
        public org.dataone.service.types.v1.LogEntry convert(LogEntry logEntryV2) 
                throws InstantiationException, IllegalAccessException, InvocationTargetException, MarshallingException, IOException {
            org.dataone.service.types.v1.LogEntry logEntryV1 = null;;
            if(logEntryV2 != null) {
                logEntryV1 = new org.dataone.service.types.v1.LogEntry();
               
                logEntryV1.setDateLogged(logEntryV2.getDateLogged());
                
                logEntryV1.setEntryId(logEntryV2.getEntryId());
              
                if(logEntryV2.getEvent() != null) {
                    logEntryV1.setEvent(Event.convert(logEntryV2.getEvent().toLowerCase()));
                }
                
                logEntryV1.setIdentifier(logEntryV2.getIdentifier());
                
                logEntryV1.setIpAddress(logEntryV2.getIpAddress());
                
                logEntryV1.setNodeIdentifier(logEntryV2.getNodeIdentifier());
                
                logEntryV1.setSubject(logEntryV2.getSubject());
                
                logEntryV1.setUserAgent(logEntryV2.getUserAgent());
                
            }
            return logEntryV1;
        }
    }
    
    /**
     * A wrapper class to gap the difference in the signature of setEvent between the v2 and v1 LogEntry objects.
     * (The v2 LogEntry doesn't have the setEvent(Event) method, so TypeMarshaller can't handle it)
     * @author tao
     *
     */
    public static class V1LogEntryWrapper extends org.dataone.service.types.v1.LogEntry{
        
        public void setEvent(String event) { 
            if(event != null) {
                super.setEvent(Event.convert(event));
            }
        }
    }
    
    /**
     * A wrapper class to gap the difference in the signature of setEvent between the v2 and v1 LogEntry objects.
     * (The v2 LogEntry doesn't have the setEvent(Event) method, so TypeMarshaller can't handle it)
     * @author tao
     *
     */
    public static class V2LogEntryWrapper extends LogEntry{
        
        public void setEvent(Event event) { 
            if(event != null) {
                super.setEvent(event.xmlValue());
            }
        }
    }

}