1:
45:
46: package ;
47:
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53:
54: import ;
55: import ;
56: import ;
57:
58:
65: public class DefaultIntervalCategoryDataset extends AbstractSeriesDataset
66: implements IntervalCategoryDataset {
67:
68:
69: private Comparable[] seriesKeys;
70:
71:
72: private Comparable[] categoryKeys;
73:
74:
75: private Number[][] startData;
76:
77:
78: private Number[][] endData;
79:
80:
86: public DefaultIntervalCategoryDataset(double[][] starts, double[][] ends) {
87: this(DataUtilities.createNumberArray2D(starts),
88: DataUtilities.createNumberArray2D(ends));
89: }
90:
91:
102: public DefaultIntervalCategoryDataset(Number[][] starts, Number[][] ends) {
103: this(null, null, starts, ends);
104: }
105:
106:
117: public DefaultIntervalCategoryDataset(String[] seriesNames,
118: Number[][] starts,
119: Number[][] ends) {
120:
121: this(seriesNames, null, starts, ends);
122:
123: }
124:
125:
135: public DefaultIntervalCategoryDataset(Comparable[] seriesKeys,
136: Comparable[] categoryKeys,
137: Number[][] starts,
138: Number[][] ends) {
139:
140: this.startData = starts;
141: this.endData = ends;
142:
143: if (starts != null && ends != null) {
144:
145: String baseName = "org.jfree.data.resources.DataPackageResources";
146: ResourceBundle resources = ResourceBundle.getBundle(baseName);
147:
148: int seriesCount = starts.length;
149: if (seriesCount != ends.length) {
150: String errMsg = "DefaultIntervalCategoryDataset: the number "
151: + "of series in the start value dataset does "
152: + "not match the number of series in the end "
153: + "value dataset.";
154: throw new IllegalArgumentException(errMsg);
155: }
156: if (seriesCount > 0) {
157:
158:
159: if (seriesKeys != null) {
160:
161: if (seriesKeys.length != seriesCount) {
162: throw new IllegalArgumentException(
163: "The number of series keys does not "
164: + "match the number of series in the data.");
165: }
166:
167: this.seriesKeys = seriesKeys;
168: }
169: else {
170: String prefix = resources.getString(
171: "series.default-prefix") + " ";
172: this.seriesKeys = generateKeys(seriesCount, prefix);
173: }
174:
175:
176: int categoryCount = starts[0].length;
177: if (categoryCount != ends[0].length) {
178: String errMsg = "DefaultIntervalCategoryDataset: the "
179: + "number of categories in the start value "
180: + "dataset does not match the number of "
181: + "categories in the end value dataset.";
182: throw new IllegalArgumentException(errMsg);
183: }
184: if (categoryKeys != null) {
185: if (categoryKeys.length != categoryCount) {
186: throw new IllegalArgumentException(
187: "The number of category keys does not match "
188: + "the number of categories in the data.");
189: }
190: this.categoryKeys = categoryKeys;
191: }
192: else {
193: String prefix = resources.getString(
194: "categories.default-prefix") + " ";
195: this.categoryKeys = generateKeys(categoryCount, prefix);
196: }
197:
198: }
199: else {
200: this.seriesKeys = null;
201: this.categoryKeys = null;
202: }
203: }
204:
205: }
206:
207:
215: public int getSeriesCount() {
216: int result = 0;
217: if (this.startData != null) {
218: result = this.startData.length;
219: }
220: return result;
221: }
222:
223:
233: public int getSeriesIndex(Comparable seriesKey) {
234: int result = -1;
235: for (int i = 0; i < this.seriesKeys.length; i++) {
236: if (seriesKey.equals(this.seriesKeys[i])) {
237: result = i;
238: break;
239: }
240: }
241: return result;
242: }
243:
244:
253: public Comparable getSeriesKey(int series) {
254: if ((series >= getSeriesCount()) || (series < 0)) {
255: throw new IllegalArgumentException("No such series : " + series);
256: }
257: return this.seriesKeys[series];
258: }
259:
260:
269: public void setSeriesKeys(Comparable[] seriesKeys) {
270: if (seriesKeys == null) {
271: throw new IllegalArgumentException("Null 'seriesKeys' argument.");
272: }
273: if (seriesKeys.length != getSeriesCount()) {
274: throw new IllegalArgumentException(
275: "The number of series keys does not match the data.");
276: }
277: this.seriesKeys = seriesKeys;
278: fireDatasetChanged();
279: }
280:
281:
288: public int getCategoryCount() {
289: int result = 0;
290: if (this.startData != null) {
291: if (getSeriesCount() > 0) {
292: result = this.startData[0].length;
293: }
294: }
295: return result;
296: }
297:
298:
306: public List getColumnKeys() {
307:
308:
309: if (this.categoryKeys == null) {
310: return new ArrayList();
311: }
312: else {
313: return Collections.unmodifiableList(Arrays.asList(
314: this.categoryKeys));
315: }
316: }
317:
318:
327: public void setCategoryKeys(Comparable[] categoryKeys) {
328: if (categoryKeys == null) {
329: throw new IllegalArgumentException("Null 'categoryKeys' argument.");
330: }
331: if (categoryKeys.length != this.startData[0].length) {
332: throw new IllegalArgumentException(
333: "The number of categories does not match the data.");
334: }
335: for (int i = 0; i < categoryKeys.length; i++) {
336: if (categoryKeys[i] == null) {
337: throw new IllegalArgumentException(
338: "DefaultIntervalCategoryDataset.setCategoryKeys(): "
339: + "null category not permitted.");
340: }
341: }
342: this.categoryKeys = categoryKeys;
343: fireDatasetChanged();
344: }
345:
346:
359: public Number getValue(Comparable series, Comparable category) {
360: int seriesIndex = getSeriesIndex(series);
361: if (seriesIndex < 0) {
362: throw new UnknownKeyException("Unknown 'series' key.");
363: }
364: int itemIndex = getColumnIndex(category);
365: if (itemIndex < 0) {
366: throw new UnknownKeyException("Unknown 'category' key.");
367: }
368: return getValue(seriesIndex, itemIndex);
369: }
370:
371:
384: public Number getValue(int series, int category) {
385: return getEndValue(series, category);
386: }
387:
388:
399: public Number getStartValue(Comparable series, Comparable category) {
400: int seriesIndex = getSeriesIndex(series);
401: if (seriesIndex < 0) {
402: throw new UnknownKeyException("Unknown 'series' key.");
403: }
404: int itemIndex = getColumnIndex(category);
405: if (itemIndex < 0) {
406: throw new UnknownKeyException("Unknown 'category' key.");
407: }
408: return getStartValue(seriesIndex, itemIndex);
409: }
410:
411:
422: public Number getStartValue(int series, int category) {
423:
424:
425: if ((series < 0) || (series >= getSeriesCount())) {
426: throw new IllegalArgumentException(
427: "DefaultIntervalCategoryDataset.getValue(): "
428: + "series index out of range.");
429: }
430:
431: if ((category < 0) || (category >= getCategoryCount())) {
432: throw new IllegalArgumentException(
433: "DefaultIntervalCategoryDataset.getValue(): "
434: + "category index out of range.");
435: }
436:
437:
438: return this.startData[series][category];
439:
440: }
441:
442:
452: public Number getEndValue(Comparable series, Comparable category) {
453: int seriesIndex = getSeriesIndex(series);
454: if (seriesIndex < 0) {
455: throw new UnknownKeyException("Unknown 'series' key.");
456: }
457: int itemIndex = getColumnIndex(category);
458: if (itemIndex < 0) {
459: throw new UnknownKeyException("Unknown 'category' key.");
460: }
461: return getEndValue(seriesIndex, itemIndex);
462: }
463:
464:
474: public Number getEndValue(int series, int category) {
475: if ((series < 0) || (series >= getSeriesCount())) {
476: throw new IllegalArgumentException(
477: "DefaultIntervalCategoryDataset.getValue(): "
478: + "series index out of range.");
479: }
480:
481: if ((category < 0) || (category >= getCategoryCount())) {
482: throw new IllegalArgumentException(
483: "DefaultIntervalCategoryDataset.getValue(): "
484: + "category index out of range.");
485: }
486:
487: return this.endData[series][category];
488: }
489:
490:
500: public void setStartValue(int series, Comparable category, Number value) {
501:
502:
503: if ((series < 0) || (series > getSeriesCount() - 1)) {
504: throw new IllegalArgumentException(
505: "DefaultIntervalCategoryDataset.setValue: "
506: + "series outside valid range.");
507: }
508:
509:
510: int categoryIndex = getCategoryIndex(category);
511: if (categoryIndex < 0) {
512: throw new IllegalArgumentException(
513: "DefaultIntervalCategoryDataset.setValue: "
514: + "unrecognised category.");
515: }
516:
517:
518: this.startData[series][categoryIndex] = value;
519: fireDatasetChanged();
520:
521: }
522:
523:
533: public void setEndValue(int series, Comparable category, Number value) {
534:
535:
536: if ((series < 0) || (series > getSeriesCount() - 1)) {
537: throw new IllegalArgumentException(
538: "DefaultIntervalCategoryDataset.setValue: "
539: + "series outside valid range.");
540: }
541:
542:
543: int categoryIndex = getCategoryIndex(category);
544: if (categoryIndex < 0) {
545: throw new IllegalArgumentException(
546: "DefaultIntervalCategoryDataset.setValue: "
547: + "unrecognised category.");
548: }
549:
550:
551: this.endData[series][categoryIndex] = value;
552: fireDatasetChanged();
553:
554: }
555:
556:
565: public int getCategoryIndex(Comparable category) {
566: int result = -1;
567: for (int i = 0; i < this.categoryKeys.length; i++) {
568: if (category.equals(this.categoryKeys[i])) {
569: result = i;
570: break;
571: }
572: }
573: return result;
574: }
575:
576:
585: private Comparable[] generateKeys(int count, String prefix) {
586: Comparable[] result = new Comparable[count];
587: String name;
588: for (int i = 0; i < count; i++) {
589: name = prefix + (i + 1);
590: result[i] = name;
591: }
592: return result;
593: }
594:
595:
604: public Comparable getColumnKey(int column) {
605: return this.categoryKeys[column];
606: }
607:
608:
617: public int getColumnIndex(Comparable columnKey) {
618: if (columnKey == null) {
619: throw new IllegalArgumentException("Null 'columnKey' argument.");
620: }
621: return getCategoryIndex(columnKey);
622: }
623:
624:
633: public int getRowIndex(Comparable rowKey) {
634: return getSeriesIndex(rowKey);
635: }
636:
637:
645: public List getRowKeys() {
646:
647:
648: if (this.seriesKeys == null) {
649: return new java.util.ArrayList();
650: }
651: else {
652: return Collections.unmodifiableList(Arrays.asList(this.seriesKeys));
653: }
654: }
655:
656:
665: public Comparable getRowKey(int row) {
666: if ((row >= getRowCount()) || (row < 0)) {
667: throw new IllegalArgumentException(
668: "The 'row' argument is out of bounds.");
669: }
670: return this.seriesKeys[row];
671: }
672:
673:
682: public int getColumnCount() {
683: return this.categoryKeys.length;
684: }
685:
686:
694: public int getRowCount() {
695: return this.seriesKeys.length;
696: }
697:
698:
705: public boolean equals(Object obj) {
706: if (obj == this) {
707: return true;
708: }
709: if (!(obj instanceof DefaultIntervalCategoryDataset)) {
710: return false;
711: }
712: DefaultIntervalCategoryDataset that
713: = (DefaultIntervalCategoryDataset) obj;
714: if (!Arrays.equals(this.seriesKeys, that.seriesKeys)) {
715: return false;
716: }
717: if (!Arrays.equals(this.categoryKeys, that.categoryKeys)) {
718: return false;
719: }
720: if (!equal(this.startData, that.startData)) {
721: return false;
722: }
723: if (!equal(this.endData, that.endData)) {
724: return false;
725: }
726:
727: return true;
728: }
729:
730:
738: public Object clone() throws CloneNotSupportedException {
739: DefaultIntervalCategoryDataset clone
740: = (DefaultIntervalCategoryDataset) super.clone();
741: clone.categoryKeys = (Comparable[]) this.categoryKeys.clone();
742: clone.seriesKeys = (Comparable[]) this.seriesKeys.clone();
743: clone.startData = clone(this.startData);
744: clone.endData = clone(this.endData);
745: return clone;
746: }
747:
748:
756: private static boolean equal(Number[][] array1, Number[][] array2) {
757: if (array1 == null) {
758: return (array2 == null);
759: }
760: if (array2 == null) {
761: return false;
762: }
763: if (array1.length != array2.length) {
764: return false;
765: }
766: for (int i = 0; i < array1.length; i++) {
767: if (!Arrays.equals(array1[i], array2[i])) {
768: return false;
769: }
770: }
771: return true;
772: }
773:
774:
781: private static Number[][] clone(Number[][] array) {
782: if (array == null) {
783: throw new IllegalArgumentException("Null 'array' argument.");
784: }
785: Number[][] result = new Number[array.length][];
786: for (int i = 0; i < array.length; i++) {
787: Number[] child = array[i];
788: Number[] copychild = new Number[child.length];
789: System.arraycopy(child, 0, copychild, 0, child.length);
790: result[i] = copychild;
791: }
792: return result;
793: }
794:
795:
802: public List getSeries() {
803: if (this.seriesKeys == null) {
804: return new java.util.ArrayList();
805: }
806: else {
807: return Collections.unmodifiableList(Arrays.asList(this.seriesKeys));
808: }
809: }
810:
811:
818: public List getCategories() {
819: return getColumnKeys();
820: }
821:
822:
829: public int getItemCount() {
830: return this.categoryKeys.length;
831: }
832:
833: }