package org.karmaexchange.bootstrap;
import static org.karmaexchange.util.OfyService.ofy;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Date;
import java.util.Iterator;
import java.util.logging.Logger;
import javax.servlet.http.Cookie;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.karmaexchange.dao.Event;
import org.karmaexchange.dao.Organization;
import org.karmaexchange.dao.RequestStatus;
import org.karmaexchange.dao.User;
import org.karmaexchange.resources.EventResource;
import org.karmaexchange.resources.EventResource.EventSearchType;
import org.karmaexchange.resources.OrganizationResource;
import org.karmaexchange.resources.msg.ErrorResponseMsg;
import com.googlecode.objectify.Key;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
@SuppressWarnings("serial")
public class GenerateDatastoreIndexesXmlServlet extends BootstrapServlet {
private static final Logger logger =
Logger.getLogger(GenerateDatastoreIndexesXmlServlet.class.getName());
@Override
public void execute() {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseUri());
Date now = new Date();
statusWriter.println("Issuing queries to build datastore-indexes.xml file...");
issueGetRequestAndCheckRespone(
service.path("api/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.UPCOMING.toString()));
issueGetRequestAndCheckRespone(
service.path("api/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.UPCOMING.toString())
.queryParam(EventResource.KEYWORDS_PARAM, "animals"));
// Used for past-event search of events associated with an organization.
issueGetRequestAndCheckRespone(
service.path("api/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.PAST.toString())
.queryParam(EventResource.KEYWORDS_PARAM, "animals"));
Key<Event> arbitraryEventKey = getArbitraryEventKey();
issueGetRequestAndCheckRespone(
service.path("api/event")
.path(arbitraryEventKey.getString())
.path("review_comment_view"));
issueGetRequestAndCheckRespone(
service.path("api/me/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.UPCOMING.toString()));
issueGetRequestAndCheckRespone(
service.path("api/me/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.PAST.toString()));
issueGetRequestAndCheckRespone(
service.path("api/me/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.INTERVAL.toString())
.queryParam(EventResource.START_TIME_PARAM, Long.valueOf(now.getTime()).toString())
.queryParam(EventResource.END_TIME_PARAM, Long.valueOf(now.getTime() + 1).toString()) );
// Not currently used by the UI.
issueGetRequestAndCheckRespone(
service.path("api/me/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.UPCOMING.toString())
.queryParam(EventResource.KEYWORDS_PARAM, "animals"));
// Not currently used by the UI.
issueGetRequestAndCheckRespone(
service.path("api/me/event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.PAST.toString())
.queryParam(EventResource.KEYWORDS_PARAM, "animals"));
Key<User> arbitraryUserKey = getArbitraryUserKey();
issueGetRequestAndCheckRespone(
service.path("api/user")
.path(arbitraryUserKey.getString())
.path("user_managed_event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.UPCOMING.toString()));
issueGetRequestAndCheckRespone(
service.path("api/user")
.path(arbitraryUserKey.getString())
.path("user_managed_event")
.queryParam(EventResource.SEARCH_TYPE_PARAM, EventSearchType.PAST.toString()));
Key<Organization> arbitraryOrgKey = getArbitraryOrganizationKey();
issueGetRequestAndCheckRespone(
service.path("api/org")
.path(arbitraryOrgKey.getString())
.path("member"));
issueGetRequestAndCheckRespone(
service.path("api/org")
.path(arbitraryOrgKey.getString())
.path("member")
.queryParam(OrganizationResource.ROLE_PARAM, Organization.Role.ADMIN.toString()));
issueGetRequestAndCheckRespone(
service.path("api/org")
.path(arbitraryOrgKey.getString())
.path("member")
.queryParam(OrganizationResource.ROLE_PARAM, Organization.Role.ORGANIZER.toString()));
issueGetRequestAndCheckRespone(
service.path("api/org")
.path(arbitraryOrgKey.getString())
.path("member")
.queryParam(OrganizationResource.MEMBERSHIP_STATUS_PARAM, RequestStatus.PENDING.toString()));
issueGetRequestAndCheckRespone(
service.path("task/process_event_completions"));
statusWriter.println("Completed issuing queries.");
}
private URI getBaseUri() {
try {
return new URI(req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort());
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
private void issueGetRequestAndCheckRespone(WebResource resource) {
ClientResponse response = issueGetRequest(resource);
Response.Status status = Response.Status.fromStatusCode(response.getStatus());
if (!status.equals(Response.Status.OK)) {
logger.severe("ERROR: " + response);
if (status.equals(Response.Status.BAD_REQUEST) && response.hasEntity()) {
ErrorResponseMsg errorMsg = response.getEntity(ErrorResponseMsg.class);
logger.severe(" " + errorMsg);
}
throw new RuntimeException(response.toString());
}
}
private ClientResponse issueGetRequest(WebResource resource) {
Cookie[] cookies = req.getCookies();
WebResource.Builder resourceBldr = resource.accept(MediaType.APPLICATION_JSON);
for (Cookie cookie : cookies) {
resourceBldr = resourceBldr.cookie(
new javax.ws.rs.core.Cookie(cookie.getName(), cookie.getValue(), cookie.getPath(),
cookie.getDomain(), cookie.getVersion()));
}
return resourceBldr.get(ClientResponse.class);
}
private Key<Event> getArbitraryEventKey() {
Iterator<Key<Event>> keysIter = ofy().load().type(Event.class).limit(1).keys().iterator();
if (keysIter.hasNext()) {
return keysIter.next();
} else {
throw new RuntimeException(
"At least one event is required in order to generate the datastore-indexes.xml ");
}
}
private Key<User> getArbitraryUserKey() {
Iterator<Key<User>> keysIter = ofy().load().type(User.class).limit(1).keys().iterator();
if (keysIter.hasNext()) {
return keysIter.next();
} else {
throw new RuntimeException(
"At least one user is required in order to generate the datastore-indexes.xml ");
}
}
private Key<Organization> getArbitraryOrganizationKey() {
Iterator<Key<Organization>> keysIter =
ofy().load().type(Organization.class).limit(1).keys().iterator();
if (keysIter.hasNext()) {
return keysIter.next();
} else {
throw new RuntimeException(
"At least one organization is required in order to generate the datastore-indexes.xml ");
}
}
}