/*
* Copyright 2014, The OpenNMS Group
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.opennms.newts.rest;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import org.opennms.newts.api.Duration;
import org.opennms.newts.api.Measurement;
import org.opennms.newts.api.Resource;
import org.opennms.newts.api.Results;
import org.opennms.newts.api.Results.Row;
import org.opennms.newts.api.Sample;
import org.opennms.newts.api.Timestamp;
import org.opennms.newts.api.ValueType;
import org.opennms.newts.api.query.ResultDescriptor;
import org.opennms.newts.api.search.SearchResults;
import org.opennms.newts.api.search.SearchResults.Result;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.Collections2;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
class Transform {
private Transform() {}
private static final Function<SampleDTO, Sample> DTO_TO_SAMPLE;
static {
DTO_TO_SAMPLE = new Function<SampleDTO, Sample>() {
@Override
public Sample apply(SampleDTO input) {
return new Sample(
Timestamp.fromEpochMillis(input.getTimestamp()),
input.getContext(),
new Resource(input.getResource().getId(), wrapMap(input.getResource().getAttributes())),
input.getName(),
input.getType(),
ValueType.compose(input.getValue(), input.getType()),
input.getAttributes());
}
};
}
private static Optional<Map<String, String>> wrapMap(Map<String, String> map) {
if (map == null) return Optional.<Map<String, String>> absent();
return Optional.of(map);
}
/**
* Convert a {@link ResultDescriptorDTO} to {@link ResultDescriptor}.
*
* @param rDescriptorDTO
* the DTO to transform
* @return the corresponding descriptor
*/
static ResultDescriptor resultDescriptor(ResultDescriptorDTO rDescriptorDTO) {
ResultDescriptor rDescriptor = new ResultDescriptor(rDescriptorDTO.getInterval());
for (ResultDescriptorDTO.Datasource ds : rDescriptorDTO.getDatasources()) {
if (ds.getHeartbeat() != null) {
rDescriptor.datasource(ds.getLabel(), ds.getSource(), ds.getHeartbeat(), ds.getFunction());
}
else {
rDescriptor.datasource(ds.getLabel(), ds.getSource(), ds.getFunction());
}
}
for (ResultDescriptorDTO.Expression expr : rDescriptorDTO.getExpressions()) {
rDescriptor.expression(expr.getLabel(), expr.getExpression());
}
rDescriptor.export(rDescriptorDTO.getExports());
return rDescriptor;
}
/**
* Convert {@link SampleDTO}s to {@link Sample}s.
*
* @param samples
* samples to convert
* @return converted samples
*/
static Collection<Sample> samples(Collection<SampleDTO> samples) {
return Collections2.transform(samples, DTO_TO_SAMPLE);
}
/**
* Convert samples to {@link SampleDTO}s.
*
* @param samples
* samples to convert.
* @return converted samples.
*/
static Collection<Collection<SampleDTO>> sampleDTOs(Results<Sample> samples) {
return Lists.newArrayList(Iterables.transform(samples, new Function<Results.Row<Sample>, Collection<SampleDTO>>() {
@Override
public Collection<SampleDTO> apply(Row<Sample> input) {
return Collections2.transform(input.getElements(), new Function<Sample, SampleDTO>() {
@Override
public SampleDTO apply(Sample input) {
return new SampleDTO(
input.getTimestamp().asMillis(),
new ResourceDTO(input.getResource().getId(), unwrapMap(input.getResource().getAttributes())),
input.getName(),
input.getType(),
input.getValue(),
input.getAttributes(),
input.getContext().getId());
}
});
}
}));
}
/**
* Convert measurements to {@link MeasurementDTO}s.
*
* @param measurements
* measurements to convert.
* @return converted measurements.
*/
static Collection<Collection<MeasurementDTO>> measurementDTOs(Results<Measurement> measurements) {
return Lists.newArrayList(Iterables.transform(measurements, new Function<Results.Row<Measurement>, Collection<MeasurementDTO>>() {
@Override
public Collection<MeasurementDTO> apply(Row<Measurement> input) {
return Collections2.transform(input.getElements(), new Function<Measurement, MeasurementDTO>() {
@Override
public MeasurementDTO apply(Measurement input) {
return new MeasurementDTO(
input.getTimestamp().asMillis(),
new ResourceDTO(input.getResource().getId(), unwrapMap(input.getResource().getAttributes())),
input.getName(),
input.getValue(),
input.getAttributes());
}
});
}
}));
}
/**
* Convert search results to {@link SearchResultDTO}s.
*
* @param results
* search results to convert.
* @return converted search results.
*/
public static Collection<SearchResultDTO> searchResultDTOs(SearchResults results) {
return Lists.newArrayList(Iterables.transform(results, new Function<SearchResults.Result, SearchResultDTO>() {
@Override
public SearchResultDTO apply(Result input) {
return new SearchResultDTO(
new ResourceDTO(input.getResource().getId(), unwrapMap(input.getResource().getAttributes())),
input.getMetrics());
}
}));
}
private static Map<String, String> unwrapMap(Optional<Map<String, String>> wrapped) {
if (!wrapped.isPresent()) return Collections.<String, String> emptyMap();
return wrapped.get();
}
static Optional<Timestamp> toTimestamp(Optional<TimestampParam> value) {
return value.isPresent() ? Optional.of(value.get().get()) : Optional.<Timestamp>absent();
}
static Optional<Duration> toDuration(Optional<DurationParam> value) {
return value.isPresent() ? Optional.of(value.get().get()) : Optional.<Duration>absent();
}
}