001    /*******************************************************************************
002     * Copyright (c) 2009 Progress Software, Inc.
003     * Copyright (c) 2004, 2007 IBM Corporation and others.
004     *
005     * All rights reserved. This program and the accompanying materials
006     * are made available under the terms of the Eclipse Public License v1.0
007     * which accompanies this distribution, and is available at
008     * http://www.eclipse.org/legal/epl-v10.html
009     *
010     *******************************************************************************/
011    package org.fusesource.hawtjni.generator;
012    
013    import java.util.*;
014    import java.io.File;
015    import java.lang.reflect.*;
016    
017    import org.fusesource.hawtjni.generator.model.JNIClass;
018    import org.fusesource.hawtjni.generator.model.JNIMethod;
019    import org.fusesource.hawtjni.generator.model.ReflectClass;
020    
021    /**
022     * 
023     * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
024     */
025    public class CleanupNatives extends CleanupClass {
026    
027        public CleanupNatives() {
028        }
029    
030        public void generate(JNIClass clazz) {
031            unusedCount = usedCount = 0;
032            super.generate(clazz);
033            List<JNIMethod> methods = clazz.getDeclaredMethods();
034            generate(methods);
035            output("used=" + usedCount + " unused=" + unusedCount + " total=" + (unusedCount + usedCount));
036        }
037    
038        public void generate(List<JNIMethod> methods) {
039            sortMethods(methods);
040            for (JNIMethod method : methods) {
041                if ((method.getModifiers() & Modifier.NATIVE) == 0)
042                    continue;
043                generate(method);
044            }
045        }
046    
047        public void generate(JNIMethod method) {
048            String name = method.getName();
049            Set<File> keys = files.keySet();
050            for (File key : keys) {
051                String str = (String) files.get(key);
052                if (str.indexOf(name) != -1) {
053                    // int modifiers = method.getModifiers();
054                    // Class clazz = method.getDeclaringClass();
055                    // String modifiersStr = Modifier.toString(modifiers);
056                    // output(modifiersStr);
057                    // if (modifiersStr.length() > 0) output(" ");
058                    // output(getTypeSignature3(method.getReturnType()));
059                    // output(" " );
060                    // output(method.getName());
061                    // output("(");
062                    // Class[] paramTypes = method.getParameterTypes();
063                    // String[] paramNames = getArgNames(method);
064                    // for (int i = 0; i < paramTypes.length; i++) {
065                    // Class paramType = paramTypes[i];
066                    // if (i != 0) output(", ");
067                    // String sig = getTypeSignature3(paramType);
068                    // if (clazz.getPackage().equals(paramType.getPackage())) sig =
069                    // getClassName(paramType);
070                    // output(sig);
071                    // output(" ");
072                    // output(paramNames[i]);
073                    // }
074                    // outputln(");");
075                    usedCount++;
076                    return;
077                }
078            }
079            unusedCount++;
080            output("NOT USED=" + method.toString() + "\n");
081        }
082    
083        public static void main(String[] args) {
084            if (args.length < 2) {
085                System.out.println("Usage: java CleanupNatives <OS className> <OS class source> <src path0> <src path1>");
086                return;
087            }
088            try {
089                CleanupNatives gen = new CleanupNatives();
090                String clazzName = args[0];
091                String classSource = args[1];
092                String[] sourcePath = new String[args.length - 2];
093                System.arraycopy(args, 2, sourcePath, 0, sourcePath.length);
094                Class<?> clazz = Class.forName(clazzName);
095                gen.setSourcePath(sourcePath);
096                gen.setClassSourcePath(classSource);
097                gen.generate(new ReflectClass(clazz));
098            } catch (Exception e) {
099                System.out.println("Problem");
100                e.printStackTrace(System.out);
101            }
102        }
103    
104    }