Commit a7917289 authored by Christos Tranoris's avatar Christos Tranoris
Browse files

adding api to create prod offer from spec

parent 6d270139
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -224,4 +224,24 @@ public interface ProductOfferingApi {
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
	}
	
	   @Operation(summary = "Creates and Retrieves a ProductOffering by ID", operationId = "retrieveProductOffering", description = "This operation retrieves a ProductOffering entity. Attribute selection is enabled for all first level attributes." , tags = {
           "productOffering", })
   @ApiResponses(value = { @ApiResponse(responseCode ="200", description = "Success" ),
           @ApiResponse(responseCode = "400", description = "Bad Request" ),
           @ApiResponse(responseCode = "401", description = "Unauthorized" ),
           @ApiResponse(responseCode = "403", description = "Forbidden" ),
           @ApiResponse(responseCode = "404", description = "Not Found" ),
           @ApiResponse(responseCode = "405", description = "Method Not allowed" ),
           @ApiResponse(responseCode = "409", description = "Conflict" ),
           @ApiResponse(responseCode = "500", description = "Internal Server Error" ) })
   @RequestMapping(value = "/productOffering/fromServiceSpecId/{id}", produces = {
           "application/json;charset=utf-8" }, method = RequestMethod.POST)
   default ResponseEntity<ProductOffering> createRetrieveProductOfferingBasedOnServiceSpec(
           @Parameter(description = "Identifier of the ProductOffering", required = true) @PathVariable("id") String id) {
       
       
       return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
   }


}
+16 −0
Original line number Diff line number Diff line
@@ -167,5 +167,21 @@ public class ProductOfferingApiController implements ProductOfferingApi {
		}
	}
	
	@Override
    @PreAuthorize("hasAnyAuthority('ROLE_ADMIN')" )
	public ResponseEntity<ProductOffering> createRetrieveProductOfferingBasedOnServiceSpec(
	  String id) {
	  try {

        
        return new ResponseEntity<ProductOffering>(productOfferingRepoService.createRetrieveProductOfferingBasedOnServiceSpec(id),
                HttpStatus.OK);
    } catch (Exception e) {
        log.error("Couldn't serialize response for content type application/json", e);
        return new ResponseEntity<ProductOffering>(HttpStatus.INTERNAL_SERVER_ERROR);
    }

	}

    
}
+89 −2
Original line number Diff line number Diff line
@@ -26,21 +26,34 @@ import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.etsi.osl.tmf.JsonUtils;
import org.etsi.osl.tmf.am651.model.AgreementRef;
import org.etsi.osl.tmf.common.model.Any;
import org.etsi.osl.tmf.common.model.AttachmentRefOrValue;
import org.etsi.osl.tmf.common.model.ELifecycle;
import org.etsi.osl.tmf.common.model.TimePeriod;
import org.etsi.osl.tmf.common.model.service.ServiceSpecificationRef;
import org.etsi.osl.tmf.pcm620.model.BundledProductOffering;
import org.etsi.osl.tmf.pcm620.model.ProductOffering;
import org.etsi.osl.tmf.pcm620.model.ProductOfferingCreate;
import org.etsi.osl.tmf.pcm620.model.ProductOfferingPriceRef;
import org.etsi.osl.tmf.pcm620.model.ProductOfferingUpdate;
import org.etsi.osl.tmf.pcm620.model.ProductSpecification;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCharacteristic;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCharacteristicValue;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCharacteristicValueUse;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCreate;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationRef;
import org.etsi.osl.tmf.pcm620.repo.ProductOfferingRepository;
import org.etsi.osl.tmf.pcm620.repo.ProductSpecificationRepository;
import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue;
import org.etsi.osl.tmf.scm633.model.ServiceSpecification;
import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@@ -59,7 +72,11 @@ public class ProductOfferingRepoService {
	@Autowired
	ProductOfferingRepository prodsOfferingRepo;

    @Autowired
    ProductSpecificationRepoService prodSpecRepoService;

    @Autowired
    ServiceSpecificationRepoService serviceSpecificationRepoService;

	private SessionFactory sessionFactory;

@@ -320,6 +337,7 @@ public class ProductOfferingRepoService {

		if ( prodOfferingUpd.getProductSpecification() != null ) {
			prodOffering.setProductSpecification( prodOfferingUpd.getProductSpecification()  );
            prodOffering = copyCharacteristicsFromProdSpec( prodOffering,  prodOfferingUpd.getProductSpecification()  );    
		}


@@ -543,4 +561,73 @@ public class ProductOfferingRepoService {
		return prodOffering;
	}

  private ProductOffering copyCharacteristicsFromProdSpec(ProductOffering prodOffering,
      @Valid ProductSpecificationRef productSpecRef) {

    ProductSpecification prodSpec = prodSpecRepoService.findByUuid( productSpecRef.getId() );
    
    if (prodSpec!= null ) {
      for (ProductSpecificationCharacteristic prodSpecChar : prodSpec.getProductSpecCharacteristic()) {
        if ( prodOffering.findCharacteristicByName( prodSpecChar.getName() ) == null ) {
          ProductSpecificationCharacteristicValueUse pcitem = new ProductSpecificationCharacteristicValueUse();
          pcitem.name( prodSpecChar.getName() );
          pcitem.setDescription(prodSpecChar.getDescription());
          pcitem
          .maxCardinality(prodSpecChar.getMaxCardinality())
          .minCardinality(prodSpecChar.getMinCardinality())
          .valueType(prodSpecChar.getValueType());

          for (ProductSpecificationCharacteristicValue r : prodSpecChar.getProductSpecCharacteristicValue()) {
            ProductSpecificationCharacteristicValue pcval = new ProductSpecificationCharacteristicValue();
            pcval.isDefault(r.isIsDefault())
            .rangeInterval(r.getRangeInterval())
            .regex(r.getRegex())              
            .unitOfMeasure(r.getUnitOfMeasure())
            .valueFrom(r.getValueFrom()+"")
            .valueTo(r.getValueTo()+"")
            .valueType(r.getValueType())
            .value( new Any( r.getValue() )  );              
            pcitem.addProductSpecCharacteristicValueItem( pcval );
            
          }
          
          
          prodOffering.addProdSpecCharValueUseItem(pcitem );
        }        
      }
    }

    return prodOffering;
  }

  public ProductOffering createRetrieveProductOfferingBasedOnServiceSpec(String id) {

    ServiceSpecification serviceSpec = serviceSpecificationRepoService.findByUuid(id);
    ProductSpecificationCreate psc = new ProductSpecificationCreate();
    psc.setName(serviceSpec.getName());
    psc.setDescription(serviceSpec.getDescription());
    
    ProductSpecification responseProdSpec = prodSpecRepoService.addProductSpecification(psc);    
    
    responseProdSpec = prodSpecRepoService.addServiceSpecToProductSpec( responseProdSpec, serviceSpec );    
    
    ProductOffering pOffer = this.prodOfferingFromPrdSpec( responseProdSpec );
    
    return pOffer;
  }

  private ProductOffering prodOfferingFromPrdSpec(ProductSpecification responseProdSpec) {
    ProductSpecificationRef prodSpecRef = new ProductSpecificationRef();
    prodSpecRef.setId(responseProdSpec.getId());
    prodSpecRef.setName(responseProdSpec.getName());
    
    ProductOfferingCreate pefCre = new ProductOfferingCreate();
    pefCre.setName( responseProdSpec.getName());
    pefCre.productSpecification(prodSpecRef);
    
    ProductOffering pOffer = this.addProductOffering(pefCre);
    
    return pOffer;
  }
	
}
+72 −3
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.etsi.osl.tmf.common.model.Any;
import org.etsi.osl.tmf.common.model.AttachmentRefOrValue;
import org.etsi.osl.tmf.common.model.ELifecycle;
import org.etsi.osl.tmf.common.model.TimePeriod;
@@ -37,12 +38,17 @@ import org.etsi.osl.tmf.common.model.service.ServiceSpecificationRef;
import org.etsi.osl.tmf.pcm620.model.BundledProductSpecification;
import org.etsi.osl.tmf.pcm620.model.ProductSpecification;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCharacteristic;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCharacteristicValue;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationCreate;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationRelationship;
import org.etsi.osl.tmf.pcm620.model.ProductSpecificationUpdate;
import org.etsi.osl.tmf.pcm620.repo.ProductSpecificationRepository;
import org.etsi.osl.tmf.prm669.model.RelatedParty;
import org.etsi.osl.tmf.rcm634.model.ResourceSpecificationRef;
import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic;
import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue;
import org.etsi.osl.tmf.scm633.model.ServiceSpecification;
import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@@ -62,6 +68,8 @@ public class ProductSpecificationRepoService {
	ProductSpecificationRepository prodsOfferingRepo;
	

    @Autowired
    ServiceSpecificationRepoService serviceSpecificationRepoService;

	private SessionFactory sessionFactory;

@@ -548,7 +556,7 @@ public class ProductSpecificationRepoService {
		}
		
		/**
		 * Update ResourceSpecificationRef list
		 * Update ServiceSpecificationRef list
		 */
		if (prodSpecUpd.getServiceSpecification()  != null) {

@@ -569,6 +577,7 @@ public class ProductSpecificationRepoService {

				if (!idexists) {
					prodSpec.getServiceSpecification().add(ar);
					prodSpec = copyConfigurableCharacteristics( prodSpec, ar );					
					idAddedUpdated.put(ar.getUuid(), true);
				}
			}
@@ -598,4 +607,64 @@ public class ProductSpecificationRepoService {
		return prodSpec;
	}

  private ProductSpecification copyConfigurableCharacteristics(ProductSpecification prodSpec,
      ServiceSpecificationRef ar) {

    ServiceSpecification sourceSpec = serviceSpecificationRepoService.findByUuid(ar.getId());
    
    if ( sourceSpec != null ) {
      for (ServiceSpecCharacteristic ssc : sourceSpec.getServiceSpecCharacteristic()) {
        if (ssc.isConfigurable()!= null && ssc.isConfigurable()) {
          if ( prodSpec.findProdCharacteristicByName( ssc.getName() ) == null ) {
            
            ProductSpecificationCharacteristic cnew = new ProductSpecificationCharacteristic();          
            cnew.setName(  cnew.getName() ); 
            cnew.setDescription( cnew.getDescription());
            cnew.isUnique(cnew.isIsUnique())
            .extensible(cnew.isExtensible())
            .maxCardinality(cnew.getMaxCardinality())
            .minCardinality(cnew.getMinCardinality())
            .valueType(cnew.getValueType());
            for (ServiceSpecCharacteristicValue r : ssc.getServiceSpecCharacteristicValue()) {
              ProductSpecificationCharacteristicValue pcval = new ProductSpecificationCharacteristicValue();
              pcval.isDefault(r.isIsDefault())
              .rangeInterval(r.getRangeInterval())
              .regex(r.getRegex())              
              .unitOfMeasure(r.getUnitOfMeasure())
              .valueFrom(r.getValueFrom()+"")
              .valueTo(r.getValueTo()+"")
              .valueType(r.getValueType())
              .value( new Any( r.getValue() )  );              
              
              cnew.addProductSpecCharacteristicValueItem( pcval  );
            }
            
            prodSpec.getProductSpecCharacteristic().add( cnew );           
            
          }
        } 
      }           
  }
    
    return prodSpec;
  }

  public ProductSpecification addServiceSpecToProductSpec(ProductSpecification responseProdSpec, ServiceSpecification serviceSpec) {

    ServiceSpecificationRef serviceSpecRef = new ServiceSpecificationRef();
    serviceSpecRef.setId( serviceSpec.getId() );
    serviceSpecRef.setName( serviceSpec.getName());
    serviceSpecRef.setVersion(serviceSpec.getVersion());
    serviceSpecRef.setReferredType(serviceSpec.getType());
    
    ProductSpecificationUpdate pSpecUpd = new ProductSpecificationUpdate();
    pSpecUpd.addServiceSpecificationItem(serviceSpecRef);
    if (responseProdSpec.getServiceSpecification()!=null) {
      pSpecUpd.getServiceSpecification().addAll( responseProdSpec.getServiceSpecification() );      
    }
    responseProdSpec = updateProductSpecificationDataFromAPIcall(responseProdSpec, pSpecUpd);
    
    return responseProdSpec;
  }
	
}
+53 −0
Original line number Diff line number Diff line
@@ -311,6 +311,36 @@ public class ProductOrderRepoServiceTest {
  }
  
  
  @WithMockUser(username = "osadmin", roles = {"ADMIN", "USER"})
  @Test
  public void testCreateProductOfferingFromServiceSpec() throws Exception {
    ServiceSpecification serviceSpec = createServiceSpecification();
    
    String response = mvc
        .perform(MockMvcRequestBuilders.post("/productCatalogManagement/v4/productOffering/fromServiceSpecId/" + serviceSpec.getId())
            .with(SecurityMockMvcRequestPostProcessors.csrf()))
        .andExpect(status().isOk())
        .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
    
    ProductOffering respOff = JsonUtils.toJsonObj(response, ProductOffering.class);

    assertThat(respOff).isNotNull();
    assertThat( respOff.getName() ).isEqualTo( "Test Spec2" );
    assertThat( respOff.getProductSpecification() ).isNotNull();
    assertThat( respOff.getProductSpecification().getName()  ).isEqualTo( "Test Spec2" );
    
    ProductSpecification prodSpec = productSpecificationRepoService.findByUuid( respOff.getProductSpecification().getId() );
    assertThat( prodSpec.getName() ).isEqualTo( "Test Spec2" );
    assertThat( prodSpec.getServiceSpecification().size() ).isEqualTo( 1 );
    assertThat( prodSpec.getProductSpecCharacteristic().size() ).isEqualTo( 2 );    

    assertThat( respOff.getProdSpecCharValueUse().size() ).isEqualTo( 2 );    
    
    
  }


  private String createProductOrder() throws Exception {

    int currSize = productOrderRepoService.findAll().size();
@@ -397,6 +427,29 @@ public class ProductOrderRepoServiceTest {
        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
    ProductSpecification responsesSpec = JsonUtils.toJsonObj(response, ProductSpecification.class);

    return responsesSpec;
  }
  
  private ServiceSpecification createServiceSpecification() throws Exception{

    File sspec = new File( "src/test/resources/testServiceSpec2.json" );
    InputStream in = new FileInputStream( sspec );
    String sspectext = IOUtils.toString(in, "UTF-8");
    ServiceSpecificationCreate serviceSpecificationCreate = JsonUtils.toJsonObj( sspectext,  ServiceSpecificationCreate.class);

    String response = mvc.perform(MockMvcRequestBuilders.post("/serviceCatalogManagement/v4/serviceSpecification")
                    .with( SecurityMockMvcRequestPostProcessors.csrf())
                    .contentType(MediaType.APPLICATION_JSON)
                    .content( JsonUtils.toJson( serviceSpecificationCreate ) ))
            .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString();


    ServiceSpecification responsesSpec = JsonUtils.toJsonObj(response,  ServiceSpecification.class);
    assertThat( responsesSpec.getName() ).isEqualTo( "Test Spec2" );
    

    return responsesSpec;
}
}
Loading