blob: 8e257d64f59ece867a3122814e44a508d1526fcb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.commons.scxml2.env.javascript;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import javax.script.Bindings;
import org.apache.commons.scxml2.Context;
/**
* JDK Javascript engine Bindings class that delegates to a SCXML context
*/
public class JSBindings implements Bindings {
private JSContext context;
/**
* Initialize the Bindings
*
* @param jsContext initial SCXML Context to use for script variables.
*
* @throws IllegalArgumentException Thrown if <code>jsContext</code> is <code>null</code>.
*
*/
public JSBindings(JSContext jsContext) {
setContext(jsContext);
}
/**
* Set or update the SCXML context delegate
*
* @param jsContext the SCXML context to use for script variables.
* @throws IllegalArgumentException Thrown if <code>jsContext</code> is <code>null</code>.
*/
public void setContext(JSContext jsContext) {
if (jsContext == null) {
throw new IllegalArgumentException("SCXML context is required");
}
this.context = jsContext;
}
/**
* Returns <code>true</code> if the SCXML context contains a variable identified by <code>key</code>.
*/
@Override
public boolean containsKey(Object key) {
return context.has(key.toString());
}
/**
* Returns the SCXML context key set
*/
@Override
public Set<String> keySet() {
return context.getVars().keySet();
}
/**
* Returns the size of the SCXML context size.
*/
@Override
public int size() {
return context.getVars().size();
}
/**
* Returns <code>true</code> if the SCXML context contains <code>value</code>.
*/
@Override
public boolean containsValue(Object value) {
return context.getVars().containsValue(value);
}
/**
* Returns the SCXML context entry set.
*/
@Override
public Set<Map.Entry<String,Object>> entrySet() {
return context.getVars().entrySet();
}
/**
* Returns the SCXML context values.
*/
@Override
public Collection<Object> values() {
return context.getVars().values();
}
/**
* Returns <code>true</code> if the SCXML context is empty.
*/
@Override
public boolean isEmpty() {
return context.getVars().isEmpty();
}
/**
* Returns the value from the SCXML context identified by <code>key</code>.
*/
@Override
public Object get(Object key) {
return context.get(key.toString());
}
/**
* The following delegation model is used to set values:
* <ol>
* <li>Delegates to {@link Context#set(String,Object)} if the Context contains the key (name), else</li>
* <li>Delegates to {@link Context#setLocal(String, Object)}</li>
* </ol>
* @param name The variable name
* @param value The variable value
*/
@Override
public Object put(String name, Object value) {
Object old = null;
if (context.has(name)) {
old = context.get(name);
context.set(name, value);
} else {
context.setLocal(name, value);
}
return old;
}
/**
* Sets all entries in the provided map via {@link #put(String, Object)}
* @param toMerge the map of variables to merge
*/
@Override
public void putAll(Map<? extends String, ?> toMerge) {
for (Map.Entry<? extends String, ?> entry : toMerge.entrySet()) {
put(entry.getKey(), entry.getValue());
}
}
/**
* Removes the named variable from the contained SCXML context.
* @param name the variable name
*/
@Override
public Object remove(Object name) {
return context.getVars().remove(name);
}
/**
* Does nothing - never invoked anyway
*/
@Override
public void clear() {
}
}