/* * Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved * http://www.griddynamics.com * * This library is free software; you can redistribute it and/or modify it under the terms of * the Apache License; either * version 2.0 of the License, or any later version. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.griddynamics.jagger.storage; import java.util.List; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.ImmutableList; /** * Presents tree-structured namespace. * * @author Mairbek Khadikov * */ public class Namespace { private static final String SEPARATOR = "/"; private final List<String> values; public static Namespace root() { return of(Lists.<String> newArrayList()); } public static Namespace of(List<String> values) { return new Namespace(values); } public static Namespace of(String... values) { return of(Lists.newArrayList(values)); } private Namespace(List<String> values) { this.values = values; } public List<String> getValues() { return values; } public Namespace child(List<String> values) { ImmutableList<String> child = ImmutableList.<String>builder().addAll(this.values).addAll(values).build(); return Namespace.of(child); } public Namespace child(String... values) { return child(Lists.newArrayList(values)); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((values == null) ? 0 : values.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Namespace other = (Namespace) obj; if (values == null) { if (other.values != null) return false; } else if (!values.equals(other.values)) return false; return true; } @Override public String toString() { if (values.isEmpty()) { return SEPARATOR; } return Joiner.on(SEPARATOR).join(values); } }