Dépôt officiel du code source de l'ERP OpenConcerto
Rev 17 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* A list of related formats.
*
* @author Sylvain CUAZ
*/
public class FormatGroup extends Format {
private final List<Format> formats;
private int formatIndex;
public FormatGroup(Format... formats) {
this(Arrays.asList(formats));
}
/**
* Creates a group, which will try to parse with the given formats. format() is done with the
* first format.
*
* @param formats a List of Format.
* @throws IllegalArgumentException if formats is empty.
*/
public FormatGroup(final List<? extends Format> formats) {
if (formats.size() == 0)
throw new IllegalArgumentException("formats must not be empty");
this.formats = CollectionUtils.toImmutableList(formats);
this.formatIndex = 0;
}
public final List<Format> getFormats() {
return this.formats;
}
@Override
public StringBuffer format(Object newVal, StringBuffer toAppendTo, FieldPosition pos) {
return this.formats.get(this.formatIndex).format(newVal, toAppendTo, pos);
}
@Override
public Object parseObject(String s, ParsePosition pos) {
if (pos.getErrorIndex() >= 0)
throw new IllegalArgumentException(pos + " has en error at " + pos.getErrorIndex());
boolean success = false;
Object tmpRes = null;
final ParsePosition tmpPos = new ParsePosition(pos.getIndex());
final Iterator<? extends Format> iter = this.formats.iterator();
while (iter.hasNext() && !success) {
final Format f = iter.next();
mutateTo(tmpPos, pos);
tmpRes = f.parseObject(s, tmpPos);
success = tmpPos.getIndex() != pos.getIndex() && tmpPos.getErrorIndex() < 0;
}
final Object res;
if (!success) {
// fail with the same as format()
res = this.formats.get(this.formatIndex).parseObject(s, pos);
} else {
res = tmpRes;
mutateTo(pos, tmpPos);
}
return res;
}
private void mutateTo(ParsePosition tmpPos, ParsePosition pos) {
tmpPos.setIndex(pos.getIndex());
tmpPos.setErrorIndex(pos.getErrorIndex());
}
public final int getFormatIndex() {
return this.formatIndex;
}
public final void setFormatIndex(int formatIndex) {
if (formatIndex < 0 || formatIndex >= this.getFormats().size())
throw new IllegalArgumentException(formatIndex + " out of bounds");
this.formatIndex = formatIndex;
}
}