001 /*
002 * The MIT License
003 * Copyright (c) 2012 Microsoft Corporation
004 *
005 * Permission is hereby granted, free of charge, to any person obtaining a copy
006 * of this software and associated documentation files (the "Software"), to deal
007 * in the Software without restriction, including without limitation the rights
008 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
009 * copies of the Software, and to permit persons to whom the Software is
010 * furnished to do so, subject to the following conditions:
011 *
012 * The above copyright notice and this permission notice shall be included in
013 * all copies or substantial portions of the Software.
014 *
015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
020 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
021 * THE SOFTWARE.
022 */
023
024 package microsoft.exchange.webservices.data.property.complex.recurrence;
025
026 import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
027 import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
028 import microsoft.exchange.webservices.data.core.EwsUtilities;
029 import microsoft.exchange.webservices.data.core.XmlElementNames;
030 import microsoft.exchange.webservices.data.core.enumeration.property.time.DayOfTheWeek;
031 import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
032 import microsoft.exchange.webservices.data.core.exception.misc.ArgumentOutOfRangeException;
033 import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
034 import microsoft.exchange.webservices.data.property.complex.ComplexProperty;
035 import org.apache.commons.lang3.StringUtils;
036
037 import javax.xml.stream.XMLStreamException;
038
039 import java.util.ArrayList;
040 import java.util.Iterator;
041 import java.util.List;
042
043 /**
044 * Represents a collection of DayOfTheWeek values.
045 */
046 public final class DayOfTheWeekCollection extends ComplexProperty implements
047 Iterable<DayOfTheWeek> {
048
049 /**
050 * The item.
051 */
052 private List<DayOfTheWeek> items = new ArrayList<DayOfTheWeek>();
053
054 /**
055 * Initializes a new instance of the class.
056 */
057 public DayOfTheWeekCollection() {
058 }
059
060 /**
061 * Convert to string.
062 *
063 * @param separator the separator
064 * @return String representation of collection.
065 */
066 private String toString(String separator) {
067 if (this.getCount() == 0) {
068 return "";
069 } else {
070 // String[] daysOfTheWeekArray = new String[this.getCount()];
071 StringBuilder daysOfTheWeekstr = new StringBuilder();
072
073 for (int i = 0; i < this.getCount(); i++) {
074 // daysOfTheWeekArray[i] = item.get(i).toString();
075 if (daysOfTheWeekstr.length() == 0) {
076 daysOfTheWeekstr.append(items.get(i).toString());
077 } else {
078 daysOfTheWeekstr.append(separator);
079 daysOfTheWeekstr.append(items.get(i).toString());
080 }
081 }
082
083 return daysOfTheWeekstr.toString();
084 }
085 }
086
087 /**
088 * Loads from XML.
089 *
090 * @param reader The reader.
091 * @param xmlElementName Name of the XML element.
092 * @throws Exception the exception
093 */
094 public void loadFromXml(EwsServiceXmlReader reader, String xmlElementName)
095 throws Exception {
096 reader.ensureCurrentNodeIsStartElement(XmlNamespace.Types,
097 xmlElementName);
098 EwsUtilities.parseEnumValueList(DayOfTheWeek.class, this.items, reader.readElementValue(), ' ');
099 }
100
101 /**
102 * Gets the request version.
103 *
104 * @param writer the writer
105 * @param xmlElementName the xml element name
106 * @throws XMLStreamException the XML stream exception
107 * @throws ServiceXmlSerializationException the service xml serialization exception
108 */
109 @Override public void writeToXml(EwsServiceXmlWriter writer, String xmlElementName)
110 throws XMLStreamException, ServiceXmlSerializationException {
111 String daysOfWeekAsString = this.toString(" ");
112
113 if (!StringUtils.isEmpty(daysOfWeekAsString)) {
114 writer.writeElementValue(XmlNamespace.Types,
115 XmlElementNames.DaysOfWeek, daysOfWeekAsString);
116 }
117 }
118
119 /**
120 * Builds string representation of the collection.
121 *
122 * @return A comma-delimited string representing the collection.
123 */
124 @Override
125 public String toString() {
126 return this.toString(",");
127 }
128
129 /**
130 * Adds a day to the collection if it is not already present.
131 *
132 * @param dayOfTheWeek The day to add.
133 */
134 public void add(DayOfTheWeek dayOfTheWeek) {
135 if (!this.items.contains(dayOfTheWeek)) {
136 this.items.add(dayOfTheWeek);
137 this.changed();
138 }
139 }
140
141 /**
142 * Adds multiple days to the collection if they are not already present.
143 *
144 * @param daysOfTheWeek The days to add.
145 */
146 public void addRange(Iterator<DayOfTheWeek> daysOfTheWeek) {
147 while (daysOfTheWeek.hasNext()) {
148 this.add(daysOfTheWeek.next());
149 }
150 }
151
152 /**
153 * Clears the collection.
154 */
155 public void clear() {
156 if (this.getCount() > 0) {
157 this.items.clear();
158 this.changed();
159 }
160 }
161
162 /**
163 * Remove a specific day from the collection.
164 *
165 * @param dayOfTheWeek the day of the week
166 * @return True if the day was removed from the collection, false otherwise.
167 */
168 public boolean remove(DayOfTheWeek dayOfTheWeek) {
169 boolean result = this.items.remove(dayOfTheWeek);
170
171 if (result) {
172 this.changed();
173 }
174 return result;
175 }
176
177 /**
178 * Removes the day at a specific index.
179 *
180 * @param index the index
181 * @throws ArgumentOutOfRangeException the argument out of range exception
182 */
183 public void removeAt(int index) throws ArgumentOutOfRangeException {
184 if (index < 0 || index >= this.getCount()) {
185 throw new ArgumentOutOfRangeException("index", "index is out of range.");
186 }
187
188 this.items.remove(index);
189 this.changed();
190 }
191
192 /**
193 * Gets the DayOfTheWeek at a specific index in the collection.
194 *
195 * @param index the index
196 * @return DayOfTheWeek at index
197 */
198 public DayOfTheWeek getWeekCollectionAtIndex(int index) {
199 return this.items.get(index);
200 }
201
202 /**
203 * Gets the number of days in the collection.
204 *
205 * @return the count
206 */
207 public int getCount() {
208 return this.items.size();
209 }
210
211 /*
212 * (non-Javadoc)
213 *
214 * @see java.lang.Iterable#iterator()
215 */
216 @Override
217 public Iterator<DayOfTheWeek> iterator() {
218 return this.items.iterator();
219 }
220
221 }