741 if (a == b) {
742 return true;
743 }
744
745 if (a.isTemplate() != b.isTemplate()) {
746 return false;
747 }
748 // do ez checks first
749 if (a.getMarkersEnabled() != b.getMarkersEnabled()
750 || a.getMarkersFilterEnabled() != b.getMarkersFilterEnabled()) {
751 return false;
752 }
753
754 Map<String, Question> aQuestions = a.getAllQuestions();
755 Map<String, Question> bQuestions = b.getAllQuestions();
756
757 Set<String> keys = new TreeSet<>();
758 keys.addAll(aQuestions.keySet());
759 keys.addAll(bQuestions.keySet());
760
761 for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
762 String key = (String) (iter.next());
763 Question aq = aQuestions.get(key);
764 Question bq = bQuestions.get(key);
765 if (aq == null || bq == null) {
766 return false;
767 }
768 if (!aq.equals(bq)) {
769 String empty = "";
770 boolean eq = (aq.getStringValue() == null &&
771 empty.equals(bq.getStringValue())) ||
772 (empty.equals(aq.getStringValue()) &&
773 bq.getStringValue() == null);
774 if(!eq) {
775 /*
776 Hopefully, question reloading is not required anymore,
777 not because questions are equal now, but because
778 the unexpected dialog no longer appears...
779
780 // if aq is not set, it will be set to the default value
781 // (if the default value had been specified for aq before)
782 aq.reload();
783 if (!aq.equals(bq)) {
784 return false;
785 }
786 */
787 return false;
788 }
789 }
790 }
791 // Checking external values
792 Set aKeys = a.getPropertyKeys();
793 Set bKeys = b.getPropertyKeys();
794
795 if (aKeys == null || bKeys == null) {
796 return aKeys == bKeys;
797 }
798
799 if (aKeys.size() != bKeys.size()) {
800 return false;
801 }
802
803 for (Iterator iter = aKeys.iterator(); iter.hasNext(); ) {
804 String key = (String)iter.next();
805 if (!bKeys.contains(key)) {
806 return false;
807 }
808
809 String aProp = a.retrieveProperty(key);
810 String bProp = b.retrieveProperty(key);
811 if (!equal(aProp, bProp)) {
812 return false;
813 }
814 }
815
816
817 return true;
818 }
819
820 /**
821 * Registers new observer
822 * @param o - observer to be added to the list
823 */
824 public void addObserver(Observer o) {
|
741 if (a == b) {
742 return true;
743 }
744
745 if (a.isTemplate() != b.isTemplate()) {
746 return false;
747 }
748 // do ez checks first
749 if (a.getMarkersEnabled() != b.getMarkersEnabled()
750 || a.getMarkersFilterEnabled() != b.getMarkersFilterEnabled()) {
751 return false;
752 }
753
754 Map<String, Question> aQuestions = a.getAllQuestions();
755 Map<String, Question> bQuestions = b.getAllQuestions();
756
757 Set<String> keys = new TreeSet<>();
758 keys.addAll(aQuestions.keySet());
759 keys.addAll(bQuestions.keySet());
760
761 for (Iterator<String> iter = keys.iterator(); iter.hasNext(); ) {
762 String key = (iter.next());
763 Question aq = aQuestions.get(key);
764 Question bq = bQuestions.get(key);
765 if (aq == null || bq == null) {
766 return false;
767 }
768 if (!aq.equals(bq)) {
769 String empty = "";
770 boolean eq = (aq.getStringValue() == null &&
771 empty.equals(bq.getStringValue())) ||
772 (empty.equals(aq.getStringValue()) &&
773 bq.getStringValue() == null);
774 if(!eq) {
775 /*
776 Hopefully, question reloading is not required anymore,
777 not because questions are equal now, but because
778 the unexpected dialog no longer appears...
779
780 // if aq is not set, it will be set to the default value
781 // (if the default value had been specified for aq before)
782 aq.reload();
783 if (!aq.equals(bq)) {
784 return false;
785 }
786 */
787 return false;
788 }
789 }
790 }
791 // Checking external values
792 Set<String> aKeys = a.getPropertyKeys();
793 Set<String> bKeys = b.getPropertyKeys();
794
795 if (aKeys == null || bKeys == null) {
796 return aKeys == bKeys;
797 }
798
799 if (aKeys.size() != bKeys.size()) {
800 return false;
801 }
802
803 for (Iterator<String> iter = aKeys.iterator(); iter.hasNext(); ) {
804 String key = iter.next();
805 if (!bKeys.contains(key)) {
806 return false;
807 }
808
809 String aProp = a.retrieveProperty(key);
810 String bProp = b.retrieveProperty(key);
811 if (!equal(aProp, bProp)) {
812 return false;
813 }
814 }
815
816
817 return true;
818 }
819
820 /**
821 * Registers new observer
822 * @param o - observer to be added to the list
823 */
824 public void addObserver(Observer o) {
|