package de.tud.kom.socom.web.server;
import java.util.List;
import de.tud.kom.socom.web.client.services.influence.SoComInfluenceService;
import de.tud.kom.socom.web.client.sharedmodels.Influence;
import de.tud.kom.socom.web.client.sharedmodels.InfluenceAnswer;
import de.tud.kom.socom.web.client.sharedmodels.LoginResult;
import de.tud.kom.socom.web.client.util.exceptions.NotVisibleException;
import de.tud.kom.socom.web.server.database.influence.HSQLInfluenceDatabaseAccess;
import de.tud.kom.socom.web.server.database.influence.InfluenceDatabaseAccess;
@SuppressWarnings("serial")
public class SoComInfluenceServiceImpl extends SoComService implements SoComInfluenceService {
private final InfluenceDatabaseAccess db = HSQLInfluenceDatabaseAccess.getInstance();
@Override
public List<Influence> getInfluences(String sid, boolean includeEndedInfluences, int rangeStart, int rangeEnd)
throws NotVisibleException {
LoginResult currentUser = getCurrentUser(sid);
boolean userIsAdmin = currentUser.isAdmin();
long uid = currentUser.getUid();
includeEndedInfluences = userIsAdmin || includeEndedInfluences;
// visibility check done directly in DB SELECT due to offset/limit..
List<Influence> influences = db.getAllInfluences(uid, userIsAdmin, rangeStart, rangeEnd - rangeStart,
includeEndedInfluences, userIsAdmin ? true : false);
return influences;
}
@Override
public Influence getInfluence(String sid, String influenceId, boolean log) throws NotVisibleException {
LoginResult currentUser = getCurrentUser(sid);
boolean userIsAdmin = currentUser.isAdmin();
long uid = currentUser.getUid();
boolean includeDeletedAnswer = userIsAdmin;
// throws NotVisibleException
Influence influence = db.getInfluence(uid, userIsAdmin, influenceId, includeDeletedAnswer);
if (influence == null)
throw new NotVisibleException(-1); // FIXME throw another error
db.appendResults(influence);
if(log) logRequest(currentUser, influence);
return influence;
}
@Override
public Influence getInfluence(String sid, String influenceId) throws NotVisibleException {
return getInfluence(sid, influenceId, false);
}
private void logRequest(LoginResult currentUser, Influence influence) {
try {
StringBuffer sb = new StringBuffer();
long uid = currentUser.getUid();
if (uid >= 0) {
sb.append("User #").append(uid).append(": \"").append(currentUser.getUsername()).append("\"");
} else {
sb.append("Unregistered User");
}
sb.append(" fetched Influence ").append(influence.getId()).append(" (\"")
.append(influence.getQuestion()).append(",externalid:").append(influence.getExternalId()).append(")");
logger.Debug(sb.toString());
} catch (Exception e) {
logger.Error(e);
}
}
@Override
public boolean answerInfluence(String sid, long id, List<InfluenceAnswer> givenAnswers) {
boolean success = true;
for (InfluenceAnswer answer : givenAnswers) {
if (answer.isPredefined()) {
success &= db.addPredefinedAnswer(id, answer.getId());
} else {
if (answer.isNewFreeAnswer()) {
if (answer.getOwnerId() >= 0)
success &= db.createFreeAnswer(id, answer.getOwnerId(), answer.getAnswer(),
answer.getVisibility());
else
return false;
} else {
success &= db.addFreeAnswer(id, answer.getId());
}
}
}
if (sid != null) {// if a user is logged in..
long uid = getCurrentUser(sid).getUid();
if (uid != -1) {
db.addAttendent(id, uid);
logAnswering(success, id, givenAnswers, uid);
}
} else
logAnswering(success, id, givenAnswers, -1);
return success;
}
private void logAnswering(boolean success, long id, List<InfluenceAnswer> givenAnswers, long uid) {
try {
StringBuffer sb = new StringBuffer();
if (success) {
sb.append((uid >= 0) ? "User #" + uid : "Unregistered User").append(" answered Influence #").append(id)
.append(": ");
for (InfluenceAnswer an : givenAnswers) {
sb.append(an.getId())
.append(" (\"")
.append(an.getAnswer())
.append(an.isPredefined() ? "\" <predefined>" : an.getOwnerId() >= 0 ? "\" <*new free answer>"
: "\" <free answer>").append(")");
}
logger.Debug(sb.toString());
}
} catch (Exception e) {
logger.Error(e);
}
}
}