package com.l7tech.objectmodel.imp;

import com.l7tech.common.io.NonCloseableOutputStream;
import com.l7tech.objectmodel.NamedEntityWithProperties;
import com.l7tech.util.Charsets;
import com.l7tech.util.PoolByteArrayOutputStream;
import com.l7tech.util.SafeXMLDecoder;
import com.l7tech.util.SafeXMLDecoderBuilder;
import jakarta.persistence.Column;
import jakarta.persistence.Lob;
import jakarta.persistence.MappedSuperclass;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

@MappedSuperclass
public abstract class NamedEntityWithPropertiesImp extends NamedEntityImp implements NamedEntityWithProperties {
   private static final Charset PROPERTIES_ENCODING = Charsets.UTF8;
   private transient String xmlProperties;
   private Map<String, String> properties;
   static final long serialVersionUID = -1195202233711317421L;

   @Column(name = "properties", length = Integer.MAX_VALUE)
   @Lob
   public String getXmlProperties() {
      if (this.xmlProperties == null) {
         Map var1 = this.properties;
         if (var1 == null) {
            return null;
         }

         PoolByteArrayOutputStream var2 = new PoolByteArrayOutputStream();

         try {
            XMLEncoder var3 = new XMLEncoder(new NonCloseableOutputStream(var2));
            var3.writeObject(var1);
            var3.close();
            this.xmlProperties = var2.toString(PROPERTIES_ENCODING);
         } finally {
            var2.close();
         }
      }

      return this.xmlProperties;
   }

   public void setXmlProperties(String var1) {
      if (var1 == null || !var1.equals(this.xmlProperties)) {
         this.xmlProperties = var1;
         if (var1 != null && var1.length() > 0) {
            SafeXMLDecoder var2 = new SafeXMLDecoderBuilder(new ByteArrayInputStream(var1.getBytes(PROPERTIES_ENCODING))).build();
            this.properties = (Map<String, String>)var2.readObject();
         }
      }
   }

   @Override
   public String getProperty(String var1) {
      String var2 = null;
      Map var3 = this.properties;
      if (var3 != null) {
         var2 = (String)var3.get(var1);
      }

      return var2;
   }

   @Override
   public void setProperty(String var1, String var2) {
      Map var3 = this.properties;
      if (var3 == null) {
         var3 = new HashMap();
         this.properties = var3;
      }

      var3.put(var1, var2);
      this.xmlProperties = null;
   }
}
