4eaea1c228b4b472521ed1f396caed492aa2d664
[vfc/nfvo/wfengine.git] / winery / org.eclipse.winery.repository / src / main / java / org / eclipse / winery / repository / resources / entitytypes / InstanceStatesResource.java
1 /*******************************************************************************
2  * Copyright (c) 2012-2013 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.entitytypes;
13
14 import java.util.ArrayList;
15 import java.util.Iterator;
16 import java.util.List;
17
18 import javax.ws.rs.Consumes;
19 import javax.ws.rs.DELETE;
20 import javax.ws.rs.FormParam;
21 import javax.ws.rs.GET;
22 import javax.ws.rs.POST;
23 import javax.ws.rs.Path;
24 import javax.ws.rs.PathParam;
25 import javax.ws.rs.Produces;
26 import javax.ws.rs.core.MediaType;
27 import javax.ws.rs.core.Response;
28 import javax.ws.rs.core.Response.Status;
29
30 import org.apache.commons.lang3.StringUtils;
31 import org.eclipse.winery.model.tosca.TTopologyElementInstanceStates;
32 import org.eclipse.winery.model.tosca.TTopologyElementInstanceStates.InstanceState;
33 import org.eclipse.winery.common.Util;
34 import org.eclipse.winery.repository.backend.BackendUtils;
35
36 import com.sun.jersey.api.view.Viewable;
37
38 /**
39  * Resource for instance states <br />
40  * Used by relationship types and node types
41  */
42 public class InstanceStatesResource {
43         
44         private TopologyGraphElementEntityTypeResource typeResource;
45         private TTopologyElementInstanceStates instanceStates;
46         
47         
48         /**
49          * 
50          * @param instanceStates the instanceStates to manage
51          * @param typeResource the type resource, where the instance states are
52          *            managed. This reference is required to fire "persist()" in
53          *            case of updates
54          */
55         public InstanceStatesResource(TTopologyElementInstanceStates instanceStates, TopologyGraphElementEntityTypeResource typeResource) {
56                 this.instanceStates = instanceStates;
57                 this.typeResource = typeResource;
58         }
59         
60         @GET
61         @Produces(MediaType.TEXT_HTML)
62         public Viewable getHTML() {
63                 return new Viewable("/jsp/entitytypes/instancestates.jsp", this);
64         }
65         
66         public List<String> getInstanceStates() {
67                 List<InstanceState> instanceStates = this.instanceStates.getInstanceState();
68                 ArrayList<String> states = new ArrayList<String>(instanceStates.size());
69                 for (InstanceState instanceState : instanceStates) {
70                         states.add(instanceState.getState());
71                 }
72                 return states;
73         }
74         
75         @DELETE
76         @Path("{instanceState}")
77         public Response deleteInstanceState(@PathParam("instanceState") String instanceStateToRemove) {
78                 if (StringUtils.isEmpty(instanceStateToRemove)) {
79                         return Response.status(Status.BAD_REQUEST).entity("null instance to remove").build();
80                 }
81                 instanceStateToRemove = Util.URLdecode(instanceStateToRemove);
82                 
83                 // InstanceState does not override "equals()", therefore we have to manually remove it
84                 
85                 List<InstanceState> instanceStates = this.instanceStates.getInstanceState();
86                 Iterator<InstanceState> iterator = instanceStates.iterator();
87                 boolean found = false;
88                 while (iterator.hasNext() && !found) {
89                         if (iterator.next().getState().equals(instanceStateToRemove)) {
90                                 found = true;
91                         }
92                 }
93                 
94                 if (!found) {
95                         return Response.status(Status.NOT_FOUND).build();
96                 }
97                 
98                 iterator.remove();
99                 
100                 return BackendUtils.persist(this.typeResource);
101         }
102         
103         @POST
104         @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
105         public Response addInstanceState(@FormParam("state") String state) {
106                 if (StringUtils.isEmpty(state)) {
107                         return Response.notAcceptable(null).build();
108                 }
109                 
110                 // InstanceState does not override "equals()", therefore we have to manually check for existance
111                 
112                 List<InstanceState> instanceStates = this.instanceStates.getInstanceState();
113                 Iterator<InstanceState> iterator = instanceStates.iterator();
114                 boolean found = false;
115                 while (iterator.hasNext() && !found) {
116                         if (iterator.next().getState().equals(state)) {
117                                 found = true;
118                         }
119                 }
120                 
121                 if (found) {
122                         // no error, just return
123                         return Response.noContent().build();
124                 }
125                 
126                 InstanceState instanceState = new InstanceState();
127                 instanceState.setState(state);
128                 instanceStates.add(instanceState);
129                 
130                 return BackendUtils.persist(this.typeResource);
131         }
132         
133 }