// Path: src/main/java/io/openio/sds/common/Check.java
// public static void checkArgument(boolean condition, String msg) {
//     if (!condition)
//         throw new IllegalArgumentException(msg);
// }
// 
// Path: src/main/java/io/openio/sds/common/OioConstants.java
// public static final Charset OIO_CHARSET = Charset.forName("UTF-8");
// 
// Path: src/main/java/io/openio/sds/common/Strings.java
// public static boolean nullOrEmpty(String string) {
//     return null == string || 0 == string.length();
// }
// 
// Path: src/main/java/io/openio/sds/common/Hash.java
// public class Hash {
// 
// 	private MessageDigest md;
// 
// 	private Hash(MessageDigest md) {
// 		this.md = md;
// 	}
// 
// 	/**
// 	 * Returns an {@link Hash} instance ready to compute a md5 hash
// 	 * 
// 	 * @return an {@link Hash} instance ready to compute a md5 hash
// 	 */
// 	public static Hash md5() {
// 		try {
// 			return new Hash(MessageDigest.getInstance("MD5"));
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	/**
// 	 * Returns an {@link Hash} instance ready to compute a md5 hash
// 	 * 
// 	 * @return an {@link Hash} instance ready to compute a md5 hash
// 	 */
// 	public static Hash sha256() {
// 		try {
// 			return new Hash(MessageDigest.getInstance("SHA-256"));
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	/**
// 	 * Updates the current hash with the specified bytes
// 	 * 
// 	 * @param bytes
// 	 *            the bytes to add
// 	 * @return this
// 	 */
// 	public Hash putBytes(byte[] bytes) {
// 		this.md.update(bytes);
// 		return this;
// 	}
// 
// 	/**
// 	 * Completes the current hash computation
// 	 * 
// 	 * @return an {@link Hex} instance handling the computed hash
// 	 */
// 	public Hex hash() {
// 		return Hex.fromBytes(this.md.digest());
// 	}
// 
// 	/**
// 	 * Add a final update to the current hash and completes it
// 	 * 
// 	 * @param bytes
// 	 *            the final bytes to add
// 	 * @return an {@link Hex} instance handling the computed hash
// 	 */
// 	public Hex hashBytes(byte[] bytes) {
// 		return Hex.fromBytes(this.md.digest(bytes));
// 	}
// }
// 
// Path: src/main/java/io/openio/sds/common/MoreObjects.java
// public class MoreObjects {
// 
//     public static ToStringHelper toStringHelper(String name) {
//         return new ToStringHelper(name);
//     }
// 
//     public static ToStringHelper toStringHelper(Object o) {
//         return new ToStringHelper(o.getClass().getSimpleName());
//     }
// 
//     public static class ToStringHelper {
// 
//         private String name;
//         private HashMap<String, Object> fields = new HashMap<String, Object>();
//         private boolean skipNulls = false;
// 
//         private ToStringHelper(String name) {
//             this.name = name;
//         }
// 
//         public ToStringHelper add(String key, Object value) {
//             if (null != key && (null != value || !skipNulls))
//                 fields.put(key, value);
//             return this;
//         }
//         
//         public ToStringHelper omitNullValues(){
//             this.skipNulls = true;
//             return this;
//         }
// 
//         @Override
//         public String toString() {
//             StringBuilder sb = new StringBuilder(name)
//                     .append("={");
//             for (Entry<String, Object> e : fields.entrySet()) {
//                 sb.append("\"")
//                 .append(e.getKey())
//                 .append("\":\"")
//                 .append(e.getValue())
//                 .append("\",");
//             }
// 
//             return sb.replace(sb.length() - 1, sb.length(), "}")
//                     .toString();
//         }
//     }
// }


import static io.openio.sds.common.Check.checkArgument;
import static io.openio.sds.common.OioConstants.OIO_CHARSET;
import static io.openio.sds.common.Strings.nullOrEmpty;
import io.openio.sds.common.Hash;
import io.openio.sds.common.MoreObjects;
package io.openio.sds.models;


/**
 * 
 *
 *
 */
public class OioUrl {

    private static final byte[] BACK_ZERO = { '\0' };

    private String ns;
    private String account;
    private String container;
    private String cid;
    private String object;

    private OioUrl(String ns, String account, String container, String cid,
            String object) {
        this.ns = ns;
        this.account = account;
        this.container = container;
        this.cid = cid;
        this.object = object;
    }
    
    
    
    public static OioUrl url(String account, String container) {
        return url(account, container, null);
    }

