mappingdefinition.java
来自「JiBX是一个为Java提供的XML数据绑定框架。它可以和现存的类一起运行」· Java 代码 · 共 811 行 · 第 1/3 页
JAVA
811 行
// just create an instance of the (non-abstract) mapped class genNewInstance(mb); mb.storeObject(); } // define unmarshallings for child mappings of this mapping mb.targetNext(ifnnull); ArrayList maps = m_defContext.getMappings(); if (maps != null && maps.size() > 0) { for (int i = 0; i < maps.size(); i++) { IMapping map = (IMapping)maps.get(i); if (!map.isAbstract() || map.isBase()) { mb.loadContext(UNMARSHALCONTEXT_CLASS); mb.appendLoadConstant(map.getIndex()); NameDefinition mname = map.getName(); if (mname == null) { mb.appendACONST_NULL(); mb.appendACONST_NULL(); } else { map.getName().genPushUriPair(mb); } mb.appendLoadConstant(map.getUnmarshaller().getName()); mb.appendCallVirtual(ADDUNMARSHALLER_METHOD, ADDUNMARSHALLER_SIGNATURE); } } } // load object and cast to type mb.loadObject(); mb.appendCreateCast(type); // handle the actual unmarshalling if (hasattr) { m_component.genAttributeUnmarshal(mb); } if (hascont) { m_component.genContentUnmarshal(mb); } // undefine unmarshallings for child mappings of this mapping if (maps != null && maps.size() > 0) { for (int i = 0; i < maps.size(); i++) { IMapping map = (IMapping)maps.get(i); if (!map.isAbstract() || map.isBase()) { mb.loadContext(UNMARSHALCONTEXT_CLASS); mb.appendLoadConstant(map.getIndex()); mb.appendCallVirtual(REMOVEUNMARSHALLER_METHOD, REMOVEUNMARSHALLER_SIGNATURE); } } } // finish by returning unmarshalled object reference mb.appendReturn("java.lang.Object"); mb.codeComplete(false); mb.addMethod(); // add interface if mapped class is directly unmarshallable if (hasname && m_class.getClassFile() == m_class.getMungedFile()) { addIUnmarshallableMethod(); } } // add marshaller access method if (def.isOutput()) { // build the marshal implementation method; this loads the // passed object and casts it to the target type, then handles // marshalling first attributes and followed by content for the // item ContextMethodBuilder mb = new ContextMethodBuilder (MARSHAL_METHODNAME, Type.VOID, MARSHAL_METHOD_ARGS, cf, Constants.ACC_PUBLIC|Constants.ACC_FINAL, 1, "java.lang.Object", 2, MARSHALCONTEXT_INTERFACE); mb.addException(MethodBuilder.FRAMEWORK_EXCEPTION_CLASS); // TODO: optionally check for null value on object // define marshallings for child mappings of this mapping ArrayList maps = m_defContext.getMappings(); if (maps != null && maps.size() > 0) { for (int i = 0; i < maps.size(); i++) { IMapping map = (IMapping)maps.get(i); if (!map.isAbstract() || map.isBase()) { mb.loadContext(MARSHALCONTEXT_CLASS); mb.appendLoadConstant(map.getIndex()); mb.appendLoadConstant(map.getMarshaller().getName()); mb.appendCallVirtual(ADDMARSHALLER_METHOD, ADDMARSHALLER_SIGNATURE); } } } // handle the actual marshalling if (hasattr || hascont) { mb.loadObject(m_class.getClassName()); if (hasattr) { if (hascont) { mb.appendDUP(); } m_component.genAttributeMarshal(mb); } if (hascont) { m_component.genContentMarshal(mb); } } // undefine marshallings for child mappings of this mapping if (maps != null && maps.size() > 0) { for (int i = 0; i < maps.size(); i++) { IMapping map = (IMapping)maps.get(i); if (!map.isAbstract() || map.isBase()) { mb.loadContext(MARSHALCONTEXT_CLASS); mb.appendLoadConstant(map.getIndex()); mb.appendCallVirtual(REMOVEMARSHALLER_METHOD, REMOVEMARSHALLER_SIGNATURE); } } } // finish with plain return mb.appendReturn(); mb.codeComplete(false); mb.addMethod(); // build method to check if extending a particular abstract // mapping ExceptionMethodBuilder xb = new ExceptionMethodBuilder (CHECKEXTENDS_METHODNAME, CHECKEXTENDS_SIGNATURE, cf, Constants.ACC_PUBLIC|Constants.ACC_FINAL); xb.appendLoadLocal(1); xb.appendLoadConstant(getIndex()); xb.appendISUB(); BranchWrapper ifident = xb.appendIFEQ(this); if (m_baseMapping != null) { xb.appendLoadLocal(1); xb.appendLoadConstant(m_baseMapping.getIndex()); xb.appendISUB(); BranchWrapper iftrue = xb.appendIFEQ(this); xb.appendICONST_0(); xb.appendReturn("int"); xb.targetNext(iftrue); } xb.targetNext(ifident); xb.appendICONST_1(); xb.appendReturn("int"); xb.codeComplete(false); xb.addMethod(); // add interface if mapped class is directly marshallable if (hasname && m_class.getClassFile() == m_class.getMungedFile()) { addIMarshallableMethod(); } // check for mapping with extensions to add extra method and // interface if (m_extensions != null) { // for an abstract mapping, add base marshal implementation // that just passes handling on to the appropriate // extension class, and add corresponding interface to // class. mb = new ContextMethodBuilder(BASEMARSHAL_METHODNAME, Type.VOID, MARSHAL_METHOD_ARGS, cf, Constants.ACC_PUBLIC|Constants.ACC_FINAL, 1, "java.lang.Object", 2, MARSHALCONTEXT_INTERFACE); mb.addException(MethodBuilder.FRAMEWORK_EXCEPTION_CLASS); // TODO: optionally check for null value on object mb.loadContext(); mb.loadObject(IMARSHALLABLE_INTERFACE); mb.appendCallInterface(GETINDEX_METHOD, GETINDEX_SIGNATURE); mb.loadObject(); mb.appendCallVirtual("java.lang.Object.getClass", "()Ljava/lang/Class;"); mb.appendCallVirtual("java.lang.Class.getName", "()Ljava/lang/String;"); mb.appendCallInterface(GETMARSHALLER_METHOD, GETMARSHALLER_SIGNATURE); mb.appendDUP(); mb.appendLoadConstant(getIndex()); mb.appendCallInterface(CHECKEXTENDS_METHOD, CHECKEXTENDS_SIGNATURE); BranchWrapper ifvalid = mb.appendIFNE(this); // generate and throw exception describing the problem mb.appendCreateNew("java.lang.StringBuffer"); mb.appendDUP(); mb.appendLoadConstant("Mapping for type "); mb.appendCallInit("java.lang.StringBuffer", "(Ljava/lang/String;)V"); mb.appendDUP(); mb.loadObject(); mb.appendCallVirtual("java.lang.Object.getClass", "()Ljava/lang/Class;"); mb.appendCallVirtual("java.lang.Class.getName", "()Ljava/lang/String;"); mb.appendCallVirtual("java.lang.StringBuffer.append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;"); mb.appendDUP(); mb.appendLoadConstant(" must extend abstract mapping for " + "type " + m_class.getClassName()); mb.appendCallVirtual("java.lang.StringBuffer.append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;"); mb.appendCallVirtual("java.lang.StringBuffer.toString", "()Ljava/lang/String;"); mb.appendCreateNew(MethodBuilder.FRAMEWORK_EXCEPTION_CLASS); mb.appendDUP_X1(); mb.appendSWAP(); mb.appendCallInit(MethodBuilder.FRAMEWORK_EXCEPTION_CLASS, MethodBuilder.EXCEPTION_CONSTRUCTOR_SIGNATURE1); mb.appendThrow(); // for valid extension mapping, just call the marshaller mb.targetNext(ifvalid); mb.loadObject(); mb.loadContext(); mb.appendCallInterface(MARSHALLERMARSHAL_METHOD, MARSHALLERMARSHAL_SIGNATURE); mb.appendReturn(); mb.codeComplete(false); mb.addMethod(); // add extended interface to constructed class cf.addInterface(ABSTRACTMARSHALLER_INTERFACE); } } // add as generated class m_marshaller = m_unmarshaller = MungedClass.getUniqueSupportClass(cf); } // // IComponent interface method definitions public NameDefinition getWrapperName() { return m_name; } public void setLinkages() throws JiBXException { m_component.setLinkages(); m_defContext.setLinkages(); } // DEBUG public void print(int depth) { BindingDefinition.indent(depth); System.out.print("mapping class " + m_class.getClassFile().getName()); if (m_name != null) { System.out.print(" to element " + m_name.toString()); } System.out.print(" (#" + getIndex() + ')'); if (m_baseMapping != null) { System.out.print(" extends " + m_baseMapping.getBoundType()); } if (m_isAbstract) { if (m_extensions != null) { System.out.print(" (abstract, " + m_extensions.size() + " extensions)"); } else { System.out.print(" (abstract)"); } } System.out.println(); m_defContext.print(depth+1); m_component.print(depth+1); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?