Skip to content

Commit

Permalink
[HWKMETRICS-41] initial refactoring for consistent, non-null return t…
Browse files Browse the repository at this point in the history
…ypes
  • Loading branch information
John Sanda committed Mar 25, 2015
1 parent 7b5fc00 commit c65964a
Show file tree
Hide file tree
Showing 17 changed files with 391 additions and 286 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;

Expand Down Expand Up @@ -56,7 +57,6 @@
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;

import org.hawkular.metrics.api.jaxrs.callback.MetricCreatedCallback;
import org.hawkular.metrics.api.jaxrs.callback.NoDataCallback;
import org.hawkular.metrics.api.jaxrs.callback.SimpleDataCallback;
Expand Down Expand Up @@ -162,9 +162,11 @@ public void createAvailabilityMetric(@Suspended final AsyncResponse asyncRespons
})
public void getNumericMetricTags(@Suspended final AsyncResponse asyncResponse,
@PathParam("tenantId") String tenantId, @PathParam("id") String id) {
ListenableFuture<Metric<?>> future = metricsService.findMetric(tenantId, MetricType.NUMERIC,
java.util.function.Function<Void, String> f = v -> "";

ListenableFuture<Optional<Metric<?>>> future = metricsService.findMetric(tenantId, MetricType.NUMERIC,
new MetricId(id));
Futures.addCallback(future, new SimpleDataCallback<Metric<?>>(asyncResponse));
Futures.addCallback(future, new SimpleDataCallback<>(asyncResponse));
}

@PUT
Expand All @@ -179,7 +181,7 @@ public void updateNumericMetricTags(@Suspended final AsyncResponse asyncResponse
@ApiParam(required = true) Map<String, String> tags) {
NumericMetric metric = new NumericMetric(tenantId, new MetricId(id));
ListenableFuture<Void> future = metricsService.addTags(metric, tags);
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@DELETE
Expand All @@ -197,7 +199,7 @@ public void deleteNumericMetricTags(
@PathParam("tags") String encodedTags) {
NumericMetric metric = new NumericMetric(tenantId, new MetricId(id));
ListenableFuture<Void> future = metricsService.deleteTags(metric, MetricUtils.decodeTags(encodedTags));
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@GET
Expand All @@ -210,9 +212,9 @@ public void deleteNumericMetricTags(
})
public void getAvailabilityMetricTags(@Suspended final AsyncResponse asyncResponse,
@PathParam("tenantId") String tenantId, @PathParam("id") String id) {
ListenableFuture<Metric<?>> future = metricsService.findMetric(tenantId, MetricType.AVAILABILITY,
ListenableFuture<Optional<Metric<?>>> future = metricsService.findMetric(tenantId, MetricType.AVAILABILITY,
new MetricId(id));
Futures.addCallback(future, new SimpleDataCallback<Metric<?>>(asyncResponse));
Futures.addCallback(future, new SimpleDataCallback<>(asyncResponse));
}

@PUT
Expand All @@ -227,7 +229,7 @@ public void updateAvailabilityMetricTags(@Suspended final AsyncResponse asyncRes
@ApiParam(required = true) Map<String, String> tags) {
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
ListenableFuture<Void> future = metricsService.addTags(metric, tags);
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@DELETE
Expand All @@ -244,7 +246,7 @@ public void deleteAvailabilityMetricTags(
@PathParam("tags") String encodedTags) {
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
ListenableFuture<Void> future = metricsService.deleteTags(metric, MetricUtils.decodeTags(encodedTags));
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -271,7 +273,7 @@ public void addDataForMetric(
NumericMetric metric = new NumericMetric(tenantId, new MetricId(id));
data.forEach(metric::addData);
ListenableFuture<Void> future = metricsService.addNumericData(Collections.singletonList(metric));
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -297,7 +299,7 @@ public void addAvailabilityForMetric(
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));
data.forEach(metric::addData);
ListenableFuture<Void> future = metricsService.addAvailabilityData(Collections.singletonList(metric));
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -320,7 +322,7 @@ public void addNumericData(@Suspended final AsyncResponse asyncResponse,
}

ListenableFuture<Void> future = metricsService.addNumericData(metrics);
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -342,7 +344,7 @@ public void addAvailabilityData(@Suspended final AsyncResponse asyncResponse,
}

ListenableFuture<Void> future = metricsService.addAvailabilityData(metrics);
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@GET
Expand All @@ -358,7 +360,7 @@ public void findNumericDataByTags(@Suspended final AsyncResponse asyncResponse,
@QueryParam("tags") String encodedTags) {
ListenableFuture<Map<MetricId, Set<NumericData>>> queryFuture = metricsService.findNumericDataByTags(
tenantId, MetricUtils.decodeTags(encodedTags));
Futures.addCallback(queryFuture, new SimpleDataCallback<Map<MetricId, Set<NumericData>>>(asyncResponse));
Futures.addCallback(queryFuture, new SimpleDataCallback<>(asyncResponse));
}

@GET
Expand All @@ -376,7 +378,7 @@ public void findAvailabilityDataByTags(@Suspended final AsyncResponse asyncRespo
@QueryParam("tags") String encodedTags) {
ListenableFuture<Map<MetricId, Set<Availability>>> queryFuture = metricsService.findAvailabilityByTags(
tenantId, MetricUtils.decodeTags(encodedTags));
Futures.addCallback(queryFuture, new SimpleDataCallback<Map<MetricId, Set<Availability>>>(asyncResponse));
Futures.addCallback(queryFuture, new SimpleDataCallback<>(asyncResponse));
}

@GET
Expand Down Expand Up @@ -408,19 +410,9 @@ public void findNumericData(
NumericMetric metric = new NumericMetric(tenantId, new MetricId(id));

if (bucketsCount == null && bucketDuration == null) {
ListenableFuture<NumericMetric> dataFuture = metricsService.findNumericData(metric, start, end);
ListenableFuture<List<NumericData>> outputFuture = Futures.transform(
dataFuture, new Function<NumericMetric, List<NumericData>>() {
@Override
public List<NumericData> apply(NumericMetric input) {
if (input == null) {
return null;
}
return input.getData();
}
}
);
Futures.addCallback(outputFuture, new SimpleDataCallback<Object>(asyncResponse));
ListenableFuture<List<NumericData>> dataFuture = metricsService.findNumericData(tenantId, new MetricId(id),
start, end);
Futures.addCallback(dataFuture, new SimpleDataCallback<Object>(asyncResponse));
return;
}

Expand All @@ -444,20 +436,18 @@ public List<NumericData> apply(NumericMetric input) {
asyncResponse.resume(response);
return;
}
ListenableFuture<BucketedOutput<NumericBucketDataPoint>> dataFuture = metricsService.findNumericStats(
metric, start, end, buckets
);
ListenableFuture<List<NumericBucketDataPoint>> outputFuture = Futures.transform(
dataFuture, new Function<BucketedOutput<NumericBucketDataPoint>, List<NumericBucketDataPoint>>() {
@Override
public List<NumericBucketDataPoint> apply(BucketedOutput<NumericBucketDataPoint> input) {
if (input == null) {
return null;
}
return input.getData();
ListenableFuture<BucketedOutput<NumericBucketDataPoint>> dataFuture = metricsService.findNumericStats(metric,
start, end, buckets);
ListenableFuture<List<NumericBucketDataPoint>> outputFuture = Futures.transform(dataFuture,
new Function<BucketedOutput<NumericBucketDataPoint>, List<NumericBucketDataPoint>>() {
@Override
public List<NumericBucketDataPoint> apply(BucketedOutput<NumericBucketDataPoint> input) {
if (input == null) {
return null;
}
return input.getData();
}
);
});
Futures.addCallback(outputFuture, new SimpleDataCallback<Object>(asyncResponse));
}

Expand Down Expand Up @@ -554,19 +544,9 @@ public void findAvailabilityData(
AvailabilityMetric metric = new AvailabilityMetric(tenantId, new MetricId(id));

if (bucketsCount == null && bucketDuration == null) {
ListenableFuture<AvailabilityMetric> dataFuture = metricsService.findAvailabilityData(metric, start, end);
ListenableFuture<List<Availability>> outputFuture = Futures.transform(
dataFuture, new Function<AvailabilityMetric, List<Availability>>() {
@Override
public List<Availability> apply(AvailabilityMetric input) {
if (input == null) {
return null;
}
return input.getData();
}
}
);
Futures.addCallback(outputFuture, new SimpleDataCallback<Object>(asyncResponse));
ListenableFuture<List<Availability>> dataFuture = metricsService.findAvailabilityData(tenantId,
metric.getId(), start, end);
Futures.addCallback(dataFuture, new SimpleDataCallback<Object>(asyncResponse));
return;
}

Expand Down Expand Up @@ -621,7 +601,7 @@ public void tagNumericData(@Suspended final AsyncResponse asyncResponse, @PathPa
} else {
future = metricsService.tagNumericData(metric, params.getTags(), params.getStart(), params.getEnd());
}
Futures.addCallback(future, new NoDataCallback<List<NumericData>>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -638,7 +618,7 @@ public void tagAvailabilityData(@Suspended final AsyncResponse asyncResponse,
} else {
future = metricsService.tagAvailabilityData(metric, params.getTags(), params.getStart(), params.getEnd());
}
Futures.addCallback(future, new NoDataCallback<List<Availability>>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@GET
Expand All @@ -660,15 +640,15 @@ public void findTaggedNumericData(@Suspended final AsyncResponse asyncResponse,
new Function<Map<MetricId, Set<NumericData>>, Map<String, Set<NumericData>>>() {
@Override
public Map<String, Set<NumericData>> apply(Map<MetricId, Set<NumericData>> input) {
Map<String, Set<NumericData>> result = new HashMap<String, Set<NumericData>>(input.size());
Map<String, Set<NumericData>> result = new HashMap<>(input.size());
for (Map.Entry<MetricId, Set<NumericData>> entry : input.entrySet()) {
result.put(entry.getKey().getName(), entry.getValue());
}
return result;
}
}
);
Futures.addCallback(resultFuture, new SimpleDataCallback<Map<String, Set<NumericData>>>(asyncResponse));
Futures.addCallback(resultFuture, new SimpleDataCallback<>(asyncResponse));
}

@GET
Expand All @@ -685,7 +665,7 @@ public void findTaggedAvailabilityData(@Suspended final AsyncResponse asyncRespo
@PathParam("tag") String encodedTag) {
ListenableFuture<Map<MetricId, Set<Availability>>> queryFuture = metricsService.findAvailabilityByTags(tenantId,
MetricUtils.decodeTags(encodedTag));
Futures.addCallback(queryFuture, new SimpleDataCallback<Map<MetricId, Set<Availability>>>(asyncResponse));
Futures.addCallback(queryFuture, new SimpleDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -705,7 +685,7 @@ public void updateCounterForGroup(@Suspended final AsyncResponse asyncResponse,
counter.setGroup(group);
}
ListenableFuture<Void> future = metricsService.updateCounters(counters);
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -715,7 +695,7 @@ public void updateCounter(@Suspended final AsyncResponse asyncResponse, @PathPar
@PathParam("counter") String counter) {
ListenableFuture<Void> future = metricsService
.updateCounter(new Counter(DEFAULT_TENANT_ID, group, counter, 1L));
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@POST
Expand All @@ -725,7 +705,7 @@ public void updateCounter(@Suspended final AsyncResponse asyncResponse, @PathPar
@PathParam("counter") String counter, @PathParam("value") Long value) {
ListenableFuture<Void> future = metricsService.updateCounter(new Counter(DEFAULT_TENANT_ID, group, counter,
value));
Futures.addCallback(future, new NoDataCallback<Void>(asyncResponse));
Futures.addCallback(future, new NoDataCallback<>(asyncResponse));
}

@GET
Expand All @@ -735,7 +715,7 @@ public void updateCounter(@Suspended final AsyncResponse asyncResponse, @PathPar
@Produces({ APPLICATION_JSON })
public void getCountersForGroup(@Suspended final AsyncResponse asyncResponse, @PathParam("group") String group) {
ListenableFuture<List<Counter>> future = metricsService.findCounters(group);
Futures.addCallback(future, new SimpleDataCallback<List<Counter>>(asyncResponse));
Futures.addCallback(future, new SimpleDataCallback<>(asyncResponse));
}

@GET
Expand Down Expand Up @@ -788,7 +768,7 @@ public void findMetrics(
asyncResponse.resume(Response.status(Status.BAD_REQUEST).entity(errors).build());
}
ListenableFuture<List<Metric<?>>> future = metricsService.findMetrics(tenantId, metricType);
Futures.addCallback(future, new SimpleDataCallback<List<Metric<?>>>(asyncResponse));
Futures.addCallback(future, new SimpleDataCallback<>(asyncResponse));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
*/
package org.hawkular.metrics.api.jaxrs.callback;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;

import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.core.Response;

Expand All @@ -29,6 +33,28 @@ public SimpleDataCallback(AsyncResponse asyncResponse) {
public void onSuccess(Object responseData) {
if (responseData == null) {
asyncResponse.resume(Response.noContent().build());
} else if (responseData instanceof Optional) {
Optional optional = (Optional) responseData;
if (optional.isPresent()) {
Object value = optional.get();
asyncResponse.resume(Response.ok(value).build());
} else {
asyncResponse.resume(Response.noContent().build());
}
} else if (responseData instanceof Collection) {
Collection collection = (Collection) responseData;
if (collection.isEmpty()) {
asyncResponse.resume(Response.noContent().build());
} else {
asyncResponse.resume(Response.ok(collection).build());
}
} else if (responseData instanceof Map) {
Map map = (Map) responseData;
if (map.isEmpty()) {
asyncResponse.resume(Response.noContent().build());
} else {
asyncResponse.resume(Response.ok(map).build());
}
} else {
asyncResponse.resume(Response.ok(responseData).build());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,8 @@ private void select(AsyncResponse asyncResponse, String tenantId, SelectQueryCon
if (idExists != Boolean.TRUE) {
return Futures.immediateFuture(null);
}
return metricsService.findData(new NumericMetric(tenantId, new MetricId(metric)),
timeInterval.getStartMillis(), timeInterval.getEndMillis());
return metricsService.findNumericData(tenantId, new MetricId(metric),
timeInterval.getStartMillis(), timeInterval.getEndMillis());
});
ListenableFuture<List<InfluxObject>> influxObjectTranslatorFuture = Futures.transform(loadMetricsFuture,
(List<NumericData> metrics) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;

Expand Down Expand Up @@ -69,7 +70,7 @@ public interface MetricsService {

ListenableFuture<Void> createMetric(Metric<?> metric);

ListenableFuture<Metric<?>> findMetric(String tenantId, MetricType type, MetricId id);
ListenableFuture<Optional<Metric<?>>> findMetric(String tenantId, MetricType type, MetricId id);

ListenableFuture<List<Metric<?>>> findMetrics(String tenantId, MetricType type);

Expand All @@ -79,18 +80,15 @@ public interface MetricsService {

ListenableFuture<Void> addNumericData(List<NumericMetric> metrics);

ListenableFuture<NumericMetric> findNumericData(NumericMetric metric, long start, long end);
ListenableFuture<List<NumericData>> findNumericData(String tenantId, MetricId id, Long start, Long end);

ListenableFuture<BucketedOutput<NumericBucketDataPoint>> findNumericStats(
NumericMetric metric, long start, long end, Buckets buckets
);

/** Find and return raw metrics for {id} that have a timestamp between {start} and {end} */
ListenableFuture<List<NumericData>> findData(NumericMetric metric, long start, long end);

ListenableFuture<Void> addAvailabilityData(List<AvailabilityMetric> metrics);

ListenableFuture<AvailabilityMetric> findAvailabilityData(AvailabilityMetric metric, long start, long end);
ListenableFuture<List<Availability>> findAvailabilityData(String tenantId, MetricId id, long start, long end);

ListenableFuture<BucketedOutput<AvailabilityBucketDataPoint>> findAvailabilityStats(
AvailabilityMetric metric, long start, long end, Buckets buckets
Expand Down

0 comments on commit c65964a

Please sign in to comment.