ZelScriptContext.java

/*
 * Copyright 2021 SPF4J.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.spf4j.zel.javax;


import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.script.Bindings;
import javax.script.ScriptContext;
import org.spf4j.io.EmptyReader;
import org.spf4j.io.NullWriter;

/**
 * @author Zoltan Farkas
 */
final class ZelScriptContext implements ScriptContext {

  private final SortedMap<Integer, Bindings> scope2Bindings;

  private  Reader in;

  private  Writer out;

  private  Writer err;

  ZelScriptContext() {
    scope2Bindings = new TreeMap<>();
    in = EmptyReader.INSTANCE;
    out = NullWriter.INSTANCE;
    err =  NullWriter.INSTANCE;
  }

  @Override
  public void setBindings(final Bindings bindings, final int scope) {
    scope2Bindings.put(scope, bindings);
  }

  @Override
  public Bindings getBindings(final int scope) {
    return scope2Bindings.get(scope);
  }

  @Override
  public void setAttribute(final String name, final Object value, final int scope) {
    scope2Bindings.get(scope).put(name, value);
  }

  @Override
  public Object getAttribute(final String name, final int scope) {
    return scope2Bindings.get(scope).get(name);
  }

  @Override
  public Object removeAttribute(final String name, final int scope) {
    return scope2Bindings.get(scope).remove(name);
  }

  @Override
  public Object getAttribute(final String name) {
    Iterator<Bindings> iterator = scope2Bindings.values().iterator();
    if (iterator.hasNext()) {
      return iterator.next().get(name);
    } else {
      return null;
    }
  }

  @Override
  public int getAttributesScope(final String name) {
    for (Map.Entry<Integer, Bindings> entry : scope2Bindings.entrySet()) {
      Object val = entry.getValue().get(name);
      if (val != null) {
        return entry.getKey();
      }
    }
    return -1;
  }

  @Override
  public Writer getWriter() {
   return out;
  }

  @Override
  public Writer getErrorWriter() {
    return err;
  }

  @Override
  public void setWriter(final Writer writer) {
    this.out = writer;
  }

  @Override
  public void setErrorWriter(final Writer writer) {
    this.err = writer;
  }

  @Override
  public Reader getReader() {
    return in;
  }

  @Override
  public void setReader(final Reader reader) {
    this.in = reader;
  }

  @Override
  public List<Integer> getScopes() {
    return new ArrayList<>(scope2Bindings.keySet());
  }

  @Override
  public String toString() {
    return "ZelScriptContext{" + "scope2Bindings=" + scope2Bindings + ", in="
            + in + ", out=" + out + ", err=" + err + '}';
  }



}