
package de.ivu.elect.wus.exchange.gruppe.xml;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.xml.bind.JAXBException;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.jee.exchange.Violations;
import de.ivu.elect.business.gruppe.control.GruppeExchangeContext;
import de.ivu.elect.business.gruppe.control.GruppeExportObject;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.jee.exchange.XmlMarshaller;
import de.ivu.elect.wus.exchange.gruppe.AbstractDefaultGruppeMapper;

public class DefaultXmlGruppeMapper extends AbstractDefaultGruppeMapper<DefaultExchangeGruppeXml> {

  @Inject
  protected XmlMarshaller<DefaultExchangeXmlGruppeListe> xmlMarshaller;

  public DefaultXmlGruppeMapper() {
    super();
  }

  @Override
  public void serialize(GruppeExportObject object, OutputStream os, GruppeExchangeContext context, FileKonfiguration fileKonfiguration)
      throws MappingException {
    try {
      xmlMarshaller.serialize(mappeEntityInternToExtern(object.getGruppen()), os);
    } catch (JAXBException e) {
      throw new MappingException(e.getMessage(), e);
    }
  }

  @Override
  public List<Gruppe> deserialize(InputStream is, GruppeExchangeContext context, FileKonfiguration fileKonfiguration)
      throws MappingException {
    try {
      return mappeEntityExternToIntern(xmlMarshaller.deserialize(DefaultExchangeXmlGruppeListe.class, is));
    } catch (JAXBException e) {
      throw new MappingException(e.getMessage(), e);
    }
  }

  @Override
  public Violations validateInputFormat(InputStream is, GruppeExchangeContext context, FileKonfiguration fileKonfiguration) {
    return new Violations();
  }

  @Override
  public FileType getFileType() {
    return FileType.XML;
  }

  @Override
  protected DefaultExchangeGruppeXml createEntity() {
    return new DefaultExchangeGruppeXml();
  }

  protected DefaultExchangeXmlGruppeListe mappeEntityInternToExtern(List<Gruppe> entityListe) {
    DefaultExchangeXmlGruppeListe result = new DefaultExchangeXmlGruppeListe();

    for (Gruppe entity : entityListe) {
      result.getGruppen().add(mappeEntity(entity));
    }

    return result;
  }

  protected List<Gruppe> mappeEntityExternToIntern(DefaultExchangeXmlGruppeListe entityListe) {
    return mappeEntityExternToIntern(entityListe.getGruppen());
  }

}
