Skip to content

Issue #139 #140

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Apr 24, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@ target
*~
.idea
/bin/
*.iml
.classpath
rm_ide_settings.sh
32 changes: 0 additions & 32 deletions demos/po/.classpath

This file was deleted.

23 changes: 0 additions & 23 deletions demos/po/.project

This file was deleted.

10 changes: 0 additions & 10 deletions demos/wms/.classpath

This file was deleted.

23 changes: 0 additions & 23 deletions demos/wms/.project

This file was deleted.

13 changes: 0 additions & 13 deletions formats/gml-geojson/.classpath

This file was deleted.

23 changes: 0 additions & 23 deletions formats/gml-geojson/.project

This file was deleted.

1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
<modules>
<module>scripts</module>
<module>nodejs</module>
<module>typescript</module>
</modules>
<profiles>
<profile>
Expand Down
46 changes: 0 additions & 46 deletions scripts/.classpath

This file was deleted.

23 changes: 0 additions & 23 deletions scripts/.project

This file was deleted.

46 changes: 46 additions & 0 deletions typescript/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>jsonix-typescript</artifactId>
<packaging>jar</packaging>
<name>Jsonix Typescript</name>
<parent>
<groupId>org.hisrc.jsonix</groupId>
<artifactId>jsonix-project</artifactId>
<version>2.4.2-SNAPSHOT</version>
</parent>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/typescript</directory>
</resource>
<resource>
<directory>src/main/java</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/java</directory>
</testResource>
<testResource>
<directory>src/test/resources</directory>
</testResource>
<testResource>
<directory>src/test/typescript</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
24 changes: 24 additions & 0 deletions typescript/readme_de.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Tests gibt es noch nicht, ich denke mein Ansatz dient erst mal der Orientierung und Diskussion. Wenn es alles so weit OK ist, können wir bestehende Tests auf TS umstellen.

Die Definitiondatei war ürsprünglich nicht systematisch erstellt, sondern hat sich aus den Anforderungen ergeben, die ich ad hoc beim Verwenden von Jsonix ergeben haben. Dazu hatte ich mir ursprünglich den Context rekursiv (begrenzt auf eine gewisse Tiefe) als JSON.stringify ausgeben lassen und dann bearbeitet, was natürlich nicht so gut die Class-Hierarchie trifft.

