org.daxplore.presenter.server.storage.QuestionMetadataServerImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.daxplore.presenter.server.storage.QuestionMetadataServerImpl.java

Source

/*
 *  Copyright 2012 Axel Winkler, Daniel Dunr
 * 
 *  This file is part of Daxplore Presenter.
 *
 *  Daxplore Presenter is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 2.1 of the License, or
 *  (at your option) any later version.
 *
 *  Daxplore Presenter is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with Daxplore Presenter.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.daxplore.presenter.server.storage;

import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.daxplore.presenter.shared.QuestionMetadata;
import org.json.simple.JSONObject;
import org.json.simple.parser.ContainerFactory;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

/**
 * Gives server-side access to localized meta-data for the questions that are
 * defined for the site.
 * 
 * <p>Each question has texts and a number of question options (corresponding to
 * answer options in a survey).</p>
 * 
 * <p>These questions represents both what is called "questions" on the web site
 * as well as "perspectives". This is because they are all originally questions
 * in a survey.</p>
 */
@SuppressWarnings({ "rawtypes" })
public class QuestionMetadataServerImpl implements QuestionMetadata {

    private List<JSONObject> questionList;

    /**
     * Instantiates a new question metadata instance by reading in and parsing
     * the data from reader.
     * 
     * @param reader
     *            a reader, presumably from the file that contains the json
     *            question metadata
     */
    public QuestionMetadataServerImpl(Reader reader) {
        JSONParser parser = new JSONParser();

        ContainerFactory containerFactory = new ContainerFactory() {
            @Override
            public List creatArrayContainer() {
                return new LinkedList();
            }

            @Override
            public Map createObjectContainer() {
                return null;
            }
        };

        try {
            questionList = (List<JSONObject>) parser.parse(reader, containerFactory);
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
    }

    private JSONObject getQuestion(String column) {
        for (JSONObject obj : questionList) {
            if (obj.get("column") != null && column.equals(obj.get("column"))) {
                return obj;
            }
        }
        return null;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean hasQuestion(String column) {
        return getQuestion(column) != null;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getFullText(String column) {
        JSONObject question = getQuestion(column);
        return (String) question.get("text");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getShortText(String column) {
        JSONObject question = getQuestion(column);
        return (String) question.get("short");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<String> getOptionTexts(String column) {
        JSONObject question = getQuestion(column);
        List<String> options = new LinkedList<>();
        List opts = (List) question.get("options");

        Iterator iter = opts.iterator();
        while (iter.hasNext()) {
            options.add((String) iter.next());
        }
        return options;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int getOptionCount(String column) {
        List<String> opts = getOptionTexts(column);
        return opts.size();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean hasSecondary(String column) {
        JSONObject question = getQuestion(column);
        return question.containsKey("hasOld") && (Boolean) question.get("hasOld");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean hasMean(String column) {
        JSONObject question = getQuestion(column);
        return question.containsKey("hasMean") && (Boolean) question.get("hasMean");
    }

}