/******************************************************************************* * Copyright (c) 2008 Vlad Dumitrescu and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Vlad Dumitrescu *******************************************************************************/ package org.erlide.util.erlang; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangBinary; import com.ericsson.otp.erlang.OtpErlangException; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangPid; import com.ericsson.otp.erlang.OtpErlangString; import com.ericsson.otp.erlang.OtpErlangTuple; import com.google.common.collect.Lists; public final class OtpBindings implements Map<String, OtpErlangObject> { private final Map<String, OtpErlangObject> bindings; public OtpBindings() { bindings = new HashMap<>(); } public OtpBindings(final OtpBindings binds) { this(); merge(binds); } public void merge(final OtpBindings binds) { bindings.putAll(binds.getAll()); } public int getInt(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangLong) { return ((OtpErlangLong) r).intValue(); } throw new OtpErlangException("value is not an integer"); } public long getLong(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangLong) { return ((OtpErlangLong) r).longValue(); } throw new OtpErlangException("value is not an integer"); } public String getAtom(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangAtom) { return ((OtpErlangAtom) r).atomValue(); } throw new OtpErlangException("value is not an atom"); } public String getQuotedAtom(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangAtom) { return ((OtpErlangAtom) r).toString(); } throw new OtpErlangException("value is not an atom"); } public String getString(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangString) { return ((OtpErlangString) r).stringValue(); } throw new OtpErlangException("value is not a string"); } public Collection<OtpErlangObject> getList(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangList) { return Lists.newArrayList(((OtpErlangList) r).elements()); } throw new OtpErlangException("value is not a list"); } public OtpErlangObject[] getTuple(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangTuple) { return ((OtpErlangTuple) r).elements(); } throw new OtpErlangException("value is not a tuple"); } public OtpErlangPid getPid(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangPid) { return (OtpErlangPid) r; } throw new OtpErlangException("value is not a pid"); } @SuppressWarnings("unchecked") public <T> T getAs(final String name, final Class<T> cls) throws SignatureException { final OtpErlangObject v = get(name); return (T) TypeConverter.erlang2java(v, cls); } public Map<String, OtpErlangObject> getAll() { return Collections.unmodifiableMap(bindings); } @Override public String toString() { return bindings.toString(); } public OtpErlangBinary getBinary(final String name) throws OtpErlangException { final OtpErlangObject r = get(name); if (r instanceof OtpErlangBinary) { return (OtpErlangBinary) r; } throw new OtpErlangException("value is not a binary"); } public String getAsString(final String name) { final OtpErlangObject r = get(name); return OtpErlang.asString(r); } @Override public int size() { return bindings.size(); } @Override public boolean isEmpty() { return bindings.isEmpty(); } @Override public boolean containsKey(final Object key) { return bindings.containsKey(key); } @Override public boolean containsValue(final Object value) { return bindings.containsValue(value); } @Override public OtpErlangObject get(final Object key) { return bindings.get(key); } @Override public OtpErlangObject put(final String key, final OtpErlangObject value) { return bindings.put(key, value); } @Override public OtpErlangObject remove(final Object key) { return bindings.remove(key); } @Override public void putAll(final Map<? extends String, ? extends OtpErlangObject> m) { bindings.putAll(m); } @Override public void clear() { bindings.clear(); } @Override public Set<String> keySet() { return bindings.keySet(); } @Override public Collection<OtpErlangObject> values() { return bindings.values(); } @Override public Set<java.util.Map.Entry<String, OtpErlangObject>> entrySet() { return bindings.entrySet(); } }