Da ich kein professionelles UML-Tool besitze (und schon gar keins, was TS erzeugt, falls es so etwas überhaupt gibt (StarUML und TS-Plugin bekomme ich nicht zum laufen)), bin ich auf Java ausgewichen.
Die Klassen, die in Java erzeugt werden "ähneln" den Design-Pattern von TS, so dass man Ende mit ein paar regulären Ausrücken, den Code umwandeln kann (zu den Interfaces komme ich später. Man könnte das natürlich auch via xmi lösen, das fände ich zum gegenwärtigen Zeitpunkt aber etwas übertrieben.

Die Klassenhierarchie aus

https://github.com/duschata/jsonix/blob/issue_%23139/typescript/src/main/resources/diagram.svg

war dann Grundlage meines Mappings auf die d.ts (ist mit intelliJ erzeugt).

Die Erzeugung der d.ts ging so weit ganz gut von der Hand, allerdings sehe ich im Diagram noch eine Reihe von nicht zugeordneten Klassen, da müsstest du mir vielleicht noch mal ein paar Beziehungen einzeichnen. Es sind in der d.ts noch nicht alle Typen zu Literalen terminiert, einige Definitionen enden daher noch mit Object, {} oder any, das Ganze ist also noch in progess...

Soweit die d.ts, bei einer vollständigen Migration zu TS sehe ich aber vor allen Dingen folgende Probleme:
Du benutzt in vielen Klassen mehrfach- bzw. prototypische-Vererbung. Das kann man in der d.ts gut über Interfaces abbilden (wie ich es auch gemacht habe), TS selbst unterstützt aber keine Mehrfachvererbung, so dass man an den Stellen in denen Mehrfachvererbung ein Rolle spielt auf das Strategy-Pattern (oder Delegation) ausweichen könnte.
In der Java Uml habe ich einfach Interfaces benutzt, was nicht ganz korrekt ist, aber ja nur der Übersicht dienen soll.

In TS und plain-JS, was d.ts benutzt gibt es keinen wirklich funktionierende instanceof Implementierung. Das generierte JS weiß quasi nichts von den Klassen, die in TS definiert sind. Der Code "weiß", wenn er eine TypeInfo verarbeitet nicht, ob es nicht vielleicht eine ClassInfo ist. Jsonix benutzt hier in jeder Klasse ein CLASS_NAME Feld, das konnte ich in die Interfaces nicht aufnehmen, da sie keinen Initializer besitzten dürfen (das Problem sollte aber erledigt sein, wenn man Klassen definiert, die ein CLASS_NAME Feld besitzen können).

Ich hätte gerne Generics eingebaut, leider geht das wegen der gekapselten factory nicht. Hier könnte man eine Funktion in Jsonix ergänzen, dann sollte es gehen:

createUnmarshaller<T>(type: T): Unmarshaller<T>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.hisrc.jsonix.Binding.Mashalls;

public interface Element
{
Object elementInfo = null;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.hisrc.jsonix.Binding.Unmashalls;

public interface Element
{
Object elementInfo = null;
}
6 changes: 6 additions & 0 deletions typescript/src/main/java/org/hisrc/jsonix/Mapping/Styled.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.hisrc.jsonix.Mapping;

public interface Styled
{
Object mappingSyle = null;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.hisrc.jsonix.Model;


public class AbstractElementRefsPropertyInfo extends PropertyInfo implements org.hisrc.jsonix.Binding.Mashalls.Element, org.hisrc.jsonix.Binding.Unmashalls.Element{
Object wrapperElementName = null;
boolean allowDom = true;
boolean allowTypedObject = true;
boolean mixed = true;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.hisrc.jsonix.Model;

import org.hisrc.jsonix.Schema.XML.QName;

public class AbstractElementsPropertyInfo extends PropertyInfo implements org.hisrc.jsonix.Binding.Mashalls.Element, org.hisrc.jsonix.Binding.Unmashalls.Element{
QName wrapperElementName = null;
boolean allowDom = false;
boolean allowTypedObject = true;
boolean mixed = false;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.hisrc.jsonix.Model;

public class AnyAttributePropertyInfo extends PropertyInfo {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.hisrc.jsonix.Model;

/**
* Created by tgrabietz on 15.04.16.
*/
public class AnyElementPropertyInfo extends PropertyInfo implements org.hisrc.jsonix.Binding.Mashalls.Element, org.hisrc.jsonix.Binding.Unmashalls.Element{
boolean allowDom = true;
boolean allowTypedObject = true;
boolean mixed = true;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.hisrc.jsonix.Model;

public class AttributePropertyInfo extends SingleTypePropertyInfo {
Object attributeName = null;

}
33 changes: 33 additions & 0 deletions typescript/src/main/java/org/hisrc/jsonix/Model/ClassInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.hisrc.jsonix.Model;

import com.sun.org.apache.xml.internal.utils.Hashtree2Node;

import org.hisrc.jsonix.Mapping.Styled;
import org.hisrc.jsonix.Schema.XML.QName;

import java.util.HashMap;
import java.util.Properties;

public class ClassInfo extends TypeInfo implements Styled {
class Structure {
HashMap<String, ElementPropertyInfo> elements = null;
Object attributes = null;
Object anyAttribute = null;
Object value = null;
Object any = null;
}

String name = null;
String localName = null;
QName typeName = null;
Object instanceFactory = null;
ElementPropertyInfo[] properties = null;
HashMap<String, ElementPropertyInfo> propertiesMap = null;
Structure structure = null;
String targetNamespace = "";
String defaultElementNamespaceURI = "";
String defaultAttributeNamespaceURI = "";
boolean built = false;
Object propertyInfoCreators = null;

}
Loading