com.alibaba.cobar.manager.util.CobarStringUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.alibaba.cobar.manager.util.CobarStringUtil.java

Source

/*
 * Copyright 1999-2012 Alibaba Group.
 *  
 * Licensed 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.alibaba.cobar.manager.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.web.util.HtmlUtils;

/**
 * (created at 2010-7-26)
 * 
 * @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a>
 * @author haiqing.zhuhq 2011-9-15
 */
public class CobarStringUtil {
    private static final int DEFAULT_INDEX = -1;

    public static String toSqlEscapedString(Object obj) {
        if (obj == null)
            return "NULL";
        String raw = obj.toString();
        StringBuilder sb = new StringBuilder("\'");
        for (int i = 0; i < raw.length(); ++i) {
            char c = raw.charAt(i);
            if ('\\' == c) {
                sb.append("\\\\");
            } else if ('\'' == c) {
                sb.append("\\\'");
            } else {
                sb.append(c);
            }
        }
        sb.append('\'');
        return sb.toString();
    }

    public static String toSqlEscapedObject(Object obj) {
        if (obj == null)
            return "NULL";
        if (obj instanceof String) {
            return toSqlEscapedString(obj);
        } else {
            return String.valueOf(obj);
        }
    }

    /**
     * @return negative number if there is no common start from left side, or
     *         any of the string is empty
     */
    private static int indexOfLastEqualCharacter(String str1, String str2) {
        if (StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2))
            return -1;
        String shortOne = (str1.length() < str2.length()) ? str1 : str2;
        String longOne = (str2 == shortOne) ? str1 : str2;
        final int shortSize = shortOne.length();
        for (int i = 0; i < shortSize; ++i) {
            char cs = shortOne.charAt(i);
            char cl = longOne.charAt(i);
            if (cs != cl)
                return i - 1;
        }
        return shortOne.length() - 1;
    }

    public static String mergeListedStringWithJoin(String[] input, String sep) {
        List<String> rst = mergeListedString(input);
        return StringUtils.join(rst, ",");
    }

    /**
     * e.g. {"mysql_1","mysql_2","mysql_3","mysql_5"} will return
     * {"mysql_$1-3","mysql_5"}<br/>
     * only merge last number
     */
    public static List<String> mergeListedString(String[] input) {
        if (input == null || input.length < 1)
            return Collections.emptyList();
        if (input.length == 1) {
            List<String> rst = new ArrayList<String>(1);
            rst.add(input[0]);
            return rst;
        }
        List<String> list = new ArrayList<String>(input.length);
        for (String str : input)
            list.add(str);
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (StringUtils.equals(o1, o2))
                    return 0;
                if (o1.length() == o2.length())
                    return o1.compareTo(o2);
                return o1.length() < o2.length() ? -1 : 1;
            }
        });

        List<String> rst = new ArrayList<String>();

        String prefix = null;
        Integer from = null;
        Integer to = null;
        String last = list.get(0);
        for (int i = 1; i < list.size(); ++i) {
            String cur = list.get(i);
            if (StringUtils.equals(last, cur))
                continue;
            int commonInd = indexOfLastEqualCharacter(last, cur);

            boolean isCon = false;

            if (commonInd >= 0) {
                String suffixLast = last.substring(1 + commonInd);
                String suffixCur = cur.substring(1 + commonInd);
                try {
                    int il = Integer.parseInt(suffixLast);
                    int ic = Integer.parseInt(suffixCur);
                    if (ic - il == 1)
                        isCon = true;
                } catch (Exception e) {
                }
            }

            if (isCon) {
                if (prefix == null)
                    prefix = last.substring(0, commonInd + 1);
                if (from == null)
                    from = Integer.parseInt(last.substring(commonInd + 1));
                to = Integer.parseInt(cur.substring(commonInd + 1));
            } else if (prefix != null) {
                rst.add(new StringBuilder(prefix).append('$').append(from).append('-').append(to).toString());
                prefix = null;
                from = to = null;
            } else {
                rst.add(last);
            }
            last = cur;
        }

        if (prefix != null) {
            rst.add(new StringBuilder(prefix).append('$').append(from).append('-').append(to).toString());
            prefix = null;
            from = to = null;
        } else {
            rst.add(last);
        }

        return rst;
    }

    public static String htmlEscapedString(String str) {
        if (null != str) {
            return HtmlUtils.htmlEscape(str);
        }
        return null;
    }

    /**
     * <pre>
     * ????????????????? ??src = "offer_group[4]", l='[', r=']'???
     * ?????Piar<String,Integer>("offer", 4);
     * ??src = "offer_group", l='[', r=']'??? 
     * ????Pair<String, Integer>("offer",-1);
     * </pre>
     */
    public static final Pair<String, Integer> splitIndex(String src, char l, char r) {
        if (src == null)
            return null;
        int length = src.length();
        if (length == 0)
            return new Pair<String, Integer>("", DEFAULT_INDEX);
        if (src.charAt(length - 1) != r)
            return new Pair<String, Integer>(src, DEFAULT_INDEX);
        int offset = src.lastIndexOf(l);
        if (offset == -1)
            return new Pair<String, Integer>(src, DEFAULT_INDEX);
        int index = DEFAULT_INDEX;
        try {
            index = Integer.parseInt(src.substring(offset + 1, length - 1));
        } catch (NumberFormatException e) {
            return new Pair<String, Integer>(src, DEFAULT_INDEX);
        }
        return new Pair<String, Integer>(src.substring(0, offset), index);
    }

}