/* * Copyright 2004-2012 the Seasar Foundation and the Others. * * 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 org.seasar.mayaa.impl.cycle; import org.seasar.mayaa.FactoryFactory; import org.seasar.mayaa.cycle.CycleFactory; import org.seasar.mayaa.cycle.CycleLocalInstantiator; import org.seasar.mayaa.cycle.Response; import org.seasar.mayaa.cycle.ServiceCycle; import org.seasar.mayaa.cycle.scope.AttributeScope; import org.seasar.mayaa.cycle.scope.RequestScope; import org.seasar.mayaa.impl.cycle.scope.ScopeNotWritableException; import org.seasar.mayaa.impl.cycle.script.rhino.PageAttributeScope; import org.seasar.mayaa.impl.util.StringUtil; /** * @author Masataka Kurihara (Gluegent, Inc.) */ public class CycleUtil { private static CycleUtil _singleton = new CycleUtil(); private volatile CycleFactory _factory; private static StandardScope _standardScope = new StandardScope(); private CycleUtil() { // singleton. } public static boolean isInitialized() { return _singleton._factory != null; } public static CycleFactory getFactory() { if (_singleton._factory == null) { synchronized (_singleton) { if (_singleton._factory == null) { _singleton._factory = (CycleFactory) FactoryFactory.getFactory(CycleFactory.class); } } } return _singleton._factory; } public static void initialize( Object requestContext, Object responseContext) { getFactory().initialize(requestContext, responseContext); } public static void cycleFinalize() { getFactory().cycleFinalize(); } public static void registVariableFactory(String key, CycleLocalInstantiator instantiator) { CycleThreadLocalFactory.registFactory(key, instantiator); } public static Object getGlobalVariable(String key, Object[] params) { return getFactory().getLocalVariables().getGlobalVariable(key, params); } public static void setGlobalVariable(String key, Object value) { getFactory().getLocalVariables().setGlobalVariable(key, value); } public static void clearGlobalVariable(String key) { getFactory().getLocalVariables().clearGlobalVariable(key); } public static Object getLocalVariable(String key, Object owner, Object[] params) { return getFactory().getLocalVariables().getVariable(key, owner, params); } public static void setLocalVariable(String key, Object owner, Object value) { getFactory().getLocalVariables().setVariable(key, owner, value); } public static void clearLocalVariable(String key, Object owner) { getFactory().getLocalVariables().clearVariable(key, owner); } public static ServiceCycle getServiceCycle() { if (getFactory() == null) { throw new CycleNotInitializedException(); } return getFactory().getServiceCycle(); } public static StandardScope getStandardScope() { return _standardScope; } public static void addStandardScope(String newScopeName) { _standardScope.addScope(newScopeName); } /** * ルートのPageスコープを取得します。 * * @return ルートのPageスコープ */ public static AttributeScope getPageScope() { return getServiceCycle().getPageScope(); } /** * 現在のPageスコープを取得します。 * * @return 現在のPageスコープ */ public static AttributeScope getCurrentPageScope() { return (AttributeScope) getPageScope().getAttribute( PageAttributeScope.KEY_CURRENT); } public static RequestScope getRequestScope() { return getServiceCycle().getRequestScope(); } public static Response getResponse() { return getServiceCycle().getResponse(); } public static AttributeScope findStandardAttributeScope(String name) { if (StringUtil.isEmpty(name)) { return null; } ServiceCycle cycle = getServiceCycle(); for (int i = 0; i < _standardScope.size(); i++) { AttributeScope scope = cycle.getAttributeScope(_standardScope.get(i)); if (scope != null) { if (scope instanceof PageAttributeScope) { scope = getCurrentPageScope(); while (scope != null) { if (scope.hasAttribute(name)) { return scope; } Object parent = ((PageAttributeScope)scope).getParentScope(); if (parent instanceof AttributeScope) { scope = (AttributeScope)parent; } else { scope = null; } } } else if (scope.hasAttribute(name)) { return scope; } } } return null; } public static Object getAttribute(String name, String scopeName) { ServiceCycle cycle = getServiceCycle(); AttributeScope scope = cycle.getAttributeScope(scopeName); return scope.getAttribute(name); } public static void setAttribute( String name, Object value, String scopeName) { ServiceCycle cycle = getServiceCycle(); AttributeScope scope = cycle.getAttributeScope(scopeName); if (scope.isAttributeWritable()) { scope.setAttribute(name, value); } else { throw new ScopeNotWritableException(scopeName); } } public static void removeAttribute(String name, String scopeName) { ServiceCycle cycle = getServiceCycle(); AttributeScope scope = cycle.getAttributeScope(scopeName); if (scope.isAttributeWritable()) { scope.removeAttribute(name); } else { throw new ScopeNotWritableException(scopeName); } } /** ノードツリー最適化中か否かを保持するキー */ private static final ThreadLocal/*<Boolean>*/ IS_DRAFT_WRITING = new ThreadLocal/*<Boolean>*/(); /** * ノードツリー最適化中か。 * * @return ノードツリー最適化中ならtrue */ public static boolean isDraftWriting() { return IS_DRAFT_WRITING.get() != null; } /** * ノードツリー最適化を開始する。 */ public static void beginDraftWriting() { IS_DRAFT_WRITING.set(Boolean.TRUE); } /** * ノードツリー最適化を終了する。 */ public static void endDraftWriting() { IS_DRAFT_WRITING.set(null); } }