content: // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  // SPDX-License-Identifier: Apache-2.0
  package com.amazon.ion.impl.lite;
  
  import com.amazon.ion.IonClob;
  import com.amazon.ion.IonType;
  import com.amazon.ion.IonWriter;
  import com.amazon.ion.ValueVisitor;
  import com.amazon.ion.impl._Private_Utils;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.Reader;
  import java.nio.charset.Charset;
  
  
  final class IonClobLite
      extends IonLobLite
      implements IonClob
  {
      static private final int HASH_SIGNATURE =
          IonType.CLOB.toString().hashCode();
  
      /**
       * Constructs a <code>null.clob</code> element.
       */
      IonClobLite(ContainerlessContext context, boolean isNull)
      {
          super(context, isNull);
      }
  
      IonClobLite(IonClobLite existing, IonContext context)
      {
          super(existing, context);
      }
  
      @Override
      IonValueLite shallowClone(IonContext context)
      {
          return new IonClobLite(this, context);
      }
  
      @Override
      public IonClobLite clone()
      {
          return (IonClobLite) shallowClone(ContainerlessContext.wrap(getSystem()));
      }
  
      @Override
      int hashSignature() {
          return HASH_SIGNATURE;
      }
  
      @Override
      int scalarHashCode() {
          return lobHashCode(HASH_SIGNATURE);
      }
  
      @Override
      public IonType getTypeSlow()
      {
          return IonType.CLOB;
      }
  
  
      public Reader newReader(Charset cs)
      {
          InputStream in = newInputStream();
          if (in == null) return null;
  
          return new InputStreamReader(in, cs);
      }
  
  
      public String stringValue(Charset cs)
      {
          // TODO use Charset directly.
          byte[] bytes = getBytes();
          if (bytes == null) return null;
  
          return _Private_Utils.decode(bytes, cs);
      }
  
      @Override
      final void writeBodyTo(IonWriter writer, SymbolTableProvider symbolTableProvider)
          throws IOException
      {
          writer.writeClob(getBytesNoCopy());
      }
  
      @Override
      public void accept(ValueVisitor visitor) throws Exception
      {
          visitor.visit(this);
      }
  }
  