-
Notifications
You must be signed in to change notification settings - Fork 6
/
modify_metadata_request.go
158 lines (137 loc) · 5.37 KB
/
modify_metadata_request.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package message
import (
"encoding/xml"
"fmt"
"github.com/cyverse/go-irodsclient/irods/common"
"github.com/cyverse/go-irodsclient/irods/types"
"golang.org/x/xerrors"
)
// IRODSMessageModifyMetadataRequest stores alter metadata request
type IRODSMessageModifyMetadataRequest struct {
XMLName xml.Name `xml:"ModAVUMetadataInp_PI"`
Operation string `xml:"arg0"` // add, adda, rm, rmw, rmi, cp, mod, set
ItemType string `xml:"arg1"` // -d, -D, -c, -C, -r, -R, -u, -U
ItemName string `xml:"arg2"`
AttrName string `xml:"arg3"`
AttrValue string `xml:"arg4"`
AttrUnits string `xml:"arg5"`
NewAttrName string `xml:"arg6"` // new attr name (for mod)
NewAttrValue string `xml:"arg7"` // new attr value (for mod)
NewAttrUnits string `xml:"arg8"` // new attr unit (for mod)
Arg9 string `xml:"arg9"` // unused
}
// NewIRODSMessageAddMetadataRequest creates a IRODSMessageModMetaRequest message for adding a metadata AVU on some item.
// metadata.AVUID is ignored
func NewIRODSMessageAddMetadataRequest(itemType types.IRODSMetaItemType, itemName string, metadata *types.IRODSMeta) *IRODSMessageModifyMetadataRequest {
request := &IRODSMessageModifyMetadataRequest{
Operation: "add",
ItemType: string(itemType),
ItemName: itemName,
AttrName: metadata.Name,
AttrValue: metadata.Value,
AttrUnits: metadata.Units,
}
return request
}
// NewIRODSMessageReplaceMetadataRequest creates a IRODSMessageModMetaRequest message for replacing a metadata AVU.
// oldMetadata.AVUID and newMetadata.AVUID are ignored, the old AVU is queried by its name, value and unit.
func NewIRODSMessageReplaceMetadataRequest(itemType types.IRODSMetaItemType, itemName string, oldMetadata *types.IRODSMeta, newMetadata *types.IRODSMeta) *IRODSMessageModifyMetadataRequest {
request := &IRODSMessageModifyMetadataRequest{
Operation: "mod",
ItemType: string(itemType),
ItemName: itemName,
AttrName: oldMetadata.Name,
AttrValue: oldMetadata.Value,
AttrUnits: oldMetadata.Units,
NewAttrName: newMetadata.Name,
NewAttrValue: newMetadata.Value,
NewAttrUnits: newMetadata.Units,
}
return request
}
// NewIRODSMessageRemoveMetadataRequest creates a IRODSMessageModMetaRequest message for removing a metadata AVU.
// metadata.AVUID is ignored, the AVU is queried by its name, value and unit.
func NewIRODSMessageRemoveMetadataRequest(itemType types.IRODSMetaItemType, itemName string, metadata *types.IRODSMeta) *IRODSMessageModifyMetadataRequest {
request := &IRODSMessageModifyMetadataRequest{
Operation: "rm",
ItemType: string(itemType),
ItemName: itemName,
AttrName: metadata.Name,
AttrValue: metadata.Value,
AttrUnits: metadata.Units,
}
return request
}
// NewIRODSMessageRemoveMetadataByIDRequest creates a IRODSMessageModMetaRequest message for removing a metadata AVU by its AVUID.
func NewIRODSMessageRemoveMetadataByIDRequest(itemType types.IRODSMetaItemType, itemName string, AVUID int64) *IRODSMessageModifyMetadataRequest {
request := &IRODSMessageModifyMetadataRequest{
Operation: "rmi",
ItemType: string(itemType),
ItemName: itemName,
AttrName: fmt.Sprintf("%d", AVUID),
}
return request
}
// NewIRODSMessageRemoveMetadataWildcardRequest creates a IRODSMessageModMetaRequest message for removing a metadata AVU by itemName and attributeValue.
func NewIRODSMessageRemoveMetadataWildcardRequest(itemType types.IRODSMetaItemType, itemName, attName string) *IRODSMessageModifyMetadataRequest {
request := &IRODSMessageModifyMetadataRequest{
Operation: "rmw",
ItemType: string(itemType),
ItemName: itemName,
AttrName: attName,
AttrValue: "%",
AttrUnits: "%",
}
return request
}
// NewIRODSMessageSetMetadataRequest creates a IRODSMessageModMetaRequest message for changing the first metadata AVU on the given item with a matching attribute name to the given value an units.
// metadata.AVUID is ignored.
func NewIRODSMessageSetMetadataRequest(itemType types.IRODSMetaItemType, itemName string, metadata *types.IRODSMeta) *IRODSMessageModifyMetadataRequest {
request := &IRODSMessageModifyMetadataRequest{
Operation: "set",
ItemType: string(itemType),
ItemName: itemName,
AttrName: metadata.Name,
AttrValue: metadata.Value,
AttrUnits: metadata.Units,
}
return request
}
// GetBytes returns byte array
func (msg *IRODSMessageModifyMetadataRequest) GetBytes() ([]byte, error) {
xmlBytes, err := xml.Marshal(msg)
if err != nil {
return nil, xerrors.Errorf("failed to marshal irods message to xml: %w", err)
}
return xmlBytes, nil
}
// FromBytes returns struct from bytes
func (msg *IRODSMessageModifyMetadataRequest) FromBytes(bytes []byte) error {
err := xml.Unmarshal(bytes, msg)
if err != nil {
return xerrors.Errorf("failed to unmarshal xml to irods message: %w", err)
}
return nil
}
// GetMessage builds a message
func (msg *IRODSMessageModifyMetadataRequest) GetMessage() (*IRODSMessage, error) {
bytes, err := msg.GetBytes()
if err != nil {
return nil, xerrors.Errorf("failed to get bytes from irods message: %w", err)
}
msgBody := IRODSMessageBody{
Type: RODS_MESSAGE_API_REQ_TYPE,
Message: bytes,
Error: nil,
Bs: nil,
IntInfo: int32(common.MOD_AVU_METADATA_AN),
}
msgHeader, err := msgBody.BuildHeader()
if err != nil {
return nil, xerrors.Errorf("failed to build header from irods message: %w", err)
}
return &IRODSMessage{
Header: msgHeader,
Body: &msgBody,
}, nil
}