/** * Copyright 2016 Nabarun Mondal * 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 com.noga.njexl.lang.introspection; import com.noga.njexl.lang.JexlInfo; import com.noga.njexl.lang.internal.logging.Log; /** * An uberspect that controls usage of properties, methods and contructors through a sandbox. * @since 2.1 */ public class SandboxUberspectImpl extends UberspectImpl { /** The sandbox. */ protected final Sandbox sandbox; /** * A constructor for Sandbox uberspect. * @param runtimeLogger the logger to use or null to use default * @param theSandbox the sandbox instance to use */ public SandboxUberspectImpl(Log runtimeLogger, Sandbox theSandbox) { super(runtimeLogger); if (theSandbox == null) { throw new NullPointerException("sandbox can not be null"); } this.sandbox = theSandbox; } /** * {@inheritDoc} */ @Override public void setLoader(ClassLoader cloader) { base().setLoader(cloader); } /** * {@inheritDoc} */ @Override public JexlMethod getConstructorMethod(Object ctorHandle, Object[] args, JexlInfo info) { final String className; if (ctorHandle instanceof Class<?>) { Class<?> clazz = (Class<?>) ctorHandle; className = clazz.getName(); } else if (ctorHandle != null) { className = ctorHandle.toString(); } else { return null; } if (sandbox.execute(className, "") != null) { return super.getConstructorMethod(className, args, info); } return null; } /** * {@inheritDoc} */ @Override public JexlMethod getMethod(Object obj, String method, Object[] args, JexlInfo info) { if (obj != null && method != null) { String actual = sandbox.execute(obj.getClass().getName(), method); if (actual != null) { return getMethodExecutor(obj, actual, args); } } return null; } /** * {@inheritDoc} */ @Override public JexlPropertyGet getPropertyGet(Object obj, Object identifier, JexlInfo info) { if (obj != null && identifier != null) { String actual = sandbox.read(obj.getClass().getName(), identifier.toString()); if (actual != null) { return super.getPropertyGet(obj, actual, info); } } return null; } /** * {@inheritDoc} */ @Override public JexlPropertySet getPropertySet(final Object obj, final Object identifier, Object arg, JexlInfo info) { if (obj != null && identifier != null) { String actual = sandbox.write(obj.getClass().getName(), identifier.toString()); if (actual != null) { return super.getPropertySet(obj, actual, arg, info); } } return null; } }