/* * 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.Collection; import java.util.EnumMap; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public final class LogicalNode extends ModelNode { private final Map> fcDataObjects = new EnumMap<>(Fc.class); private final Map urcbs = new HashMap<>(); private final Map brcbs = new HashMap<>(); public LogicalNode(ObjectReference objectReference, List fcDataObjects) { children = new LinkedHashMap<>(); for (Fc fc : Fc.values()) { this.fcDataObjects.put(fc, new LinkedHashMap()); } this.objectReference = objectReference; for (FcDataObject fcDataObject : fcDataObjects) { children.put(fcDataObject.getReference().getName() + fcDataObject.fc.toString(), fcDataObject); this.fcDataObjects.get(fcDataObject.getFc()).put(fcDataObject.getReference().getName(), fcDataObject); fcDataObject.setParent(this); if (fcDataObject.getFc() == Fc.RP) { addUrcb((Urcb) fcDataObject, false); } else if (fcDataObject.getFc() == Fc.BR) { addBrcb((Brcb) fcDataObject); } } } @Override public LogicalNode copy() { List dataObjectsCopy = new ArrayList<>(); for (ModelNode obj : children.values()) { dataObjectsCopy.add((FcDataObject) obj.copy()); } LogicalNode copy = new LogicalNode(objectReference, dataObjectsCopy); return copy; } public List getChildren(Fc fc) { Map requestedDataObjectsMap = fcDataObjects.get(fc); if (requestedDataObjectsMap == null) { return null; } Collection fcChildren = requestedDataObjectsMap.values(); if (fcChildren.size() == 0) { return null; } else { return new ArrayList<>(fcChildren); } } void addUrcb(Urcb urcb, boolean addDataSet) { urcbs.put(urcb.getReference().getName(), urcb); if (addDataSet) { String dataSetRef = urcb.getDatSet().getStringValue(); if (dataSetRef != null) { urcb.dataSet = ((ServerModel) getParent().getParent()).getDataSet(dataSetRef.replace('$', '.')); } } } public Collection getUrcbs() { return urcbs.values(); } public Urcb getUrcb(String urcbName) { return urcbs.get(urcbName); } void addBrcb(Brcb brcb) { brcbs.put(brcb.getReference().getName(), brcb); } public Brcb getBrcb(String brcbName) { return brcbs.get(brcbName); } public Collection getBrcbs() { return brcbs.values(); } @Override public ModelNode getChild(String childName, Fc fc) { if (fc != null) { return fcDataObjects.get(fc).get(childName); } return null; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getReference().toString()); for (Map fcChildNodes : fcDataObjects.values()) { for (ModelNode childNode : fcChildNodes.values()) { sb.append("\n"); sb.append(childNode.toString()); } } return sb.toString(); } }