001/*
002 * (C) Copyright 2015 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Nicolas Chapurlat <nchapurlat@nuxeo.com>
016 */
017
018package org.nuxeo.ecm.core.io.registry.context;
019
020import java.util.List;
021import java.util.Locale;
022import java.util.Map;
023import java.util.Set;
024
025import org.nuxeo.ecm.core.api.CoreSession;
026import org.nuxeo.ecm.core.api.DocumentModel;
027import org.nuxeo.ecm.core.io.registry.reflect.Instantiations;
028
029/**
030 * A {@link ThreadLocal} delegate {@link RenderingContext} used for {@link Instantiations#SINGLETON} marshallers.
031 *
032 * @since 7.2
033 */
034public final class ThreadSafeRenderingContext implements RenderingContext {
035
036    private final ThreadLocal<RenderingContext> ctx = new ThreadLocal<RenderingContext>();
037
038    public ThreadSafeRenderingContext() {
039    }
040
041    /**
042     * Configure this {@link RenderingContext} to use the given {@link RenderingContext} in the current thread.
043     *
044     * @param delegates The underlying {@link RenderingContext}.
045     * @since 7.2
046     */
047    public void configureThread(RenderingContext delegates) {
048        ctx.set(delegates);
049    }
050
051    /**
052     * Get the underlying {@link RenderingContext}.
053     *
054     * @return The underlying {@link RenderingContext}.
055     * @since 7.2
056     */
057    public RenderingContext getDelegate() {
058        return ctx.get();
059    }
060
061    @Override
062    public Locale getLocale() {
063        return ctx.get().getLocale();
064    }
065
066    @Override
067    public String getBaseUrl() {
068        return ctx.get().getBaseUrl();
069    }
070
071    @Override
072    public SessionWrapper getSession(DocumentModel document) {
073        return ctx.get().getSession(document);
074    }
075
076    @Override
077    public void setExistingSession(CoreSession session) {
078        ctx.get().setExistingSession(session);
079    }
080
081    @Override
082    public Set<String> getProperties() {
083        return ctx.get().getProperties();
084    }
085
086    @Override
087    public Set<String> getFetched(String entity) {
088        return ctx.get().getFetched(entity);
089    }
090
091    @Override
092    public Set<String> getTranslated(String entity) {
093        return ctx.get().getTranslated(entity);
094    }
095
096    @Override
097    public Set<String> getEnrichers(String entity) {
098        return ctx.get().getEnrichers(entity);
099    }
100
101    @Override
102    public WrappedContext wrap() {
103        return ctx.get().wrap();
104    }
105
106    @Override
107    public <T> T getParameter(String name) {
108        return ctx.get().getParameter(name);
109    }
110
111    @Override
112    public boolean getBooleanParameter(String name) {
113        return ctx.get().getBooleanParameter(name);
114    }
115
116    @Override
117    public <T> List<T> getParameters(String name) {
118        return ctx.get().getParameters(name);
119    }
120
121    @Override
122    public Map<String, List<Object>> getAllParameters() {
123        return ctx.get().getAllParameters();
124    }
125
126    @Override
127    public void setParameterValues(String name, Object... values) {
128        ctx.get().setParameterValues(name, values);
129    }
130
131    @Override
132    public void setParameterListValues(String name, List<Object> values) {
133        ctx.get().setParameterListValues(name, values);
134    }
135
136    @Override
137    public void addParameterValues(String name, Object... values) {
138        ctx.get().addParameterValues(name, values);
139    }
140
141    @Override
142    public void addParameterListValues(String name, List<Object> values) {
143        ctx.get().addParameterListValues(name, values);
144    }
145
146}