sequencetypeinfo.java
来自「ASN.1工具源代码,包括编译源码生成工具和各种基本类型构造类型的编解码实现代码」· Java 代码 · 共 245 行
JAVA
245 行
/** * * SequenceTypeInfo * * @author Ian Ibbotson ( ibbo@k-int.com ) * @version $Id: SequenceTypeInfo.java,v 1.2 2000/12/23 10:43:56 ianibbo Exp $ * * Copyright: Copyright (C) 2000, Knowledge Integration Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the license, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite * 330, Boston, MA 02111-1307, USA. * * */package com.k_int.codec.comp;import java.io.StringWriter;import java.io.FileWriter;import java.io.File; import java.util.Set;import java.util.HashSet;import java.util.Vector;import java.util.Iterator;import java.util.Collections; import java.util.Enumeration; public class SequenceTypeInfo extends TypeInfo{ public SequenceTypeInfo(String type_reference, boolean builtin_type, int tag_class, int tag_number, boolean is_implicit, String basetype, String internal_type, ModuleInfo mi) { super(type_reference,builtin_type, tag_class, tag_number,is_implicit,basetype,internal_type,mi); this.internal_type=this.type_class_name; } public SequenceTypeInfo(String type_reference, boolean builtin_type, String basetype, String internal_type, ModuleInfo mi) { super(type_reference, builtin_type, basetype, internal_type, mi); this.internal_type=this.type_class_name; } public void writeTypeSpecificStaticInitialisationCode(StringWriter func, StringWriter declarations) { // Just to be on the safe side... I don't know why but under some conditions // I'm getting 2 declarations for a type Vector added_so_far = new Vector(); for(Iterator i=codecs_used_by_this_codec.iterator(); i.hasNext(); ) { TypeInfo codec_to_add = (TypeInfo)i.next(); String cname = codec_to_add.getCodecClassName(); if ( added_so_far.contains(cname) ) { // Don't add it twice } else { added_so_far.add(cname); declarations.write(" private "+codec_to_add.getCodecClassName()+" i_"+codec_to_add.getCodecClassName().toLowerCase()+" = "+codec_to_add.getCodecClassName()+".getCodec();\n"); } } declarations.write("\n"); } public void createTypeClassFile() { String type_file_name = parent.getModulePackageDir()+"/"+type_reference.replace('-','_')+"_type.java"; File type_source_file = new File(type_file_name); FileWriter type_writer = null; try { if ( type_source_file.exists() ) { System.err.println(type_file_name+" type already exists"); } else { System.err.println(" create type source file : "+type_file_name); type_source_file.createNewFile(); } type_writer = new FileWriter(type_source_file); System.err.println("Package is "+parent.getModulePackageName()+"."+type_reference.replace('-','_')); StringWriter declarations_stream = new StringWriter(); StringWriter static_get_stream = new StringWriter(); StringWriter serialize_method_stream = new StringWriter(); StringWriter imports_stream = new StringWriter(); parent.addImportStatementsToClass(imports_stream, false, true); // type_writer.write("package "+parent.getModulePackageName()+"."+type_reference.replace('-','_')+";\n\n"); type_writer.write("package "+parent.getModulePackageName()+";\n\n"); type_writer.write("import java.math.BigInteger;\n"); type_writer.write("import java.util.Vector;\n"); type_writer.write("import com.k_int.codec.runtime.*;\n"); type_writer.write("import "+System.getProperty("CodecBasePackage")+".AsnUseful.*;\n\n"); type_writer.write(imports_stream.toString()); type_writer.write("public class "+this.type_class_name+"\n{\n"); for ( Enumeration e = cons_members.elements(); e.hasMoreElements(); ) { TaggedMember t = (TaggedMember)e.nextElement(); TypeInfo ti = parent.lookup(null,t.getTypeReference(),true); if ( null != ti ) { type_writer.write(" public "+ti.getInternalType()+" "+t.getMemberName()+" = null;\n"); } } type_writer.write(declarations_stream.toString()); type_writer.write(static_get_stream.toString()); type_writer.write(serialize_method_stream.toString()); type_writer.write("\n}\n"); type_writer.flush(); type_writer.close(); } catch ( java.io.IOException ioe ) { ioe.printStackTrace(); System.exit(0); } } public void writeSerializeMethod(StringWriter func, StringWriter declarations) { func.write(" public Object serialize(SerializationManager sm,\n"); func.write(" Object type_instance,\n"); func.write(" boolean is_optional,\n"); func.write(" String type_name) throws java.io.IOException\n"); func.write(" {\n"); func.write(" "+this.type_class_name+" retval = ("+this.type_class_name+")type_instance;\n\n"); if ( tag_class == -1 ) { func.write(" if ( sm.sequenceBegin() )\n {\n"); } else { if ( is_implicit ) { func.write(" sm.implicit_settag("+tag_class+", "+tag_number+");\n"); func.write(" if ( sm.sequenceBegin() )\n {\n"); } else { func.write(" if ( sm.constructedBegin("+tag_class+", "+tag_number+") )\n {\n"); func.write(" sm.sequenceBegin();\n"); } } func.write("\n if ( sm.getDirection() == SerializationManager.DIRECTION_DECODE )\n {\n"); func.write(" retval = new "+this.type_class_name+"();\n"); func.write(" }\n\n"); // Skip through members, calling appropriate m's for ( Enumeration e = cons_members.elements(); e.hasMoreElements(); ) { TaggedMember t = (TaggedMember)e.nextElement(); TypeInfo ti = parent.lookup(null,t.getTypeReference(),true); if ( null != ti ) { String codec_to_use = "i_"+ti.getCodecClassName().toLowerCase(); if ( t.getTagClass() == -1 ) { func.write(" retval."+t.getMemberName()+" = ("+ti.getInternalType()+")"+codec_to_use+".serialize(sm, retval."+t.getMemberName()+","+t.isOptional()+", \""+t.getMemberName()+"\");\n"); } else { if ( t.isImplicit() ) { func.write(" retval."+t.getMemberName()+" = ("+ti.getInternalType()+")sm.implicit_tag("+codec_to_use+", retval."+t.getMemberName()+", "+ t.getTagClass() +", "+t.getTagNumber()+", "+t.isOptional()+", \""+t.getMemberName()+"\");\n"); } else { func.write(" retval."+t.getMemberName()+" = ("+ti.getInternalType()+")sm.explicit_tag("+codec_to_use+", retval."+t.getMemberName()+", "+ t.getTagClass() +", "+t.getTagNumber()+", "+t.isOptional()+", \""+t.getMemberName()+"\");\n"); } } } } if ( tag_class == -1 ) { func.write(" sm.sequenceEnd();\n }\n\n"); } else { if ( is_implicit ) { func.write(" sm.sequenceEnd();\n }\n\n"); } else { func.write(" sm.constructedEnd();\n"); func.write(" sm.sequenceEnd();\n }\n\n"); } } func.write(" return retval;\n"); func.write(" }\n"); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?