package com.airlock.iam.plugin.framework.infrastructure.xstream;

import com.airlock.iam.plugin.framework.domain.model.MedusaConfigurationElement;
import com.airlock.iam.plugin.framework.domain.model.Plugin;
import com.airlock.iam.plugin.framework.domain.model.property.PluginListProperty;
import com.airlock.iam.plugin.framework.domain.model.property.PluginMapProperty;
import com.airlock.iam.plugin.framework.domain.model.property.PluginProperty;
import com.airlock.iam.plugin.framework.domain.model.property.SimpleListProperty;
import com.airlock.iam.plugin.framework.domain.model.property.SimpleProperty;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.HierarchicalStreamDriver;
import com.thoughtworks.xstream.io.xml.QNameMap;
import com.thoughtworks.xstream.io.xml.StaxDriver;
import com.thoughtworks.xstream.security.NoTypePermission;

public class MedusaConfigXStream extends XStream {
   public MedusaConfigXStream() {
      super(createDriver());
   }

   protected void setupConverters() {
      this.registerConverter(new MedusaConfigurationElementConverter(), 0);
      this.registerConverter(new HistoryItemConverter(), 0);
      this.registerConverter(new PluginConverter(), 0);
      this.registerConverter(new SimplePropertyConverter(), 0);
      this.registerConverter(new SimpleListPropertyConverter(), 0);
      this.registerConverter(new PluginPropertyConverter(), 0);
      this.registerConverter(new PluginListPropertyConverter(), 0);
      this.registerConverter(new PluginMapPropertyConverter(), 0);
   }

   protected void setupAliases() {
      this.alias("medusaConfiguration", MedusaConfigurationElement.class);
      this.alias("configHistoryMetaDataItem", HistoryItemConverter.class);
      this.alias("plugin", Plugin.class);
      this.alias("property", SimpleProperty.class);
      this.alias("propertyList", SimpleListProperty.class);
      this.alias("pluginProperty", PluginProperty.class);
      this.alias("pluginList", PluginListProperty.class);
      this.alias("pluginMap", PluginMapProperty.class);
   }

   protected void setupSecurity() {
      this.addPermission(NoTypePermission.NONE);
      this.allowTypes(new Class[]{MedusaConfigurationElement.class});
   }

   private static HierarchicalStreamDriver createDriver() {
      QNameMap qmap = new QNameMap();
      qmap.setDefaultNamespace("http://www.ergon.ch");
      return new StaxDriver(qmap);
   }
}
