martiLQ/source/golang/client/src/martilq/resource.go

156 lines
3.5 KiB
Go

package martilq
import (
"github.com/google/uuid"
"encoding/csv"
"os"
"io"
"strings"
"time"
"fmt"
"log"
"errors"
"mime"
"strconv"
)
type Resource struct {
Title string `json:"title"`
Uid string `json:"uid"`
DocumentName string `json:"documentName"`
IssueDate string `json:"issueDate"`
Modified string `json:"modified"`
Expires string `json:"expires"`
State string `json:"state"`
Author string `json:"author"`
Length int64 `json:"length"`
Hash hash `json:"hash"`
Description string `json:"description"`
Url string `json:"url"`
Structure string `json:"structure"`
Version string `json:"version"`
ContentType string `json:"contentType"`
Encoding string `json:"encoding"`
Compression string `json:"compression"`
Encryption string `json:"encryption"`
DescribedBy string `json:"describedBy"`
Attributes []Attribute `json:"attributes"`
}
func NewResource(config configuration) Resource {
r := Resource {}
u := uuid.New()
r.Uid = u.String()
r.IssueDate = time.Now().Format(config.dateTimeFormat)
r.State = config.state
r.Author = config.author
r.Expires = config.ExpireDate("").Format(config.dateTimeFormat)
r.Encoding = config.encoding
r.Compression = config.compression
r.DescribedBy = config.describedBy
return r
}
func NewMartiLQResource(config configuration, sourcePath string, urlPath string, excludeHash bool, extendAttributes bool) (Resource, error) {
r := Resource {}
stats, err := os.Stat(sourcePath)
if err != nil {
if os.IsNotExist(err) {
log.Printf("'" + sourcePath + "' file does not exist.")
return r, errors.New("'" + sourcePath + "' file does not exist.")
}
}
if config.dataPath != "" {
}
u := uuid.New()
r.Uid = u.String()
r.State = config.state
r.Author = config.author
r.Expires = config.ExpireDate(sourcePath).Format(config.dateTimeFormat)
if time.Now().Before(config.ExpireDate(sourcePath)) && r.State == "expired" {
r.State = "active"
}
r.Encoding = config.encoding
r.Compression = config.compression
r.DescribedBy = config.describedBy
r.DocumentName = stats.Name()
switch config.title {
case "{{documentName.ext}}":
r.Title = r.DocumentName
case "{{documentName}}":
parts := strings.Split(r.DocumentName, ".")
r.Title = strings.Replace(r.DocumentName, ("."+parts[len(parts)-1]), "",-1)
case "{{print}}":
fmt.Println("r: "+ r.Title)
r.Title = r.DocumentName
default:
r.Title = config.title
}
r.IssueDate = time.Now().Format(config.dateTimeFormat)
r.Modified = stats.ModTime().Format(config.dateTimeFormat)
r.Url = urlPath
r.Length = stats.Size()
if !excludeHash {
h := NewMartiLQHash(config.hashAlgorithm, sourcePath, "", config.signKey_File)
r.Hash = h
}
parts := strings.Split(sourcePath,".")
extension := parts[len(parts)-1]
r.ContentType = mime.TypeByExtension("."+extension)
records := 0
columns := -1
switch extension {
case "csv":
r.Attributes = NewDefaultCsvAttributes(true, ",")
f_csv, err := os.Open(sourcePath)
if err != nil {
log.Fatal(err)
}
rdr := csv.NewReader(f_csv)
for {
record, err := rdr.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
records = records + 1
if len(record) > columns {
columns = len(record)
}
}
f_csv.Close()
default:
r.Attributes = NewDefaultExtensionAttributes(sourcePath, extendAttributes)
}
if columns > 0 {
r.Attributes = SetMartiAttribute(r.Attributes, "dataset", "columns", "count", "EQ" , strconv.Itoa(columns))
r.Attributes = SetMartiAttribute(r.Attributes, "dataset", "records", "count", "EQ" , strconv.Itoa(records))
}
return r, nil
}