Skip to content

Commit

Permalink
Changes to the OMC-Java interface (Java code)
Browse files Browse the repository at this point in the history
- Added OMCStringParser.parse(File f) functions.
- Made parse functions for Record, Array, Tuple public.
- Fixed ComplexTypeDefinitions for generic types.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4794 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Jan 18, 2010
1 parent 08650f4 commit a484f68
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 20 deletions.
20 changes: 11 additions & 9 deletions c_runtime/java_interface/src/org/openmodelica/ModelicaAny.java
Expand Up @@ -3,17 +3,18 @@
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.Constructor;

import org.openmodelica.corba.parser.ParseException;

public class ModelicaAny {
@SuppressWarnings("unchecked")
public static <T extends ModelicaObject> T cast(ModelicaObject o, Class<T> c) throws Exception {
/* ModelicaObject -> ModelicaObject: Simple */
if (c == ModelicaObject.class) {
if (o.getClass() == c) {
return (T) o;
} else if (c == ModelicaObject.class) {
/* ModelicaObject -> ModelicaObject: Simple */
return c.cast(o);
/* ModelicaObject -> Interface extends ModelicaObject (must be Uniontype) */
} else if (c.isInterface()) {
/* ModelicaObject -> Interface extends ModelicaObject (must be Uniontype) */
if (!(o instanceof ModelicaRecord))
throw new Exception(o + " is not a record, but tried to cast it to Uniontype " + c);
/* Find the Java name of the record. We know the record will be part of the same package */
Expand Down Expand Up @@ -193,11 +194,12 @@ private static <T extends ModelicaObject> T parse(Reader r, Class<T> c) throws I
String id = lexIdent(r,false);
r.reset();
return parse(r,new SimpleTypeSpec<T>((Class<T>)findUniontypeRecordClass(c,id)));
}
try {
return (T) c.getMethod("parse", java.io.Reader.class).invoke(null, r);
} catch (Exception e) {
throw new ParseException(e);
} else {
try {
return (T) c.getMethod("parse", java.io.Reader.class).invoke(null, r);
} catch (Exception e) {
throw new ParseException(e);
}
}
}

Expand Down
Expand Up @@ -161,8 +161,12 @@ public void setObject(ModelicaObject o) {
this.isFlat = arr.isFlat;
}

@SuppressWarnings("unchecked")
static <T extends ModelicaObject> ModelicaArray<T> parse(Reader r, TypeSpec<T> spec) throws IOException, ParseException {
public static ModelicaArray<?> parse(Reader r) throws IOException, ParseException {
return parse(r,SimpleTypeSpec.modelicaObject);
}

@SuppressWarnings("unchecked")
public static <T extends ModelicaObject> ModelicaArray<T> parse(Reader r, TypeSpec<T> spec) throws IOException, ParseException {
ModelicaArray<T> arr = new ModelicaArray<T>();
ModelicaAny.skipWhiteSpace(r);
int i;
Expand Down
Expand Up @@ -319,11 +319,11 @@ private static boolean recordEnd(Reader r, String id) throws IOException, ParseE
throw new ParseException("Expected comma or end");
}

protected static ModelicaObject parse(Reader r) throws ParseException, IOException {
public static ModelicaRecord parse(Reader r) throws ParseException, IOException {
return parse(r,ModelicaRecord.class,null);
}

protected static <T extends ModelicaRecord> T parse(Reader r, Class<T> cl, TypeSpec<?>[] fieldTypeSpecs) throws ParseException, IOException {
public static <T extends ModelicaRecord> T parse(Reader r, Class<T> cl, TypeSpec<?>[] fieldTypeSpecs) throws ParseException, IOException {
String rec = ModelicaAny.lexIdent(r);
if (!rec.equals("record"))
throw new ParseException("Expected 'record' got " + rec);
Expand Down
Expand Up @@ -53,6 +53,10 @@ public void printToBuffer(StringBuffer buffer) {
buffer.append(")");
}

public static ModelicaTuple parse(Reader r) throws ParseException, IOException {
return parse(r,null);
}

public static ModelicaTuple parse(Reader r, TypeSpec<?>[] spec) throws ParseException, IOException {
ModelicaTuple tuple = new ModelicaTuple();
ModelicaAny.skipWhiteSpace(r);
Expand Down
Expand Up @@ -176,7 +176,7 @@ public String getTypeClass() {
public String getTypeSpec() {
switch (t) {
case GENERIC_TYPE:
return "__outClass";
return "new org.openmodelica.SimpleTypeSpec(ModelicaObject.class)";
case BUILT_IN:
case DEFINED_TYPE:
return "new org.openmodelica.SimpleTypeSpec("+typeName + ".class)";
Expand Down
@@ -1,8 +1,12 @@
package org.openmodelica.corba.parser;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.openmodelica.ModelicaAny;
Expand All @@ -19,27 +23,60 @@ public static <T extends ModelicaObject> T parse(String s, Class<T> c) throws Pa
return parse(s,new SimpleTypeSpec<T>(c));
}
public static <T extends ModelicaObject> T parse(String s, TypeSpec<T> spec) throws ParseException {
StringReader input = new StringReader(s);
Reader input = new StringReader(s);
try {
return parse(input,spec);
} catch (ParseException ex) {
char[] cbuf = new char[40];
String str;
try {
input.read(cbuf,0,40);
str = new String(cbuf);
File f = File.createTempFile("OMCStringParser", ".log");
FileWriter fw = new FileWriter(f);
fw.write(s);
fw.close();
throw new ParseException("Original string saved to file "+f+"\nNext characters in stream: " + str,ex);
} catch (IOException ex2) {
throw new ParseException(ex);
}
}
}

public static <T extends ModelicaObject> T parse(Reader input, TypeSpec<T> spec) throws ParseException {
try {
T o = ModelicaAny.parse(input,spec);
System.gc();
ModelicaAny.skipWhiteSpace(input);
if (input.read() != -1)
throw new ParseException("Expected EOF");
return o;
} catch (ClassCastException ex) {
throw new ParseException(ex);
} catch (IOException ex) {
throw new ParseException(ex);
}
}

public static ModelicaObject parse(File f) throws ParseException, FileNotFoundException {
return parse(f,SimpleTypeSpec.modelicaObject);
}

public static <T extends ModelicaObject> T parse(File f, Class<T> c) throws ParseException, FileNotFoundException {
return parse(f,new SimpleTypeSpec<T>(c));
}
public static <T extends ModelicaObject> T parse(File f, TypeSpec<T> spec) throws ParseException, FileNotFoundException {
Reader input;
input = new BufferedReader(new FileReader(f));
try {
return parse(input,spec);
} catch (ParseException ex) {
char[] cbuf = new char[40];
String str;
try {
input.read(cbuf,0,40);
str = new String(cbuf);
File f = File.createTempFile("OMCStringParser", ".log");
FileWriter fw = new FileWriter(f);
fw.write(s);
fw.close();
throw new ParseException("Original string saved to file "+f+"\nNext characters in stream: " + str,ex);
throw new ParseException("Original file: "+f+"\nNext characters in stream: " + str,ex);
} catch (IOException ex2) {
throw new ParseException(ex);
}
Expand Down

0 comments on commit a484f68

Please sign in to comment.