Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti2008-09-10 04:07:54 +0000
committerSilenio Quarti2008-09-10 04:07:54 +0000
commitfea9885d21cfa943b8cc86766a8a26b8fc9e04f5 (patch)
treed8159a6cf5a6510b85c0d27d13173286aaaea125 /bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/EmbedMetaData.java
parent06597172893a01ed09cb4ee2c1ec2e5765770b5f (diff)
downloadeclipse.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.java148
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());
+ }
+}
+}

Back to the top