Package com.bj58.spat.gaea.serializer.component

Source Code of com.bj58.spat.gaea.serializer.component.TypeMap

/*
*  Copyright Beijing 58 Information Technology Co.,Ltd.
*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you 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 com.bj58.spat.gaea.serializer.component;

import java.util.Map;
import java.util.Set;
import java.util.Date;
import java.util.List;
import java.util.HashMap;
import java.util.ArrayList;
import java.io.IOException;
import java.math.BigDecimal;
import java.lang.reflect.Array;
import java.net.URISyntaxException;
import java.net.MalformedURLException;

import com.bj58.spat.gaea.serializer.classes.DBNull;
import com.bj58.spat.gaea.serializer.classes.GKeyValuePair;
import com.bj58.spat.gaea.serializer.component.annotation.GaeaSerializable;
import com.bj58.spat.gaea.serializer.component.exception.DisallowedSerializeException;
import com.bj58.spat.gaea.serializer.component.helper.StrHelper;
import com.bj58.spat.gaea.serializer.component.ClassItem;

/**
* TypeMap
*
* @author Service Platform Architecture Team (spat@58.com)
*/
public final class TypeMap {

    private static Map<Class, ClassItem> TypeIdMap = new HashMap<Class, ClassItem>();
    private static Map<Integer, ClassItem> IdTypeMap = new HashMap<Integer, ClassItem>();

    public static void InitTypeMap() {
        TypeIdMap.clear();
        IdTypeMap.clear();
        ArrayList<ClassItem> ClassList = new ArrayList<ClassItem>();
        ClassList.add(new ClassItem(1, DBNull.class));
        ClassList.add(new ClassItem(2, Object.class));
        ClassList.add(new ClassItem(3, Boolean.class, boolean.class));
        ClassList.add(new ClassItem(4, Character.class, char.class));
        ClassList.add(new ClassItem(5, Byte.class, byte.class));
        ClassList.add(new ClassItem(7, Short.class, short.class));
        ClassList.add(new ClassItem(9, Integer.class, int.class));
        ClassList.add(new ClassItem(11, Long.class, long.class));
        ClassList.add(new ClassItem(13, Float.class, float.class));
        ClassList.add(new ClassItem(14, Double.class, double.class));
        ClassList.add(new ClassItem(15, BigDecimal.class));
        ClassList.add(new ClassItem(16, Date.class, java.sql.Date.class, java.sql.Time.class, java.sql.Timestamp.class));
        ClassList.add(new ClassItem(18, String.class));
        ClassList.add(new ClassItem(19, List.class));
        ClassList.add(new ClassItem(22, GKeyValuePair.class));
        ClassList.add(new ClassItem(23, Array.class));
        ClassList.add(new ClassItem(24, Map.class));
        for (ClassItem item : ClassList) {
            int id = item.getTypeId();
            Class[] types = item.getTypes();
            for (Class c : types) {
                TypeIdMap.put(c, item);
            }
            IdTypeMap.put(id, item);
        }

        String scanType = System.getProperty("gaea.serializer.scantype");
        if (scanType != null && scanType.equals("asyn")) {
            Thread th = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Scan jar files begin!");
                    try {
                        LoadCustmeType();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    System.out.println("Scan jar files completed!");
                }
            });
            th.start();
        } else {
            System.out.println("Scan jar files begin!");
            try {
                LoadCustmeType();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            System.out.println("Scan jar files completed!");
        }
    }

    private static void LoadCustmeType() throws URISyntaxException, IOException, MalformedURLException, ClassNotFoundException {
        ClassScaner cs = new ClassScaner();
        String basePakage = System.getProperty("gaea.serializer.basepakage");
        if (basePakage == null) {
            basePakage = StrHelper.EmptyString;
        }
        Set<Class> classes = cs.scan(basePakage.split(";"));
        for (Class c : classes) {
            System.out.println("scaning " + c.getPackage().getName() + "." + c.getName());
            try {
                GaeaSerializable ann = (GaeaSerializable) c.getAnnotation(GaeaSerializable.class);
                if (ann != null) {
                    String name = ann.name();
                    if (name.equals(StrHelper.EmptyString)) {
                        name = c.getSimpleName();
                    }
                    int typeId = StrHelper.GetHashcode(name);
                    TypeIdMap.put(c, new ClassItem(typeId, c));
                    IdTypeMap.put(typeId, new ClassItem(typeId, c));
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static Class getClass(int typeId) {
        /*****************兼容之前版本***********************/
        if(typeId==6){
            typeId =5;
        }else if(typeId==20 || typeId == 21){
            typeId = 19;
        }else if(typeId == 25){
            typeId = 24;
        }
        /**************************************************/
        ClassItem ci = IdTypeMap.get(typeId);
        if (ci != null) {
            return ci.getType();
        }
        return null;
    }

    public static int getTypeId(Class type) throws DisallowedSerializeException {
        int typeId = 0;
        if (type.isArray()) {
            type = Array.class;
        } else if (Map.class.isAssignableFrom(type)) {
            type = Map.class;
        } else if (List.class.isAssignableFrom(type)) {
            type = List.class;
        }
        ClassItem ci = TypeIdMap.get(type);
        if (ci != null) {
            typeId = ci.getTypeId();
        } else {
            GaeaSerializable ann = (GaeaSerializable) type.getAnnotation(GaeaSerializable.class);
            if (ann == null) {
                throw new DisallowedSerializeException(type);
            }
            String name = ann.name();
            if (name.equals(StrHelper.EmptyString)) {
                name = type.getSimpleName();
            }
            typeId = StrHelper.GetHashcode(name);
            setTypeMap(type, typeId);
        }
        return typeId;
    }

    public static void setTypeMap(Class type, int typeId) {
        ClassItem ci = new ClassItem(typeId, type);
        TypeIdMap.put(type, ci);
        IdTypeMap.put(typeId, ci);
    }
}

class ClassItem {

    private Class[] Types;
    private int TypeId;

    public ClassItem(int typeids, Class... types) {
        Types = types;
        TypeId = typeids;
    }

    public Class getType() {
        return Types[0];
    }

    public Class[] getTypes() {
        return Types;
    }

    public int getTypeId() {
        return TypeId;
    }
}
TOP

Related Classes of com.bj58.spat.gaea.serializer.component.TypeMap

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.