package de.tud.kom.socom; import java.sql.SQLException; import java.text.DateFormat; import java.text.SimpleDateFormat; import org.eclipse.jetty.util.Utf8Appendable.NotUtf8Exception; import org.json.JSONException; import org.json.JSONObject; import de.tud.kom.socom.components.achievements.AchievementsManager; import de.tud.kom.socom.components.content.ContentManager; import de.tud.kom.socom.components.game.GameManager; import de.tud.kom.socom.components.influence.InfluenceManager; import de.tud.kom.socom.components.report.ReportManager; import de.tud.kom.socom.components.social.SocialNetworkManager; import de.tud.kom.socom.components.statistics.StatisticsManager; import de.tud.kom.socom.components.user.UserManager; import de.tud.kom.socom.database.user.HSQLUserDatabase; import de.tud.kom.socom.util.ErrorCodeUtils; import de.tud.kom.socom.util.SocomRequest; import de.tud.kom.socom.util.JSONUtils; import de.tud.kom.socom.util.Logger; import de.tud.kom.socom.util.LoggerFactory; import de.tud.kom.socom.util.ResourceLoader; import de.tud.kom.socom.util.enums.ErrorCode; import de.tud.kom.socom.util.exceptions.SocomException; import de.tud.kom.socom.util.exceptions.ParseException; import de.tud.kom.socom.util.exceptions.UIDNotIncludedException; import de.tud.kom.socom.util.playerstate.ObservedUIDs; import de.tud.kom.socom.util.playerstate.PlayerStateWatcher; /** * * @author rhaban * */ public class SocomCore { private SocomComponent[] components; private Logger logger; private static SimpleDateFormat simple_date_format; public SocomCore() { simple_date_format = new SimpleDateFormat(ResourceLoader.getResource("simple_date_format")); loadComponents(); runPlayerStateWachter(); logger = LoggerFactory.getLogger(); } protected void doRequest(SocomRequest req) { try { updateOnlineState(req.getUid()); } catch (UIDNotIncludedException e) { } String handler; int code = -1; try { handler = req.getHandlerString(); for (SocomComponent component : components) { if (component.getUrlPattern().equalsIgnoreCase(handler)) { code = component.handleRequest(req); break; } } if (code == -1) throw new ParseException("handler"); if (code > 0) // no success? req.addOutput(ErrorCodeUtils.toJSONString(ErrorCode.fromInt(code))); } catch (NumberFormatException e) { try { req.setOutput(JSONUtils.JSONToString(new JSONObject().put("error", ErrorCode.UNEXPECTED_OR_MISSING_PARAMETER.name()) .put("code", ErrorCode.UNEXPECTED_OR_MISSING_PARAMETER.ordinal()))); } catch (JSONException e1) { logger.Error(e); } } catch (NotUtf8Exception e) {// this will basically never happen as these are all catched and transformed to socom Exceptions in SocomRequest try { JSONObject json = new JSONObject().put("error", ErrorCode.UNEXPECTED_OR_MISSING_PARAMETER.name()) .put("code", ErrorCode.UNEXPECTED_OR_MISSING_PARAMETER.ordinal()).put("message", "UTF8-Encoding Error: "+e.getMessage()); req.setOutput(JSONUtils.JSONToString(json)); } catch (JSONException e1) { logger.Error(e); } }catch (ParseException e) { req.setOutput(e.toJSON()); } catch (SocomException e) { try { JSONObject json = new JSONObject(); json.put("code", e.getErrorCode()); json.put("error", ErrorCode.fromInt(e.getErrorCode()).name()); json.put("message", e.getMessage()); req.addOutput(JSONUtils.JSONToString(json)); } catch (JSONException e1) { logger.Error(e1); } } catch (Throwable e) { e.printStackTrace(); logger.Error(e); req.setOutput(e.getMessage()); } finally { req.finish(); } } private void updateOnlineState(long uid) { ObservedUIDs.getInstance().setOnline(uid); } private void loadComponents() { components = new SocomComponent[] { SocialNetworkManager.getInstance(), ContentManager.getInstance(), UserManager.getInstance(), GameManager.getInstance(), InfluenceManager.getInstance(), AchievementsManager.getInstance(), StatisticsManager.getInstance(), ReportManager.getInstance()}; } private void runPlayerStateWachter() { try { HSQLUserDatabase.getInstance().setAllUsersOffline(); } catch (SQLException e) { logger.Error(e); } PlayerStateWatcher.getInstance().start(); } public static DateFormat getDateFormat() { return simple_date_format; } }