⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asmcontenthandler.java

📁 jboss规则引擎
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
            if ( this.rules.containsKey( path ) ) {
                return this.rules.get( path );
            }

            final int n = path.lastIndexOf( '/' );
            for ( final Iterator it = this.lpatterns.iterator(); it.hasNext(); ) {
                final String pattern = (String) it.next();
                if ( path.substring( n ).endsWith( pattern ) ) {
                    return this.rules.get( pattern );
                }
            }

            for ( final Iterator it = this.rpatterns.iterator(); it.hasNext(); ) {
                final String pattern = (String) it.next();
                if ( path.startsWith( pattern ) ) {
                    return this.rules.get( pattern );
                }
            }

            return null;
        }

    }

    /**
     * Rule
     */
    protected abstract class Rule {

        public void begin(final String name,
                          final Attributes attrs) {
        }

        public void end(final String name) {
        }

        protected final Object getValue(final String desc,
                                        final String val) {
            Object value = null;
            if ( val != null ) {
                if ( desc.equals( "Ljava/lang/String;" ) ) {
                    value = decode( val );
                } else if ( "Ljava/lang/Integer;".equals( desc ) || "I".equals( desc ) || "S".equals( desc ) || "B".equals( desc ) || "C".equals( desc ) || desc.equals( "Z" ) ) {
                    value = new Integer( val );

                } else if ( "Ljava/lang/Short;".equals( desc ) ) {
                    value = new Short( val );

                } else if ( "Ljava/lang/Byte;".equals( desc ) ) {
                    value = new Byte( val );

                } else if ( "Ljava/lang/Character;".equals( desc ) ) {
                    value = new Character( decode( val ).charAt( 0 ) );

                } else if ( "Ljava/lang/Boolean;".equals( desc ) ) {
                    value = Boolean.valueOf( val );

                    // } else if ("Ljava/lang/Integer;".equals(desc)
                    // || desc.equals("I"))
                    // {
                    // value = new Integer(val);
                    // } else if ("Ljava/lang/Character;".equals(desc)
                    // || desc.equals("C"))
                    // {
                    // value = new Character(decode(val).charAt(0));
                    // } else if ("Ljava/lang/Short;".equals(desc) ||
                    // desc.equals("S"))
                    // {
                    // value = Short.valueOf(val);
                    // } else if ("Ljava/lang/Byte;".equals(desc) ||
                    // desc.equals("B"))
                    // {
                    // value = Byte.valueOf(val);

                } else if ( "Ljava/lang/Long;".equals( desc ) || desc.equals( "J" ) ) {
                    value = new Long( val );
                } else if ( "Ljava/lang/Float;".equals( desc ) || desc.equals( "F" ) ) {
                    value = new Float( val );
                } else if ( "Ljava/lang/Double;".equals( desc ) || desc.equals( "D" ) ) {
                    value = new Double( val );
                } else if ( Type.getDescriptor( Type.class ).equals( desc ) ) {
                    value = Type.getType( val );

                    // } else if ("[I".equals(desc)) {
                    // value = new int[0]; // TODO
                    // } else if ("[C".equals(desc)) {
                    // value = new char[0]; // TODO
                    // } else if ("[Z".equals(desc)) {
                    // value = new boolean[0]; // TODO
                    // } else if ("[S".equals(desc)) {
                    // value = new short[0]; // TODO
                    // } else if ("[B".equals(desc)) {
                    // value = new byte[0]; // TODO
                    // } else if ("[J".equals(desc)) {
                    // value = new long[0]; // TODO
                    // } else if ("[F".equals(desc)) {
                    // value = new float[0]; // TODO
                    // } else if ("[D".equals(desc)) {
                    // value = new double[0]; // TODO

                } else {
                    throw new RuntimeException( "Invalid value:" + val + " desc:" + desc + " ctx:" + this );
                }
            }
            return value;
        }

        private final String decode(final String val) {
            final StringBuffer sb = new StringBuffer( val.length() );
            try {
                int n = 0;
                while ( n < val.length() ) {
                    char c = val.charAt( n );
                    if ( c == '\\' ) {
                        n++;
                        c = val.charAt( n );
                        if ( c == '\\' ) {
                            sb.append( '\\' );
                        } else {
                            n++; // skip 'u'
                            sb.append( (char) Integer.parseInt( val.substring( n,
                                                                               n + 4 ),
                                                                16 ) );
                            n += 3;
                        }
                    } else {
                        sb.append( c );
                    }
                    n++;
                }

            } catch ( final RuntimeException ex ) {
                System.err.println( val + "\n" + ex.toString() );
                ex.printStackTrace();
                throw ex;
            }
            return sb.toString();
        }

        protected final Label getLabel(final Object label) {
            Label lbl = (Label) ASMContentHandler.this.labels.get( label );
            if ( lbl == null ) {
                lbl = new Label();
                ASMContentHandler.this.labels.put( label,
                                                   lbl );
            }
            return lbl;
        }

        // TODO verify move to stack
        protected final MethodVisitor getCodeVisitor() {
            return (MethodVisitor) peek();
        }

        protected final int getAccess(final String s) {
            int access = 0;
            if ( s.indexOf( "public" ) != -1 ) {
                access |= Opcodes.ACC_PUBLIC;
            }
            if ( s.indexOf( "private" ) != -1 ) {
                access |= Opcodes.ACC_PRIVATE;
            }
            if ( s.indexOf( "protected" ) != -1 ) {
                access |= Opcodes.ACC_PROTECTED;
            }
            if ( s.indexOf( "static" ) != -1 ) {
                access |= Opcodes.ACC_STATIC;
            }
            if ( s.indexOf( "final" ) != -1 ) {
                access |= Opcodes.ACC_FINAL;
            }
            if ( s.indexOf( "super" ) != -1 ) {
                access |= Opcodes.ACC_SUPER;
            }
            if ( s.indexOf( "synchronized" ) != -1 ) {
                access |= Opcodes.ACC_SYNCHRONIZED;
            }
            if ( s.indexOf( "volatile" ) != -1 ) {
                access |= Opcodes.ACC_VOLATILE;
            }
            if ( s.indexOf( "bridge" ) != -1 ) {
                access |= Opcodes.ACC_BRIDGE;
            }
            if ( s.indexOf( "varargs" ) != -1 ) {
                access |= Opcodes.ACC_VARARGS;
            }
            if ( s.indexOf( "transient" ) != -1 ) {
                access |= Opcodes.ACC_TRANSIENT;
            }
            if ( s.indexOf( "native" ) != -1 ) {
                access |= Opcodes.ACC_NATIVE;
            }
            if ( s.indexOf( "interface" ) != -1 ) {
                access |= Opcodes.ACC_INTERFACE;
            }
            if ( s.indexOf( "abstract" ) != -1 ) {
                access |= Opcodes.ACC_ABSTRACT;
            }
            if ( s.indexOf( "strict" ) != -1 ) {
                access |= Opcodes.ACC_STRICT;
            }
            if ( s.indexOf( "synthetic" ) != -1 ) {
                access |= Opcodes.ACC_SYNTHETIC;
            }
            if ( s.indexOf( "annotation" ) != -1 ) {
                access |= Opcodes.ACC_ANNOTATION;
            }
            if ( s.indexOf( "enum" ) != -1 ) {
                access |= Opcodes.ACC_ENUM;
            }
            if ( s.indexOf( "deprecated" ) != -1 ) {
                access |= Opcodes.ACC_DEPRECATED;
            }
            return access;
        }

    }

    /**
     * ClassRule
     */
    private final class ClassRule extends Rule {

        public final void begin(final String name,
                                final Attributes attrs) {
            final int major = Integer.parseInt( attrs.getValue( "major" ) );
            final int minor = Integer.parseInt( attrs.getValue( "minor" ) );
            ASMContentHandler.this.cw = new ClassWriter( ASMContentHandler.this.computeMax );
            final Map vals = new HashMap();
            vals.put( "version",
                      new Integer( minor << 16 | major ) );
            vals.put( "access",
                      attrs.getValue( "access" ) );
            vals.put( "name",
                      attrs.getValue( "name" ) );
            vals.put( "parent",
                      attrs.getValue( "parent" ) );
            vals.put( "source",
                      attrs.getValue( "source" ) );
            vals.put( "signature",
                      attrs.getValue( "signature" ) );
            vals.put( "interfaces",
                      new ArrayList() );
            push( vals );
            // values will be extracted in InterfacesRule.end();
        }

    }

    private final class SourceRule extends Rule {

        public void begin(final String name,
                          final Attributes attrs) {
            final String file = attrs.getValue( "file" );
            final String debug = attrs.getValue( "debug" );
            ASMContentHandler.this.cw.visitSource( file,
                                                   debug );
        }

    }

    /**
     * InterfaceRule
     */
    private final class InterfaceRule extends Rule {

        public final void begin(final String name,
                                final Attributes attrs) {
            ((List) ((Map) peek()).get( "interfaces" )).add( attrs.getValue( "name" ) );
        }

    }

    /**
     * InterfacesRule
     */
    private final class InterfacesRule extends Rule {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -