public AssessmentItem() {
    super(null, QTI_CLASS_NAME); // Item doesn't have any parent.

    getAttributes().add(new StringAttribute(this, IdentifiableNode.ATTR_IDENTIFIER_NAME, true));

    getAttributes().add(new StringAttribute(this, ATTR_TITLE_NAME, true));
    getAttributes().add(new StringAttribute(this, ATTR_LABEL_NAME, false));
    getAttributes()
        .add(new StringAttribute(this, ATTR_LANG_NAME, XMLConstants.XML_NS_URI, null, false));
    getAttributes().add(new BooleanAttribute(this, ATTR_ADAPTIVE_NAME, true));
    getAttributes().add(new BooleanAttribute(this, ATTR_TIME_DEPENDENT_NAME, true));
    getAttributes().add(new StringAttribute(this, ATTR_TOOL_NAME_NAME, false));
    getAttributes().add(new StringAttribute(this, ATTR_TOOL_VERSION_NAME, false));

    getNodeGroups().add(new ResponseDeclarationGroup(this));
    getNodeGroups().add(new OutcomeDeclarationGroup(this));
    getNodeGroups().add(new TemplateDeclarationGroup(this));

    getNodeGroups().add(new TemplateProcessingGroup(this)); // templateProcessing [0..1]
    getNodeGroups().add(new StylesheetGroup(this)); // stylesheet [0..*]
    getNodeGroups().add(new ItemBodyGroup(this)); // itemBody [0..1]
    getNodeGroups().add(new ResponseProcessingGroup(this)); // responseProcessing [0..1]
    getNodeGroups().add(new ModalFeedbackGroup(this)); // modalFeedback [*]
    getNodeGroups().add(new ApipAccessibilityGroup(this, false));

    /* create a special declaration for the internal completionStatus variable */
    completionStatusOutcomeDeclaration = new OutcomeDeclaration(this);
    completionStatusOutcomeDeclaration.setIdentifier(
        QtiConstants.VARIABLE_COMPLETION_STATUS_IDENTIFIER);
    completionStatusOutcomeDeclaration.setCardinality(Cardinality.SINGLE);
    completionStatusOutcomeDeclaration.setBaseType(BaseType.IDENTIFIER);

    /* create a special declaration for the internal numAttempts variable */
    numAttemptsResponseDeclaration = new ResponseDeclaration(this);
    numAttemptsResponseDeclaration.setIdentifier(
        QtiConstants.VARIABLE_NUMBER_OF_ATTEMPTS_IDENTIFIER);
    numAttemptsResponseDeclaration.setCardinality(Cardinality.SINGLE);
    numAttemptsResponseDeclaration.setBaseType(BaseType.INTEGER);

    /* create a special declaration for the internal duration variable */
    durationResponseDeclaration = new ResponseDeclaration(this);
    durationResponseDeclaration.setIdentifier(QtiConstants.VARIABLE_DURATION_IDENTIFIER);
    durationResponseDeclaration.setCardinality(Cardinality.SINGLE);
    durationResponseDeclaration.setBaseType(BaseType.FLOAT);
  }