diff options
author | Silenio Quarti | 2008-09-10 04:07:54 +0000 |
---|---|---|
committer | Silenio Quarti | 2008-09-10 04:07:54 +0000 |
commit | fea9885d21cfa943b8cc86766a8a26b8fc9e04f5 (patch) | |
tree | d8159a6cf5a6510b85c0d27d13173286aaaea125 /bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java | |
parent | 06597172893a01ed09cb4ee2c1ec2e5765770b5f (diff) | |
download | eclipse.platform.swt-fea9885d21cfa943b8cc86766a8a26b8fc9e04f5.tar.gz eclipse.platform.swt-fea9885d21cfa943b8cc86766a8a26b8fc9e04f5.tar.xz eclipse.platform.swt-fea9885d21cfa943b8cc86766a8a26b8fc9e04f5.zip |
*** empty log message ***
Diffstat (limited to 'bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java')
-rw-r--r-- | bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java new file mode 100644 index 0000000000..938b66a8fb --- /dev/null +++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java @@ -0,0 +1,148 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.tools.internal; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Modifier; +import java.util.Collections; +import java.util.Iterator; +import java.util.Set; +import java.util.TreeMap; +import java.util.ArrayList; + +public class EmbedMetaData extends JNIGenerator { + TreeMap inserts; + +public void generate(JNIClass clazz) { + inserts = new TreeMap(); + String data = ((AbstractItem)clazz).flatten(); + if (data != null && data.length() != 0) { + String doc = "/** @jniclass " + data + " */" + delimiter; + inserts.put(new Integer(((ASTClass)clazz).start), doc); + } + JNIField[] fields = clazz.getDeclaredFields(); + generate(fields); + JNIMethod[] methods = clazz.getDeclaredMethods(); + generate(methods); + if (inserts.size() == 0) return; + String sourcePath = ((ASTClass)clazz).sourcePath; + String source = JNIGenerator.loadFile(sourcePath); + Set set = inserts.keySet(); + ArrayList keys = new ArrayList(); + keys.addAll(set); + Collections.reverse(keys); + StringBuffer buffer = new StringBuffer(source); + for (Iterator iterator = keys.iterator(); iterator.hasNext();) { + Integer index = (Integer) iterator.next(); + String doc = (String)inserts.get(index); + buffer.insert(index.intValue(), doc); + } + try { + output(buffer.toString().getBytes(), sourcePath); + } catch (Exception e) { + e.printStackTrace(); + } + inserts = null; +} + +boolean compare(InputStream is1, InputStream is2) throws IOException { + while (true) { + int c1 = is1.read(); + int c2 = is2.read(); + if (c1 != c2) return false; + if (c1 == -1) break; + } + return true; +} + +void output(byte[] bytes, String fileName) throws IOException { + FileInputStream is = null; + try { + is = new FileInputStream(fileName); + if (compare(new ByteArrayInputStream(bytes), new BufferedInputStream(is))) return; + } catch (FileNotFoundException e) { + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) {} + } + FileOutputStream out = new FileOutputStream(fileName); + out.write(bytes); + out.close(); +} + +public void generate(JNIField[] fields) { + for (int i = 0; i < fields.length; i++) { + JNIField field = fields[i]; + int mods = field.getModifiers(); + if ((mods & Modifier.PUBLIC) == 0) continue; + if ((mods & Modifier.FINAL) != 0) continue; + if ((mods & Modifier.STATIC) != 0) continue; + generate(field); + } +} + +public void generate(JNIField field) { + String data = ((AbstractItem)field).flatten(); + if (data != null && data.length() != 0) { + String doc = "/** @field " + data + " */" + delimiter + "\t"; + inserts.put(new Integer(((ASTField)field).start), doc); + } +} + +public void generate(JNIMethod[] methods) { + for (int i = 0; i < methods.length; i++) { + JNIMethod method = methods[i]; + if ((method.getModifiers() & Modifier.NATIVE) == 0) continue; + generate(method); + } +} + +public void generate(JNIMethod method) { + ArrayList tags = new ArrayList(); + String data = ((AbstractItem)method).flatten(); + if (data != null && data.length() != 0) { + tags.add("@method " + data); + } + JNIParameter[] params = method.getParameters(); + for (int i = 0; i < params.length; i++) { + ASTParameter param = (ASTParameter)params[i]; + data = ((AbstractItem)param).flatten(); + if (data != null && data.length() != 0) { + tags.add("@param " + param.getName() + " " + data); + } + } + if (tags.size() == 0) return; + if (tags.size() == 1) { + String doc = "/** " + (String)tags.get(0) + " */" + delimiter; + inserts.put(new Integer(((ASTMethod)method).start), doc); + } else { + StringBuffer buffer = new StringBuffer(); + buffer.append("/**"); + buffer.append(delimiter); + for (Iterator iterator = tags.iterator(); iterator.hasNext();) { + String tag = (String) iterator.next(); + buffer.append(" * "); + buffer.append(tag); + buffer.append(delimiter); + } + buffer.append(" */"); + buffer.append(delimiter); + inserts.put(new Integer(((ASTMethod)method).start), buffer.toString()); + } +} +} |