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.CompanyJSONTransformer;
018    import com.liferay.portal.json.transformer.FlexjsonObjectJSONTransformer;
019    import com.liferay.portal.json.transformer.JSONArrayJSONTransformer;
020    import com.liferay.portal.json.transformer.JSONObjectJSONTransformer;
021    import com.liferay.portal.json.transformer.JSONSerializableJSONTransformer;
022    import com.liferay.portal.json.transformer.RepositoryModelJSONTransformer;
023    import com.liferay.portal.json.transformer.UserJSONTransformer;
024    import com.liferay.portal.kernel.json.JSONArray;
025    import com.liferay.portal.kernel.json.JSONObject;
026    import com.liferay.portal.kernel.json.JSONSerializable;
027    import com.liferay.portal.kernel.repository.model.RepositoryModel;
028    import com.liferay.portal.model.Company;
029    import com.liferay.portal.model.User;
030    
031    import flexjson.TransformerUtil;
032    
033    import flexjson.transformer.NullTransformer;
034    import flexjson.transformer.Transformer;
035    import flexjson.transformer.TransformerWrapper;
036    import flexjson.transformer.TypeTransformerMap;
037    
038    import java.io.InputStream;
039    
040    import java.lang.reflect.Field;
041    import java.lang.reflect.Modifier;
042    
043    import java.util.Map;
044    
045    /**
046     * @author Igor Spasic
047     */
048    public class JSONInit {
049    
050            @SuppressWarnings("rawtypes")
051            public static synchronized void init() {
052                    try {
053                            if (_initalized) {
054                                    return;
055                            }
056    
057                            Field defaultTransformersField =
058                                    TransformerUtil.class.getDeclaredField("defaultTransformers");
059    
060                            defaultTransformersField.setAccessible(true);
061    
062                            TypeTransformerMap oldTransformersMap =
063                                    TransformerUtil.getDefaultTypeTransformers();
064    
065                            TypeTransformerMap newTransformersMap = new TypeTransformerMap();
066    
067                            for (Map.Entry<Class, Transformer> entry :
068                                            oldTransformersMap.entrySet()) {
069    
070                                    newTransformersMap.put(entry.getKey(), entry.getValue());
071                            }
072    
073                            _registerDefaultTransformers(newTransformersMap);
074    
075                            Field modifiersField = Field.class.getDeclaredField("modifiers");
076    
077                            modifiersField.setAccessible(true);
078    
079                            modifiersField.setInt(
080                                    defaultTransformersField,
081                                    defaultTransformersField.getModifiers() & ~Modifier.FINAL);
082    
083                            defaultTransformersField.set(null, newTransformersMap);
084    
085                            _initalized = true;
086                    }
087                    catch (Exception e) {
088                            throw new RuntimeException(e);
089                    }
090            }
091    
092            private static void _registerDefaultTransformers(
093                    TypeTransformerMap transformersMap) {
094    
095                    transformersMap.put(
096                            Company.class,
097                            new TransformerWrapper(new CompanyJSONTransformer()));
098    
099                    transformersMap.put(
100                            InputStream.class, new TransformerWrapper(new NullTransformer()));
101    
102                    transformersMap.put(
103                            JSONArray.class,
104                            new TransformerWrapper(new JSONArrayJSONTransformer()));
105    
106                    transformersMap.put(
107                            JSONObject.class,
108                            new TransformerWrapper(new JSONObjectJSONTransformer()));
109    
110                    transformersMap.put(
111                            JSONSerializable.class,
112                            new TransformerWrapper(new JSONSerializableJSONTransformer()));
113    
114                    transformersMap.put(
115                            Object.class,
116                            new TransformerWrapper(new FlexjsonObjectJSONTransformer()));
117    
118                    transformersMap.put(
119                            RepositoryModel.class,
120                            new TransformerWrapper(new RepositoryModelJSONTransformer()));
121    
122                    transformersMap.put(
123                            User.class, new TransformerWrapper(new UserJSONTransformer()));
124            }
125    
126            private static boolean _initalized = false;
127    
128    }