aboutsummaryrefslogtreecommitdiffstats
path: root/winery/org.eclipse.winery.topologymodeler/src/main/java/org/eclipse/winery/topologymodeler/resources/TopologyCompletionResource.java
blob: efc36e304f596d7e91c5212b81df2a810b599164 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*******************************************************************************
 * Copyright (c) 2013 Pascal Hirmer.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and the Apache License 2.0 which both accompany this distribution,
 * and are available at http://www.eclipse.org/legal/epl-v10.html
 * and http://www.apache.org/licenses/LICENSE-2.0
 *
 * Contributors:
 *    Pascal Hirmer - initial API and implementation
 *******************************************************************************/

package org.eclipse.winery.topologymodeler.resources;

import java.io.StringReader;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import org.eclipse.winery.model.tosca.Definitions;
import org.eclipse.winery.model.tosca.TNodeTemplate;
import org.eclipse.winery.model.tosca.TRelationshipTemplate;
import org.eclipse.winery.model.tosca.TServiceTemplate;
import org.eclipse.winery.model.tosca.TTopologyTemplate;
import org.eclipse.winery.topologymodeler.addons.topologycompleter.helper.JAXBHelper;
import org.eclipse.winery.topologymodeler.addons.topologycompleter.helper.RESTHelper;

/**
 * This class contains resources used for the topology completion.
 *
 */
@Path("/")
public class TopologyCompletionResource {

	/**
	 * Adds selected {@link TNodeTemplate}s and {@link TRelationshipTemplate}s
	 * to a topology.
	 *
	 * @param topology
	 *            the {@link TTopologyTemplate} as XML string
	 * @param allChoices
	 *            all possible choices as XML
	 * @param selectedNodeTemplates
	 *            the selected {@link TNodeTemplate}s as JSON array
	 * @param selectedRelationshipTemplates
	 *            the selected {@link TRelationshipTemplate}s as JSON array
	 * @return the enhanced {@link TTopologyTemplate}
	 */
	@Path("selectionhandler/")
	@GET
	@Produces(MediaType.TEXT_PLAIN)
	public Response handleSelection(
			@QueryParam(value = "topology") String topology,
			@QueryParam(value = "allChoices") String allChoices,
			@QueryParam(value = "selectedNodeTemplates") String selectedNodeTemplates,
			@QueryParam(value = "selectedRelationshipTemplates") String selectedRelationshipTemplates) {
		return Response
				.ok()
				.entity(JAXBHelper.addTemplatesToTopology(topology, allChoices,
						selectedNodeTemplates, selectedRelationshipTemplates))
				.build();
	}

	/**
	 * This resource is used to save a {@link TTopologyTemplate} to the repository.
	 *
	 * @param topology
	 *            the topology to be saved
	 * @param templateURL
	 * 			  the URL the {@link TTopologyTemplate} of the topology template
	 * @param repositoryURL
	 * 			  the URL of the repository
	 * @param topologyName
	 * 			  the name of the saved {@link TTopologyTemplate}
	 * @param topologyNamespace
	 * 			  the namespace of the saved {@link TTopologyTemplate}
	 * @param overwriteTopology
	 * 			  whether the {@link TTopologyTemplate} should be overwritten or not
	 *
	 * @return whether the save operation has been successful or not
	 */
	@Path("topologysaver/")
	@POST
	public Response saveTopology(@FormParam("topology") String topology,
			@FormParam(value = "templateURL") String templateURL,
			@FormParam(value = "repositoryURL") String repositoryURL,
			@FormParam(value = "topologyName") String topologyName,
			@FormParam(value = "topologyNamespace") String topologyNamespace,
			@FormParam(value = "overwriteTopology") String overwriteTopology) {
		try {

			boolean overwrite = Boolean.parseBoolean(overwriteTopology);

			// initiate JaxB context
			JAXBContext context;
			context = JAXBContext.newInstance(Definitions.class);
			StringReader reader = new StringReader(topology);

			// unmarshall the topology XML string
			Unmarshaller um;

			um = context.createUnmarshaller();

			Definitions jaxBDefinitions = (Definitions) um.unmarshal(reader);
			TServiceTemplate st = (TServiceTemplate) jaxBDefinitions
					.getServiceTemplateOrNodeTypeOrNodeTypeImplementation()
					.get(0);
			TTopologyTemplate toBeSaved = st.getTopologyTemplate();

			// depending on the selected save method (overwrite or create new)
			// the save method is called
			if (overwrite) {
				RESTHelper.saveCompleteTopology(toBeSaved, templateURL, true,
						"", "", repositoryURL);
			} else {
				RESTHelper.saveCompleteTopology(toBeSaved, templateURL, false,
						topologyName, topologyNamespace, repositoryURL);
			}

			return Response.ok().build();

		} catch (JAXBException e) {
			e.printStackTrace();
			return Response.serverError().build();
		}
	}
}