/*******************************************************************************
* Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
* All rights reserved. This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.openshift.internal.ui.job;
import static org.jboss.tools.openshift.internal.ui.job.ResourceCreationJobUtils.createErrorStatusForExistingResources;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.jboss.tools.openshift.internal.common.core.job.AbstractDelegatingMonitorJob;
import org.jboss.tools.openshift.internal.ui.OpenShiftUIActivator;
import org.jboss.tools.openshift.internal.ui.wizard.common.IResourceLabelsPageModel.Label;
import com.openshift.restclient.IClient;
import com.openshift.restclient.OpenShiftException;
import com.openshift.restclient.ResourceKind;
import com.openshift.restclient.capability.CapabilityVisitor;
import com.openshift.restclient.capability.resources.IClientCapability;
import com.openshift.restclient.capability.resources.IProjectTemplateProcessing;
import com.openshift.restclient.model.IProject;
import com.openshift.restclient.model.IResource;
import com.openshift.restclient.model.template.IParameter;
import com.openshift.restclient.model.template.ITemplate;
/**
* A Job to create an application from a template
*
* @author jeff.cantrill
*/
public class CreateApplicationFromTemplateJob extends AbstractDelegatingMonitorJob implements IResourcesModel {
private IProject project;
private ITemplate template;
private Collection<Label> labels;
private Collection<IParameter> parameters;
private Collection<IResource> resources;
public CreateApplicationFromTemplateJob(IProject project, ITemplate template) {
this(project, template, Collections.emptyList(),Collections.emptyList());
}
public CreateApplicationFromTemplateJob(IProject project, ITemplate template, Collection<IParameter> parameters, Collection<Label> labels) {
super("Create Application From Template Job");
this.project = project;
this.template = template;
this.labels = labels;
this.parameters = parameters;
}
@Override
protected IStatus doRun(IProgressMonitor monitor) {
template.updateParameterValues(parameters);
for (Label label : labels) {
template.addObjectLabel(label.getName(), label.getValue());
}
IStatus status = project.accept(new CapabilityVisitor<IProjectTemplateProcessing, IStatus>() {
@Override
public IStatus visit(IProjectTemplateProcessing capability) {
try {
ITemplate processed = capability.process(template);
Collection<IResource> existing = findExistingResources(project, processed);
if(!existing.isEmpty()) {
return createErrorStatusForExistingResources(existing);
}
parameters = processed.getParameters().values();
resources = capability.apply(processed);
return handleResponse(resources);
}catch(OpenShiftException e) {
String message = e.getMessage();
if(e.getStatus() != null) {
message = e.getStatus().getMessage();
}
return new Status(IStatus.ERROR, OpenShiftUIActivator.PLUGIN_ID, -1, message, e);
}
}
},
new Status(IStatus.ERROR, OpenShiftUIActivator.PLUGIN_ID, "Template processing is unsupported for this client and server combination.", null));
return status;
}
/*
* @throws
*/
private Collection<IResource> findExistingResources(final IProject project, final ITemplate template) {
return project.accept(new CapabilityVisitor<IClientCapability, Collection<IResource>>() {
@Override
public Collection<IResource> visit(IClientCapability capability) {
final IClient client = capability.getClient();
List<IResource> existing = new ArrayList<>(template.getObjects().size());
for (IResource resource : template.getObjects()) {
try {
IResource found = client.get(resource.getKind(), resource.getName(), project.getName());
existing.add(found);
}catch(OpenShiftException e) {
//this is expected if the resource is not found
//@TODO change to NotFoundException of some kind
}
}
return existing;
}
}, new ArrayList<IResource>());
}
/**
* Get the list of parameters for this Job.
* The values
* will have changed if the parameter is generated and
* has been processed by the server.
* @return
*/
public Collection<IParameter> getParameters(){
return parameters;
}
@Override
public Collection<IResource> getResources(){
return resources;
}
private IStatus handleResponse(Collection<IResource> resources) {
int severity = IStatus.OK;
for (IResource resource : resources) {
if(resource.getKind() == ResourceKind.STATUS) {
severity = IStatus.WARNING;
break;
}
}
return new Status(severity, OpenShiftUIActivator.PLUGIN_ID, OK,"Resources created from template.",null);
}
}