87b52754e97630d3afc8241cd43f486296587b49
[vfc/nfvo/wfengine.git] /
1 /*******************************************************************************
2  * Copyright (c) 2012-2015 University of Stuttgart.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * and the Apache License 2.0 which both accompany this distribution,
6  * and are available at http://www.eclipse.org/legal/epl-v10.html
7  * and http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Contributors:
10  *     Oliver Kopp - initial API and implementation
11  *******************************************************************************/
12 package org.eclipse.winery.repository.resources;
13
14 import java.io.File;
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.util.ArrayList;
18 import java.util.List;
19
20 import javax.ws.rs.Consumes;
21 import javax.ws.rs.GET;
22 import javax.ws.rs.POST;
23 import javax.ws.rs.Path;
24 import javax.ws.rs.Produces;
25 import javax.ws.rs.core.MediaType;
26 import javax.ws.rs.core.Response;
27 import javax.ws.rs.core.Response.Status;
28
29 import org.apache.commons.io.FileUtils;
30 import org.eclipse.winery.repository.Utils;
31 import org.eclipse.winery.repository.importing.CSARImporter;
32 import org.eclipse.winery.repository.resources.API.APIResource;
33 import org.eclipse.winery.repository.resources.admin.AdminTopResource;
34 import org.eclipse.winery.repository.resources.entitytemplates.artifacttemplates.ArtifactTemplatesResource;
35 import org.eclipse.winery.repository.resources.entitytemplates.policytemplates.PolicyTemplatesResource;
36 import org.eclipse.winery.repository.resources.entitytypeimplementations.nodetypeimplementations.NodeTypeImplementationsResource;
37 import org.eclipse.winery.repository.resources.entitytypeimplementations.relationshiptypeimplementations.RelationshipTypeImplementationsResource;
38 import org.eclipse.winery.repository.resources.entitytypes.artifacttypes.ArtifactTypesResource;
39 import org.eclipse.winery.repository.resources.entitytypes.capabilitytypes.CapabilityTypesResource;
40 import org.eclipse.winery.repository.resources.entitytypes.nodetypes.NodeTypesResource;
41 import org.eclipse.winery.repository.resources.entitytypes.policytypes.PolicyTypesResource;
42 import org.eclipse.winery.repository.resources.entitytypes.relationshiptypes.RelationshipTypesResource;
43 import org.eclipse.winery.repository.resources.entitytypes.requirementtypes.RequirementTypesResource;
44 import org.eclipse.winery.repository.resources.imports.ImportsResource;
45 import org.eclipse.winery.repository.resources.servicetemplates.ServiceTemplatesResource;
46 import org.restdoc.annotations.RestDoc;
47 import org.restdoc.annotations.RestDocParam;
48 import org.restdoc.annotations.RestDocReturnCode;
49
50 import com.sun.jersey.api.view.Viewable;
51 import com.sun.jersey.core.header.FormDataContentDisposition;
52 import com.sun.jersey.multipart.FormDataParam;
53
54 /**
55  * All paths listed here have to be listed in Jersey's filter configuration
56  */
57 @Path("/")
58 public class MainResource {
59         
60         @Path("API/")
61         public APIResource api() {
62                 return new APIResource();
63         }
64         
65         @Path("artifacttemplates/")
66         public ArtifactTemplatesResource artifacttemplates() {
67                 return new ArtifactTemplatesResource();
68         }
69         
70         @Path("artifacttypes/")
71         public ArtifactTypesResource artifactypes() {
72                 return new ArtifactTypesResource();
73         }
74         
75         @Path("admin/")
76         public AdminTopResource admin() {
77                 return new AdminTopResource();
78         }
79         
80         @Path("capabilitytypes/")
81         public CapabilityTypesResource capabilitytypes() {
82                 return new CapabilityTypesResource();
83         }
84         
85         @Path("imports/")
86         public ImportsResource imports() {
87                 return new ImportsResource();
88         }
89         
90         @Path("nodetypes/")
91         public NodeTypesResource nodetypes() {
92                 return new NodeTypesResource();
93         }
94         
95         @Path("nodetypeimplementations/")
96         public NodeTypeImplementationsResource nodetypeimplementations() {
97                 return new NodeTypeImplementationsResource();
98         }
99         
100         @Path("other/")
101         @GET
102         @Produces(MediaType.TEXT_HTML)
103         public Viewable getOtherElements() {
104                 return new Viewable("/jsp/otherElements.jsp");
105         }
106         
107         @Path("policytemplates/")
108         public PolicyTemplatesResource policytemplates() {
109                 return new PolicyTemplatesResource();
110         }
111         
112         @Path("policytypes/")
113         public PolicyTypesResource policytypes() {
114                 return new PolicyTypesResource();
115         }
116         
117         @Path("relationshiptypes/")
118         public RelationshipTypesResource relationshiptypes() {
119                 return new RelationshipTypesResource();
120         }
121         
122         @Path("requirementtypes/")
123         public RequirementTypesResource requirementtypes() {
124                 return new RequirementTypesResource();
125         }
126         
127         @Path("relationshiptypeimplementations/")
128         public RelationshipTypeImplementationsResource relationshiptypeimplementations() {
129                 return new RelationshipTypeImplementationsResource();
130         }
131         
132         @Path("servicetemplates/")
133         public ServiceTemplatesResource servicetemplates() {
134                 return new ServiceTemplatesResource();
135         }
136         
137         /**
138          * Returns the main page of winery.
139          */
140         @GET
141         @Produces(MediaType.TEXT_HTML)
142         public Response onGet() {
143                 return Response.temporaryRedirect(Utils.createURI("servicetemplates/")).build();
144         }
145         
146         @POST
147         @Consumes(MediaType.MULTIPART_FORM_DATA)
148         @RestDoc(methodDescription = "Imports the given CSAR (sent by simplesinglefileupload.jsp)")
149         @RestDocReturnCode(code = "200", description = "If the CSAR could be partially imported, the points where it failed are returned in the body")
150         // @formatter:off
151         public Response importCSAR(
152                 @FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail,
153                 @FormDataParam("overwrite") @RestDocParam(description = "true: content of CSAR overwrites existing content. false (default): existing content is kept") Boolean overwrite) {
154                 // @formatter:on
155                 CSARImporter importer = new CSARImporter();
156                 List<String> errors = new ArrayList<String>();
157                 boolean ow;
158                 ow = (overwrite != null) && overwrite;
159                 try {
160                         importer.readCSAR(uploadedInputStream, errors, ow, true);
161                 } catch (Exception e) {
162                         return Response.serverError().entity("Could not import CSAR").entity(e.getMessage()).build();
163                 }
164                 if (errors.isEmpty()) {
165                         return Response.noContent().build();
166                 } else {
167                         // In case there are errors, we send them as "bad request"
168                         return Response.status(Status.BAD_REQUEST).entity(errors).build();
169                 }
170         }
171         
172         @POST
173         @Consumes(MediaType.APPLICATION_XML)
174         @Produces(MediaType.APPLICATION_JSON)
175         public Response importDefinitions(InputStream is) throws IOException {
176                 File toscaFile;
177                 toscaFile = File.createTempFile("TOSCA", ".tosca");
178                 FileUtils.copyInputStreamToFile(is, toscaFile);
179                 CSARImporter importer = new CSARImporter();
180                 List<String> errors = new ArrayList<>();
181                 importer.importDefinitions(null, toscaFile.toPath(), errors, false, true);
182                 if (errors.isEmpty()) {
183                         return Response.noContent().build();
184                 } else {
185                         return Response.status(Status.BAD_REQUEST).entity(errors).build();
186                 }
187         }
188         
189 }