    public static OioUrl url(String account, String container,
            String object) {
        checkArgument(!nullOrEmpty(account),
                "account cannot be null or empty");
// Path: src/main/java/io/openio/sds/common/Check.java
// public static void checkArgument(boolean condition, String msg) {
//     if (!condition)
//         throw new IllegalArgumentException(msg);
// }
// 
// Path: src/main/java/io/openio/sds/common/OioConstants.java
// public static final Charset OIO_CHARSET = Charset.forName("UTF-8");
// 
// Path: src/main/java/io/openio/sds/common/Strings.java
// public static boolean nullOrEmpty(String string) {
//     return null == string || 0 == string.length();
// }
// 
// Path: src/main/java/io/openio/sds/common/Hash.java
// public class Hash {
// 
// 	private MessageDigest md;
// 
// 	private Hash(MessageDigest md) {
// 		this.md = md;
// 	}
// 
// 	/**
// 	 * Returns an {@link Hash} instance ready to compute a md5 hash
// 	 * 
// 	 * @return an {@link Hash} instance ready to compute a md5 hash
// 	 */
// 	public static Hash md5() {
// 		try {
// 			return new Hash(MessageDigest.getInstance("MD5"));
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	/**
// 	 * Returns an {@link Hash} instance ready to compute a md5 hash
// 	 * 
// 	 * @return an {@link Hash} instance ready to compute a md5 hash
// 	 */
// 	public static Hash sha256() {
// 		try {
// 			return new Hash(MessageDigest.getInstance("SHA-256"));
// 		} catch (NoSuchAlgorithmException e) {
// 			throw new RuntimeException(e);
// 		}
// 	}
// 
// 	/**
// 	 * Updates the current hash with the specified bytes
// 	 * 
// 	 * @param bytes
// 	 *            the bytes to add
// 	 * @return this
// 	 */
// 	public Hash putBytes(byte[] bytes) {
// 		this.md.update(bytes);
// 		return this;
// 	}
// 
// 	/**
// 	 * Completes the current hash computation
// 	 * 
// 	 * @return an {@link Hex} instance handling the computed hash
// 	 */
// 	public Hex hash() {
// 		return Hex.fromBytes(this.md.digest());
// 	}
// 
// 	/**
// 	 * Add a final update to the current hash and completes it
// 	 * 
// 	 * @param bytes
// 	 *            the final bytes to add
// 	 * @return an {@link Hex} instance handling the computed hash
// 	 */
// 	public Hex hashBytes(byte[] bytes) {
// 		return Hex.fromBytes(this.md.digest(bytes));
// 	}
// }
// 
// Path: src/main/java/io/openio/sds/common/MoreObjects.java
// public class MoreObjects {
// 
//     public static ToStringHelper toStringHelper(String name) {
//         return new ToStringHelper(name);
//     }
// 
//     public static ToStringHelper toStringHelper(Object o) {
//         return new ToStringHelper(o.getClass().getSimpleName());
//     }
// 
//     public static class ToStringHelper {
// 
//         private String name;
//         private HashMap<String, Object> fields = new HashMap<String, Object>();
//         private boolean skipNulls = false;
// 
//         private ToStringHelper(String name) {
//             this.name = name;
//         }
// 
//         public ToStringHelper add(String key, Object value) {
//             if (null != key && (null != value || !skipNulls))
//                 fields.put(key, value);
//             return this;
//         }
//         
//         public ToStringHelper omitNullValues(){
//             this.skipNulls = true;
//             return this;
//         }
// 
//         @Override
//         public String toString() {
//             StringBuilder sb = new StringBuilder(name)
//                     .append("={");
//             for (Entry<String, Object> e : fields.entrySet()) {
//                 sb.append("\"")
//                 .append(e.getKey())
//                 .append("\":\"")
//                 .append(e.getValue())
//                 .append("\",");
//             }
// 
//             return sb.replace(sb.length() - 1, sb.length(), "}")
//                     .toString();
//         }
//     }
// }


// Path: src/main/java/io/openio/sds/models/OioUrl.java
import static io.openio.sds.common.Check.checkArgument;
import static io.openio.sds.common.OioConstants.OIO_CHARSET;
import static io.openio.sds.common.Strings.nullOrEmpty;
import io.openio.sds.common.Hash;
import io.openio.sds.common.MoreObjects;

package io.openio.sds.models;


/**
 * 
 *
 *
 */
public class OioUrl {

    private static final byte[] BACK_ZERO = { '\0' };

    private String ns;
    private String account;
    private String container;
    private String cid;
    private String object;

    private OioUrl(String ns, String account, String container, String cid,
            String object) {
        this.ns = ns;
        this.account = account;
        this.container = container;
        this.cid = cid;
        this.object = object;
    }
    
    
    
    public static OioUrl url(String account, String container) {
        return url(account, container, null);
    }

    public static OioUrl url(String account, String container,
            String object) {
        checkArgument(!nullOrEmpty(account),
                "account cannot be null or empty");
        checkArgument(!nullOrEmpty(container),