CloudTVURLBuilder

欸..嚴格說來這不是一個設計模式, 當初寫這個CloudTVURLBuilder的關係, 是因為我們要組合HTTP Parameter, 然而我們有數十種不同組合的 Parameter, 若用土法煉鋼的方式, 那這程式會變得很醜, 於是我就創造了這個Builder, 於是使用端再也不用去煩惱要怎麼組合http parameter了, 他只要會使用這個builder跟丟入參數即可。

public class CloudTVURLBuilder {
    private HashMap<CloudTVParams, String> mCloudTVParamsHashMap;

    private HttpMethod mMethod = HttpMethod.GET;
    private CloudTVUrl mCloudTVUrl;

    private HashMap<String, String> mParameterHashMap;

    public CloudTVURLBuilder(CloudTVUrl cloudTVUrl, HttpMethod httpMethod) {
        init();
        if (UserSingleton.getInstance() != null && httpMethod == HttpMethod.POST)
            setValue(CloudTVParams.KEY_USER_ID, UserSingleton.getInstance().getId());
        mMethod = httpMethod;
        mCloudTVUrl = cloudTVUrl;
    }

    private void initHashMap() {
        mParameterHashMap = new HashMap<>();
        mCloudTVParamsHashMap = new HashMap<>();
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_VERSION, "version");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_SP_ID, "spId");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_USER_ID, "userId");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_CHANNEL_ID, "channelId");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_PAGE, "page");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_TYPE, "type");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_PLAY_DATE, "playDate");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_MENU_CODE, "menuCode");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_START_TIME, "startTime");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_END_TIME, "endTime");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_EPG_NAME, "epgName");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_EPG_ID, "epgId");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_EPISODE_NUMBER, "episodeNumber");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_PROGRAM_ID, "programId");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_BOOKING_TYPE, "bookingType");
        mCloudTVParamsHashMap.put(CloudTVParams.KEY_PHONE, "phone");
    }

    private void init() {
        initHashMap();
        setValue(CloudTVParams.KEY_VERSION, Constants.WEB_SERVICE_CLOUDTV_VERSION);
        setValue(CloudTVParams.KEY_TYPE, Constants.WEB_SERVICE_CLOUDTV_TYPE);
        setValue(CloudTVParams.KEY_SP_ID, Constants.WEB_SERVICE_CLOUDTV_SPLD);
    }

    public String getParamsNameAndValue() {
        StringBuilder params = new StringBuilder();
        Iterator iterator = mParameterHashMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry mapEntry = (Map.Entry) iterator.next();
            params.append(mapEntry.getKey());
            params.append("=");
            params.append(mapEntry.getValue());
            if (iterator.hasNext())
                params.append("&");
        }
        return params.toString();
    }

    public String getURLandMethod() {
        String prefix = "http://" + Constants.WEB_SERVICE_CLOUDTV_SERVER_IP + ":" + Constants.WEB_SERVICE_CLOUDTV_SERVER_PORT;
        String method = enumToString(mCloudTVUrl);
        return prefix + method;
    }

    public HttpMethod getHTTPMethod() {
        return mMethod;
    }

    public String getValue(CloudTVParams key) {
        if (!mCloudTVParamsHashMap.containsKey(key))
            return "";
        String paramName = mCloudTVParamsHashMap.get(key);
        if (!mParameterHashMap.containsKey(paramName))
            return "";
        return mParameterHashMap.get(paramName);
    }

    public boolean setValue(CloudTVParams key, String value) {
        if (!mCloudTVParamsHashMap.containsKey(key))
            return false;
        String paramName = mCloudTVParamsHashMap.get(key);
        mParameterHashMap.put(paramName, value);
        return false;
    }

    public String enumToString(CloudTVUrl cloudTVUrl) {
        String cloudTVUrlString;
        switch (cloudTVUrl) {
            case BOOKING_CHANNEL_DAY_LIST:
                cloudTVUrlString = "/cloudeer/rest/dev/user/booking/channel/day/list";
                break;
            case BOOKING_CHANNEL_LIST:
                cloudTVUrlString = "/cloudeer/rest/dev/user/booking/channel/list";
                break;
            case BOOKING_CHANNEL_ADD:
                cloudTVUrlString = "/cloudeer/rest/dev/user/booking/channel/add";
                break;
            case CHANNEL_LIST:
                cloudTVUrlString = "/cloudeer/rest/dev/channel/list";
                break;
            case CHANNEL_EPG:
                cloudTVUrlString = "/cloudeer/rest/dev/channel/epg";
                break;
            case CHANNEL_CATEGORY:
                cloudTVUrlString = "/cloudeer/rest/dev/channel/category";
                break;
            case COLLECTION_CHANNEL_LIST:
                cloudTVUrlString = "/cloudeer/rest/dev/user/collection/channel/list";
                break;
            case COLLECTION_CHANNEL_CHECK:
                cloudTVUrlString = "/cloudeer/rest/dev/user/collection/channel/check";
                break;
            case COLLECTION_CHANNEL_ADD:
                cloudTVUrlString = "/cloudeer/rest/dev/user/collection/channel/add";
                break;
            case COLLECTION_CHANNEL_DELETE:
                cloudTVUrlString = "/cloudeer/rest/dev/user/collection/channel/delete";
                break;
            case WATCHING_ADD:
                cloudTVUrlString = "/cloudeer/rest/dev/user/watchHistory/add";
                break;
            case QUERY_FRIEND:
                cloudTVUrlString = "/plugins/push/user";
                break;
            default:
                cloudTVUrlString = "";
                break;
        }
        return cloudTVUrlString;
    }

    public enum CloudTVParams {
        KEY_VERSION,
        KEY_SP_ID,
        KEY_USER_ID,
        KEY_CHANNEL_ID,
        KEY_PAGE, KEY_TYPE,
        KEY_PLAY_DATE,
        KEY_MENU_CODE,
        KEY_START_TIME,
        KEY_END_TIME,
        KEY_EPG_NAME,
        KEY_EPG_ID,
        KEY_EPISODE_NUMBER,
        KEY_PROGRAM_ID,
        KEY_PHONE,
        KEY_BOOKING_TYPE
    }

    public enum CloudTVUrl {
        // Booking
        BOOKING_CHANNEL_ADD, BOOKING_CHANNEL_LIST, BOOKING_CHANNEL_DAY_LIST,
        // Channel
        CHANNEL_CATEGORY, CHANNEL_EPG, CHANNEL_LIST,
        // Watching History
        WATCHING_ADD,
        // Friends
        QUERY_FRIEND,
        // Collection
        COLLECTION_CHANNEL_LIST, COLLECTION_CHANNEL_CHECK, COLLECTION_CHANNEL_ADD, COLLECTION_CHANNEL_DELETE
    }

    public enum HttpMethod {
        POST, GET
    }

}

results matching ""

    No results matching ""