From: <ja...@us...> - 2006-10-03 02:26:52
|
Revision: 73 http://svn.sourceforge.net/surveyforge/?rev=73&view=rev Author: javism Date: 2006-09-29 08:28:51 -0700 (Fri, 29 Sep 2006) Log Message: ----------- Some changes in the inheritance of Questionnaire-QuestionnaireElement and some improvements in ValueDomain Modified Paths: -------------- trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/DataElement.java trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/Register.java trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/RegisterDataElement.java trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/ValueDomain.java trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/domain/AbstractValueDomain.java trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/Questionnaire.java trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/QuestionnaireElement.java trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/DataElementTest.java trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/RegisterTest.java trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireElementTest.java trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireTest.java Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/DataElement.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/DataElement.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/DataElement.java 2006-09-29 15:28:51 UTC (rev 73) @@ -35,12 +35,12 @@ import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; -import javax.persistence.Table; import javax.persistence.Transient; -import javax.persistence.UniqueConstraint; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.IndexColumn; @@ -52,6 +52,7 @@ * @author jsegura */ @Entity +@Inheritance(strategy = InheritanceType.JOINED) public abstract class DataElement implements Serializable { private static final long serialVersionUID = 0L; Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/Register.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/Register.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/Register.java 2006-09-29 15:28:51 UTC (rev 73) @@ -21,13 +21,11 @@ */ package org.surveyforge.core.metadata; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.persistence.CascadeType; -import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; @@ -38,19 +36,22 @@ import org.hibernate.annotations.IndexColumn; import org.surveyforge.core.data.RegisterData; import org.surveyforge.core.metadata.domain.StructuredValueDomain; -import org.surveyforge.core.survey.Questionnaire; // TODO Elaborate on comments /** * @author jsegura */ @Entity -public class Register extends DataElement implements Serializable +public class Register extends RegisterDataElement { - private static final long serialVersionUID = 0L; /** + * + */ + private static final long serialVersionUID = -7481816596643587493L; + + /** * When defining hierarchical registers the hierarchy is expressed as master/detail relationship. The master register defines the * objects that consist of the details. */ @@ -78,10 +79,10 @@ @OneToOne(cascade = {CascadeType.ALL}) private RegisterData registerData; - /** */ - @OneToOne(mappedBy = "register", fetch = FetchType.LAZY, optional = true) - // @OneToOne(fetch = FetchType.LAZY) - private Questionnaire questionnaire; +// /** */ +// @OneToOne(mappedBy = "register", fetch = FetchType.LAZY, optional = true) +// // @OneToOne(fetch = FetchType.LAZY) +// private Questionnaire questionnaire; protected Register( ) @@ -94,9 +95,8 @@ */ public Register( String identifier ) { - this.setIdentifier( identifier ); + super( identifier, new StructuredValueDomain( ) ); this.registerData = new RegisterData( this ); - this.setValueDomain( new StructuredValueDomain( ) ); } /** @@ -142,48 +142,48 @@ if( detailRegister != null ) this.detailRegisters.remove( detailRegister ); } - @Override - public List<? extends RegisterDataElement> getComponentElements( ) - { - List<RegisterDataElement> componentElements = new ArrayList<RegisterDataElement>( ); - for( DataElement dataElement : super.getComponentElements( ) ) - componentElements.add( (RegisterDataElement) dataElement ); - return componentElements; - } + // @Override + // public List<? extends RegisterDataElement> getComponentElements( ) + // { + // List<RegisterDataElement> componentElements = new ArrayList<RegisterDataElement>( ); + // for( DataElement dataElement : super.getComponentElements( ) ) + // componentElements.add( (RegisterDataElement) dataElement ); + // return componentElements; + // } - @Override - public void addComponentElement( DataElement componentElement ) - { - if( !(componentElement instanceof RegisterDataElement) ) - throw new IllegalArgumentException( ); - else if( this.registerData.getObjectData( ).size( ) > 0 ) - throw new IllegalStateException( ); - else - super.addComponentElement( componentElement ); - } + // @Override + // public void addComponentElement( DataElement componentElement ) + // { + // if( !(componentElement instanceof RegisterDataElement) ) + // throw new IllegalArgumentException( ); + // else if( this.registerData.getObjectData( ).size( ) > 0 ) + // throw new IllegalStateException( ); + // else + // super.addComponentElement( componentElement ); + // } + // + // @Override + // public void removeComponentElement( DataElement componentElement ) + // { + // if( this.registerData.getObjectData( ).size( ) > 0 ) + // throw new IllegalStateException( ); + // else + // super.removeComponentElement( componentElement ); + // } + // + // @Override + // public void setComponentElements( List<? extends DataElement> componentElements ) + // { + // if( componentElements == null ) + // throw new NullPointerException( ); + // else if( this.registerData.getObjectData( ).size( ) > 0 ) + // throw new IllegalStateException( ); + // else if( this.key != null && !componentElements.containsAll( this.key ) ) + // throw new IllegalArgumentException( ); + // else + // super.setComponentElements( componentElements ); + // } - @Override - public void removeComponentElement( DataElement componentElement ) - { - if( this.registerData.getObjectData( ).size( ) > 0 ) - throw new IllegalStateException( ); - else - super.removeComponentElement( componentElement ); - } - - @Override - public void setComponentElements( List<? extends DataElement> componentElements ) - { - if( componentElements == null ) - throw new NullPointerException( ); - else if( this.registerData.getObjectData( ).size( ) > 0 ) - throw new IllegalStateException( ); - else if( this.key != null && !componentElements.containsAll( this.key ) ) - throw new IllegalArgumentException( ); - else - super.setComponentElements( componentElements ); - } - /** * @return Returns the key. */ @@ -213,15 +213,15 @@ return this.registerData; } - public Questionnaire getQuestionnaire( ) - { - return this.questionnaire; - } +// public Questionnaire getQuestionnaire( ) +// { +// return (Questionnaire) super.getQuestionnaireElement( ); +// } - public void setQuestionnaire( Questionnaire questionnaire ) - { - this.questionnaire = questionnaire; - } +// public void setQuestionnaire( Questionnaire questionnaire ) +// { +// this.questionnaire = questionnaire; +// } @Override public boolean equals( Object object ) Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/RegisterDataElement.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/RegisterDataElement.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/RegisterDataElement.java 2006-09-29 15:28:51 UTC (rev 73) @@ -31,7 +31,6 @@ import org.surveyforge.core.metadata.domain.AbstractValueDomain; import org.surveyforge.core.survey.Question; -import org.surveyforge.core.survey.QuestionnaireElement; /** * Register data elements define data elements for a register. In contrast to an abstract data element a register data element is @@ -54,8 +53,8 @@ @ManyToOne(optional = true) private Question question; - @OneToOne - private QuestionnaireElement questionnaireElement; +// @OneToOne +// private QuestionnaireElement questionnaireElement; protected RegisterDataElement( ) {}; @@ -182,18 +181,18 @@ /** * @return the questionnaireElement */ - public QuestionnaireElement getQuestionnaireElement( ) - { - return questionnaireElement; - } +// public QuestionnaireElement getQuestionnaireElement( ) +// { +// return questionnaireElement; +// } /** * @param questionnaireElement the questionnaireElement to set */ - public void setQuestionnaireElement( QuestionnaireElement questionnaireElement ) - { - this.questionnaireElement = questionnaireElement; - } +// public void setQuestionnaireElement( QuestionnaireElement questionnaireElement ) +// { +// this.questionnaireElement = questionnaireElement; +// } public AbstractValueDomain getValueDomain( ) { Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/ValueDomain.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/ValueDomain.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/ValueDomain.java 2006-09-29 15:28:51 UTC (rev 73) @@ -22,12 +22,17 @@ package org.surveyforge.core.metadata; import java.io.Serializable; +import java.util.List; +import org.surveyforge.core.metadata.domain.AbstractValueDomain; + /** * @author jsegura */ public interface ValueDomain { public boolean isValid( Serializable object ); + + public List<AbstractValueDomain> getSubDomains( ); } Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/domain/AbstractValueDomain.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/domain/AbstractValueDomain.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/metadata/domain/AbstractValueDomain.java 2006-09-29 15:28:51 UTC (rev 73) @@ -22,6 +22,8 @@ package org.surveyforge.core.metadata.domain; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; @@ -59,7 +61,12 @@ {} + public List<AbstractValueDomain> getSubDomains( ) + { + return new ArrayList<AbstractValueDomain>( ); + } + @Override public AbstractValueDomain clone( ) { Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/Questionnaire.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/Questionnaire.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/Questionnaire.java 2006-09-29 15:28:51 UTC (rev 73) @@ -32,20 +32,17 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; -import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.IndexColumn; import org.surveyforge.core.metadata.Register; import org.surveyforge.util.InternationalizedString; + /** * A questionnaire is a list of {@link Question}s used to recollect the data into a register. The questionnaire is included in almost * one {@link Study}. @@ -54,61 +51,38 @@ */ @Entity @Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"identifier", "study_id"})}) -public class Questionnaire implements Serializable +public class Questionnaire extends QuestionnaireElement { - private static final long serialVersionUID = 6844066269698434310L; - - @SuppressWarnings("unused") - @Id - @Column(length = 50) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - private String id; - /** Version for optimistic locking. */ - @SuppressWarnings("unused") - @javax.persistence.Version - private int lockingVersion; - /** - * A questionnaire is identified by an identifier, which is unique in the context of a statistical activity. It may typically be an - * abbreviation of its title or a systematic number. + * */ - @Column(nullable = false, length = 50) - private String identifier; + private static final long serialVersionUID = -357629851050021121L; /** A questionnaire has a title as provided by the owner or maintenance unit. */ @Column(length = 250) - private String title = ""; + private String title = ""; /** * Detailed description of the questionnaire. The questionnaire description typically describes the underlying concept of the * questionnaire and basic principles. */ @Column(length = 500) - private String description = ""; - /** A questionnaire consists of a number of questionnaire elements. Each element refers to a question. */ - @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) - @IndexColumn(name = "questionnairesIndex") - @JoinColumn(name = "questionnaire_id") - private List<QuestionnaireElement> elements = new ArrayList<QuestionnaireElement>( ); + private String description = ""; + /** A questionnaire may have its content organized in pages. */ @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) @IndexColumn(name = "pageIndex") // @JoinColumn(name = "questionnaire_page_id") @JoinColumn(name = "questionnaire_page_id") - private List<Feed> pageFeeds = new ArrayList<Feed>( ); + private List<Feed> pageFeeds = new ArrayList<Feed>( ); /** A questionnaire may have its content organized in sections. */ @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) @IndexColumn(name = "sectionIndex") @JoinColumn(name = "questionnaire_section_id") - private List<SectionFeed> sectionFeeds = new ArrayList<SectionFeed>( ); + private List<SectionFeed> sectionFeeds = new ArrayList<SectionFeed>( ); - /** A questionnaire corresponds logically to a register, which describes the content of the data collection. */ - @OneToOne(fetch = FetchType.LAZY) - private Register register; - /** A questionnaire is included in a Study. */ @ManyToOne @JoinColumn(name = "study_id", insertable = false, updatable = false) - private Study study; + private Study study; protected Questionnaire( ) @@ -123,38 +97,17 @@ * @throws NullPointerException If the study is <code>null</code> or if the register is <code>null</code> or if the identifier is * <code>null</code> or is empty. */ - public Questionnaire( String identifier, Study study, Register register ) + public Questionnaire( String identifier, Study study ) { + // super( ); this.setIdentifier( identifier ); + this.registerDataElement = new Register( identifier ); this.setStudy( study ); - this.setRegister( register ); } - /** - * Returns the identifier of the Questionnaire. - * - * @return Returns the identifier. - */ - public String getIdentifier( ) - { - return this.identifier; - } + // } /** - * Sets the identifier of the Questionnaire. - * - * @param identifier The identifier to set. - * @throws NullPointerException If the register is <code>null</code> or if the identifier is <code>null</code> or is empty. - */ - public void setIdentifier( String identifier ) - { - if( identifier != null && !identifier.equals( "" ) ) - this.identifier = identifier; - else - throw new NullPointerException( ); - } - - /** * Returns the title of the questionnaire. * * @return Returns the title. @@ -203,17 +156,6 @@ } /** - * Return the list of {@link QuestionnaireElement}s included in this questionnaire. - * - * @return Returns the elements. - */ - public List<QuestionnaireElement> getElements( ) - { - return Collections.unmodifiableList( this.elements ); - } - - - /** * Adds a new {@link Element} to he Questionnaire. * * @param element The element to add. @@ -223,7 +165,7 @@ { if( element != null ) { - this.elements.add( element ); + super.addElement( element ); if( this.pageFeeds.isEmpty( ) ) this.createPageFeed( element ); if( this.sectionFeeds.isEmpty( ) ) this.createSectionFeed( element ); } @@ -241,7 +183,7 @@ { if( element != null ) { - int indexToRemove = this.elements.indexOf( element ); + int indexToRemove = this.getComponentElements( ).indexOf( element ); if( indexToRemove != -1 ) { Comparator<Feed> feedComparator = new Questionnaire.FeedComparator( ); @@ -252,7 +194,8 @@ if( pageFeedPosition >= 0 ) { this.pageFeeds.remove( pageFeedPosition ); - if( indexToRemove < this.elements.size( ) - 1 ) this.createPageFeed( this.elements.get( indexToRemove + 1 ) ); + if( indexToRemove < this.getComponentElements( ).size( ) - 1 ) + this.createPageFeed( this.getComponentElements( ).get( indexToRemove + 1 ) ); } SectionFeed sectionFeedToRemove = new SectionFeed( element ); @@ -261,11 +204,12 @@ if( sectionFeedPosition >= 0 ) { SectionFeed oldSectionFeed = this.sectionFeeds.remove( sectionFeedPosition ); - if( indexToRemove < this.elements.size( ) - 1 ) - this.createSectionFeed( this.elements.get( indexToRemove + 1 ), oldSectionFeed.getInternationalizedTitle( ) ); + if( indexToRemove < this.getComponentElements( ).size( ) - 1 ) + this + .createSectionFeed( this.getComponentElements( ).get( indexToRemove + 1 ), oldSectionFeed.getInternationalizedTitle( ) ); } - this.elements.remove( element ); + this.delElement( element ); } } else @@ -375,21 +319,23 @@ int pageNumber = this.pageFeeds.indexOf( pageFeed ); int sectionNumber = this.sectionFeeds.indexOf( sectionFeed ); - int firstElementIndex = Math.max( this.elements.indexOf( pageFeed.getFirstElement( ) ), this.elements.indexOf( sectionFeed - .getFirstElement( ) ) ); + int firstElementIndex = Math.max( this.getComponentElements( ).indexOf( pageFeed.getFirstElement( ) ), this + .getComponentElements( ).indexOf( sectionFeed.getFirstElement( ) ) ); - int lastElementInPageIndex = (pageNumber != this.pageFeeds.size( ) - 1) ? this.elements.indexOf( this.pageFeeds.get( - pageNumber + 1 ).getFirstElement( ) ) : Integer.MAX_VALUE; - int lastElementInSectionIndex = (sectionNumber != this.sectionFeeds.size( ) - 1) ? this.elements.indexOf( this.sectionFeeds.get( - sectionNumber + 1 ).getFirstElement( ) ) : Integer.MAX_VALUE; - int lastElementIndex = Math.min( Math.min( lastElementInPageIndex, lastElementInSectionIndex ), this.elements.size( ) ); + int lastElementInPageIndex = (pageNumber != this.pageFeeds.size( ) - 1) ? this.getComponentElements( ).indexOf( + this.pageFeeds.get( pageNumber + 1 ).getFirstElement( ) ) : Integer.MAX_VALUE; + int lastElementInSectionIndex = (sectionNumber != this.sectionFeeds.size( ) - 1) ? this.getComponentElements( ).indexOf( + this.sectionFeeds.get( sectionNumber + 1 ).getFirstElement( ) ) : Integer.MAX_VALUE; + int lastElementIndex = Math.min( Math.min( lastElementInPageIndex, lastElementInSectionIndex ), this.getComponentElements( ) + .size( ) ); - return Collections.unmodifiableList( this.elements.subList( firstElementIndex, lastElementIndex ) ); + return Collections.unmodifiableList( this.getComponentElements( ).subList( firstElementIndex, lastElementIndex ) ); } else throw new IllegalArgumentException( ); } + /** * Returns the {@link Register} of the questionnaire. * @@ -397,22 +343,9 @@ */ public Register getRegister( ) { - return this.register; + return (Register) this.getRegisterDataElement( ); } - /** - * Sets the register of the Questionnaire. - * - * @param register The register to set. - * @throws NullPointerException If the register is <code>null</code> - */ - public void setRegister( Register register ) - { - if( register != null ) - this.register = register; - else - throw new NullPointerException( ); - } /** * Return the study his questionnaire belongs to. @@ -461,8 +394,8 @@ public int compare( Feed feed1, Feed feed2 ) { - Integer firstPosition = Questionnaire.this.getElements( ).indexOf( feed1.getFirstElement( ) ); - Integer secondPosition = Questionnaire.this.getElements( ).indexOf( feed2.getFirstElement( ) ); + Integer firstPosition = Questionnaire.this.getComponentElements( ).indexOf( feed1.getFirstElement( ) ); + Integer secondPosition = Questionnaire.this.getComponentElements( ).indexOf( feed2.getFirstElement( ) ); return firstPosition.compareTo( secondPosition ); } } Modified: trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/QuestionnaireElement.java =================================================================== --- trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/QuestionnaireElement.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/main/java/org/surveyforge/core/survey/QuestionnaireElement.java 2006-09-29 15:28:51 UTC (rev 73) @@ -32,6 +32,8 @@ import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @@ -42,8 +44,9 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.IndexColumn; import org.surveyforge.core.metadata.RegisterDataElement; +import org.surveyforge.core.metadata.domain.AbstractValueDomain; +import org.surveyforge.core.metadata.domain.StructuredValueDomain; - /** * A questionnaire element is the link between the {@link Question} of the {@link Questionnaire} and the metadata layer represented by * the {@link RegisterDataElement}. @@ -51,10 +54,11 @@ * @author jsegura */ @Entity -@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"identifier", "questionnaire_id"})}) +@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"identifier", "upperElement_id"})}) +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class QuestionnaireElement implements Serializable { - private static final long serialVersionUID = -5920656314181190011L; + private static final long serialVersionUID = -5920656314181190011L; @SuppressWarnings("unused") @@ -68,59 +72,44 @@ @javax.persistence.Version private int lockingVersion; - /** A questionnaire element is identified by a unique identifier. */ + /** A SurveyElement is identified by a unique identifier. */ @Column(unique = true, length = 50) private String identifier; + /** Each questionnaire element has a {@link Question} that has the text and the structure of the question. */ @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) - private Question question = null; + private Question question = null; /** A questionnaire element have a {@link RegisterDataElement} to have the info of the data. */ - @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) - private RegisterDataElement registerDataElement; + @OneToOne(cascade = {CascadeType.ALL}) + protected RegisterDataElement registerDataElement; /** Default answer if the question is not applicable. */ @Column(length = 50) - private String defaultNotApplicable = ""; + private String defaultNotApplicable = ""; /** Default answer if the question is not answered. */ @Column(length = 50) - private String defaultNotAnswered = ""; - /** This is the question that acts as a frame for a number of sub questions. */ + private String defaultNotAnswered = ""; + @ManyToOne - @JoinColumn(name = "upperQuestionnaireElement_id", insertable = false, updatable = false) - private QuestionnaireElement upperQuestionnaireElement = null; - /** A question referring to a complex fact can be divided in a number of sub questions. */ + @JoinColumn(name = "upperElement_id", insertable = false, updatable = false) + private QuestionnaireElement upperElement = null; + @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) - @IndexColumn(name = "subQuestionnaireElementsIndex") - @JoinColumn(name = "upperQuestionnaireElement_id") - private List<QuestionnaireElement> subQuestionnaireElements = new ArrayList<QuestionnaireElement>( ); + @IndexColumn(name = "componentElementsIndex") + @JoinColumn(name = "upperElement_id") + private List<QuestionnaireElement> componentElements = new ArrayList<QuestionnaireElement>( ); protected QuestionnaireElement( ) {} - /** - * Creates a new instance of a QuestionnaireElement linked to the registerDataElement and identified by identifier. - * - * @param registerDataElement The {@link RegisterDataElement} the questionnaire element is linked to. - * @param identifier The identifier of the questionnaire element. - * @throws NullPointerException If the registerDataElement or the identifier are <code>null</code> and if the identifier is empty. - */ - public QuestionnaireElement( RegisterDataElement registerDataElement ) + public QuestionnaireElement( String identifier, AbstractValueDomain valueDomain ) { - this.setRegisterDataElement( registerDataElement ); - this.setIdentifier( registerDataElement.getIdentifier( ) ); + this.setIdentifier( identifier ); + this.registerDataElement = new RegisterDataElement( identifier, valueDomain ); } - public QuestionnaireElement( RegisterDataElement registerDataElement, QuestionnaireElement upperElement ) - { - this( registerDataElement ); - this.setUpperQuestionnaireElement( upperElement ); - } - - - /** - * Returns the identifier of the questionnaire element. - * - * @return Returns the identifier. + /* + * Returns the identifier of the SurveyElement. @return Returns the identifier. */ public String getIdentifier( ) { @@ -128,12 +117,12 @@ } /** - * Sets a new identifier for the questionnaire element. + * Sets the identifier of the SurveyElement. * * @param identifier The identifier to set. - * @throws NullPointerException If the identifier is <code>null</code> and if the identifier is empty. + * @throws NullPointerException If the register is <code>null</code> or if the identifier is <code>null</code> or is empty. */ - protected void setIdentifier( String identifier ) + public void setIdentifier( String identifier ) { if( identifier != null && !identifier.equals( "" ) ) this.identifier = identifier; @@ -162,7 +151,7 @@ } /** - * Return the {@link RegisterDataElement} this questionnaire element is linked to. + * / * Return the {@link RegisterDataElement} this questionnaire element is linked to. * * @return Returns the registerDataElement. */ @@ -172,29 +161,6 @@ } /** - * Sets a the new {@link RegisterDataElement} this questionnaire element is linked to. - * - * @param registerDataElement The registerDataElement to set. - * @throws If the registerDataElement is <code>null</code>; - */ - protected void setRegisterDataElement( RegisterDataElement registerDataElement ) - { - if( registerDataElement != null ) - { - // TODO remove old elements - this.registerDataElement = registerDataElement; - registerDataElement.setQuestionnaireElement( this ); - for( int i = 0; i < registerDataElement.getComponentElements( ).size( ); i++ ) - { - this.addSubQuestionnaireElement( new QuestionnaireElement( (RegisterDataElement) (registerDataElement.getComponentElements( ) - .get( i )) ) ); - } - } - else - throw new NullPointerException( ); - } - - /** * Returns the default answer for not applicable questions. * * @return Returns the default answer for not applicable questions. @@ -242,43 +208,91 @@ throw new NullPointerException( ); } - - public QuestionnaireElement getUpperQuestionnaireElement( ) + protected void setUpperElement( QuestionnaireElement upperElement ) { - return this.upperQuestionnaireElement; + if( this.getUpperElement( ) != null ) this.getUpperElement( ).removeElement( this ); + this.upperElement = upperElement; + if( this.getUpperElement( ) != null ) this.getUpperElement( ).addElement( this ); } - public void setUpperQuestionnaireElement( QuestionnaireElement upperQuestionnaireElement ) + public QuestionnaireElement getUpperElement( ) { - if( this.upperQuestionnaireElement != null ) this.upperQuestionnaireElement.removeSubQuestionnaireElement( this ); - this.upperQuestionnaireElement = upperQuestionnaireElement; - if( this.upperQuestionnaireElement != null ) this.upperQuestionnaireElement.addSubQuestionnaireElement( this ); + return this.upperElement; } - private void removeSubQuestionnaireElement( QuestionnaireElement subQuestionnaireElement ) + public List<QuestionnaireElement> getComponentElements( ) { - if( subQuestionnaireElement != null ) - this.subQuestionnaireElements.remove( subQuestionnaireElement ); + return Collections.unmodifiableList( this.componentElements ); + } + + /** + * @param componentElements The componentElements to set. + */ + public void addComponentElement( QuestionnaireElement componentElement ) + { + if( componentElement != null ) + { + if( !this.getComponentElements( ).contains( componentElement ) + && this.getRegisterDataElement( ).getValueDomain( ) instanceof StructuredValueDomain ) + { + componentElement.setUpperElement( this ); + // ((StructuredValueDomain) this.getValueDomain( )).addSubDomain( componentElement.getValueDomain( ) ); + } + else + throw new IllegalArgumentException( ); + } else throw new NullPointerException( ); } - public List<QuestionnaireElement> getSubQuestionnaireElementss( ) + + /** + * @param componentElement + */ + protected void addElement( QuestionnaireElement componentElement ) { - return Collections.unmodifiableList( this.subQuestionnaireElements ); + if( componentElement == null ) throw new NullPointerException( ); + if( this.getRegisterDataElement( ).getValueDomain( ) instanceof StructuredValueDomain ) + { + this.componentElements.add( componentElement ); + componentElement.upperElement = this; + this.getRegisterDataElement( ).addComponentElement( componentElement.getRegisterDataElement( ) ); + } + else + throw new IllegalArgumentException( ); } - - private void addSubQuestionnaireElement( QuestionnaireElement subQuestionnaireElement ) + /** + * @param componentElements The componentElements to set. + */ + public void removeComponentElement( QuestionnaireElement componentElement ) { - if( subQuestionnaireElement != null ) - this.subQuestionnaireElements.add( subQuestionnaireElement ); + if( componentElement != null ) + { + componentElement.setUpperElement( null ); + } else throw new NullPointerException( ); } + /** + * @param componentElement + */ + protected void removeElement( QuestionnaireElement componentElement ) + { + if( componentElement == null ) throw new NullPointerException( ); + if( this.getRegisterDataElement( ).getValueDomain( ) instanceof StructuredValueDomain ) + { + this.componentElements.remove( componentElement ); + componentElement.upperElement = null; + this.getRegisterDataElement( ).removeComponentElement( componentElement.getRegisterDataElement( ) ); + } + else + throw new IllegalArgumentException( ); + } + // TODO : Equals+hashcode // @Override // public boolean equals( Object object ) @@ -293,5 +307,4 @@ // { // return this.getStudy( ).hashCode( ) ^ this.getIdentifier( ).hashCode( ); // } - } Modified: trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/DataElementTest.java =================================================================== --- trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/DataElementTest.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/DataElementTest.java 2006-09-29 15:28:51 UTC (rev 73) @@ -66,8 +66,7 @@ public void RegisterDataElementCreationWithNullIdentifier( ) { LogicalValueDomain lvd = new LogicalValueDomain( ); - RegisterDataElement rde = new RegisterDataElement( null, lvd ); - + new RegisterDataElement( null, lvd ); } @Test @@ -75,9 +74,6 @@ public void RegisterCreationWithNullDomain( ) { LogicalValueDomain lvd = null; - RegisterDataElement rde = new RegisterDataElement( "id", lvd ); - + new RegisterDataElement( "id", lvd ); } - - } Modified: trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/RegisterTest.java =================================================================== --- trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/RegisterTest.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/test/java/org/surveyforge/core/metadata/RegisterTest.java 2006-09-29 15:28:51 UTC (rev 73) @@ -27,14 +27,14 @@ @ExpectedExceptions( {NullPointerException.class}) public void RegisterCreationWithNullIdentifier( ) { - Register register = new Register( null ); + new Register( null ); } @Test @ExpectedExceptions( {NullPointerException.class}) public void RegisterCreationWithEmptyIdentifier( ) { - Register register = new Register( "" ); + new Register( "" ); } Modified: trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireElementTest.java =================================================================== --- trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireElementTest.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireElementTest.java 2006-09-29 15:28:51 UTC (rev 73) @@ -29,7 +29,10 @@ import org.surveyforge.core.metadata.RegisterDataElement; import org.surveyforge.core.metadata.StatisticalObjectType; import org.surveyforge.core.metadata.domain.LogicalValueDomain; +import org.surveyforge.core.metadata.domain.StructuredValueDomain; +import org.testng.Assert; import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; /** * @author jsegura @@ -47,4 +50,27 @@ RegisterDataElement registerDataElement = new RegisterDataElement( "registerDataElement", conceptualDataElement ); return new Object[][] {new Object[] {registerDataElement}}; } + + @Test + public void Test( ) + { + + + QuestionnaireElement upperQE = new QuestionnaireElement( "upperQE", new StructuredValueDomain( ) ); + QuestionnaireElement q1 = new QuestionnaireElement( "qe1", new LogicalValueDomain( ) ); + QuestionnaireElement q2 = new QuestionnaireElement( "qe2", new LogicalValueDomain( ) ); + QuestionnaireElement q3 = new QuestionnaireElement( "qe3", new LogicalValueDomain( ) ); + QuestionnaireElement q4 = new QuestionnaireElement( "qe4", new LogicalValueDomain( ) ); + QuestionnaireElement q5 = new QuestionnaireElement( "qe5", new LogicalValueDomain( ) ); + upperQE.addComponentElement( q1 ); + upperQE.addComponentElement( q2 ); + upperQE.addComponentElement( q3 ); + upperQE.addComponentElement( q4 ); + upperQE.addComponentElement( q5 ); + Assert.assertEquals( 5, upperQE.getComponentElements( ).size( ) ); + Assert.assertEquals( 5, upperQE.getRegisterDataElement( ).getComponentElements( ).size( ) ); + Assert.assertEquals( 5, upperQE.getRegisterDataElement( ).getValueDomain( ).getSubDomains( ).size( ) ); + + + } } Modified: trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireTest.java =================================================================== --- trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireTest.java 2006-09-21 13:56:29 UTC (rev 72) +++ trunk/surveyforge-core/src/test/java/org/surveyforge/core/survey/QuestionnaireTest.java 2006-09-29 15:28:51 UTC (rev 73) @@ -21,7 +21,6 @@ */ package org.surveyforge.core.survey; -import org.surveyforge.core.metadata.Register; import org.testng.Assert; import org.testng.annotations.ExpectedExceptions; import org.testng.annotations.Test; @@ -35,35 +34,28 @@ @ExpectedExceptions( {NullPointerException.class}) public void questionnaireCreationWithNullIdentifier( ) { - new Questionnaire( null, new Study( "id" ), new Register( "id" ) ); + new Questionnaire( null, new Study( "id" ) ); } @Test @ExpectedExceptions( {NullPointerException.class}) public void questionnaireCreationWithEmptyIdentifier( ) { - new Questionnaire( "", new Study( "id" ), new Register( "id" ) ); + new Questionnaire( "", new Study( "id" ) ); } @Test @ExpectedExceptions( {NullPointerException.class}) public void questionnaireCreationWithNullStudy( ) { - new Questionnaire( "id", null, new Register( "id" ) ); + new Questionnaire( "id", null ); } @Test - @ExpectedExceptions( {NullPointerException.class}) - public void questionnaireCreationWithNullRegister( ) - { - new Questionnaire( "id", new Study( "id" ), null ); - } - - @Test public void questionnaireGetIdentifier( ) { String id = "id"; - Questionnaire questionnaire = new Questionnaire( id, new Study( "id" ), new Register( "id" ) ); + Questionnaire questionnaire = new Questionnaire( id, new Study( "id" ) ); Assert.assertEquals( questionnaire.getIdentifier( ), id ); } @@ -72,14 +64,14 @@ public void questionnaireSetNullTitle( ) { - new Questionnaire( "id", new Study( "id" ), new Register( "id" ) ).setTitle( null ); + new Questionnaire( "id", new Study( "id" ) ).setTitle( null ); } @Test public void questionnaireGetTitle( ) { - Questionnaire questionnaire = new Questionnaire( "id", new Study( "id" ), new Register( "id" ) ); + Questionnaire questionnaire = new Questionnaire( "id", new Study( "id" ) ); questionnaire.setTitle( "title" ); Assert.assertEquals( questionnaire.getTitle( ), "title" ); } @@ -88,7 +80,7 @@ @ExpectedExceptions( {NullPointerException.class}) public void questionnaireSetNullDescription( ) { - new Questionnaire( "id", new Study( "id" ), new Register( "id" ) ).setDescription( null ); + new Questionnaire( "id", new Study( "id" ) ).setDescription( null ); } @Test @@ -96,7 +88,7 @@ { String empty = ""; String desc = "desc"; - Questionnaire obj = new Questionnaire( "id", new Study( "id" ), new Register( "id" ) ); + Questionnaire obj = new Questionnaire( "id", new Study( "id" ) ); obj.setDescription( desc ); Assert.assertTrue( obj.getDescription( ).equals( desc ) ); Assert.assertFalse( obj.getDescription( ).equals( "test" ) ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |