/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.brooklyn.rest.transform;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.mgmt.HasTaskChildren;
import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags.WrappedStream;
import org.apache.brooklyn.rest.domain.LinkWithMetadata;
import org.apache.brooklyn.rest.domain.TaskSummary;
import org.apache.brooklyn.rest.util.WebResourceUtils;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.task.TaskInternal;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.text.Strings;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
public class TaskTransformer {
@SuppressWarnings("unused")
private static final Logger log = LoggerFactory.getLogger(TaskTransformer.class);
public static final Function<Task<?>, TaskSummary> FROM_TASK = new Function<Task<?>, TaskSummary>() {
@Override
public TaskSummary apply(@Nullable Task<?> input) {
return taskSummary(input);
}
};
public static TaskSummary taskSummary(Task<?> task) {
try {
Preconditions.checkNotNull(task);
Entity entity = BrooklynTaskTags.getContextEntity(task);
String entityId;
String entityDisplayName;
URI entityLink;
String selfLink = asLink(task).getLink();
if (entity != null) {
entityId = entity.getId();
entityDisplayName = entity.getDisplayName();
entityLink = new URI("/v1/applications/"+entity.getApplicationId()+"/"+"entities"+"/"+entity.getId());
} else {
entityId = null;
entityDisplayName = null;
entityLink = null;
}
List<LinkWithMetadata> children = Collections.emptyList();
if (task instanceof HasTaskChildren) {
children = new ArrayList<LinkWithMetadata>();
for (Task<?> t: ((HasTaskChildren)task).getChildren()) {
children.add(asLink(t));
}
}
Map<String,LinkWithMetadata> streams = new MutableMap<String, LinkWithMetadata>();
for (WrappedStream stream: BrooklynTaskTags.streams(task)) {
MutableMap<String, Object> metadata = MutableMap.<String,Object>of("name", stream.streamType);
if (stream.streamSize.get()!=null) {
metadata.add("size", stream.streamSize.get());
metadata.add("sizeText", Strings.makeSizeString(stream.streamSize.get()));
}
String link = selfLink+"/stream/"+stream.streamType;
streams.put(stream.streamType, new LinkWithMetadata(link, metadata));
}
Map<String,URI> links = MutableMap.of("self", new URI(selfLink),
"children", new URI(selfLink+"/"+"children"));
if (entityLink!=null) links.put("entity", entityLink);
Object result;
try {
if (task.isDone()) {
result = WebResourceUtils.getValueForDisplay(task.get(), true, false);
} else {
result = null;
}
} catch (Throwable t) {
result = Exceptions.collapseText(t);
}
return new TaskSummary(task.getId(), task.getDisplayName(), task.getDescription(), entityId, entityDisplayName,
task.getTags(), ifPositive(task.getSubmitTimeUtc()), ifPositive(task.getStartTimeUtc()), ifPositive(task.getEndTimeUtc()),
task.getStatusSummary(), result, task.isError(), task.isCancelled(),
children, asLink(task.getSubmittedByTask()),
task.isDone() ? null : task instanceof TaskInternal ? asLink(((TaskInternal<?>)task).getBlockingTask()) : null,
task.isDone() ? null : task instanceof TaskInternal ? ((TaskInternal<?>)task).getBlockingDetails() : null,
task.getStatusDetail(true),
streams,
links);
} catch (URISyntaxException e) {
// shouldn't happen
throw Exceptions.propagate(e);
}
}
private static Long ifPositive(Long time) {
if (time==null || time<=0) return null;
return time;
}
public static LinkWithMetadata asLink(Task<?> t) {
if (t==null) return null;
MutableMap<String,Object> data = new MutableMap<String,Object>();
data.put("id", t.getId());
if (t.getDisplayName()!=null) data.put("taskName", t.getDisplayName());
Entity entity = BrooklynTaskTags.getContextEntity(t);
if (entity!=null) {
data.put("entityId", entity.getId());
if (entity.getDisplayName()!=null) data.put("entityDisplayName", entity.getDisplayName());
}
return new LinkWithMetadata("/v1/activities/"+t.getId(), data);
}
}