All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.schema.EcQuestion Maven / Gradle / Ivy

There is a newer version: 3.1.8
Show newest version
package org.schema;

import com.eduworks.ec.array.EcArray;
import org.cassproject.ebac.identity.EcIdentityManager;
import org.cassproject.ebac.repository.EcEncryptedValue;
import org.cassproject.ebac.repository.EcRepository;
import org.cassproject.schema.general.EcRemoteLinkedData;
import org.stjs.javascript.Array;
import org.stjs.javascript.JSCollections;
import org.stjs.javascript.JSObjectAdapter;
import org.stjs.javascript.functions.Callback1;

public class EcQuestion extends Question {

	public static final String MULTIPLE_CHOICE = "Multiple Choice";
	public static final String MULTIPLE_SELECT = "Multiple Select";
	public static final String SHORT_ANSWER = "Short Answer";
	public static final String FILL_IN_THE_BLANK = "Fill in the Blank";
	public static final String ESSAY_OR_SHORT_ANSWER = "Essay or Short Answer";
	public static final String HAND_GRADED_ESSAY = "Hand-graded Essay";

	/**
	 * Searches a repository for questions that match the search query
	 *
	 * @param {EcRepository}          repo Repository to search using the query
	 * @param {String}                query Query string to pass to the search web service
	 * @param {Callback1> success Callback triggered after
	 *                                completing the search, returns the results
	 * @param {Callback1}     failure Callback triggered if error searching
	 * @param {Object}                paramObj Parameter object for search
	 * @memberOf EcQuestion
	 * @method search
	 * @static
	 */
	public static void search(EcRepository repo, String query, final Callback1> success, Callback1 failure, Object paramObj) {
		String queryAdd = "";
		queryAdd = new Question().getSearchStringByType();

		if (query == null || query == "") {
			query = queryAdd;
		} else {
			query = "(" + query + ") AND " + queryAdd;
		}

		repo.searchWithParams(query, paramObj, null, new Callback1>() {
			@Override
			public void $invoke(Array p1) {
				if (success != null) {
					Array ret = JSCollections.$array();
					for (int i = 0; i < p1.$length(); i++) {
						EcQuestion comp = new EcQuestion();
						if (p1.$get(i).isAny(comp.getTypes())) {
							comp.copyFrom(p1.$get(i));
						} else if (p1.$get(i).isA(EcEncryptedValue.myType)) {
							EcEncryptedValue val = new EcEncryptedValue();
							val.copyFrom(p1.$get(i));
							if (val.isAnEncrypted(new EcQuestion().getFullType())) {
								EcRemoteLinkedData obj = val.decryptIntoObject();
								comp.copyFrom(obj);
								EcEncryptedValue.encryptOnSave(comp.id, true);
							}
						}
						ret.$set(i, comp);
					}
					success.$invoke(ret);
				}
			}
		}, failure);
	}

	/**
	 * Heuristic method of determining how this question should be asked.
	 *
	 * @return
	 */
	public String getQuestionType() {
		Array acceptedAnswers = acceptedAnswers();
		if (acceptedAnswers == null) {
			if (canEdit(EcIdentityManager.ids.$get(0).ppk.toPk())) {
				return HAND_GRADED_ESSAY;
			} else {
				return ESSAY_OR_SHORT_ANSWER;
			}
		}
		int m = acceptedAnswers.$length();
		if (m == 0) {
			return HAND_GRADED_ESSAY;
		}
		if (suggestedAnswer == null) {
			if (text != null && text.indexOf("__") != -1) {
				return FILL_IN_THE_BLANK;
			}
			return SHORT_ANSWER;
		}
		int l = ((Array) (Object) suggestedAnswer).$length();
		if (l == 0) {
			if (text != null && text.indexOf("__") != -1) {
				return FILL_IN_THE_BLANK;
			}
			return SHORT_ANSWER;
		}
		if (m > 1) {
			return MULTIPLE_SELECT;
		}
		if (l > 0) {
			return MULTIPLE_CHOICE;
		}
		return "Not sure.";
	}

	public void cementAnswerId(String id) {
		if (acceptedAnswer != null) {
			if (!EcArray.isArray(acceptedAnswer)) {
				throw new RuntimeException("Accepted Answer is not Array");
			}
			Array ary = (Array) (Object) acceptedAnswer;
			for (int i = 0; i < ary.$length(); i++) {
				if (EcRemoteLinkedData.trimVersionFromUrl(ary.$get(i)) == EcRemoteLinkedData.trimVersionFromUrl(id)) {
					ary.$set(i, id);
				}
			}
		}
		if (suggestedAnswer != null) {
			if (!EcArray.isArray(suggestedAnswer)) {
				throw new RuntimeException("Suggested Answer is not Array");
			}
			Array ary = (Array) (Object) suggestedAnswer;
			for (int i = 0; i < ary.$length(); i++) {
				if (EcRemoteLinkedData.trimVersionFromUrl(ary.$get(i)) == EcRemoteLinkedData.trimVersionFromUrl(id)) {
					ary.$set(i, id);
				}
			}
		}
	}

	public Array acceptedAnswers() {
		if (acceptedAnswer == null) {
			return new Array<>();
		}
		return (Array) (Object) acceptedAnswer;
	}

	public Array suggestedAnswers() {
		if (suggestedAnswer == null) {
			return new Array<>();
		}
		return (Array) (Object) suggestedAnswer;
	}

	public void addAcceptedAnswer(EcAnswer answer) {
		if (acceptedAnswer == null) {
			JSObjectAdapter.$put(this, "acceptedAnswer", new Array());
		}
		if (!EcArray.isArray(acceptedAnswer)) {
			throw new RuntimeException("Accepted Answer is not Array");
		}
		Array ary = (Array) (Object) acceptedAnswer;
		ary.push(answer.id);
	}

	public void addSuggestedAnswer(EcAnswer answer) {
		if (suggestedAnswer == null) {
			JSObjectAdapter.$put(this, "suggestedAnswer", new Array());
		}
		if (!EcArray.isArray(suggestedAnswer)) {
			throw new RuntimeException("Suggested Answer is not Array");
		}
		Array ary = (Array) (Object) suggestedAnswer;
		ary.push(answer.id);
	}

	public void removeSuggestedAnswerById(String id) {
		if (suggestedAnswer == null) {
			return;
		}

		if (!EcArray.isArray(suggestedAnswer)) {
			throw new RuntimeException("Suggested Answer is not Array");
		}
		Array ary = (Array) (Object) suggestedAnswer;
		for (int i = 0; i < ary.$length(); i++) {
			if (EcRemoteLinkedData.trimVersionFromUrl(ary.$get(i)) == EcRemoteLinkedData.trimVersionFromUrl(id)) {
				ary.splice(i, 1);
			}
		}
	}

	public void removeAcceptedAnswerById(String id) {
		if (acceptedAnswer == null) {
			return;
		}

		if (!EcArray.isArray(acceptedAnswer)) {
			throw new RuntimeException("Accepted Answer is not Array");
		}
		Array ary = (Array) (Object) acceptedAnswer;
		for (int i = 0; i < ary.$length(); i++) {
			if (EcRemoteLinkedData.trimVersionFromUrl(ary.$get(i)) == EcRemoteLinkedData.trimVersionFromUrl(id)) {
				ary.splice(i, 1);
			}
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy