blob: d68053b21261161660b555e8120e26d944bd33a2 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package appname
import (
"errors"
"fmt"
"path/filepath"
"strconv"
"strings"
"sync"
)
import (
"github.com/apache/dubbo-kubernetes/pkg/bufman/pkg/app"
)
type container struct {
envContainer app.EnvContainer
appName string
configDirPath string
configDirPathOnce sync.Once
cacheDirPath string
cacheDirPathOnce sync.Once
dataDirPath string
dataDirPathOnce sync.Once
port uint16
portErr error
portOnce sync.Once
}
func newContainer(envContainer app.EnvContainer, appName string) (*container, error) {
if err := validateAppName(appName); err != nil {
return nil, err
}
return &container{
envContainer: envContainer,
appName: appName,
}, nil
}
func (c *container) AppName() string {
return c.appName
}
func (c *container) ConfigDirPath() string {
c.configDirPathOnce.Do(c.setConfigDirPath)
return c.configDirPath
}
func (c *container) CacheDirPath() string {
c.cacheDirPathOnce.Do(c.setCacheDirPath)
return c.cacheDirPath
}
func (c *container) DataDirPath() string {
c.dataDirPathOnce.Do(c.setDataDirPath)
return c.dataDirPath
}
func (c *container) Port() (uint16, error) {
c.portOnce.Do(c.setPort)
return c.port, c.portErr
}
func (c *container) setConfigDirPath() {
c.configDirPath = c.getDirPath("CONFIG_DIR", app.ConfigDirPath)
}
func (c *container) setCacheDirPath() {
c.cacheDirPath = c.getDirPath("CACHE_DIR", app.CacheDirPath)
}
func (c *container) setDataDirPath() {
c.dataDirPath = c.getDirPath("DATA_DIR", app.DataDirPath)
}
func (c *container) setPort() {
c.port, c.portErr = c.getPort()
}
func (c *container) getDirPath(envSuffix string, getBaseDirPath func(app.EnvContainer) (string, error)) string {
dirPath := c.envContainer.Env(getEnvPrefix(c.appName) + envSuffix)
if dirPath == "" {
baseDirPath, err := getBaseDirPath(c.envContainer)
if err == nil {
dirPath = filepath.Join(baseDirPath, c.appName)
}
}
return dirPath
}
func (c *container) getPort() (uint16, error) {
portString := c.envContainer.Env(getEnvPrefix(c.appName) + "PORT")
if portString == "" {
portString = c.envContainer.Env("PORT")
if portString == "" {
return 0, nil
}
}
port, err := strconv.ParseUint(portString, 10, 16)
if err != nil {
return 0, fmt.Errorf("could not parse port %q to uint16: %v", portString, err)
}
return uint16(port), nil
}
func getEnvPrefix(appName string) string {
return strings.ToUpper(strings.ReplaceAll(appName, "-", "_")) + "_"
}
func validateAppName(appName string) error {
if appName == "" {
return errors.New("empty application name")
}
for _, c := range appName {
if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '-' || c == '_') {
return fmt.Errorf("invalid application name: %s", appName)
}
}
return nil
}