DELL
2024-02-21 4982b9614516dde101c3e44c60a612b3bfd8d6fe
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
/*
 * Copyright 2011-17 Fraunhofer ISE, energy & meteo Systems GmbH and other contributors
 *
 * Licensed 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 org.openmuc.openiec61850;
 
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
 
import org.openmuc.openiec61850.internal.mms.asn1.Identifier;
import org.openmuc.openiec61850.internal.mms.asn1.ObjectName;
 
public final class DataSet implements Iterable<FcModelNode> {
 
    private final String dataSetReference;
    private final List<FcModelNode> members;
    private final Map<Fc, Map<String, FcModelNode>> membersMap = new EnumMap<>(Fc.class);
    private final boolean deletable;
    private ObjectName mmsObjectName = null;
 
    public DataSet(String dataSetReference, List<FcModelNode> members) {
        this(dataSetReference, members, true);
    }
 
    public DataSet(String dataSetReference, List<FcModelNode> members, boolean deletable) {
        if (!dataSetReference.startsWith("@") && dataSetReference.indexOf('/') == -1) {
            throw new IllegalArgumentException("DataSet reference " + dataSetReference
                    + " is invalid. Must either start with @ or contain a slash.");
        }
        this.members = new LinkedList<>();
        this.dataSetReference = dataSetReference;
        this.deletable = deletable;
 
        for (Fc myfc : Fc.values()) {
            membersMap.put(myfc, new LinkedHashMap<String, FcModelNode>());
        }
 
        for (FcModelNode member : members) {
            this.members.add(member);
            membersMap.get(member.getFc()).put(member.getReference().toString(), member);
        }
    }
 
    public String getReferenceStr() {
        return dataSetReference;
    }
 
    public DataSet copy() {
        List<FcModelNode> membersCopy = new ArrayList<>(members.size());
        for (FcModelNode node : members) {
            membersCopy.add((FcModelNode) node.copy());
        }
        return new DataSet(dataSetReference, membersCopy, deletable);
    }
 
    public FcModelNode getMember(ObjectReference memberReference, Fc fc) {
        if (fc != null) {
            return membersMap.get(fc).get(memberReference.toString());
        }
        for (FcModelNode member : members) {
            if (member.getReference().toString().equals(memberReference.toString())) {
                return member;
            }
        }
        return null;
    }
 
    public FcModelNode getMember(int index) {
        return members.get(index);
    }
 
    public List<FcModelNode> getMembers() {
        return members;
    }
 
    /**
     * Those DataSets defined in the SCL file are not deletable. All other DataSets are deletable. Note that no
     * Reports/Logs may be using the DataSet otherwise it cannot be deleted (but this function will still return true).
     * 
     * @return true if deletable
     */
    public boolean isDeletable() {
        return deletable;
    }
 
    @Override
    public Iterator<FcModelNode> iterator() {
        return members.iterator();
    }
 
    public List<BasicDataAttribute> getBasicDataAttributes() {
        List<BasicDataAttribute> subBasicDataAttributes = new LinkedList<>();
        for (ModelNode member : members) {
            subBasicDataAttributes.addAll(member.getBasicDataAttributes());
        }
        return subBasicDataAttributes;
    }
 
    ObjectName getMmsObjectName() {
 
        if (mmsObjectName != null) {
            return mmsObjectName;
        }
 
        if (dataSetReference.charAt(0) == '@') {
            mmsObjectName = new ObjectName();
            mmsObjectName.setAaSpecific(new Identifier(dataSetReference.getBytes()));
            return mmsObjectName;
        }
 
        int slash = dataSetReference.indexOf('/');
        String domainID = dataSetReference.substring(0, slash);
        String itemID = dataSetReference.substring(slash + 1, dataSetReference.length()).replace('.', '$');
 
        ObjectName.DomainSpecific domainSpecificObjectName = new ObjectName.DomainSpecific();
        domainSpecificObjectName.setDomainID(new Identifier(domainID.getBytes()));
        domainSpecificObjectName.setItemID(new Identifier(itemID.getBytes()));
 
        mmsObjectName = new ObjectName();
        mmsObjectName.setDomainSpecific(domainSpecificObjectName);
 
        return mmsObjectName;
 
    }
 
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getReferenceStr());
        for (FcModelNode member : members) {
            sb.append("\n");
            sb.append(member.toString());
        }
        return sb.toString();
    }
 
}