package org.fluxtream.core.mvc.models.admin; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.fluxtream.core.Configuration; import org.fluxtream.core.connectors.Connector; import org.fluxtream.core.domain.ApiKey; import org.fluxtream.core.domain.UpdateWorkerTask; import org.fluxtream.core.services.ConnectorUpdateService; import org.fluxtream.core.services.GuestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * User: candide * Date: 16/09/13 * Time: 13:51 */ @Component public class ConnectorInstanceModelFactory { @Autowired Configuration env; @Autowired ConnectorUpdateService connectorUpdateService; @Autowired GuestService guestService; public Map<String,Object> createConnectorInstanceModel(ApiKey apiKey) { Map<String,Object> model = new HashMap<String,Object>(); final Connector connector = apiKey.getConnector(); final Map<String, String> attributes = guestService.getApiKeyAttributes(apiKey.getId()); model.put("connectorName", connector.getName()); model.put("attributes", attributes); String rateLimitString = (String) env.connectors.getProperty(connector.getName() + ".rateLimit"); if (rateLimitString == null) rateLimitString = (String) env.connectors.getProperty("rateLimit"); model.put("rateLimitSpecs", rateLimitString); final String auditTrail = checkForErrors(apiKey); ApiKey.Status status = apiKey.getStatus(); // Treat status=null as STATUS_UP if(status==null) { status=ApiKey.Status.STATUS_UP; } model.put("status", status.toString()); model.put("errors", status != ApiKey.Status.STATUS_UP); model.put("auditTrail", auditTrail!=null?auditTrail:""); int quota = Integer.valueOf(rateLimitString.split("/")[0]); long numberOfUpdates = getNumberOfUpdatesOverSpecifiedTimePeriod(apiKey.getGuestId(), connector, rateLimitString, model); model.put("isOverQuota", numberOfUpdates >= quota); return model; } private String checkForErrors(ApiKey apiKey) { Collection<UpdateWorkerTask> update = connectorUpdateService.getLastFinishedUpdateTasks(apiKey); if (update.size() < 1) { return null; } for (UpdateWorkerTask workerTask : update) { if (workerTask == null || workerTask.status != UpdateWorkerTask.Status.DONE) { if (workerTask.auditTrail != null) { return workerTask.auditTrail; } else { return "no audit trail"; } } } return null; } private long getNumberOfUpdatesOverSpecifiedTimePeriod(final long guestId, final Connector connector, final String rateLimitString, final Map<String, Object> model) { int millis = Integer.valueOf(rateLimitString.split("/")[1]); long then = System.currentTimeMillis() - millis; long numberOfUpdates; if (rateLimitString.endsWith("/user")) { numberOfUpdates = connectorUpdateService .getNumberOfUpdatesSince(guestId, connector.value(), then); model.put("numberOfUserCalls", numberOfUpdates); } else { numberOfUpdates = connectorUpdateService .getTotalNumberOfUpdatesSince(connector, then); model.put("numberOfCalls", numberOfUpdates); } return numberOfUpdates; } }