606c3c677e0387a30bacb04984fb5c7968835ecd
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - MSO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.mso.apihandlerinfra;
22
23 import java.io.StringReader;
24 import java.io.StringWriter;
25 import java.sql.Timestamp;
26 import java.text.SimpleDateFormat;
27 import java.util.ArrayList;
28 import java.util.Calendar;
29 import java.util.Date;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.Map.Entry;
34 import java.util.StringTokenizer;
35
36 import javax.ws.rs.core.MultivaluedMap;
37 import javax.ws.rs.core.Response;
38 import javax.xml.bind.JAXBContext;
39 import javax.xml.bind.JAXBElement;
40 import javax.xml.bind.JAXBException;
41 import javax.xml.bind.Marshaller;
42 import javax.xml.bind.Unmarshaller;
43 import javax.xml.transform.OutputKeys;
44 import javax.xml.transform.Transformer;
45 import javax.xml.transform.TransformerFactory;
46 import javax.xml.transform.dom.DOMSource;
47 import javax.xml.transform.sax.SAXSource;
48 import javax.xml.transform.stream.StreamResult;
49
50 import org.codehaus.jackson.map.ObjectMapper;
51 import org.codehaus.jackson.map.SerializationConfig.Feature;
52 import org.codehaus.jackson.map.annotate.JsonSerialize;
53 import org.hibernate.Session;
54 import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
55 import org.w3c.dom.Document;
56 import org.w3c.dom.Element;
57 import org.w3c.dom.Node;
58 import org.w3c.dom.NodeList;
59 import org.xml.sax.InputSource;
60
61 import org.openecomp.mso.apihandler.common.ErrorNumbers;
62 import org.openecomp.mso.apihandler.common.ValidationException;
63 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.CloudConfiguration;
64 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
65 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.PolicyException;
66 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
67 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
68 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestError;
69 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceException;
70 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
71 import org.openecomp.mso.apihandlerinfra.vnfbeans.ActionType;
72 import org.openecomp.mso.apihandlerinfra.vnfbeans.ObjectFactory;
73 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;
74 import org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType;
75 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfInputs;
76 import org.openecomp.mso.apihandlerinfra.vnfbeans.VnfRequest;
77 import org.openecomp.mso.logger.MsoLogger;
78 import org.openecomp.mso.logger.MessageEnum;
79 import org.openecomp.mso.properties.MsoJavaProperties;
80 import org.openecomp.mso.requestsdb.HibernateUtil;
81 import org.openecomp.mso.requestsdb.InfraActiveRequests;
82 import org.openecomp.mso.requestsdb.RequestsDatabase;
83 import org.openecomp.mso.utils.UUIDChecker;
84
85 public class MsoRequest {
86
87     private String requestId;
88     private String requestXML;
89     private String requestJSON;
90     private String requestUri;
91     private VnfRequest vnfReq;
92     private RequestInfo requestInfo;
93     private ModelInfo modelInfo;
94     private CloudConfiguration cloudConfiguration ;
95     private VnfInputs vnfInputs;
96     private String vnfParams;
97     private Action action;
98     private String errorMessage;
99     private String errorCode;
100     private String httpResponse;
101     private String responseBody;
102     private RequestStatusType status;
103     private ServiceInstancesRequest sir;
104     private long startTime;
105     private long progress = Constants.PROGRESS_REQUEST_RECEIVED;
106     private String serviceInstanceType;
107     private String vnfType;
108     private String vfModuleType;
109     private String vfModuleModelName;
110     private String networkType;
111     private String asdcServiceModelVersion; 
112     private String requestScope;
113
114     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
115     private static final String NOT_PROVIDED = "not provided";
116
117     MsoRequest (String requestId) {
118         this.requestId = requestId;
119         Calendar startTimeCalendar = Calendar.getInstance ();
120         this.startTime = startTimeCalendar.getTimeInMillis ();
121         MsoLogger.setLogContext (requestId, null);
122
123     } 
124     
125     MsoRequest () {
126          
127         Calendar startTimeCalendar = Calendar.getInstance ();
128         this.startTime = startTimeCalendar.getTimeInMillis ();
129         MsoLogger.setLogContext (requestId, null);
130
131     }
132     
133     
134     public Response buildServiceErrorResponse (int httpResponseCode,
135             MsoException exceptionType,
136             String text,
137             String messageId,
138             List<String> variables) {
139         
140         this.errorCode = messageId;
141         
142         if (text != null) {
143                 this.errorMessage = text;
144         }
145         else {
146                 this.errorMessage = "";
147         }
148         this.httpResponse = Integer.toString(httpResponseCode);
149         if(errorMessage.length() > 1999){
150             errorMessage = errorMessage.substring(0, 1999);
151         }
152                 
153         RequestError re = new RequestError();
154                 
155         if(exceptionType.name().equals("PolicyException")){
156                 
157                 PolicyException pe = new PolicyException();
158                 pe.setMessageId(messageId);
159                 pe.setText(text);
160                 if(variables != null){
161                         for(String variable: variables){
162                                 pe.getVariables().add(variable);
163                         }
164                 }
165                 re.setPolicyException(pe);
166                 
167         } else {
168                 
169                 ServiceException se = new ServiceException();
170                 se.setMessageId(messageId);
171                 se.setText(text);
172                 if(variables != null){
173                         if(variables != null){
174                                 for(String variable: variables){
175                                         se.getVariables().add(variable);
176                                 }
177                         }
178                 }
179                 re.setServiceException(se);
180         }
181           
182         String requestErrorStr = null;
183
184         try{
185                 ObjectMapper mapper = new ObjectMapper();
186                 mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT);
187                 requestErrorStr = mapper.writeValueAsString(re);
188         }catch(Exception e){
189                 msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in buildServiceErrorResponse writing exceptionType to string ", e);
190         }
191                 
192        
193         return Response.status (httpResponseCode).entity(requestErrorStr).build ();
194               
195     }
196
197
198     // Parse request JSON
199     void parse (ServiceInstancesRequest sir, HashMap<String,String> instanceIdMap, Action action) throws ValidationException {
200
201         msoLogger.debug ("Validating the Service Instance request");
202         
203         this.sir = sir;
204         this.action = action;
205         
206         try{
207                 ObjectMapper mapper = new ObjectMapper();
208                 //mapper.configure(Feature.WRAP_ROOT_VALUE, true);
209                 requestJSON = mapper.writeValueAsString(sir.getRequestDetails());
210                 
211         } catch(Exception e){
212                 throw new ValidationException ("Parse ServiceInstanceRequest to JSON string");
213         }       
214         
215         if(instanceIdMap != null){
216                 if(instanceIdMap.get("serviceInstanceId") != null){
217                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("serviceInstanceId"))) {
218                                 throw new ValidationException ("serviceInstanceId");
219                         }
220                         this.sir.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
221                 }
222         
223                 if(instanceIdMap.get("vnfInstanceId") != null){
224                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vnfInstanceId"))) {
225                                 throw new ValidationException ("vnfInstanceId");
226                         }
227                         this.sir.setVnfInstanceId(instanceIdMap.get("vnfInstanceId"));
228                 }
229         
230                 if(instanceIdMap.get("vfModuleInstanceId") != null){
231                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("vfModuleInstanceId"))) {
232                                 throw new ValidationException ("vfModuleInstanceId");
233                         }
234                         this.sir.setVfModuleInstanceId(instanceIdMap.get("vfModuleInstanceId"));
235                 }
236         
237                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
238                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("volumeGroupInstanceId"))) {
239                                 throw new ValidationException ("volumeGroupInstanceId");
240                         }
241                         this.sir.setVolumeGroupInstanceId(instanceIdMap.get("volumeGroupInstanceId"));
242                 }
243         
244                 if(instanceIdMap.get("networkInstanceId") != null){
245                         if (!UUIDChecker.isValidUUID (instanceIdMap.get ("networkInstanceId"))) {
246                                 throw new ValidationException ("networkInstanceId");
247                         }
248                         this.sir.setNetworkInstanceId(instanceIdMap.get("networkInstanceId"));
249                 }
250         }
251               
252         this.modelInfo = sir.getRequestDetails().getModelInfo();
253         
254         if (this.modelInfo == null) {
255             throw new ValidationException ("model-info");
256         }
257          
258         this.requestInfo = sir.getRequestDetails().getRequestInfo();
259         
260         if (this.requestInfo == null) {
261             throw new ValidationException ("requestInfo");
262         }
263         
264         if (modelInfo.getModelType () == null) {
265                 throw new ValidationException ("modelType");
266         }        
267         
268         this.requestScope = modelInfo.getModelType().name();
269         
270         if (empty (modelInfo.getModelInvariantId ()) && !(requestScope.equalsIgnoreCase (ModelType.network.name ()) && 
271                         (action == Action.createInstance || action == Action.updateInstance))) {
272                 throw new ValidationException ("modelInvariantId");
273         }
274         
275         if (!empty (modelInfo.getModelInvariantId ()) && !UUIDChecker.isValidUUID (modelInfo.getModelInvariantId ())) {
276                 throw new ValidationException ("modelInvariantId format");
277         }        
278         
279         if (empty (modelInfo.getModelName ()) && (action == Action.createInstance || action == Action.updateInstance || (action == Action.deleteInstance && 
280                         (requestScope.equalsIgnoreCase (ModelType.network.name ()) || requestScope.equalsIgnoreCase (ModelType.vfModule.name ()))))) {
281                 throw new ValidationException ("modelName");
282         }
283         
284         if (empty (modelInfo.getModelVersion ()) && !(requestScope.equalsIgnoreCase (ModelType.network.name ()) && 
285                         (action == Action.createInstance || action == Action.updateInstance))) {
286                 throw new ValidationException ("modelVersion");
287         }
288         
289         if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && action != Action.deleteInstance && empty (modelInfo.getModelCustomizationName ())) {
290                 throw new ValidationException ("modelCustomizationName");
291         }
292                
293         this.cloudConfiguration = sir.getRequestDetails ().getCloudConfiguration ();
294         if (!requestScope.equalsIgnoreCase (ModelType.service.name ()) && cloudConfiguration == null) {
295                 throw new ValidationException ("cloudConfiguration");
296         }
297         
298         if (cloudConfiguration != null) {
299                 if (empty (cloudConfiguration.getLcpCloudRegionId ())) {
300                         throw new ValidationException ("lcpCloudRegionId");
301                 }
302                 if (empty (cloudConfiguration.getTenantId ())) {
303                         throw new ValidationException ("tenantId");
304                 }               
305         }
306         
307         if (requestScope.equalsIgnoreCase (ModelType.service.name ()) && action == Action.createInstance) {
308                 if (sir.getRequestDetails ().getRequestParameters () == null) {
309                         throw new ValidationException ("requestParameters");
310                 }
311                 if (empty (sir.getRequestDetails ().getRequestParameters ().getSubscriptionServiceType ())) {
312                         throw new ValidationException ("subscriptionServiceType");
313                 }
314         }        
315         
316         if(requestScope.equalsIgnoreCase(ModelType.service.name())){
317                 this.serviceInstanceType = modelInfo.getModelName();            
318         }
319         
320         if(requestScope.equalsIgnoreCase(ModelType.network.name())){
321                 this.networkType = modelInfo.getModelName();            
322         }        
323         
324         // Verify instanceName existence and format 
325         if (empty (requestInfo.getInstanceName ()) && action == Action.createInstance) {
326                 throw new ValidationException ("instanceName");
327         }
328         
329         if (!empty (requestInfo.getInstanceName ()) && !requestInfo.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
330                         throw new ValidationException ("instanceName format");                  
331         }
332         
333         if (empty (requestInfo.getProductFamilyId ()) && ((requestScope.equalsIgnoreCase (ModelType.vnf.name ()) && action == Action.createInstance) ||
334                         (requestScope.equalsIgnoreCase (ModelType.network.name ()) && (action == Action.createInstance || action == Action.updateInstance)))) {
335                 throw new ValidationException ("productFamilyId");
336         }        
337        
338         if (empty (requestInfo.getSource ())) {
339                 throw new ValidationException ("source");
340         }
341         
342                 
343         RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
344                 
345         String serviceModelName = null;
346         String vnfModelName = null;
347         String asdcServiceModelVersion = null;
348         String volumeGroupId = null;
349         boolean isRelatedServiceInstancePresent = false;
350         boolean isRelatedVnfInstancePresent = false;         
351                 
352         if (instanceList != null) {             
353                 for(RelatedInstanceList relatedInstanceList : instanceList){                            
354                         RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
355                                 
356                         if (!empty (relatedInstance.getInstanceName ()) && !relatedInstance.getInstanceName ().matches (Constants.VALID_INSTANCE_NAME_FORMAT)) {
357                                 throw new ValidationException ("instanceName format in relatedInstance");
358                         }
359                                 
360                         if (empty (relatedInstance.getInstanceId ())) {
361                                 throw new ValidationException ("instanceId in relatedInstance");
362                         }
363                                 
364                         if (!UUIDChecker.isValidUUID (relatedInstance.getInstanceId ())) {
365                                 throw new ValidationException ("instanceId format in relatedInstance");
366                         }
367                                 
368                         if (relatedInstance.getModelInfo () == null) {
369                                 throw new ValidationException ("modelInfo in relatedInstance");
370                         }
371                                 
372                         if (relatedInstance.getModelInfo ().getModelType () == null) {
373                                 throw new ValidationException ("modelType in relatedInstance");
374                         }
375                         
376                         if (action != Action.deleteInstance) {
377                                 
378                                 if (empty (relatedInstance.getModelInfo ().getModelInvariantId ()) && 
379                                                 !(requestScope.equalsIgnoreCase (ModelType.vfModule.name ()) && action == Action.createInstance &&
380                                                         relatedInstance.getModelInfo ().getModelType ().equals(ModelType.volumeGroup))) {
381                                         throw new ValidationException ("modelInvariantId in relatedInstance");
382                                 }
383                                         
384                                 if (!empty (relatedInstance.getModelInfo ().getModelInvariantId ()) &&
385                                                 !UUIDChecker.isValidUUID (relatedInstance.getModelInfo ().getModelInvariantId ())) {
386                                         throw new ValidationException ("modelInvariantId format in relatedInstance");
387                                 }                               
388                                         
389                                 if (empty(relatedInstance.getModelInfo ().getModelName ()) && 
390                                                 !(requestScope.equalsIgnoreCase (ModelType.vfModule.name ()) && action == Action.createInstance &&
391                                                 relatedInstance.getModelInfo ().getModelType ().equals (ModelType.volumeGroup))) {
392                                         throw new ValidationException ("modelName in relatedInstance");
393                                 }
394                                         
395                                 if (empty (relatedInstance.getModelInfo ().getModelVersion ())  && 
396                                                 !(requestScope.equalsIgnoreCase (ModelType.vfModule.name ()) && action == Action.createInstance &&
397                                                 relatedInstance.getModelInfo ().getModelType ().equals (ModelType.volumeGroup))) {
398                                         throw new ValidationException ("modelVersion in relatedInstance");
399                                 }
400                         }
401                                 
402                         if (empty (relatedInstance.getModelInfo ().getModelCustomizationName ()) &&
403                                         relatedInstance.getModelInfo ().getModelType ().equals (ModelType.vnf)) {
404                                 throw new ValidationException ("modelCustomizationName in relatedInstance");
405                         }
406                                 
407                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)) {
408                                 isRelatedServiceInstancePresent = true;
409                                 if (!relatedInstance.getInstanceId ().equals (this.sir.getServiceInstanceId ())) {
410                                         throw new ValidationException ("serviceInstanceId matching the serviceInstanceId in request URI");
411                                 }
412                                 serviceModelName = relatedInstance.getModelInfo ().getModelName ();
413                                 asdcServiceModelVersion = relatedInstance.getModelInfo().getModelVersion ();
414                         }                                                               
415                         else if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)) {
416                                 isRelatedVnfInstancePresent = true;
417                                 if (!relatedInstance.getInstanceId ().equals (this.sir.getVnfInstanceId ())) {
418                                         throw new ValidationException ("vnfInstanceId matching the vnfInstanceId in request URI");
419                                 }
420                                 vnfModelName = relatedInstance.getModelInfo().getModelCustomizationName();
421                         }
422                         else if(relatedInstance.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {                          
423                                 volumeGroupId = relatedInstance.getInstanceId ();                                       
424                         }               
425                 }
426          
427         
428                 if(requestScope.equalsIgnoreCase (ModelType.volumeGroup.name ())) {
429                         if (!isRelatedServiceInstancePresent) {
430                                 throw new ValidationException ("related service instance for volumeGroup request");
431                         }
432                         if (!isRelatedVnfInstancePresent) {
433                                 throw new ValidationException ("related vnf instance for volumeGroup request");                 
434                         }
435                         this.serviceInstanceType = serviceModelName;
436                         this.vnfType = serviceModelName + "/" + vnfModelName;
437                         this.asdcServiceModelVersion = asdcServiceModelVersion;
438                 }       
439                 else if(requestScope.equalsIgnoreCase(ModelType.vfModule.name ())) {
440                         if (!isRelatedServiceInstancePresent) {
441                                 throw new ValidationException ("related service instance for vfModule request");
442                         }
443                         if (!isRelatedVnfInstancePresent) {
444                                 throw new ValidationException ("related vnf instance for vfModule request");                    
445                         }
446                         String vfModuleModelName = modelInfo.getModelName ();
447                         this.vfModuleModelName = vfModuleModelName;     
448                         this.serviceInstanceType = serviceModelName;            
449                         this.vnfType = serviceModelName + "/" + vnfModelName;
450                         this.asdcServiceModelVersion = asdcServiceModelVersion;
451                         this.vfModuleType = vnfType + "::" + vfModuleModelName;
452                         this.sir.setVolumeGroupInstanceId (volumeGroupId);              
453                 }
454                 else if (requestScope.equalsIgnoreCase (ModelType.vnf.name ())) {
455                         if (!isRelatedServiceInstancePresent) {
456                                 throw new ValidationException ("related service instance for vnf request");
457                         }
458                         this.vnfType = serviceModelName + "/" + sir.getRequestDetails().getModelInfo().getModelCustomizationName();
459                }
460         }
461         else if (action != Action.deleteInstance && !requestScope.equalsIgnoreCase(ModelType.service.name ()) && 
462                         !requestScope.equalsIgnoreCase(ModelType.network.name ())) {
463                 throw new ValidationException ("related instances");
464         }
465         
466     }
467     
468     public Map<String, List<String>> getOrchestrationFilters (MultivaluedMap<String, String> queryParams) throws ValidationException {
469          
470         String queryParam = null; 
471         Map<String, List<String>> orchestrationFilterParams = new HashMap<String, List<String>>();
472         
473         
474         for (Entry<String,List<String>> entry : queryParams.entrySet()) {
475             queryParam = entry.getKey();
476              
477             try{
478                   if(queryParam.equalsIgnoreCase("filter")){
479                         
480                           StringTokenizer st = new StringTokenizer(entry.getValue().get(0), ":");
481
482                           int counter=0;
483                           String mapKey=null;
484                           List<String> orchestrationList = new ArrayList<String>();
485                           while (st.hasMoreElements()) {
486                                   if(counter == 0){
487                                           mapKey = st.nextElement() + "";
488                                   } else{
489                                           orchestrationList.add(st.nextElement() + "");
490                                   }
491                                  counter++;
492                           }
493                         orchestrationFilterParams.put(mapKey, orchestrationList);
494                   }
495                   
496             }catch(Exception e){
497                 //msoLogger.error (MessageEnum.APIH_VALIDATION_ERROR, e);
498                 throw new ValidationException ("QueryParam ServiceInfo", e);
499
500                 }
501             
502         }
503          
504
505         return orchestrationFilterParams;
506   } 
507
508     public void createRequestRecord (Status status, Action action) {
509
510         Session session = null;
511         try {
512
513             session = HibernateUtil.getSessionFactory ().openSession ();
514             session.beginTransaction ();
515
516                         if (null == sir) {
517                                 sir = new ServiceInstancesRequest ();
518                         }
519
520             InfraActiveRequests aq = new InfraActiveRequests ();
521             aq.setRequestId (requestId);
522             
523             aq.setRequestAction(action.name());
524             aq.setAction(action.name());
525             
526             Timestamp startTimeStamp = new Timestamp (Calendar.getInstance ().getTimeInMillis ());
527             
528             aq.setStartTime (startTimeStamp);
529                       
530             if (requestInfo != null) {  
531                 
532                 if(requestInfo.getSource() != null){
533                         aq.setSource(requestInfo.getSource());
534                 }
535                 if(requestInfo.getCallbackUrl() != null){
536                         aq.setCallBackUrl(requestInfo.getCallbackUrl());
537                 }
538                 if(requestInfo.getCorrelator() != null){
539                         aq.setCorrelator(requestInfo.getCorrelator());
540                 }
541   
542             }
543                        
544             if (modelInfo != null) { 
545                 aq.setRequestScope(requestScope);  
546             }
547             
548             if (cloudConfiguration != null) {
549                 if(cloudConfiguration.getLcpCloudRegionId() != null) {
550                         aq.setAicCloudRegion(cloudConfiguration.getLcpCloudRegionId());
551                 }
552                 
553                 if(cloudConfiguration.getTenantId() != null) {
554                         aq.setTenantId(cloudConfiguration.getTenantId());
555                 }
556                 
557             }
558             
559             if(sir.getServiceInstanceId() != null){
560                 aq.setServiceInstanceId(sir.getServiceInstanceId());
561             }
562             
563             if(sir.getVnfInstanceId() != null){
564                 aq.setVnfId(sir.getVnfInstanceId());
565             }
566
567                         if (null != requestScope) {
568                                 if (requestScope.equalsIgnoreCase(ModelType.service.name())) {
569                                         if (requestInfo.getInstanceName() != null) {
570                                                 aq.setServiceInstanceName(requestInfo.getInstanceName());
571                                         }
572                                 }
573
574                                 if (requestScope.equalsIgnoreCase(ModelType.network.name())) {
575                                         aq.setNetworkName(requestInfo.getInstanceName());
576                                         aq.setNetworkType(networkType);
577                                         aq.setNetworkId(sir.getNetworkInstanceId());
578
579                                 }
580
581                                 if (requestScope.equalsIgnoreCase(ModelType.volumeGroup.name())) {
582                                         aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
583                                         aq.setVolumeGroupName(requestInfo.getInstanceName());
584                                         aq.setVnfType(vnfType);
585
586                                 }
587
588                                 if (requestScope.equalsIgnoreCase(ModelType.vfModule.name())) {
589                                         aq.setVfModuleName(requestInfo.getInstanceName());
590                                         aq.setVfModuleModelName(modelInfo.getModelName());
591                                         aq.setVfModuleId(sir.getVfModuleInstanceId());
592                                         aq.setVolumeGroupId(sir.getVolumeGroupInstanceId());
593                                         aq.setVnfType(vnfType);
594
595                                 }
596
597                                 if (requestScope.equalsIgnoreCase(ModelType.vnf.name())) {
598                                         aq.setVnfName(requestInfo.getInstanceName());
599                                         if (null != sir.getRequestDetails()) {
600                                                 RelatedInstanceList[] instanceList = sir.getRequestDetails().getRelatedInstanceList();
601
602                                                 if (instanceList != null) {
603
604                                                         for (RelatedInstanceList relatedInstanceList : instanceList) {
605
606                                                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
607                                                                 if (relatedInstance.getModelInfo().getModelType().equals(ModelType.service)) {
608                                                                         aq.setVnfType(vnfType);
609                                                                 }
610                                                         }
611                                                 }
612                                         }
613                                         //aq.setVnfType(sir.getRequestDetails().getRelatedInstanceList());
614
615                                 }
616                         }
617
618             aq.setRequestBody (this.requestJSON);
619             
620                        
621             aq.setRequestStatus (status.toString ());
622             aq.setLastModifiedBy (Constants.MODIFIED_BY_APIHANDLER);
623             
624             if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
625                 aq.setStatusMessage (this.errorMessage);
626                 aq.setResponseBody (this.responseBody);
627                 aq.setProgress(new Long(100));
628
629                 Calendar endTime = Calendar.getInstance ();
630                 Timestamp endTimeStamp = new Timestamp (endTime.getTimeInMillis ());
631                 aq.setEndTime (endTimeStamp);
632             }
633  
634             msoLogger.debug ("About to insert a record");
635
636             session.save (aq);
637             session.getTransaction ().commit ();
638             session.close ();
639         } catch (Exception e) {
640                 msoLogger.error (MessageEnum.APIH_DB_INSERT_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception when creation record request", e);
641             if (session != null) {
642                 session.close ();
643             }
644             if (!status.equals (Status.FAILED)) {
645                 throw e;
646             }
647         }
648     }
649
650     public void updateFinalStatus (Status status) {
651         int result = 0;
652         try {
653             result = RequestsDatabase.updateInfraFinalStatus (requestId,
654                                                               status.toString (),
655                                                               this.errorMessage,
656                                                               this.progress,
657                                                               this.responseBody,
658                                                               Constants.MODIFIED_BY_APIHANDLER);
659         } catch (Exception e) {
660                 msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
661             msoLogger.debug ("Exception: ", e);
662         }
663     }
664
665     public Response buildResponse (int httpResponseCode, String errorCode, InfraActiveRequests inProgress) {
666         return buildResponseWithError (httpResponseCode, errorCode, inProgress, null);
667     }
668
669     public Response buildResponseWithError (int httpResponseCode,
670                                             String errorCode,
671                                             InfraActiveRequests inProgress,
672                                             String errorString) {
673
674       
675         
676         // Log the failed request into the MSO Requests database
677
678         return Response.status (httpResponseCode).entity (null).build ();
679
680     }
681
682     public Response buildResponseFailedValidation (int httpResponseCode, String exceptionMessage) {
683
684  
685
686         return Response.status (httpResponseCode).entity (null).build ();
687     }
688
689     public String getRequestUri () {
690         return requestUri;
691     }
692
693     public void setRequestUri (String requestUri) {
694         this.requestUri = requestUri;
695     }
696
697     public VnfInputs getVnfInputs () {
698         return vnfInputs;
699     }
700
701     public RequestInfo getRequestInfo () {
702         return requestInfo;
703     }
704
705     public String getResponseBody () {
706         return responseBody;
707     }
708
709     public void setResponseBody (String responseBody) {
710         this.responseBody = responseBody;
711     }
712
713     public String getHttpResponse () {
714         return httpResponse;
715     }
716
717     public void setHttpResponse (String httpResponse) {
718         this.httpResponse = httpResponse;
719     }
720
721     public String getRequestId () {
722         return requestId;
723     }
724
725     public String getRequestXML () {
726         return requestXML;
727     }
728
729     public void setRequestXML (String requestXML) {
730         this.requestXML = requestXML;
731     }
732
733     public RequestStatusType getStatus () {
734         return status;
735     }
736     
737     public String getServiceType () {
738         if (this.vnfInputs.getServiceType () != null) 
739                 return this.vnfInputs.getServiceType ();
740         if (this.vnfInputs.getServiceId () != null) 
741                 return this.vnfInputs.getServiceId ();
742         return null;
743     }
744
745     public void setStatus (RequestStatusType status) {
746         this.status = status;
747         switch (status) {
748         case FAILED:
749         case COMPLETE:
750                 this.progress = Constants.PROGRESS_REQUEST_COMPLETED;
751                 break;
752         case IN_PROGRESS:
753                 this.progress = Constants.PROGRESS_REQUEST_IN_PROGRESS;
754                 break;
755         }
756     }
757     
758     public ModelInfo getModelInfo() {
759         return modelInfo;
760     }
761     
762     public ServiceInstancesRequest getServiceInstancesRequest() {
763         return sir;
764     }
765     
766     public String getServiceInstanceType () {
767         return serviceInstanceType;
768     }    
769     
770     public String getNetworkType () {
771         return networkType;
772     }
773     
774     public String getVnfType () {
775         return vnfType;
776     }
777     
778     public String getVfModuleModelName () {
779         return vfModuleModelName;
780     }
781     
782     public String getVfModuleType () {
783         return vfModuleType;
784     }
785     
786     public String getAsdcServiceModelVersion () {
787         return asdcServiceModelVersion;
788     }
789     
790     public static String domToStr (Document doc) {
791         if (doc == null) {
792             return null;
793         }
794
795         try {
796             StringWriter sw = new StringWriter ();
797             StreamResult sr = new StreamResult (sw);
798             TransformerFactory tf = TransformerFactory.newInstance ();
799             Transformer t = tf.newTransformer ();
800             t.setOutputProperty (OutputKeys.STANDALONE, "yes");
801             NodeList nl = doc.getDocumentElement ().getChildNodes ();
802             DOMSource source = null;
803             for (int x = 0; x < nl.getLength (); x++) {
804                 Node e = nl.item (x);
805                 if (e instanceof Element) {
806                     source = new DOMSource (e);
807                     break;
808                 }
809             }
810             if (source != null) {
811                 t.transform (source, sr);
812
813                 String s = sw.toString ();
814                 return s;
815             }
816
817             return null;
818
819         } catch (Exception e) {
820             msoLogger.error (MessageEnum.APIH_DOM2STR_ERROR, "", "", MsoLogger.ErrorCode.DataError, "Exception in domToStr", e);
821         }
822         return null;
823     }
824     
825     public void addBPMNSpecificInputs(String personaModelId, String personaModelVersion, Boolean isBaseVfModule,
826                         String vnfPersonaModelId, String vnfPersonaModelVersion) {
827         vnfInputs.setPersonaModelId(personaModelId);
828         vnfInputs.setPersonaModelVersion(personaModelVersion);
829         vnfInputs.setIsBaseVfModule(isBaseVfModule);
830         vnfInputs.setVnfPersonaModelId(vnfPersonaModelId);
831         vnfInputs.setVnfPersonaModelVersion(vnfPersonaModelVersion);
832         
833         this.vnfReq.setVnfInputs(vnfInputs);
834                    
835           StringWriter stringWriter = new StringWriter ();
836           try {
837               JAXBContext jaxbContext = JAXBContext.newInstance (VnfRequest.class);
838               Marshaller jaxbMarshaller = jaxbContext.createMarshaller ();
839
840               // output pretty printed
841               jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);
842
843               jaxbMarshaller.marshal (this.vnfReq, stringWriter);
844
845           } catch (JAXBException e) {
846               msoLogger.debug ("Exception: ", e);
847           }
848
849           this.requestXML = stringWriter.toString ();
850           msoLogger.debug("REQUEST XML to BPEL: " + this.requestXML);
851         
852         
853     }
854     
855     private static boolean empty(String s) {              
856           return (s == null || s.trim().isEmpty());
857     }
858 }