/* * Copyright 2012-2013 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package omero.cmd; import java.util.Map; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import ome.security.basic.CurrentDetails; import ome.system.OmeroContext; import omero.SecurityViolation; /** * Interceptor which takes any context provided by the * client and calls setContext on CurrentDetails. This * allows users to dynamically change, for example, the * call group without modifying the whole session. * * @see <a href="http://trac.openmicroscopy.org/ome/ticket/3529">Trac ticket #3529</a> */ public class CallContext implements MethodInterceptor { private static Logger log = LoggerFactory.getLogger(CallContext.class); private final CurrentDetails cd; private final String token; public CallContext(OmeroContext ctx, String token) { this.cd = ctx.getBean(CurrentDetails.class); this.token = token; } public CallContext(CurrentDetails cd, String token) { this.cd = cd; this.token = token; } /** * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation) */ public Object invoke(final MethodInvocation arg0) throws Throwable { if (arg0 != null) { final Object[] args = arg0.getArguments(); if (args != null && args.length > 0) { final Object last = args[args.length-1]; if (Ice.Current.class.isAssignableFrom(last.getClass())) { final Ice.Current current = (Ice.Current) last; final Map<String, String> ctx = current.ctx; if (ctx != null && ctx.size() > 0) { cd.setContext(ctx); if (ctx.containsKey("omero.logfilename")) { if (ctx.containsKey("omero.logfilename.token") && token.equals(ctx .get("omero.logfilename.token"))) { MDC.put("fileset", ctx.get("omero.logfilename")); } else { throw new SecurityViolation(null, null, "Setting the omero.logfilename value is" + " not permitted without a secure" + " server token!"); } } } } } } try { return arg0.proceed(); } finally { MDC.clear(); } } }