001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.json;
016    
017    import com.liferay.portal.json.transformer.FlexjsonObjectJSONTransformer;
018    import com.liferay.portal.json.transformer.JSONArrayJSONTransformer;
019    import com.liferay.portal.json.transformer.JSONObjectJSONTransformer;
020    import com.liferay.portal.json.transformer.JSONSerializableJSONTransformer;
021    import com.liferay.portal.json.transformer.RepositoryModelJSONTransformer;
022    import com.liferay.portal.json.transformer.UserJSONTransformer;
023    import com.liferay.portal.kernel.json.JSONArray;
024    import com.liferay.portal.kernel.json.JSONObject;
025    import com.liferay.portal.kernel.json.JSONSerializable;
026    import com.liferay.portal.kernel.repository.model.RepositoryModel;
027    import com.liferay.portal.model.User;
028    
029    import flexjson.TransformerUtil;
030    
031    import flexjson.transformer.NullTransformer;
032    import flexjson.transformer.Transformer;
033    import flexjson.transformer.TransformerWrapper;
034    import flexjson.transformer.TypeTransformerMap;
035    
036    import java.io.InputStream;
037    
038    import java.lang.reflect.Field;
039    import java.lang.reflect.Modifier;
040    
041    import java.util.Map;
042    
043    /**
044     * @author Igor Spasic
045     */
046    public class JSONInit {
047    
048            @SuppressWarnings("rawtypes")
049            public static synchronized void init() {
050                    try {
051                            if (_initalized) {
052                                    return;
053                            }
054    
055                            Field defaultTransformersField =
056                                    TransformerUtil.class.getDeclaredField("defaultTransformers");
057    
058                            defaultTransformersField.setAccessible(true);
059    
060                            TypeTransformerMap oldTransformersMap =
061                                    TransformerUtil.getDefaultTypeTransformers();
062    
063                            TypeTransformerMap newTransformersMap = new TypeTransformerMap();
064    
065                            for (Map.Entry<Class, Transformer> entry :
066                                            oldTransformersMap.entrySet()) {
067    
068                                    newTransformersMap.put(entry.getKey(), entry.getValue());
069                            }
070    
071                            _registerDefaultTransformers(newTransformersMap);
072    
073                            Field modifiersField = Field.class.getDeclaredField("modifiers");
074    
075                            modifiersField.setAccessible(true);
076    
077                            modifiersField.setInt(
078                                    defaultTransformersField,
079                                    defaultTransformersField.getModifiers() & ~Modifier.FINAL);
080    
081                            defaultTransformersField.set(null, newTransformersMap);
082    
083                            _initalized = true;
084                    }
085                    catch (Exception e) {
086                            throw new RuntimeException(e);
087                    }
088            }
089    
090            private static void _registerDefaultTransformers(
091                    TypeTransformerMap transformersMap) {
092    
093                    transformersMap.put(
094                            InputStream.class, new TransformerWrapper(new NullTransformer()));
095    
096                    transformersMap.put(
097                            JSONArray.class,
098                            new TransformerWrapper(new JSONArrayJSONTransformer()));
099    
100                    transformersMap.put(
101                            JSONObject.class,
102                            new TransformerWrapper(new JSONObjectJSONTransformer()));
103    
104                    transformersMap.put(
105                            JSONSerializable.class,
106                            new TransformerWrapper(new JSONSerializableJSONTransformer()));
107    
108                    transformersMap.put(
109                            Object.class,
110                            new TransformerWrapper(new FlexjsonObjectJSONTransformer()));
111    
112                    transformersMap.put(
113                            RepositoryModel.class,
114                            new TransformerWrapper(new RepositoryModelJSONTransformer()));
115    
116                    transformersMap.put(
117                            User.class, new TransformerWrapper(new UserJSONTransformer()));
118            }
119    
120            private static boolean _initalized = false;
121    
122    }