Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FixingsOverview.java @ 2563:59c920e73d8a
FixingsOverview: Added a filter mechanism for generating output.
flys-artifacts/trunk@4089 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 20 Feb 2012 16:41:45 +0000 |
parents | ba35dfb7c09a |
children | 3f038d54bc87 |
comparison
equal
deleted
inserted
replaced
2562:ba35dfb7c09a | 2563:59c920e73d8a |
---|---|
379 public int compare(Column a, Column b) { | 379 public int compare(Column a, Column b) { |
380 return a.startTime.compareTo(b.startTime); | 380 return a.startTime.compareTo(b.startTime); |
381 } | 381 } |
382 }; | 382 }; |
383 | 383 |
384 public interface Filter { | |
385 | |
386 boolean accept(Column column); | |
387 | |
388 } // interface Filter | |
389 | |
384 public class Column extends Range { | 390 public class Column extends Range { |
385 | 391 |
386 protected int columnId; | 392 protected int columnId; |
387 protected Date startTime; | 393 protected Date startTime; |
388 protected String name; | 394 protected String name; |
398 this.name = name; | 404 this.name = name; |
399 | 405 |
400 sectors = new ArrayList<SectorRange>(); | 406 sectors = new ArrayList<SectorRange>(); |
401 } | 407 } |
402 | 408 |
409 public int getId() { | |
410 return columnId; | |
411 } | |
412 | |
403 public Fixing getFixing() { | 413 public Fixing getFixing() { |
404 return Fixing.this; | 414 return Fixing.this; |
405 } | 415 } |
406 | 416 |
417 public Date getStartTime() { | |
418 return startTime; | |
419 } | |
420 | |
421 public String getName() { | |
422 return name; | |
423 } | |
424 | |
407 public List<SectorRange> getSectors() { | 425 public List<SectorRange> getSectors() { |
408 return sectors; | 426 return sectors; |
427 } | |
428 | |
429 public List<SectorRange> getSectors(Range range) { | |
430 | |
431 List<SectorRange> result = | |
432 new ArrayList<SectorRange>(sectors.size()); | |
433 | |
434 for (SectorRange src: sectors) { | |
435 SectorRange dst = new SectorRange(src); | |
436 if (dst.clip(range)) { | |
437 result.add(dst); | |
438 } | |
439 } | |
440 | |
441 return result; | |
409 } | 442 } |
410 | 443 |
411 public void buildSectors(GaugeRange gauge, List<QRange> qRanges) { | 444 public void buildSectors(GaugeRange gauge, List<QRange> qRanges) { |
412 | 445 |
413 for (QRange qRange: qRanges) { | 446 for (QRange qRange: qRanges) { |
471 protected List<Column> columns; | 504 protected List<Column> columns; |
472 | 505 |
473 public Fixing() { | 506 public Fixing() { |
474 } | 507 } |
475 | 508 |
509 public int getId() { | |
510 return wstId; | |
511 } | |
512 | |
513 public String getDescription() { | |
514 return description; | |
515 } | |
516 | |
476 public Fixing(int wstId, String description) { | 517 public Fixing(int wstId, String description) { |
477 this.wstId = wstId; | 518 this.wstId = wstId; |
478 this.description = description; | 519 this.description = description; |
479 columns = new ArrayList<Column>(); | 520 columns = new ArrayList<Column>(); |
480 } | 521 } |
503 for (Column column: columns) { | 544 for (Column column: columns) { |
504 column.loadQRanges(query, gaugeFinder); | 545 column.loadQRanges(query, gaugeFinder); |
505 } | 546 } |
506 } | 547 } |
507 | 548 |
508 public void addAllColumns(List<Column> allColumns, Range range) { | 549 public void addAllColumns( |
550 List<Column> allColumns, | |
551 Range range, | |
552 Filter filter | |
553 ) { | |
509 for (Column column: columns) { | 554 for (Column column: columns) { |
510 if (column.intersects(range)) { | 555 if (column.intersects(range) && filter.accept(column)) { |
511 allColumns.add(column); | 556 allColumns.add(column); |
512 } | 557 } |
513 } | 558 } |
514 } | 559 } |
515 } // class Fixing | 560 } // class Fixing |
678 loadFixingsColumnsQRanges(session, gaugeFinder); | 723 loadFixingsColumnsQRanges(session, gaugeFinder); |
679 | 724 |
680 return true; | 725 return true; |
681 } | 726 } |
682 | 727 |
683 private static final Range FULL_EXTENT = | 728 public static final Range FULL_EXTENT = |
684 new Range(-Double.MAX_VALUE, Double.MAX_VALUE); | 729 new Range(-Double.MAX_VALUE, Double.MAX_VALUE); |
685 | 730 |
731 public static final Fixing.Filter ACCEPT = new Fixing.Filter() { | |
732 @Override | |
733 public boolean accept(Fixing.Column column) { | |
734 return true; | |
735 } | |
736 }; | |
737 | |
738 public static class NotFilter implements Fixing.Filter { | |
739 protected Fixing.Filter child; | |
740 | |
741 public NotFilter(Fixing.Filter child) { | |
742 this.child = child; | |
743 } | |
744 | |
745 @Override | |
746 public boolean accept(Fixing.Column column) { | |
747 return !child.accept(column); | |
748 } | |
749 } // class NotFilter | |
750 | |
751 public static abstract class ComponentFilter implements Fixing.Filter { | |
752 protected List<Fixing.Filter> children; | |
753 | |
754 public ComponentFilter(List<Fixing.Filter> children) { | |
755 this.children = children; | |
756 } | |
757 } // class ComponentFilter | |
758 | |
759 public static class OrFilter extends ComponentFilter { | |
760 | |
761 public OrFilter(List<Fixing.Filter> children) { | |
762 super(children); | |
763 } | |
764 | |
765 @Override | |
766 public boolean accept(Fixing.Column column) { | |
767 for (Fixing.Filter child: children) { | |
768 if (child.accept(column)) { | |
769 return true; | |
770 } | |
771 } | |
772 return false; | |
773 } | |
774 } // class OrFilter | |
775 | |
776 public static class AndFilter extends ComponentFilter { | |
777 | |
778 public AndFilter(List<Fixing.Filter> children) { | |
779 super(children); | |
780 } | |
781 | |
782 @Override | |
783 public boolean accept(Fixing.Column column) { | |
784 for (Fixing.Filter child: children) { | |
785 if (!child.accept(column)) { | |
786 return false; | |
787 } | |
788 } | |
789 return true; | |
790 } | |
791 } // class AndFilter | |
792 | |
793 public static class IdFilter implements Fixing.Filter { | |
794 | |
795 protected int columnId; | |
796 | |
797 public IdFilter(int columnId) { | |
798 this.columnId = columnId; | |
799 } | |
800 | |
801 @Override | |
802 public boolean accept(Fixing.Column column) { | |
803 return column.getId() == columnId; | |
804 } | |
805 } // class IdFilter | |
806 | |
807 public static class DateFilter implements Fixing.Filter { | |
808 | |
809 protected Date date; | |
810 | |
811 public DateFilter(Date date) { | |
812 this.date = date; | |
813 } | |
814 | |
815 @Override | |
816 public boolean accept(Fixing.Column column) { | |
817 return date.equals(column.getStartTime()); | |
818 } | |
819 } // class DateFilter | |
820 | |
821 public static class DateRangeFilter implements Fixing.Filter { | |
822 | |
823 protected Date start; | |
824 protected Date end; | |
825 | |
826 public DateRangeFilter(Date start, Date end) { | |
827 this.start = start; | |
828 this.end = end; | |
829 } | |
830 | |
831 @Override | |
832 public boolean accept(Fixing.Column column) { | |
833 Date date = column.getStartTime(); | |
834 return start.compareTo(date) <= 0 && end.compareTo(date) >= 0; | |
835 } | |
836 } // class DateRangeFilter | |
837 | |
838 public static class SectorRangeFilter implements Fixing.Filter { | |
839 | |
840 protected int min; | |
841 protected int max; | |
842 | |
843 public SectorRangeFilter(int min, int max) { | |
844 this.min = Math.min(min, max); | |
845 this.max = Math.max(min, max); | |
846 } | |
847 | |
848 @Override | |
849 public boolean accept(Fixing.Column column) { | |
850 for (SectorRange s: column.getSectors()) { | |
851 int v = s.getSector(); | |
852 if (v >= min && v <= max) { | |
853 return true; | |
854 } | |
855 } | |
856 return false; | |
857 } | |
858 } // class SectorRangeFilter | |
859 | |
686 public void generateOverview(Document document) { | 860 public void generateOverview(Document document) { |
687 generateOverview(document, FULL_EXTENT); | 861 generateOverview(document, FULL_EXTENT, ACCEPT); |
688 } | 862 } |
689 | 863 |
690 public void generateOverview(Document document, Range range) { | 864 public void generateOverview( |
691 | 865 Document document, |
866 Range range, | |
867 Fixing.Filter filter | |
868 ) { | |
692 List<Fixing.Column> allColumns = new ArrayList<Fixing.Column>(); | 869 List<Fixing.Column> allColumns = new ArrayList<Fixing.Column>(); |
693 | 870 |
694 for (Fixing fixing: fixings) { | 871 for (Fixing fixing: fixings) { |
695 fixing.addAllColumns(allColumns, range); | 872 fixing.addAllColumns(allColumns, range, filter); |
696 } | 873 } |
697 | 874 |
698 Collections.sort(allColumns, Fixing.DATE_CMP); | 875 Collections.sort(allColumns, Fixing.DATE_CMP); |
699 | 876 |
700 Element fixingsElement = document.createElement("fixings"); | 877 Element fixingsElement = document.createElement("fixings"); |
711 | 888 |
712 Element esE = document.createElement("events"); | 889 Element esE = document.createElement("events"); |
713 | 890 |
714 for (Fixing.Column column: allColumns) { | 891 for (Fixing.Column column: allColumns) { |
715 | 892 |
716 // TODO: Apply additional filters here. | 893 List<SectorRange> sectors = column.getSectors(range); |
717 List<SectorRange> sectors = column.getSectors(); | |
718 | 894 |
719 if (!sectors.isEmpty()) { | 895 if (!sectors.isEmpty()) { |
720 Element eE = document.createElement("event"); | 896 Element eE = document.createElement("event"); |
721 eE.setAttribute("name", | 897 eE.setAttribute("name", |
722 String.valueOf(column.getFixing().description)); | 898 String.valueOf(column.getFixing().description)); |