001    /*******************************************************************************
002     * Copyright (c) 2009 Progress Software, Inc.
003     * Copyright (c) 2004, 2008 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.io.*;
014    import java.util.*;
015    
016    import org.fusesource.hawtjni.generator.model.JNIClass;
017    import org.fusesource.hawtjni.generator.model.JNIMethod;
018    
019    /**
020     * 
021     * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
022     */
023    public abstract class CleanupClass extends JNIGenerator {
024    
025        String classSourcePath;
026        String[] sourcePath;
027        String classSource;
028        HashMap<File, String> files;
029    
030        int usedCount, unusedCount;
031    
032        String[] getArgNames(JNIMethod method) {
033            int n_args = method.getParameters().size();
034            if (n_args == 0)
035                return new String[0];
036            String name = method.getName();
037            String params = "";
038            int index = 0;
039            while (true) {
040                index = classSource.indexOf(name, index + 1);
041                if (!Character.isWhitespace(classSource.charAt(index - 1)))
042                    continue;
043                if (index == -1)
044                    return null;
045                int parantesesStart = classSource.indexOf("(", index);
046                if (classSource.substring(index + name.length(), parantesesStart).trim().length() == 0) {
047                    int parantesesEnd = classSource.indexOf(")", parantesesStart);
048                    params = classSource.substring(parantesesStart + 1, parantesesEnd);
049                    break;
050                }
051            }
052            String[] names = new String[n_args];
053            StringTokenizer tk = new StringTokenizer(params, ",");
054            for (int i = 0; i < names.length; i++) {
055                String s = tk.nextToken().trim();
056                StringTokenizer tk1 = new StringTokenizer(s, " ");
057                String s1 = null;
058                while (tk1.hasMoreTokens()) {
059                    s1 = tk1.nextToken();
060                }
061                names[i] = s1.trim();
062            }
063            return names;
064        }
065    
066        void loadClassSource() {
067            if (classSourcePath == null)
068                return;
069            File f = new File(classSourcePath);
070            classSource = loadFile(f);
071        }
072    
073        void loadFiles() {
074            // BAD - holds on to a lot of memory
075            if (sourcePath == null)
076                return;
077            files = new HashMap<File, String>();
078            for (int i = 0; i < sourcePath.length; i++) {
079                File file = new File(sourcePath[i]);
080                if (file.exists()) {
081                    if (!file.isDirectory()) {
082                        if (file.getAbsolutePath().endsWith(".java")) {
083                            files.put(file, loadFile(file));
084                        }
085                    } else {
086                        loadDirectory(file);
087                    }
088                }
089            }
090        }
091    
092        String loadFile(File file) {
093            try {
094                FileReader fr = new FileReader(file);
095                BufferedReader br = new BufferedReader(fr);
096                StringBuffer str = new StringBuffer();
097                char[] buffer = new char[1024];
098                int read;
099                while ((read = br.read(buffer)) != -1) {
100                    str.append(buffer, 0, read);
101                }
102                fr.close();
103                return str.toString();
104            } catch (IOException e) {
105                e.printStackTrace(System.out);
106            }
107            return "";
108        }
109    
110        void loadDirectory(File file) {
111            String[] entries = file.list();
112            for (int i = 0; i < entries.length; i++) {
113                String entry = entries[i];
114                File f = new File(file, entry);
115                if (!f.isDirectory()) {
116                    if (f.getAbsolutePath().endsWith(".java")) {
117                        files.put(f, loadFile(f));
118                    }
119                } else {
120                    loadDirectory(f);
121                }
122            }
123        }
124    
125        public void generate(JNIClass clazz) {
126            loadFiles();
127            loadClassSource();
128        }
129    
130        public void setSourcePath(String[] sourcePath) {
131            this.sourcePath = sourcePath;
132            files = null;
133        }
134    
135        public void setClassSourcePath(String classSourcePath) {
136            this.classSourcePath = classSourcePath;
137        }
138    
139    }