/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.vipr.client.core; import java.io.InputStream; import java.net.URI; import java.util.Date; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; import com.emc.vipr.client.core.impl.PathConstants; import com.emc.vipr.client.core.util.TimeBucketUtils; import com.emc.vipr.client.impl.DateUtils; import com.emc.vipr.client.impl.RestClient; import com.sun.jersey.api.client.ClientResponse; public class Audit { protected final RestClient client; private static final String TIME_BUCKET = "time_bucket"; private static final String START = "start"; private static final String END = "end"; private static final String SERVICE_TYPE = "service_type"; private static final String USER = "user"; private static final String RESULT = "result"; private static final String KEYWORD = "keyword"; private static final String LANGUAGE = "language"; public Audit(RestClient client) { this.client = client; } /** * Gets the logs for the hour of the given date, as a stream. This is a convenience method for * <tt>getLogsForHourAsStream(date, null)</tt>. * * @param date * the date, which will be formatted as an hour time bucket. * @return the stream containing the logs as XML. This must be closed by the client in order to release the * connection. * @see #getLogsForHourAsStream(Date,String) * @see TimeBucketUtils#forHour(Date) */ public InputStream getLogsForHourAsStream(Date date) { return getLogsForHourAsStream(date, null); } /** * Gets the logs for the hour of the given date, as a stream. This formats the date as <tt>yyyy-MM-dd'T'HH</tt> in * UTC time and supplies that as the time bucket for {@link #getLogsForTimeBucketAsStream(String)}. * * @param date * the date, which will be formatted as an hour time bucket. * @return the stream containing the logs as XML. This must be closed by the client in order to release the * connection. * @see #getLogsForTimeBucketAsStream(String) * @see TimeBucketUtils#forHour(Date) * */ public InputStream getLogsForHourAsStream(Date date, String language) { String timeBucket = TimeBucketUtils.forHour(date); return getLogsForTimeBucketAsStream(timeBucket, language); } /** * Gets the logs for the minute of the given date, as a stream. This is a convenience method for * <tt>getLogsForMinuteAsStream(date, null)</tt>. * * @param date * the date, which will be formatted as a minute time bucket. * @return the stream containing the logs as XML. This must be closed by the client in order to release the * connection. * @see #getLogsForTimeBucketAsStream(String) * @see TimeBucketUtils#forHour(Date) */ public InputStream getLogsForMinuteAsStream(Date date) { return getLogsForMinuteAsStream(date, null); } /** * Gets the logs for the minute of the given date, as a stream. This formats the date as <tt>yyyy-MM-dd'T'HH:mm</tt> in UTC time and * supplies that as the time bucket for {@link #getLogsForTimeBucketAsStream(String)}. * * @param date * the date, which will be formatted as a minute time bucket. * @return the stream containing the logs as XML. This must be closed by the client in order to release the * connection. * */ public InputStream getLogsForMinuteAsStream(Date date, String language) { String timeBucket = TimeBucketUtils.forMinute(date); return getLogsForTimeBucketAsStream(timeBucket, language); } /** * Gets the logs for the given time bucket, as a stream. A time bucket can be either an hour or a minute of any day, * in the form of <tt>yyyy-MM-dd'T'HH</tt> for hour or <tt>yy-MM-dd'T'HH:mm for minute.</tt> * API Call: <tt>GET /audit/logs?time_bucket={timeBucket}</tt> * * @param timeBucket * the time bucket for which to retrieve the logs. * @return the stream containing the logs as XML. This must be closed by the client in order to release the * connection. */ public InputStream getLogsForTimeBucketAsStream(String timeBucket) { return getLogsForTimeBucketAsStream(timeBucket, null); } /** * Gets the logs for the given time bucket, as a stream. A time bucket can be either an hour or a minute of any day, * in the form of <tt>yyyy-MM-dd'T'HH</tt> for hour or <tt>yy-MM-dd'T'HH:mm for minute. </tt> * API Call: <tt>GET /audit/logs?time_bucket={timeBucket} and language={language}</tt> * * @param timeBucket * the time bucket for which to retrieve the logs. * @param language * the language for the logs (optional). * @return the stream containing the logs as XML. This must be closed by the client in order to release the * connection. */ public InputStream getLogsForTimeBucketAsStream(String timeBucket, String language) { ClientResponse response = getLogs(ClientResponse.class, timeBucket, language); return response.getEntityInputStream(); } protected <T> T getLogs(Class<T> responseType, String timeBucket, String language) { UriBuilder builder = client.uriBuilder(PathConstants.AUDIT_LOGS_URL).queryParam(TIME_BUCKET, timeBucket); if ((language != null) && (language.length() > 0)) { builder.queryParam(LANGUAGE, language); } return client.resource(builder.build()).accept(MediaType.APPLICATION_XML).get(responseType); } public InputStream getAsStream(Date start, Date end, String serviceType, String user, String result, String keyword, String language) { return getAsStream(formatDate(start), formatDate(end), serviceType, user, result, keyword, language); } public InputStream getAsStream(String startTime, String endTime, String serviceType, String user, String result, String keyword, String language) { URI uri = getURI(startTime, endTime, serviceType, user, result, keyword, language); ClientResponse response = client.resource(uri).accept(MediaType.APPLICATION_XML).get(ClientResponse.class); return response.getEntityInputStream(); } public InputStream getAsText(Date start, Date end, String serviceType, String user, String result, String keyword, String language) { return getAsText(formatDate(start), formatDate(end), serviceType, user, result, keyword, language); } public InputStream getAsText(String startTime, String endTime, String serviceType, String user, String result, String keyword, String language) { URI uri = getURI(startTime, endTime, serviceType, user, result, keyword, language); ClientResponse response = client.resource(uri).accept(MediaType.TEXT_PLAIN).get(ClientResponse.class); return response.getEntityInputStream(); } private URI getURI(String startTime, String endTime, String serviceType, String user, String result, String keyword, String language) { UriBuilder builder = client.uriBuilder(PathConstants.AUDIT_LOGS_URL); if ((startTime != null) && (startTime.length() > 0)) { builder.queryParam(START, startTime); } if ((endTime != null) && (endTime.length() > 0)) { builder.queryParam(END, endTime); } if ((serviceType != null) && (serviceType.length() > 0)) { builder.queryParam(SERVICE_TYPE, serviceType); } if ((language != null) && (language.length() > 0)) { builder.queryParam(LANGUAGE, language); } buildUserResultKeyword(builder, user, result, keyword); return builder.build(); } private void buildUserResultKeyword(UriBuilder builder, String user, String result, String keyword) { if ((user != null) && (user.length() > 0)) { builder.queryParam(USER, user); } if ((result != null) && (result.length() > 0)) { builder.queryParam(RESULT, result); } if ((keyword != null) && (keyword.length() > 0)) { builder.queryParam(KEYWORD, keyword); } } private String formatDate(Date date) { return date != null ? DateUtils.formatUTC(date, "yyyy-MM-dd'T'HH") : null; } }