DELL
2024-02-21 4982b9614516dde101c3e44c60a612b3bfd8d6fe
iec61850_forFoShanAES_Model/src/org/openmuc/openiec61850/FcModelNode.java
@@ -1,250 +1,250 @@
/*
 * 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.List;
import java.util.Timer;
import java.util.TimerTask;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccess;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccessSelection;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccessSelection.SelectAccess;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccessSelection.SelectAccess.Component;
import org.openmuc.openiec61850.internal.mms.asn1.BasicIdentifier;
import org.openmuc.openiec61850.internal.mms.asn1.Identifier;
import org.openmuc.openiec61850.internal.mms.asn1.ObjectName;
import org.openmuc.openiec61850.internal.mms.asn1.Unsigned32;
import org.openmuc.openiec61850.internal.mms.asn1.VariableDefs;
import org.openmuc.openiec61850.internal.mms.asn1.VariableSpecification;
public abstract class FcModelNode extends ModelNode {
    private VariableDefs.SEQUENCE variableDef = null;
    Fc fc;
    private ServerAssociation selected = null;
    private TimerTask task = null;
    public Fc getFc() {
        return fc;
    }
    boolean select(ServerAssociation association, Timer timer) {
        if (selected != null) {
            if (selected != association) {
                return false;
            }
        }
        else {
            selected = association;
            association.selects.add(this);
        }
        ModelNode sboTimeoutNode = association.serverModel.findModelNode(objectReference, Fc.CF).getChild("sboTimeout");
        if (sboTimeoutNode == null) {
            return true;
        }
        long sboTimeout = ((BdaInt32U) sboTimeoutNode).getValue();
        if (sboTimeout == 0) {
            return true;
        }
        class SelectResetTask extends TimerTask {
            ServerAssociation association;
            SelectResetTask(ServerAssociation association) {
                this.association = association;
            }
            @Override
            public void run() {
                synchronized (association.serverModel) {
                    if (task == this) {
                        task = null;
                        deselectAndRemove(association);
                    }
                }
            }
        }
        if (task != null) {
            task.cancel();
        }
        task = new SelectResetTask(association);
        timer.schedule(task, sboTimeout);
        return true;
    }
    void deselectAndRemove(ServerAssociation association) {
        selected = null;
        if (task != null) {
            task.cancel();
            task = null;
        }
        association.selects.remove(this);
    }
    void deselect() {
        selected = null;
        if (task != null) {
            task.cancel();
            task = null;
        }
    }
    boolean isSelected() {
        if (selected == null) {
            return false;
        }
        return true;
    }
    boolean isSelectedBy(ServerAssociation association) {
        if (selected == association) {
            return true;
        }
        return false;
    }
    VariableDefs.SEQUENCE getMmsVariableDef() {
        if (variableDef != null) {
            return variableDef;
        }
        AlternateAccess alternateAccess = null;
        StringBuilder preArrayIndexItemId = new StringBuilder(objectReference.get(1));
        preArrayIndexItemId.append("$");
        preArrayIndexItemId.append(fc);
        int arrayIndexPosition = objectReference.getArrayIndexPosition();
        if (arrayIndexPosition != -1) {
            for (int i = 2; i < arrayIndexPosition; i++) {
                preArrayIndexItemId.append("$");
                preArrayIndexItemId.append(objectReference.get(i));
            }
            alternateAccess = new AlternateAccess();
            List<AlternateAccess.CHOICE> subSeqOfAlternateAccess = alternateAccess.getCHOICE();
            Unsigned32 indexBerInteger = new Unsigned32(Integer.parseInt(objectReference.get(arrayIndexPosition)));
            if (arrayIndexPosition < (objectReference.size() - 1)) {
                // this reference points to a sub-node of an array element
                StringBuilder postArrayIndexItemId = new StringBuilder(objectReference.get(arrayIndexPosition + 1));
                for (int i = (arrayIndexPosition + 2); i < objectReference.size(); i++) {
                    postArrayIndexItemId.append("$");
                    postArrayIndexItemId.append(objectReference.get(i));
                }
                BasicIdentifier subIndexReference = new BasicIdentifier(postArrayIndexItemId.toString().getBytes());
                AlternateAccessSelection.SelectAccess subIndexReferenceSelectAccess = new AlternateAccessSelection.SelectAccess();
                Component component = new Component();
                component.setBasic(subIndexReference);
                subIndexReferenceSelectAccess.setComponent(component);
                AlternateAccessSelection subIndexReferenceAlternateAccessSelection = new AlternateAccessSelection();
                subIndexReferenceAlternateAccessSelection.setSelectAccess(subIndexReferenceSelectAccess);
                AlternateAccess.CHOICE subIndexReferenceAlternateAccessSubChoice = new AlternateAccess.CHOICE();
                subIndexReferenceAlternateAccessSubChoice.setUnnamed(subIndexReferenceAlternateAccessSelection);
                AlternateAccess subIndexReferenceAlternateAccess = new AlternateAccess();
                List<AlternateAccess.CHOICE> subIndexReferenceAlternateAccessSubSeqOf = subIndexReferenceAlternateAccess
                        .getCHOICE();
                subIndexReferenceAlternateAccessSubSeqOf.add(subIndexReferenceAlternateAccessSubChoice);
                // set array index:
                AlternateAccessSelection.SelectAlternateAccess.AccessSelection indexAccessSelectionChoice = new AlternateAccessSelection.SelectAlternateAccess.AccessSelection();
                indexAccessSelectionChoice.setIndex(indexBerInteger);
                AlternateAccessSelection.SelectAlternateAccess indexAndLowerReferenceSelectAlternateAccess = new AlternateAccessSelection.SelectAlternateAccess();
                indexAndLowerReferenceSelectAlternateAccess.setAccessSelection(indexAccessSelectionChoice);
                indexAndLowerReferenceSelectAlternateAccess.setAlternateAccess(subIndexReferenceAlternateAccess);
                AlternateAccessSelection indexAndLowerReferenceAlternateAccessSelection = new AlternateAccessSelection();
                indexAndLowerReferenceAlternateAccessSelection
                        .setSelectAlternateAccess(indexAndLowerReferenceSelectAlternateAccess);
                AlternateAccess.CHOICE indexAndLowerReferenceAlternateAccessChoice = new AlternateAccess.CHOICE();
                indexAndLowerReferenceAlternateAccessChoice.setUnnamed(indexAndLowerReferenceAlternateAccessSelection);
                subSeqOfAlternateAccess.add(indexAndLowerReferenceAlternateAccessChoice);
            }
            else {
                SelectAccess selectAccess = new SelectAccess();
                selectAccess.setIndex(indexBerInteger);
                AlternateAccessSelection alternateAccessSelection = new AlternateAccessSelection();
                alternateAccessSelection.setSelectAccess(selectAccess);
                AlternateAccess.CHOICE alternateAccessChoice = new AlternateAccess.CHOICE();
                alternateAccessChoice.setUnnamed(alternateAccessSelection);
                subSeqOfAlternateAccess.add(alternateAccessChoice);
            }
        }
        else {
            for (int i = 2; i < objectReference.size(); i++) {
                preArrayIndexItemId.append("$");
                preArrayIndexItemId.append(objectReference.get(i));
            }
        }
        ObjectName.DomainSpecific domainSpecificObjectName = new ObjectName.DomainSpecific();
        domainSpecificObjectName.setDomainID(new Identifier(objectReference.get(0).getBytes()));
        domainSpecificObjectName.setItemID(new Identifier(preArrayIndexItemId.toString().getBytes()));
        ObjectName objectName = new ObjectName();
        objectName.setDomainSpecific(domainSpecificObjectName);
        VariableSpecification varSpec = new VariableSpecification();
        varSpec.setName(objectName);
        variableDef = new VariableDefs.SEQUENCE();
        variableDef.setAlternateAccess(alternateAccess);
        variableDef.setVariableSpecification(varSpec);
        return variableDef;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getReference().toString()).append(" [").append(fc).append("]");
        for (ModelNode childNode : children.values()) {
            sb.append("\n");
            sb.append(childNode.toString());
        }
        return sb.toString();
    }
}
/*
 * 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.List;
import java.util.Timer;
import java.util.TimerTask;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccess;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccessSelection;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccessSelection.SelectAccess;
import org.openmuc.openiec61850.internal.mms.asn1.AlternateAccessSelection.SelectAccess.Component;
import org.openmuc.openiec61850.internal.mms.asn1.BasicIdentifier;
import org.openmuc.openiec61850.internal.mms.asn1.Identifier;
import org.openmuc.openiec61850.internal.mms.asn1.ObjectName;
import org.openmuc.openiec61850.internal.mms.asn1.Unsigned32;
import org.openmuc.openiec61850.internal.mms.asn1.VariableDefs;
import org.openmuc.openiec61850.internal.mms.asn1.VariableSpecification;
public abstract class FcModelNode extends ModelNode {
    private VariableDefs.SEQUENCE variableDef = null;
    Fc fc;
    private ServerAssociation selected = null;
    private TimerTask task = null;
    public Fc getFc() {
        return fc;
    }
    boolean select(ServerAssociation association, Timer timer) {
        if (selected != null) {
            if (selected != association) {
                return false;
            }
        }
        else {
            selected = association;
            association.selects.add(this);
        }
        ModelNode sboTimeoutNode = association.serverModel.findModelNode(objectReference, Fc.CF).getChild("sboTimeout");
        if (sboTimeoutNode == null) {
            return true;
        }
        long sboTimeout = ((BdaInt32U) sboTimeoutNode).getValue();
        if (sboTimeout == 0) {
            return true;
        }
        class SelectResetTask extends TimerTask {
            ServerAssociation association;
            SelectResetTask(ServerAssociation association) {
                this.association = association;
            }
            @Override
            public void run() {
                synchronized (association.serverModel) {
                    if (task == this) {
                        task = null;
                        deselectAndRemove(association);
                    }
                }
            }
        }
        if (task != null) {
            task.cancel();
        }
        task = new SelectResetTask(association);
        timer.schedule(task, sboTimeout);
        return true;
    }
    void deselectAndRemove(ServerAssociation association) {
        selected = null;
        if (task != null) {
            task.cancel();
            task = null;
        }
        association.selects.remove(this);
    }
    void deselect() {
        selected = null;
        if (task != null) {
            task.cancel();
            task = null;
        }
    }
    boolean isSelected() {
        if (selected == null) {
            return false;
        }
        return true;
    }
    boolean isSelectedBy(ServerAssociation association) {
        if (selected == association) {
            return true;
        }
        return false;
    }
    VariableDefs.SEQUENCE getMmsVariableDef() {
        if (variableDef != null) {
            return variableDef;
        }
        AlternateAccess alternateAccess = null;
        StringBuilder preArrayIndexItemId = new StringBuilder(objectReference.get(1));
        preArrayIndexItemId.append("$");
        preArrayIndexItemId.append(fc);
        int arrayIndexPosition = objectReference.getArrayIndexPosition();
        if (arrayIndexPosition != -1) {
            for (int i = 2; i < arrayIndexPosition; i++) {
                preArrayIndexItemId.append("$");
                preArrayIndexItemId.append(objectReference.get(i));
            }
            alternateAccess = new AlternateAccess();
            List<AlternateAccess.CHOICE> subSeqOfAlternateAccess = alternateAccess.getCHOICE();
            Unsigned32 indexBerInteger = new Unsigned32(Integer.parseInt(objectReference.get(arrayIndexPosition)));
            if (arrayIndexPosition < (objectReference.size() - 1)) {
                // this reference points to a sub-node of an array element
                StringBuilder postArrayIndexItemId = new StringBuilder(objectReference.get(arrayIndexPosition + 1));
                for (int i = (arrayIndexPosition + 2); i < objectReference.size(); i++) {
                    postArrayIndexItemId.append("$");
                    postArrayIndexItemId.append(objectReference.get(i));
                }
                BasicIdentifier subIndexReference = new BasicIdentifier(postArrayIndexItemId.toString().getBytes());
                AlternateAccessSelection.SelectAccess subIndexReferenceSelectAccess = new AlternateAccessSelection.SelectAccess();
                Component component = new Component();
                component.setBasic(subIndexReference);
                subIndexReferenceSelectAccess.setComponent(component);
                AlternateAccessSelection subIndexReferenceAlternateAccessSelection = new AlternateAccessSelection();
                subIndexReferenceAlternateAccessSelection.setSelectAccess(subIndexReferenceSelectAccess);
                AlternateAccess.CHOICE subIndexReferenceAlternateAccessSubChoice = new AlternateAccess.CHOICE();
                subIndexReferenceAlternateAccessSubChoice.setUnnamed(subIndexReferenceAlternateAccessSelection);
                AlternateAccess subIndexReferenceAlternateAccess = new AlternateAccess();
                List<AlternateAccess.CHOICE> subIndexReferenceAlternateAccessSubSeqOf = subIndexReferenceAlternateAccess
                        .getCHOICE();
                subIndexReferenceAlternateAccessSubSeqOf.add(subIndexReferenceAlternateAccessSubChoice);
                // set array index:
                AlternateAccessSelection.SelectAlternateAccess.AccessSelection indexAccessSelectionChoice = new AlternateAccessSelection.SelectAlternateAccess.AccessSelection();
                indexAccessSelectionChoice.setIndex(indexBerInteger);
                AlternateAccessSelection.SelectAlternateAccess indexAndLowerReferenceSelectAlternateAccess = new AlternateAccessSelection.SelectAlternateAccess();
                indexAndLowerReferenceSelectAlternateAccess.setAccessSelection(indexAccessSelectionChoice);
                indexAndLowerReferenceSelectAlternateAccess.setAlternateAccess(subIndexReferenceAlternateAccess);
                AlternateAccessSelection indexAndLowerReferenceAlternateAccessSelection = new AlternateAccessSelection();
                indexAndLowerReferenceAlternateAccessSelection
                        .setSelectAlternateAccess(indexAndLowerReferenceSelectAlternateAccess);
                AlternateAccess.CHOICE indexAndLowerReferenceAlternateAccessChoice = new AlternateAccess.CHOICE();
                indexAndLowerReferenceAlternateAccessChoice.setUnnamed(indexAndLowerReferenceAlternateAccessSelection);
                subSeqOfAlternateAccess.add(indexAndLowerReferenceAlternateAccessChoice);
            }
            else {
                SelectAccess selectAccess = new SelectAccess();
                selectAccess.setIndex(indexBerInteger);
                AlternateAccessSelection alternateAccessSelection = new AlternateAccessSelection();
                alternateAccessSelection.setSelectAccess(selectAccess);
                AlternateAccess.CHOICE alternateAccessChoice = new AlternateAccess.CHOICE();
                alternateAccessChoice.setUnnamed(alternateAccessSelection);
                subSeqOfAlternateAccess.add(alternateAccessChoice);
            }
        }
        else {
            for (int i = 2; i < objectReference.size(); i++) {
                preArrayIndexItemId.append("$");
                preArrayIndexItemId.append(objectReference.get(i));
            }
        }
        ObjectName.DomainSpecific domainSpecificObjectName = new ObjectName.DomainSpecific();
        domainSpecificObjectName.setDomainID(new Identifier(objectReference.get(0).getBytes()));
        domainSpecificObjectName.setItemID(new Identifier(preArrayIndexItemId.toString().getBytes()));
        ObjectName objectName = new ObjectName();
        objectName.setDomainSpecific(domainSpecificObjectName);
        VariableSpecification varSpec = new VariableSpecification();
        varSpec.setName(objectName);
        variableDef = new VariableDefs.SEQUENCE();
        variableDef.setAlternateAccess(alternateAccess);
        variableDef.setVariableSpecification(varSpec);
        return variableDef;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getReference().toString()).append(" [").append(fc).append("]");
        for (ModelNode childNode : children.values()) {
            sb.append("\n");
            sb.append(childNode.toString());
        }
        return sb.toString();
    }
}