package com.nifty.cloud.ncs.services.validator;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import com.nifty.cloud.ncs.NiftyCloudClientException;
import com.nifty.cloud.ncs.http.HttpClient;

/**
 * オブジェクト名の妥当性をチェックします。
 *
 */
public class ObjectNameValidator
{
	/**
	 * object名の妥当性確認を行います。
	 * object名が不正な場合、不正理由を示すエラーメッセージのリストを返却します。
	 *
	 * @param value
	 * 			object名
	 * @return エラー理由を示すエラーメッセージのリスト
	 */
    public static List<ValidationMessage> validate(String value)
    {
        // execute validation.
        List<ValidationMessage> list = new ArrayList<ValidationMessage>();

		if (value == null) {
			addMessage(list, "Object name can not be null.", value);
			return (list);
		}

        String objectName = value.trim();

        try {
        	if (objectName.getBytes(HttpClient.DEFAULT_ENCODING).length > 1024) {
        		addMessage(list, "Object name must be shorter than 1024 characters long.", value);
        	}
        } catch (UnsupportedEncodingException e) {
        	throw (new NiftyCloudClientException("Can't encode " + value, e));
        }

		if (objectName.equals("..")) {
			addMessage(list, "Object name must not be repeated dots.", value);
		}

		if (objectName.equals(".")) {
			addMessage(list, "Object name must not be dot.", value);
		}

		if (objectName.startsWith("/")) {
			addMessage(list, "Object name must not be starts with '/'.", value);
		}

        return (list);
    }

	/**
	 *
	 * @param list
	 * @param message
	 * @param path
	 * @param value
	 */
	private static void addMessage(List<ValidationMessage> list, String message, Object value)
	{
		ValidationMessage validationMessage = new ValidationMessage(message, value);
		list.add(validationMessage);
	}

}
