@ -13,240 +13,373 @@
* /
* /
package com.beanit.iec61850bean ;
package com.beanit.iec61850bean ;
import static java.nio.charset.StandardCharsets.UTF_8 ;
import com.beanit.iec61850bean.internal.mms.asn1.* ;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccess ;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection ;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection.SelectAccess ;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection.SelectAccess ;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection.SelectAccess.Component ;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection.SelectAccess.Component ;
import com.beanit.iec61850bean.internal.mms.asn1.BasicIdentifier ;
import com.beanit.iec61850bean.internal.mms.asn1.Identifier ;
import com.beanit.iec61850bean.internal.mms.asn1.ObjectName ;
import com.beanit.iec61850bean.internal.mms.asn1.Unsigned32 ;
import com.beanit.iec61850bean.internal.mms.asn1.VariableDefs ;
import com.beanit.iec61850bean.internal.mms.asn1.VariableSpecification ;
import java.util.List ;
import java.util.List ;
import java.util.Timer ;
import java.util.Timer ;
import java.util.TimerTask ;
import java.util.TimerTask ;
import static java.nio.charset.StandardCharsets.UTF_8 ;
public abstract class FcModelNode extends ModelNode {
public abstract class FcModelNode extends ModelNode {
Fc fc ;
Fc fc ;
private VariableDefs . SEQUENCE variableDef = null ;
private VariableDefs . SEQUENCE variableDef = null ;
private ServerAssociation selected = null ;
private ServerAssociation selected = null ;
private TimerTask task = null ;
private TimerTask task = null ;
private String daType ;
private BdaType basicType = null ;
private String sAddr ;
private String daiVal ;
private boolean dchg ;
private boolean dupd ;
private boolean qchg ;
private String bType ;
private List < FcModelNode > bdas ;
private short valueShort ;
private byte [ ] valueBytes ;
private byte valueByte ;
private boolean valueBoolean ;
private int valueInt ;
private long valueLong ;
public Fc getFc ( ) {
return fc ;
}
public Fc getFc ( ) {
boolean select ( ServerAssociation association , Timer timer ) {
return fc ;
if ( selected ! = null ) {
}
if ( selected ! = association ) {
return false ;
}
} else {
selected = association ;
association . selects . add ( this ) ;
}
boolean select ( ServerAssociation association , Timer timer ) {
ModelNode sboTimeoutNode =
if ( selected ! = null ) {
association . serverModel . findModelNode ( objectReference , Fc . CF ) . getChild ( "sboTimeout" ) ;
if ( selected ! = association ) {
return false ;
}
} else {
selected = association ;
association . selects . add ( this ) ;
}
ModelNode sboTimeoutNode =
if ( sboTimeoutNode = = null ) {
association . serverModel . findModelNode ( objectReference , Fc . CF ) . getChild ( "sboTimeout" ) ;
return true ;
}
if ( sboTimeoutNode = = null ) {
long sboTimeout = ( ( BdaInt32U ) sboTimeoutNode ) . getValue ( ) ;
return true ;
}
long sboTimeout = ( ( BdaInt32U ) sboTimeoutNode ) . getValue ( ) ;
if ( sboTimeout = = 0 ) {
return true ;
}
if ( sboTimeout = = 0 ) {
class SelectResetTask extends TimerTask {
return true ;
ServerAssociation association ;
}
SelectResetTask ( ServerAssociation association ) {
this . association = association ;
}
@Override
public void run ( ) {
synchronized ( association . serverModel ) {
if ( task = = this ) {
task = null ;
deselectAndRemove ( association ) ;
}
}
}
}
class SelectResetTask extends TimerTask {
if ( task ! = null ) {
ServerAssociation association ;
task . cancel ( ) ;
}
SelectResetTask ( ServerAssociation association ) {
task = new SelectResetTask ( association ) ;
this . association = association ;
timer . schedule ( task , sboTimeout ) ;
}
return true ;
}
@Override
void deselectAndRemove ( ServerAssociation association ) {
public void run ( ) {
selected = null ;
synchronized ( association . serverModel ) {
if ( task ! = nul l) {
if ( task = = this ) {
task . cancel ( ) ;
task = null ;
task = null ;
deselectAndRemove ( association ) ;
}
}
}
}
association . selects . remove ( this ) ;
}
}
if ( task ! = null ) {
void deselect ( ) {
task . cancel ( ) ;
selected = null ;
if ( task ! = null ) {
task . cancel ( ) ;
task = null ;
}
}
}
task = new SelectResetTask ( association ) ;
boolean isSelected ( ) {
timer . schedule ( task , sboTimeout ) ;
return selected ! = null ;
return true ;
}
void deselectAndRemove ( ServerAssociation association ) {
selected = null ;
if ( task ! = null ) {
task . cancel ( ) ;
task = null ;
}
}
association . selects . remove ( this ) ;
}
void deselect ( ) {
boolean isSelectedBy ( ServerAssociation association ) {
selected = null ;
return selected = = association ;
if ( task ! = null ) {
task . cancel ( ) ;
task = null ;
}
}
}
boolean isSelected ( ) {
VariableDefs . SEQUENCE getMmsVariableDef ( ) {
return selected ! = null ;
}
if ( variableDef ! = null ) {
return variableDef ;
}
boolean isSelectedBy ( ServerAssociation association ) {
AlternateAccess alternateAccess = null ;
return selected = = association ;
}
VariableDefs . SEQUENCE getMmsVariableDef ( ) {
StringBuilder preArrayIndexItemId = new StringBuilder ( objectReference . get ( 1 ) ) ;
preArrayIndexItemId . append ( "$" ) ;
preArrayIndexItemId . append ( fc ) ;
if ( variableDef ! = null ) {
int arrayIndexPosition = objectReference . getArrayIndexPosition ( ) ;
return variableDef ;
if ( arrayIndexPosition ! = - 1 ) {
}
AlternateAccess alternateAccess = null ;
for ( int i = 2 ; i < arrayIndexPosition ; i + + ) {
preArrayIndexItemId . append ( "$" ) ;
preArrayIndexItemId . append ( objectReference . get ( i ) ) ;
}
StringBuilder preArrayIndexItemId = new StringBuilder ( objectReference . get ( 1 ) ) ;
alternateAccess = new AlternateAccess ( ) ;
preArrayIndexItemId . append ( "$" ) ;
List < AlternateAccess . CHOICE > subSeqOfAlternateAccess = alternateAccess . getCHOICE ( ) ;
preArrayIndexItemId . append ( fc ) ;
Unsigned32 indexBerInteger =
new Unsigned32 ( Integer . parseInt ( objectReference . get ( arrayIndexPosition ) ) ) ;
int arrayIndexPosition = objectReference . getArrayIndexPosition ( ) ;
if ( arrayIndexPosition < ( objectReference . size ( ) - 1 ) ) {
if ( arrayIndexPosition ! = - 1 ) {
// this reference points to a sub-node of an array element
for ( int i = 2 ; i < arrayIndexPosition ; i + + ) {
StringBuilder postArrayIndexItemId =
preArrayIndexItemId . append ( "$" ) ;
new StringBuilder ( objectReference . get ( arrayIndexPosition + 1 ) ) ;
preArrayIndexItemId . append ( objectReference . get ( i ) ) ;
}
for ( int i = ( arrayIndexPosition + 2 ) ; i < objectReference . size ( ) ; i + + ) {
postArrayIndexItemId . append ( "$" ) ;
postArrayIndexItemId . append ( objectReference . get ( i ) ) ;
}
BasicIdentifier subIndexReference =
new BasicIdentifier ( postArrayIndexItemId . toString ( ) . getBytes ( UTF_8 ) ) ;
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 ) ;
}
alternateAccess = new AlternateAccess ( ) ;
} else {
List < AlternateAccess . CHOICE > subSeqOfAlternateAccess = alternateAccess . getCHOICE ( ) ;
Unsigned32 indexBerInteger =
new Unsigned32 ( Integer . parseInt ( objectReference . get ( arrayIndexPosition ) ) ) ;
if ( arrayIndexPosition < ( objectReference . size ( ) - 1 ) ) {
for ( int i = 2 ; i < objectReference . size ( ) ; i + + ) {
// this reference points to a sub-node of an array element
preArrayIndexItemId . append ( "$" ) ;
preArrayIndexItemId . append ( objectReference . get ( i ) ) ;
}
}
ObjectName . DomainSpecific domainSpecificObjectName = new ObjectName . DomainSpecific ( ) ;
domainSpecificObjectName . setDomainID ( new Identifier ( objectReference . get ( 0 ) . getBytes ( UTF_8 ) ) ) ;
domainSpecificObjectName . setItemID (
new Identifier ( preArrayIndexItemId . toString ( ) . getBytes ( UTF_8 ) ) ) ;
ObjectName objectName = new ObjectName ( ) ;
objectName . setDomainSpecific ( domainSpecificObjectName ) ;
StringBuilder postArrayIndexItemId =
VariableSpecification varSpec = new VariableSpecification ( ) ;
new StringBuilder ( objectReference . get ( arrayIndexPosition + 1 ) ) ;
varSpec . setName ( objectName ) ;
variableDef = new VariableDefs . SEQUENCE ( ) ;
variableDef . setAlternateAccess ( alternateAccess ) ;
variableDef . setVariableSpecification ( varSpec ) ;
return variableDef ;
}
for ( int i = ( arrayIndexPosition + 2 ) ; i < objectReference . size ( ) ; i + + ) {
@Override
postArrayIndexItemId . append ( "$" ) ;
public String toString ( ) {
postArrayIndexItemId . append ( objectReference . get ( i ) ) ;
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 ( ) ;
}
BasicIdentifier subIndexReference =
public String getDaType ( ) {
new BasicIdentifier ( postArrayIndexItemId . toString ( ) . getBytes ( UTF_8 ) ) ;
return daType ;
}
AlternateAccessSelection . SelectAccess subIndexReferenceSelectAccess =
public void setDaType ( String daType ) {
new AlternateAccessSelection . SelectAccess ( ) ;
this . daType = daType ;
Component component = new Component ( ) ;
}
component . setBasic ( subIndexReference ) ;
subIndexReferenceSelectAccess . setComponent ( component ) ;
public BdaType getBasicType ( ) {
return basicType ;
}
public void setBasicType ( BdaType basicType ) {
this . basicType = basicType ;
}
public String getsAddr ( ) {
return sAddr ;
}
public void setsAddr ( String sAddr ) {
this . sAddr = sAddr ;
}
public String getDaiVal ( ) {
return daiVal ;
}
public void setDaiVal ( String daiVal ) {
this . daiVal = daiVal ;
}
AlternateAccessSelection subIndexReferenceAlternateAccessSelection =
public boolean isDchg ( ) {
new AlternateAccessSelection ( ) ;
return dchg ;
subIndexReferenceAlternateAccessSelection . setSelectAccess ( subIndexReferenceSelectAccess ) ;
}
AlternateAccess . CHOICE subIndexReferenceAlternateAccessSubChoice =
public void setDchg ( boolean dchg ) {
new AlternateAccess . CHOICE ( ) ;
this . dchg = dchg ;
subIndexReferenceAlternateAccessSubChoice . setUnnamed (
}
subIndexReferenceAlternateAccessSelection ) ;
AlternateAccess subIndexReferenceAlternateAccess = new AlternateAccess ( ) ;
public boolean isDupd ( ) {
return dupd ;
}
List < AlternateAccess . CHOICE > subIndexReferenceAlternateAccessSubSeqOf =
public void setDupd ( boolean dupd ) {
subIndexReferenceAlternateAccess . getCHOICE ( ) ;
this . dupd = dupd ;
subIndexReferenceAlternateAccessSubSeqOf . add ( subIndexReferenceAlternateAccessSubChoice ) ;
}
// set array index:
public boolean isQchg ( ) {
return qchg ;
}
AlternateAccessSelection . SelectAlternateAccess . AccessSelection indexAccessSelectionChoice =
public void setQchg ( boolean qchg ) {
new AlternateAccessSelection . SelectAlternateAccess . AccessSelection ( ) ;
this . qchg = qchg ;
indexAccessSelectionChoice . setIndex ( indexBerInteger ) ;
}
AlternateAccessSelection . SelectAlternateAccess indexAndLowerReferenceSelectAlternateAccess =
public String getbType ( ) {
new AlternateAccessSelection . SelectAlternateAccess ( ) ;
return bType ;
indexAndLowerReferenceSelectAlternateAccess . setAccessSelection ( indexAccessSelectionChoice ) ;
}
indexAndLowerReferenceSelectAlternateAccess . setAlternateAccess (
subIndexReferenceAlternateAccess ) ;
AlternateAccessSelection indexAndLowerReferenceAlternateAccessSelection =
public void setbType ( String bType ) {
new AlternateAccessSelection ( ) ;
this . bType = bType ;
indexAndLowerReferenceAlternateAccessSelection . setSelectAlternateAccess (
}
indexAndLowerReferenceSelectAlternateAccess ) ;
AlternateAccess . CHOICE indexAndLowerReferenceAlternateAccessChoice =
public List < FcModelNode > getDataAttributes ( ) {
new AlternateAccess . CHOICE ( ) ;
return bdas ;
indexAndLowerReferenceAlternateAccessChoice . setUnnamed (
}
indexAndLowerReferenceAlternateAccessSelection ) ;
subSeqOfAlternateAccess . add ( indexAndLowerReferenceAlternateAccessChoice ) ;
public FcModelNode setDataAttributes ( List < FcModelNode > bdas ) {
this . bdas = bdas ;
return this ;
}
} else {
public short getValueShort ( ) {
SelectAccess selectAccess = new SelectAccess ( ) ;
return valueShort ;
selectAccess . setIndex ( indexBerInteger ) ;
}
AlternateAccessSelection alternateAccessSelection = new AlternateAccessSelection ( ) ;
public void setValueShort ( short valueShort ) {
alternateAccessSelection . setSelectAccess ( selectAccess ) ;
this . valueShort = valueShort ;
}
AlternateAccess . CHOICE alternateAccessChoice = new AlternateAccess . CHOICE ( ) ;
public byte [ ] getValueBytes ( ) {
alternateAccessChoice . setUnnamed ( alternateAccessSelection ) ;
return valueBytes ;
}
subSeqOfAlternateAccess . add ( alternateAccessChoice ) ;
public void setValueBytes ( byte [ ] valueBytes ) {
}
this . valueBytes = valueBytes ;
}
} else {
public byte getValueByte ( ) {
return valueByte ;
}
for ( int i = 2 ; i < objectReference . size ( ) ; i + + ) {
public void setValueByte ( byte valueByte ) {
preArrayIndexItemId . append ( "$" ) ;
this . valueByte = valueByte ;
preArrayIndexItemId . append ( objectReference . get ( i ) ) ;
}
}
}
ObjectName . DomainSpecific domainSpecificObjectName = new ObjectName . DomainSpecific ( ) ;
public boolean isValueBoolean ( ) {
domainSpecificObjectName . setDomainID ( new Identifier ( objectReference . get ( 0 ) . getBytes ( UTF_8 ) ) ) ;
return valueBoolean ;
domainSpecificObjectName . setItemID (
}
new Identifier ( preArrayIndexItemId . toString ( ) . getBytes ( UTF_8 ) ) ) ;
ObjectName objectName = new ObjectName ( ) ;
public void setValueBoolean ( boolean valueBoolean ) {
objectName . setDomainSpecific ( domainSpecificObjectName ) ;
this . valueBoolean = valueBoolean ;
}
VariableSpecification varSpec = new VariableSpecification ( ) ;
public int getValueInt ( ) {
varSpec . setName ( objectName ) ;
return valueInt ;
}
variableDef = new VariableDefs . SEQUENCE ( ) ;
public void setValueInt ( int valueInt ) {
variableDef . setAlternateAccess ( alternateAccess ) ;
this . valueInt = valueInt ;
variableDef . setVariableSpecification ( varSpec ) ;
}
return variableDef ;
public long getValueLong ( ) {
}
return valueLong ;
}
@Override
public void setValueLong ( long valueLong ) {
public String toString ( ) {
this . valueLong = valueLong ;
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 ( ) ;
}
}
}