github.com/TIBCOSoftware/flogo-lib@v0.5.9/app/property.go (about)

     1  package app
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"sync"
     7  
     8  	"github.com/TIBCOSoftware/flogo-lib/logger"
     9  )
    10  
    11  var (
    12  	propertyProvider   *PropertyProvider
    13  	propValueResolvers = make(map[string]PropertyValueResolver)
    14  	lock               = &sync.Mutex{}
    15  )
    16  
    17  func init() {
    18  	propertyProvider = &PropertyProvider{properties: make(map[string]interface{})}
    19  }
    20  
    21  func RegisterPropertyValueResolver(relType string, resolver PropertyValueResolver) error {
    22  	lock.Lock()
    23  	defer lock.Unlock()
    24  	_, ok := propValueResolvers[relType]
    25  	if ok {
    26  		errMsg := fmt.Sprintf("Property value resolver is already registered for type - '%s'", relType)
    27  		logger.Errorf(errMsg)
    28  		return errors.New(errMsg)
    29  	}
    30  	propValueResolvers[relType] = resolver
    31  	return nil
    32  }
    33  
    34  func GetPropertyValueResolver(relType string) PropertyValueResolver {
    35  	return propValueResolvers[relType]
    36  }
    37  
    38  func GetPropertyProvider() *PropertyProvider {
    39  	return propertyProvider
    40  }
    41  
    42  type PropertyProvider struct {
    43  	properties map[string]interface{}
    44  }
    45  
    46  // PropertyValueResolver used to resolve value from external configuration like env, file etc
    47  type PropertyValueResolver interface {
    48  	// Should return value and true if the given key exists in the external configuration otherwise should return nil and false.
    49  	LookupValue(key string) (interface{}, bool)
    50  }
    51  
    52  func (pp *PropertyProvider) GetProperty(property string) (interface{}, bool) {
    53  	prop, exists := pp.properties[property]
    54  	return prop, exists
    55  }
    56  
    57  func (pp *PropertyProvider) SetProperty(property string, value interface{}) {
    58  	pp.properties[property] = value
    59  }
    60  
    61  func (pp *PropertyProvider) SetProperties(value map[string]interface{}) {
    62  	pp.properties = value
    63  }