Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method SynchronizeEntities (Lib3DS_QueryParameters_Type type) as owning Lib3DS_Entities 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    newentities := construct( Lib3DS_Entities ); 
 | 
     
 | 
    path := ''; 
 | 
    if( type.Kind() = Lib3DS_EntityKind::Object() ) 
 | 
    { 
 | 
      path := path + 'bus'; 
 | 
    } 
 | 
    else if( type.Kind() = Lib3DS_EntityKind::Relation() ) 
 | 
    { 
 | 
      path := path + 'rel'; 
 | 
    } 
 | 
     
 | 
    fields := construct( Strings ); 
 | 
     
 | 
    // Type filter 
 | 
    fields.Add( 'type=' + URL::Encode( type.Name() ) ); 
 | 
     
 | 
    // Basic attributes 
 | 
    fields.Add( 'select=id' ); 
 | 
    fields.Add( 'select=physicalid' ); 
 | 
    fields.Add( 'select=name' ); 
 | 
    fields.Add( 'select=type' ); 
 | 
     
 | 
    // Extensions 
 | 
    fields.Add( 'select=interface' ); 
 | 
     
 | 
    // Paths 
 | 
    fields.Add( 'select=paths.path.id' ); 
 | 
    fields.Add( 'select=paths.path.type' ); 
 | 
    fields.Add( 'select=paths.path.value' ); 
 | 
    fields.Add( 'select=paths.path.attribute%5bRoleSemantics%5d' ); 
 | 
     
 | 
    // PLM Name attribute is always loaded (with different attr name for Object or Relation) 
 | 
    plmnameattr := ifexpr( type.Kind() = Lib3DS_EntityKind::Object(), 
 | 
                           Lib3DS_Object::PLM_NAME_ATTRIBUTE(), 
 | 
                           Lib3DS_Relation::PLM_NAME_ATTRIBUTE() ); 
 | 
    plmnameattrUrl := URL::Encode( plmnameattr ); 
 | 
    fields.Add( 'select=attribute%5b' + plmnameattrUrl + '%5d.type' ); 
 | 
    fields.Add( 'select=attribute%5b' + plmnameattrUrl + '%5d.value' ); 
 | 
     
 | 
    // Attributes 
 | 
    traverse( type, Attribute, attr ) 
 | 
    { 
 | 
      attrNameUrl := URL::Encode( attr.Name() ); 
 | 
      fields.Add( 'select=attribute%5b' + attrNameUrl + '%5d.type' ); 
 | 
      fields.Add( 'select=attribute%5b' + attrNameUrl + '%5d.value' ); 
 | 
    } 
 | 
     
 | 
    // For relation objects, from and to entities 
 | 
    if( type.Kind() = Lib3DS_EntityKind::Relation() ) 
 | 
    { 
 | 
      fields.Add( 'select=from.id' ); 
 | 
      fields.Add( 'select=to.id' ); 
 | 
      fields.Add( 'select=torel.id' ); 
 | 
    } 
 | 
     
 | 
    // Attributes specific for business objects 
 | 
    if( type.Kind() = Lib3DS_EntityKind::Object() ) 
 | 
    { 
 | 
      fields.Add( 'select=revision' ); 
 | 
    } 
 | 
     
 | 
    querystring := fields.ToString( '&' ); 
 | 
    path := path + '?' + querystring; 
 | 
     
 | 
    nvtrequest := LibInt_MessageAccessor::CreateEmptyMessage(); 
 | 
    LibInt_MessageAccessor::SetHeaderProperty( nvtrequest, '_QI.ContentType', 'RAW' ); 
 | 
    LibInt_MessageAccessor::SetHeaderProperty( nvtrequest, 'HttpEndpointMethod', 'GET' ); 
 | 
    LibInt_MessageAccessor::SetHeaderProperty( nvtrequest, 'HttpEndpointPath', path ); 
 | 
    LibInt_MessageAccessor::SetHeaderProperty( nvtrequest, 'HTTPHeader.Accept', 'application/json' ); 
 | 
     
 | 
    nvtresponse := LibInt_IntegratorProxy::SyncNvtRequest( this.Root().IntegratorID(), '', nvtrequest ); 
 | 
    response := LibInt_MessageAccessor::GetBodyValueAsString( nvtresponse ); 
 | 
     
 | 
    jsonresponse := JSON::Parse( response ); 
 | 
     
 | 
    if( not isnull( jsonresponse ) ) 
 | 
    { 
 | 
      oldentities := selectset( Lib3DS_ClassType::FindClassType( type.Name() ), 
 | 
                                AllSubTypes.SubType.Entities, 
 | 
                                entity, 
 | 
                                entity.Kind() = type.Kind() ); 
 | 
      newentities := this.Root().ParseEntityQuery( type.Kind(), jsonresponse ); 
 | 
      deletedentities := oldentities.Difference( newentities ); 
 | 
      Lib3DS_Entity::Delete( deletedentities ); 
 | 
    } 
 | 
     
 | 
    return &newentities; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |