1 /* 2 * Copyright (C) 2015, Ivan Motsch <ivan.motsch@bsiag.com> 3 * 4 * This program and the accompanying materials are made available 5 * under the terms of the Eclipse Distribution License v1.0 which 6 * accompanies this distribution, is reproduced below, and is 7 * available at http://www.eclipse.org/org/documents/edl-v10.php 8 * 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials provided 21 * with the distribution. 22 * 23 * - Neither the name of the Eclipse Foundation, Inc. nor the 24 * names of its contributors may be used to endorse or promote 25 * products derived from this software without specific prior 26 * written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 29 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 30 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 31 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 33 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 34 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 35 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 36 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 37 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 38 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 39 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 40 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 41 */ 42 43 package org.eclipse.jgit.attributes; 44 45 import java.util.ArrayList; 46 import java.util.Collection; 47 import java.util.LinkedHashMap; 48 import java.util.Map; 49 50 import org.eclipse.jgit.attributes.Attribute.State; 51 52 /** 53 * Represents a set of attributes for a path 54 * <p> 55 * 56 * @since 4.2 57 */ 58 public final class Attributes { 59 private final Map<String, Attribute> map = new LinkedHashMap<>(); 60 61 /** 62 * Creates a new instance 63 * 64 * @param attributes 65 */ 66 public Attributes(Attribute... attributes) { 67 if (attributes != null) { 68 for (Attribute a : attributes) { 69 put(a); 70 } 71 } 72 } 73 74 /** 75 * @return true if the set does not contain any attributes 76 */ 77 public boolean isEmpty() { 78 return map.isEmpty(); 79 } 80 81 /** 82 * @param key 83 * @return the attribute or null 84 */ 85 public Attribute get(String key) { 86 return map.get(key); 87 } 88 89 /** 90 * @return all attributes 91 */ 92 public Collection<Attribute> getAll() { 93 return new ArrayList<>(map.values()); 94 } 95 96 /** 97 * @param a 98 */ 99 public void put(Attribute a) { 100 map.put(a.getKey(), a); 101 } 102 103 /** 104 * @param key 105 */ 106 public void remove(String key) { 107 map.remove(key); 108 } 109 110 /** 111 * @param key 112 * @return true if the {@link Attributes} contains this key 113 */ 114 public boolean containsKey(String key) { 115 return map.containsKey(key); 116 } 117 118 /** 119 * Returns the state. 120 * 121 * @param key 122 * 123 * @return the state (never returns <code>null</code>) 124 */ 125 public Attribute.State getState(String key) { 126 Attribute a = map.get(key); 127 return a != null ? a.getState() : Attribute.State.UNSPECIFIED; 128 } 129 130 /** 131 * @param key 132 * @return true if the key is {@link State#SET}, false in all other cases 133 */ 134 public boolean isSet(String key) { 135 return (getState(key) == State.SET); 136 } 137 138 /** 139 * @param key 140 * @return true if the key is {@link State#UNSET}, false in all other cases 141 */ 142 public boolean isUnset(String key) { 143 return (getState(key) == State.UNSET); 144 } 145 146 /** 147 * @param key 148 * @return true if the key is {@link State#UNSPECIFIED}, false in all other 149 * cases 150 */ 151 public boolean isUnspecified(String key) { 152 return (getState(key) == State.UNSPECIFIED); 153 } 154 155 /** 156 * @param key 157 * @return true if the key is {@link State#CUSTOM}, false in all other cases 158 * see {@link #getValue(String)} for the value of the key 159 */ 160 public boolean isCustom(String key) { 161 return (getState(key) == State.CUSTOM); 162 } 163 164 /** 165 * @param key 166 * @return the attribute value (may be <code>null</code>) 167 */ 168 public String getValue(String key) { 169 Attribute a = map.get(key); 170 return a != null ? a.getValue() : null; 171 } 172 173 @Override 174 public String toString() { 175 StringBuilder buf = new StringBuilder(); 176 buf.append(getClass().getSimpleName()); 177 buf.append("["); //$NON-NLS-1$ 178 buf.append(" "); //$NON-NLS-1$ 179 for (Attribute a : map.values()) { 180 buf.append(a.toString()); 181 buf.append(" "); //$NON-NLS-1$ 182 } 183 buf.append("]"); //$NON-NLS-1$ 184 return buf.toString(); 185 } 186 187 @Override 188 public int hashCode() { 189 return map.hashCode(); 190 } 191 192 @Override 193 public boolean equals(Object obj) { 194 if (this == obj) 195 return true; 196 if (!(obj instanceof Attributes)) 197 return false; 198 Attributes other = (Attributes) obj; 199 return this.map.equals(other.map); 200 } 201 202 }