Coverage Report - org.seasar.cubby.controller.ThreadContext
 
Classes in this File Line Coverage Branch Coverage Complexity
ThreadContext
90%
28/31
80%
8/10
0
ThreadContext$1
100%
2/2
N/A
0
 
 1  
 /*
 2  
  * Copyright 2004-2008 the Seasar Foundation and the Others.
 3  
  *
 4  
  * Licensed under the Apache License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  *     http://www.apache.org/licenses/LICENSE-2.0
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 13  
  * either express or implied. See the License for the specific language
 14  
  * governing permissions and limitations under the License.
 15  
  */
 16  
 package org.seasar.cubby.controller;
 17  
 
 18  
 import java.util.Map;
 19  
 import java.util.ResourceBundle;
 20  
 
 21  
 import javax.servlet.http.HttpServletRequest;
 22  
 
 23  
 import org.seasar.cubby.controller.impl.DefaultMessagesBehaviour;
 24  
 import org.seasar.framework.container.S2Container;
 25  
 import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
 26  
 
 27  
 /**
 28  
  * 実行スレッドのコンテキスト情報です。
 29  
  * 
 30  
  * @author baba
 31  
  * @since 1.0.0
 32  
  */
 33  3
 public class ThreadContext {
 34  
 
 35  
         /** デフォルトのメッセージのふるまい。 */
 36  1
         private static final MessagesBehaviour DEFAULT_MESSAGES_BEHAVIOUR = new DefaultMessagesBehaviour();
 37  
 
 38  
         /** ThreadContext を保存するスレッドローカル。 */
 39  1
         private static final ThreadLocal<ThreadContext> CONTEXT = new ThreadLocal<ThreadContext>() {
 40  
 
 41  
                 @Override
 42  
                 protected ThreadContext initialValue() {
 43  3
                         return new ThreadContext();
 44  
                 }
 45  
 
 46  
         };
 47  
 
 48  
         /**
 49  
          * スレッドローカルから現在の実行スレッドに関する情報を削除します。
 50  
          */
 51  
         public static void remove() {
 52  2
                 CONTEXT.remove();
 53  2
         }
 54  
 
 55  
         /**
 56  
          * 現在の実行スレッドに関連付けられたリクエストを取得します。
 57  
          * 
 58  
          * @return リクエスト
 59  
          */
 60  
         public static HttpServletRequest getRequest() {
 61  19
                 return CONTEXT.get().request;
 62  
         }
 63  
 
 64  
         /**
 65  
          * 現在の実行スレッドに指定されたリクエストを関連付けます。
 66  
          * 
 67  
          * @param request
 68  
          *            リクエスト
 69  
          */
 70  
         public static void setRequest(final HttpServletRequest request) {
 71  12
                 CONTEXT.get().request = request;
 72  12
         }
 73  
 
 74  
         /**
 75  
          * Cubby の全体的な設定情報を取得します。
 76  
          * 
 77  
          * @return Cubby の全体的な設定情報
 78  
          */
 79  
         public static CubbyConfiguration getConfiguration() {
 80  0
                 final S2Container container = SingletonS2ContainerFactory
 81  
                                 .getContainer();
 82  0
                 return (CubbyConfiguration) container
 83  
                                 .getComponent(CubbyConfiguration.class);
 84  
         }
 85  
 
 86  
         /**
 87  
          * 現在の実行スレッドに関連付けられたリクエストに対応するメッセージ用の {@link ResourceBundle} を取得します。
 88  
          * 
 89  
          * @return リソースバンドル
 90  
          */
 91  
         public static ResourceBundle getMessagesResourceBundle() {
 92  12
                 final ThreadContext context = CONTEXT.get();
 93  12
                 if (context.messagesResourceBundle == null) {
 94  2
                         final MessagesBehaviour messagesBehaviour = getMessagesBehaviour(context);
 95  2
                         context.messagesResourceBundle = messagesBehaviour
 96  
                                         .getBundle(context.request == null ? null : context.request
 97  
                                                         .getLocale());
 98  
                 }
 99  12
                 return context.messagesResourceBundle;
 100  
         }
 101  
 
 102  
         /**
 103  
          * {@link #getMessagesResourceBundle()} で取得できる {@link ResourceBundle} を変換した
 104  
          * {@link Map} を取得します。
 105  
          * 
 106  
          * @return メッセージの {@link Map}
 107  
          */
 108  
         public static Map<String, String> getMessagesMap() {
 109  1
                 final ThreadContext context = CONTEXT.get();
 110  1
                 if (context.messages == null) {
 111  1
                         final ResourceBundle bundle = getMessagesResourceBundle();
 112  1
                         final MessagesBehaviour messagesBehaviour = getMessagesBehaviour(context);
 113  1
                         context.messages = messagesBehaviour.toMap(bundle);
 114  
                 }
 115  1
                 return context.messages;
 116  
         }
 117  
 
 118  
         /**
 119  
          * メッセージ表示用リソースバンドルの振る舞いを取得します。
 120  
          * 
 121  
          * @param context
 122  
          *            実行スレッドのコンテキスト情報
 123  
          * @return メッセージ表示用リソースバンドルの振る舞い
 124  
          */
 125  
         private static MessagesBehaviour getMessagesBehaviour(
 126  
                         final ThreadContext context) {
 127  3
                 if (context.messagesBehaviour == null) {
 128  2
                         final S2Container container = SingletonS2ContainerFactory
 129  
                                         .getContainer();
 130  2
                         if (container.hasComponentDef(MessagesBehaviour.class)) {
 131  0
                                 context.messagesBehaviour = (MessagesBehaviour) container
 132  
                                                 .getComponent(MessagesBehaviour.class);
 133  
                         } else {
 134  2
                                 context.messagesBehaviour = DEFAULT_MESSAGES_BEHAVIOUR;
 135  
                         }
 136  
                 }
 137  3
                 return context.messagesBehaviour;
 138  
         }
 139  
 
 140  
         /**
 141  
          * インスタンス化します。
 142  
          */
 143  3
         private ThreadContext() {
 144  3
         }
 145  
 
 146  
         /** リクエスト。 */
 147  
         private HttpServletRequest request;
 148  
 
 149  
         /** メッセージのリソースバンドル。 */
 150  3
         private ResourceBundle messagesResourceBundle = null;
 151  
 
 152  
         /** メッセージの {@link Map} */
 153  3
         private Map<String, String> messages = null;
 154  
 
 155  
         /** メッセージ表示用リソースバンドルの振る舞い。 */
 156  
         private MessagesBehaviour messagesBehaviour;
 157  
 
 158  
 }