Package com.lastcalc.servlets

Source Code of com.lastcalc.servlets.StatelessServlet$WorksheetResponse

/*******************************************************************************
* LastCalc - The last calculator you'll ever need
* Copyright (C) 2011, 2012 Uprizer Labs LLC
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more
* details.
******************************************************************************/
package com.lastcalc.servlets;

import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.http.*;

import com.google.common.collect.Maps;

import com.lastcalc.*;
import com.lastcalc.db.Line;
import com.lastcalc.parsers.UserDefinedParserParser.UserDefinedParser;
import com.lastcalc.parsers.currency.Currencies;

@SuppressWarnings("serial")
public class StatelessServlet extends HttpServlet {

  @Override
  public void init() throws ServletException {

  }

  @Override
  public void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws IOException {
    final WorksheetRequest request = Misc.gson.fromJson(req.getReader(), WorksheetRequest.class);
    final WorksheetResponse response = new WorksheetResponse();
    if (request.getRecognizedWords) {
      response.recognizedWords = SequentialParser.recognizedWords;
    }
    final ArrayList<Line> qaPairs = new ArrayList<Line>();
    if (request.questions != null) {
      int earliestModified = Integer.MAX_VALUE;
      final TreeMap<Integer, String> orderedQuestions = Maps.newTreeMap();
      orderedQuestions.putAll(request.questions);
      for (final Entry<Integer, String> e : orderedQuestions.entrySet()) {
        final int pos = e.getKey() - 1;
        if (pos < qaPairs.size()) {
          final Line qaPair = qaPairs.get(pos);
          qaPair.question = e.getValue();
          earliestModified = Math.min(earliestModified, pos);
        } else {
          qaPairs.add(new Line(e.getValue(), null));
        }
      }
      for (int x = earliestModified; x < qaPairs.size(); x++) {
        final Line qaPair = qaPairs.get(x);
        qaPair.answer = null;
      }
      // Remove any qaPairs that have been removed from the browser DOM
      if (!orderedQuestions.isEmpty()) {
        while (qaPairs.size() > orderedQuestions.lastKey()) {
          qaPairs.remove(qaPairs.size() - 1);
        }
      }
    }

    // Recompute worksheet
    final SequentialParser seqParser = SequentialParser.create();
    for (final Line qap : qaPairs) {
      if (qap.question.trim().length() == 0) {
        qap.answer = TokenList.createD();
      } else {
        if (qap.answer == null) {
          qap.answer = seqParser.parseNext(Tokenizer.tokenize(qap.question));
        } else {
          seqParser.processNextAnswer(qap.answer);
        }
      }
    }

    response.answers = Maps.newHashMap();
    response.answerTypes = Maps.newHashMap();
    response.variables = seqParser.getUserDefinedKeywordMap();

    for (int x = 0; x < qaPairs.size(); x++) {
      final TokenList answer = qaPairs.get(x).answer;
      final TokenList strippedAnswer = seqParser.stripUDF(answer);
      response.answers.put(x + 1, strippedAnswer.toString());
      response.answerTypes.put(x + 1, strippedAnswer.size() == 1
          && strippedAnswer.get(0) instanceof UserDefinedParser ? AnswerType.FUNCTION
              : AnswerType.NORMAL);
    }

    resp.setContentType("application/json; charset=UTF-8");
    Misc.gson.toJson(response, resp.getWriter());

    if (Currencies.shouldUpdate()) {
      Currencies.updateExchangeRates();
    }
  }

  public static class WorksheetRequest {
    public boolean getRecognizedWords = false;

    public String worksheetId;

    public Map<Integer, String> questions;
  }

  public static class WorksheetResponse {
    Set<String> recognizedWords;

    Map<Integer, String> answers;

    Map<Integer, AnswerType> answerTypes;

    Map<String, Integer> variables;
  }

  public enum AnswerType {
    NORMAL, FUNCTION, ERROR
  }
}
TOP

Related Classes of com.lastcalc.servlets.StatelessServlet$WorksheetResponse

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.