package org.nlamah.QLS.TypeChecker; import java.util.ArrayList; import java.util.List; import org.nlamah.QBase.TypeChecker.QBaseAbstractTypeChecker; import org.nlamah.QLS.Error.DoubleDefaultBlockError; import org.nlamah.QLS.Interfaces.QLSNodeVisitor; import org.nlamah.QLS.Model.Abstract.QLSNode; import org.nlamah.QLS.Model.Abstract.SectionItem; import org.nlamah.QLS.Model.Declaration.ColorDeclaration; import org.nlamah.QLS.Model.Declaration.FontDeclaration; import org.nlamah.QLS.Model.Declaration.FontSizeDeclaration; import org.nlamah.QLS.Model.Declaration.WidgetDeclaration; import org.nlamah.QLS.Model.Declaration.WidthDeclaration; import org.nlamah.QLS.Model.StylesheetBlock.DefaultBlock; import org.nlamah.QLS.Model.StylesheetBlock.Page; import org.nlamah.QLS.Model.StylesheetBlock.Section; import org.nlamah.QLS.Model.StylesheetBlock.StyleBlock; import org.nlamah.QLS.Model.StylesheetBlock.StyledQuestion; import org.nlamah.QLS.Model.StylesheetBlock.Stylesheet; import org.nlamah.QLS.Model.Value.IdentifierValue; public class DoubleDefaultBlockChecker extends QBaseAbstractTypeChecker implements QLSNodeVisitor { public DoubleDefaultBlockChecker(Stylesheet stylesheet) { stylesheet.accept(this); } private void gatherErrors(List<DefaultBlock> defaultBlocks) { List<DefaultBlock> list = DefaultBlock.getListWithDuplicatedDefaultBlocksForQuestionType(defaultBlocks); if (list.size() > 0) { for (DefaultBlock defaultBlock : list) { List<DefaultBlock> defaultBlocksWithSameType = defaultBlocksWithSameType(defaultBlocks, defaultBlock); errors.add(new DoubleDefaultBlockError(new ArrayList<DefaultBlock>(defaultBlocksWithSameType))); } } } private List<DefaultBlock> defaultBlocksWithSameType(List<DefaultBlock> defaultBlocks, DefaultBlock referenceDeclaration) { List<DefaultBlock> returnList = new ArrayList<DefaultBlock>(); for (DefaultBlock defaultBlock : defaultBlocks) { if (defaultBlock.questionType() == referenceDeclaration.questionType()) { returnList.add(defaultBlock); } } return returnList; } @Override public QLSNode visit(Stylesheet stylesheet) { gatherErrors(stylesheet.defaultBlocks()); for (Page page : stylesheet.pages()) { page.accept(this); } return null; } @Override public QLSNode visit(Page page) { gatherErrors(page.defaultBlocks()); for (Section section : page.sections()) { section.accept(this); } return null; } @Override public QLSNode visit(Section section) { gatherErrors(section.defaultBlocks()); for (SectionItem sectionItem : section.sectionItems()) { sectionItem.accept(this); } return null; } @Override public QLSNode visit(WidgetDeclaration widgetDeclaration) { assert(false); return null; } @Override public QLSNode visit(StyledQuestion styledQuestion) { return null; } @Override public QLSNode visit(DefaultBlock defaultBlock) { assert(false); return null; } @Override public QLSNode visit(StyleBlock styleBlock) { assert(false); return null; } @Override public QLSNode visit(IdentifierValue identifierValue) { assert(false); return null; } @Override public QLSNode visit(ColorDeclaration colorDeclaration) { assert(false); return null; } @Override public QLSNode visit(FontDeclaration fontDeclaration) { assert(false); return null; } @Override public QLSNode visit(FontSizeDeclaration fontSizeDeclaration) { assert(false); return null; } @Override public QLSNode visit(WidthDeclaration widthDeclaration) { assert(false); return null; } }