1 package org.apache.torque.engine.database.model; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import java.util.ArrayList; 23 import java.util.Collections; 24 import java.util.Iterator; 25 import java.util.List; 26 import java.util.Map; 27 28 import org.apache.commons.collections.map.ListOrderedMap; 29 import org.apache.commons.logging.Log; 30 import org.apache.commons.logging.LogFactory; 31 32 import org.apache.torque.engine.EngineException; 33 34 import org.xml.sax.Attributes; 35 36 /** 37 * Information about indices of a table. 38 * 39 * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a> 40 * @author <a href="mailto:dlr@finemaltcoding.com>Daniel Rall</a> 41 * @author <a href="mailto:monroe@dukece.com>Greg Monroe</a> 42 * @version $Id: Index.java,v 1.1 2007-10-21 07:57:27 abyrne Exp $ 43 */ 44 public class Index 45 { 46 /** Logging class from commons.logging */ 47 private static Log log = LogFactory.getLog(Index.class); 48 /** name of the index */ 49 private String indexName; 50 /** table */ 51 private Table parentTable; 52 /** columns */ 53 private List indexColumns; 54 /** The XML Options specified for this index */ 55 private Map options; 56 57 58 /** 59 * Creates a new instance with default characteristics (no name or 60 * parent table, small column list size allocation, non-unique). 61 */ 62 public Index() 63 { 64 indexColumns = new ArrayList(3); 65 options = Collections.synchronizedMap(new ListOrderedMap()); 66 } 67 68 /** 69 * Creates a new instance for the list of columns composing an 70 * index. Otherwise performs as {@link #Index()}. 71 * 72 * @param table The table this index is associated with. 73 * @param indexColumns The list of {@link 74 * org.apache.torque.engine.database.model.Column} objects which 75 * make up this index. Cannot be empty. 76 * @exception EngineException Error generating name. 77 * @see #Index() 78 */ 79 protected Index(Table table, List indexColumns) 80 throws EngineException 81 { 82 this(); 83 setTable(table); 84 if (!indexColumns.isEmpty()) 85 { 86 this.indexColumns = indexColumns; 87 88 if (log.isDebugEnabled()) 89 { 90 log.debug("Created Index named " + getName() 91 + " with " + indexColumns.size() + " columns"); 92 } 93 } 94 else 95 { 96 throw new EngineException("Cannot create a new Index using an " 97 + "empty list Column object"); 98 } 99 } 100 101 /** 102 * Imports index from an XML specification 103 * 104 * @param attrib the xml attributes 105 */ 106 public void loadFromXML(Attributes attrib) 107 { 108 indexName = attrib.getValue("name"); 109 } 110 111 /** 112 * Returns the uniqueness of this index. 113 * 114 * @return the uniqueness of this index 115 */ 116 public boolean isUnique() 117 { 118 return false; 119 } 120 121 /** 122 * Gets the name of this index. 123 * 124 * @return the name of this index 125 */ 126 public String getName() 127 { 128 return indexName; 129 } 130 131 /** 132 * Set the name of this index. 133 * 134 * @param name the name of this index 135 */ 136 public void setName(String name) 137 { 138 this.indexName = name; 139 } 140 141 /** 142 * Set the parent Table of the index 143 * 144 * @param parent the table 145 */ 146 public void setTable(Table parent) 147 { 148 parentTable = parent; 149 } 150 151 /** 152 * Get the parent Table of the index 153 * 154 * @return the table 155 */ 156 public Table getTable() 157 { 158 return parentTable; 159 } 160 161 /** 162 * Returns the Name of the table the index is in 163 * 164 * @return the name of the table 165 */ 166 public String getTableName() 167 { 168 return parentTable.getName(); 169 } 170 171 /** 172 * Adds a new column to an index. 173 * 174 * @param attrib xml attributes for the column 175 */ 176 public void addColumn(Attributes attrib) 177 { 178 indexColumns.add(attrib.getValue("name")); 179 } 180 181 /** 182 * Return a comma delimited string of the columns which compose this index. 183 * 184 * @return a list of column names 185 */ 186 public String getColumnList() 187 { 188 return Column.makeList(getColumns()); 189 } 190 191 /** 192 * Return the list of local columns. You should not edit this list. 193 * 194 * @return a list of columns 195 */ 196 public List getColumns() 197 { 198 return indexColumns; 199 } 200 201 /** 202 * Returns the list of names of the columns referenced by this 203 * index. Slightly over-allocates the list's buffer (just in case 204 * more elements are going to be added, such as when a name is 205 * being generated). Feel free to modify this list. 206 * 207 * @return a list of column names 208 */ 209 protected List getColumnNames() 210 { 211 List names = new ArrayList(indexColumns.size() + 2); 212 Iterator i = getColumns().iterator(); 213 while (i.hasNext()) 214 { 215 Column c = (Column) i.next(); 216 names.add(c.getName()); 217 } 218 return names; 219 } 220 221 /** 222 * String representation of the index. This is an xml representation. 223 * 224 * @return a xml representation 225 */ 226 public String toString() 227 { 228 StringBuffer result = new StringBuffer(); 229 result.append(" <index name=\"") 230 .append(getName()) 231 .append("\""); 232 233 result.append(">\n"); 234 235 for (int i = 0; i < indexColumns.size(); i++) 236 { 237 result.append(" <index-column name=\"") 238 .append(indexColumns.get(i)) 239 .append("\"/>\n"); 240 } 241 result.append(" </index>\n"); 242 return result.toString(); 243 } 244 245 /** 246 * Add an XML Specified option key/value pair to this element's option set. 247 * 248 * @param key the key of the option. 249 * @param value the value of the option. 250 */ 251 public void addOption(String key, String value) 252 { 253 options.put(key, value); 254 } 255 256 /** 257 * Get the value that was associated with this key in an XML option 258 * element. 259 * 260 * @param key the key of the option. 261 * @return The value for the key or a null. 262 */ 263 public String getOption(String key) 264 { 265 return (String) options.get(key); 266 } 267 268 /** 269 * Gets the full ordered hashtable array of items specified by XML option 270 * statements under this element.<p> 271 * 272 * Note, this is not thread save but since it's only used for 273 * generation which is single threaded, there should be minimum 274 * danger using this in Velocity. 275 * 276 * @return An Map of all options. Will not be null but may be empty. 277 */ 278 public Map getOptions() 279 { 280 return options; 281 } 282 }