mappum 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/LICENSE +15 -0
- data/README +53 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/bin/mapserver.rb +4 -0
- data/java-api/pom.xml +63 -0
- data/java-api/src/main/java/pl/ivmx/mappum/JavaTransform.java +12 -0
- data/java-api/src/main/java/pl/ivmx/mappum/MappumApi.java +83 -0
- data/java-api/src/main/java/pl/ivmx/mappum/TreeElement.java +23 -0
- data/java-api/src/main/java/pl/ivmx/mappum/WorkdirLoader.java +12 -0
- data/java-api/src/test/java/iv/Client.java +237 -0
- data/java-api/src/test/java/iv/Person.java +261 -0
- data/java-api/src/test/java/pl/ivmx/mappum/MappumTest.java +122 -0
- data/java-api/src/test/resources/map/example_map.rb +88 -0
- data/lib/mappum.rb +46 -0
- data/lib/mappum/autoconv_catalogue.rb +43 -0
- data/lib/mappum/dsl.rb +255 -0
- data/lib/mappum/java_transform.rb +107 -0
- data/lib/mappum/map.rb +194 -0
- data/lib/mappum/mapserver/mapgraph.rb +192 -0
- data/lib/mappum/mapserver/mapserver.rb +213 -0
- data/lib/mappum/mapserver/maptable.rb +80 -0
- data/lib/mappum/mapserver/views/doc.erb +15 -0
- data/lib/mappum/mapserver/views/main.erb +39 -0
- data/lib/mappum/mapserver/views/maptable.erb +16 -0
- data/lib/mappum/mapserver/views/rubysource.erb +25 -0
- data/lib/mappum/mapserver/views/transform-ws.wsdl.erb +50 -0
- data/lib/mappum/mapserver/views/ws-error.erb +10 -0
- data/lib/mappum/open_xml_object.rb +68 -0
- data/lib/mappum/ruby_transform.rb +199 -0
- data/lib/mappum/xml_transform.rb +382 -0
- data/mappum.gemspec +117 -0
- data/sample/address_fixture.xml +11 -0
- data/sample/crm.rb +9 -0
- data/sample/crm_client.xsd +28 -0
- data/sample/erp.rb +7 -0
- data/sample/erp_person.xsd +44 -0
- data/sample/example_conversions.rb +12 -0
- data/sample/example_map.rb +92 -0
- data/sample/example_notypes.rb +77 -0
- data/sample/example_when.rb +13 -0
- data/sample/person_fixture.xml +23 -0
- data/sample/person_fixture_any.xml +26 -0
- data/sample/server/map/example_any.rb +28 -0
- data/sample/server/map/example_soap4r.rb +59 -0
- data/sample/server/mapserver.sh +1 -0
- data/sample/server/schema/crm_client.xsd +29 -0
- data/sample/server/schema/erp/erp_person.xsd +38 -0
- data/test/test_conversions.rb +24 -0
- data/test/test_example.rb +175 -0
- data/test/test_openstruct.rb +129 -0
- data/test/test_soap4r.rb +108 -0
- data/test/test_when.rb +35 -0
- data/test/test_xml_any.rb +62 -0
- metadata +164 -0
@@ -0,0 +1,261 @@
|
|
1
|
+
package iv;
|
2
|
+
|
3
|
+
import java.util.Date;
|
4
|
+
|
5
|
+
public class Person {
|
6
|
+
public static class Address {
|
7
|
+
private String street;
|
8
|
+
private String city;
|
9
|
+
/**
|
10
|
+
* @return the street
|
11
|
+
*/
|
12
|
+
public String getStreet() {
|
13
|
+
return street;
|
14
|
+
}
|
15
|
+
/**
|
16
|
+
* @param street the street to set
|
17
|
+
*/
|
18
|
+
public void setStreet(String street) {
|
19
|
+
this.street = street;
|
20
|
+
}
|
21
|
+
/**
|
22
|
+
* @return the city
|
23
|
+
*/
|
24
|
+
public String getCity() {
|
25
|
+
return city;
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* @param city the city to set
|
29
|
+
*/
|
30
|
+
public void setCity(String city) {
|
31
|
+
this.city = city;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
public static class Phone {
|
35
|
+
private String number;
|
36
|
+
private String extension;
|
37
|
+
private String type;
|
38
|
+
public Phone(){
|
39
|
+
}
|
40
|
+
public Phone(String number){
|
41
|
+
this.number = number;
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* @return the number
|
45
|
+
*/
|
46
|
+
public String getNumber() {
|
47
|
+
return number;
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* @param number the number to set
|
51
|
+
*/
|
52
|
+
public void setNumber(String number) {
|
53
|
+
this.number = number;
|
54
|
+
}
|
55
|
+
/**
|
56
|
+
* @return the extension
|
57
|
+
*/
|
58
|
+
public String getExtension() {
|
59
|
+
return extension;
|
60
|
+
}
|
61
|
+
/**
|
62
|
+
* @param extension the extension to set
|
63
|
+
*/
|
64
|
+
public void setExtension(String extension) {
|
65
|
+
this.extension = extension;
|
66
|
+
}
|
67
|
+
/**
|
68
|
+
* @return the type
|
69
|
+
*/
|
70
|
+
public String getType() {
|
71
|
+
return type;
|
72
|
+
}
|
73
|
+
/**
|
74
|
+
* @param type the type to set
|
75
|
+
*/
|
76
|
+
public void setType(String type) {
|
77
|
+
this.type = type;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
private String title;
|
81
|
+
private String type;
|
82
|
+
private String personId;
|
83
|
+
private String name;
|
84
|
+
private String surname;
|
85
|
+
private String sex;
|
86
|
+
private String email1;
|
87
|
+
private String email2;
|
88
|
+
private String email3;
|
89
|
+
private Phone mainPhone;
|
90
|
+
private Phone[] phones;
|
91
|
+
private Address address;
|
92
|
+
private String corporation;
|
93
|
+
private Person spouse;
|
94
|
+
private Date dateUpdated;
|
95
|
+
|
96
|
+
public String getCorporation() {
|
97
|
+
return corporation;
|
98
|
+
}
|
99
|
+
public void setCorporation(String corporation) {
|
100
|
+
this.corporation = corporation;
|
101
|
+
}
|
102
|
+
public Person getSpouse() {
|
103
|
+
return spouse;
|
104
|
+
}
|
105
|
+
public void setSpouse(Person spouse) {
|
106
|
+
this.spouse = spouse;
|
107
|
+
}
|
108
|
+
public Date getDateUpdated() {
|
109
|
+
return dateUpdated;
|
110
|
+
}
|
111
|
+
public void setDateUpdated(Date dateUpdated) {
|
112
|
+
this.dateUpdated = dateUpdated;
|
113
|
+
}
|
114
|
+
/**
|
115
|
+
* @return the title
|
116
|
+
*/
|
117
|
+
public String getTitle() {
|
118
|
+
return title;
|
119
|
+
}
|
120
|
+
/**
|
121
|
+
* @param title the title to set
|
122
|
+
*/
|
123
|
+
public void setTitle(String title) {
|
124
|
+
this.title = title;
|
125
|
+
}
|
126
|
+
/**
|
127
|
+
* @return the type
|
128
|
+
*/
|
129
|
+
public String getType() {
|
130
|
+
return type;
|
131
|
+
}
|
132
|
+
/**
|
133
|
+
* @param type the type to set
|
134
|
+
*/
|
135
|
+
public void setType(String type) {
|
136
|
+
this.type = type;
|
137
|
+
}
|
138
|
+
|
139
|
+
/**
|
140
|
+
* @return the personId
|
141
|
+
*/
|
142
|
+
public String getPersonId() {
|
143
|
+
return personId;
|
144
|
+
}
|
145
|
+
/**
|
146
|
+
* @param personId the personId to set
|
147
|
+
*/
|
148
|
+
public void setPersonId(String personId) {
|
149
|
+
this.personId = personId;
|
150
|
+
}
|
151
|
+
/**
|
152
|
+
* @return the name
|
153
|
+
*/
|
154
|
+
public String getName() {
|
155
|
+
return name;
|
156
|
+
}
|
157
|
+
/**
|
158
|
+
* @param name the name to set
|
159
|
+
*/
|
160
|
+
public void setName(String name) {
|
161
|
+
this.name = name;
|
162
|
+
}
|
163
|
+
/**
|
164
|
+
* @return the surname
|
165
|
+
*/
|
166
|
+
public String getSurname() {
|
167
|
+
return surname;
|
168
|
+
}
|
169
|
+
/**
|
170
|
+
* @param surname the surname to set
|
171
|
+
*/
|
172
|
+
public void setSurname(String surname) {
|
173
|
+
this.surname = surname;
|
174
|
+
}
|
175
|
+
/**
|
176
|
+
* @return the sex
|
177
|
+
*/
|
178
|
+
public String getSex() {
|
179
|
+
return sex;
|
180
|
+
}
|
181
|
+
/**
|
182
|
+
* @param sex the sex to set
|
183
|
+
*/
|
184
|
+
public void setSex(String sex) {
|
185
|
+
this.sex = sex;
|
186
|
+
}
|
187
|
+
/**
|
188
|
+
* @return the email1
|
189
|
+
*/
|
190
|
+
public String getEmail1() {
|
191
|
+
return email1;
|
192
|
+
}
|
193
|
+
/**
|
194
|
+
* @param email1 the email1 to set
|
195
|
+
*/
|
196
|
+
public void setEmail1(String email1) {
|
197
|
+
this.email1 = email1;
|
198
|
+
}
|
199
|
+
/**
|
200
|
+
* @return the email2
|
201
|
+
*/
|
202
|
+
public String getEmail2() {
|
203
|
+
return email2;
|
204
|
+
}
|
205
|
+
/**
|
206
|
+
* @param email2 the email2 to set
|
207
|
+
*/
|
208
|
+
public void setEmail2(String email2) {
|
209
|
+
this.email2 = email2;
|
210
|
+
}
|
211
|
+
/**
|
212
|
+
* @return the email3
|
213
|
+
*/
|
214
|
+
public String getEmail3() {
|
215
|
+
return email3;
|
216
|
+
}
|
217
|
+
/**
|
218
|
+
* @param email3 the email3 to set
|
219
|
+
*/
|
220
|
+
public void setEmail3(String email3) {
|
221
|
+
this.email3 = email3;
|
222
|
+
}
|
223
|
+
/**
|
224
|
+
* @return the mainPhone
|
225
|
+
*/
|
226
|
+
public Phone getMainPhone() {
|
227
|
+
return mainPhone;
|
228
|
+
}
|
229
|
+
/**
|
230
|
+
* @param mainPhone the mainPhone to set
|
231
|
+
*/
|
232
|
+
public void setMainPhone(Phone mainPhone) {
|
233
|
+
this.mainPhone = mainPhone;
|
234
|
+
}
|
235
|
+
/**
|
236
|
+
* @return the phones
|
237
|
+
*/
|
238
|
+
public Phone[] getPhones() {
|
239
|
+
return phones;
|
240
|
+
}
|
241
|
+
/**
|
242
|
+
* @param phones the phones to set
|
243
|
+
*/
|
244
|
+
public void setPhones(Phone[] phones) {
|
245
|
+
this.phones = phones;
|
246
|
+
}
|
247
|
+
/**
|
248
|
+
* @return the address
|
249
|
+
*/
|
250
|
+
public Address getAddress() {
|
251
|
+
return address;
|
252
|
+
}
|
253
|
+
/**
|
254
|
+
* @param address the address to set
|
255
|
+
*/
|
256
|
+
public void setAddress(Address address) {
|
257
|
+
this.address = address;
|
258
|
+
}
|
259
|
+
|
260
|
+
}
|
261
|
+
|
@@ -0,0 +1,122 @@
|
|
1
|
+
/**
|
2
|
+
*
|
3
|
+
*/
|
4
|
+
package pl.ivmx.mappum;
|
5
|
+
|
6
|
+
import java.util.ArrayList;
|
7
|
+
import java.util.Calendar;
|
8
|
+
import java.util.List;
|
9
|
+
|
10
|
+
import iv.Client;
|
11
|
+
import iv.Person;
|
12
|
+
import junit.framework.TestCase;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @author Jan Topinski (jtopinski@ivmx.pl)
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
public class MappumTest extends TestCase {
|
19
|
+
|
20
|
+
/* (non-Javadoc)
|
21
|
+
* @see junit.framework.TestCase#setUp()
|
22
|
+
*/
|
23
|
+
protected void setUp() throws Exception {
|
24
|
+
super.setUp();
|
25
|
+
}
|
26
|
+
public void testGetDefinedElementTrees(){
|
27
|
+
|
28
|
+
MappumApi mp = new MappumApi();
|
29
|
+
WorkdirLoader wl = mp.getWorkdirLoader("../sample/server/schema","../sample/server/map",null);
|
30
|
+
wl.generateAndRequire();
|
31
|
+
List<TreeElement> ls = wl.definedElementTrees();
|
32
|
+
TreeElement treeElement = ls.get(0);
|
33
|
+
assertEquals(null,treeElement.getClazz());
|
34
|
+
assertEquals("Client",treeElement.getName());
|
35
|
+
assertEquals(false,treeElement.getIsArray());
|
36
|
+
assertEquals(10,treeElement.getElements().size());
|
37
|
+
wl.cleanup();
|
38
|
+
}
|
39
|
+
|
40
|
+
public void testTransform(){
|
41
|
+
MappumApi mp = new MappumApi();
|
42
|
+
mp.loadMaps();
|
43
|
+
JavaTransform jt = mp.getJavaTransform();
|
44
|
+
|
45
|
+
Person per = newPerson();
|
46
|
+
Client cli = null;
|
47
|
+
Person person = null;
|
48
|
+
|
49
|
+
long time = System.currentTimeMillis();
|
50
|
+
for (int i = 0; i < 200; i++) {
|
51
|
+
cli = (Client) jt.transform(per);
|
52
|
+
person = (Person) jt.transform(cli);
|
53
|
+
}
|
54
|
+
time = System.currentTimeMillis()-time;
|
55
|
+
System.out.println(time);
|
56
|
+
assertEquals("2",cli.getSexId());
|
57
|
+
assertEquals("Skoryski",cli.getSurname());
|
58
|
+
assertEquals("M",person.getSex());
|
59
|
+
assertEquals("Skory",person.getName());
|
60
|
+
}
|
61
|
+
/**
|
62
|
+
* @return
|
63
|
+
*/
|
64
|
+
private Person newPerson() {
|
65
|
+
Person per = new Person();
|
66
|
+
per.setTitle("sir");
|
67
|
+
per.setType("NaN");
|
68
|
+
per.setPersonId("asddsa");
|
69
|
+
per.setSex("M");
|
70
|
+
per.setName("Skory");
|
71
|
+
per.setEmail1("j@j.com");
|
72
|
+
per.setEmail2("k@k.com");
|
73
|
+
per.setEmail3("l@l.com");
|
74
|
+
per.setAddress(new Person.Address());
|
75
|
+
per.getAddress().setStreet("Victoria");
|
76
|
+
per.setPhones(new Person.Phone[]{new Person.Phone("21311231"), new Person.Phone("21311232")});
|
77
|
+
per.setMainPhone(new Person.Phone());
|
78
|
+
per.getMainPhone().setNumber("09876567");
|
79
|
+
per.getMainPhone().setType("mobile");
|
80
|
+
per.setCorporation("Corporation l.t.d.");
|
81
|
+
per.setDateUpdated(Calendar.getInstance().getTime());
|
82
|
+
per.setSpouse(new Person());
|
83
|
+
per.getSpouse().setName("Linda");
|
84
|
+
return per;
|
85
|
+
}
|
86
|
+
public void testParalel() throws InterruptedException{
|
87
|
+
int threads = 2;
|
88
|
+
final int loops = 100;
|
89
|
+
|
90
|
+
final MappumApi mp = new MappumApi();
|
91
|
+
mp.loadMaps();
|
92
|
+
final JavaTransform jt = mp.getJavaTransform();
|
93
|
+
|
94
|
+
Runnable task = new Runnable(){
|
95
|
+
|
96
|
+
public void run() {
|
97
|
+
|
98
|
+
Person per = newPerson();
|
99
|
+
for (int j = 0; j < loops; j++) {
|
100
|
+
Client cli = (Client) jt.transform(per);
|
101
|
+
Person person = (Person) jt.transform(cli);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
};
|
106
|
+
|
107
|
+
List<Thread> tl = new ArrayList<Thread>();
|
108
|
+
for (int i = 0; i < threads; i++) {
|
109
|
+
Thread th = new Thread(task);
|
110
|
+
tl.add(th);
|
111
|
+
}
|
112
|
+
long time = System.currentTimeMillis();
|
113
|
+
for (Thread thread : tl) {
|
114
|
+
thread.start();
|
115
|
+
}
|
116
|
+
for (Thread thread : tl) {
|
117
|
+
thread.join();
|
118
|
+
}
|
119
|
+
time = System.currentTimeMillis()-time;
|
120
|
+
System.out.println(time);
|
121
|
+
}
|
122
|
+
}
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# Example of map for given object domains CRM and ERP
|
2
|
+
require 'mappum'
|
3
|
+
require 'java'
|
4
|
+
import 'iv.Client'
|
5
|
+
import 'iv.Person'
|
6
|
+
require 'date'
|
7
|
+
|
8
|
+
Mappum.catalogue_add do
|
9
|
+
|
10
|
+
map Person,Client do |p, c|
|
11
|
+
|
12
|
+
#simple mapping
|
13
|
+
map p.title <=> c.title
|
14
|
+
|
15
|
+
#map with simple function call
|
16
|
+
map p.person_id << c.cid.downcase
|
17
|
+
map p.person_id.upcase >> c.cid
|
18
|
+
|
19
|
+
#dictionary use
|
20
|
+
map p.sex <=> c.sex_id, :dict => {"F" => "1", "M" => "2"}
|
21
|
+
|
22
|
+
#submaps
|
23
|
+
map p.address(Person::Address) <=> c.address(Client::Address) do |a, b|
|
24
|
+
map a.street <=> b.street
|
25
|
+
#etc.
|
26
|
+
end
|
27
|
+
|
28
|
+
#compicated finc call
|
29
|
+
map p.name >> c.surname do |name|
|
30
|
+
name + "ski"
|
31
|
+
end
|
32
|
+
map p.name << c.surname do |name|
|
33
|
+
if name =~ /ski/
|
34
|
+
name[0..-4]
|
35
|
+
else
|
36
|
+
name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
#field to array and array to field
|
40
|
+
map p.email1 <=> c.emails[0]
|
41
|
+
map p.email2 <=> c.emails[1]
|
42
|
+
map p.email3 <=> c.emails[2]
|
43
|
+
|
44
|
+
map p.spouse(Person) <=> c.partners(Client::NameType)[0] do |ps,cp|
|
45
|
+
map ps.name <=> cp.name
|
46
|
+
"Wife" >> cp.type
|
47
|
+
end
|
48
|
+
map p.spouse(Person) <=> c.partners(Client::NameType)[1] do |ps,cp|
|
49
|
+
map ps.name <=> cp.name
|
50
|
+
"Friend" >> cp.type
|
51
|
+
end
|
52
|
+
map p.phones(Person::Phone)[] <=> c.phones[] do |a, b|
|
53
|
+
map a.number <=> b.self
|
54
|
+
end
|
55
|
+
|
56
|
+
#subobject to fields
|
57
|
+
map p.main_phone(Person::Phone) <=> c.self do |a, b|
|
58
|
+
map a.number <=> b.main_phone
|
59
|
+
map a.type <=> b.main_phone_type
|
60
|
+
end
|
61
|
+
|
62
|
+
#TODO one to many
|
63
|
+
#map p.name << [c.first_name, c.surname] do |fname, surname|
|
64
|
+
# fname + " " + surname
|
65
|
+
#end
|
66
|
+
#map p.name.split >> [c.first_name, c.surname]
|
67
|
+
# map p.corporation << c.self do |client|
|
68
|
+
# "#{client.company} #{client.company_suffix}" unless client.company.nil?
|
69
|
+
# end
|
70
|
+
# map p.corporation >> c.company do |corpo|
|
71
|
+
# corpo.split(" ")[0]
|
72
|
+
# end
|
73
|
+
# map p.corporation >> c.company_suffix do |corpo|
|
74
|
+
# corpo.split(" ")[1]
|
75
|
+
# end
|
76
|
+
#constants
|
77
|
+
map p.type << "NaN"
|
78
|
+
map "Last" >> c.order_by
|
79
|
+
|
80
|
+
#func
|
81
|
+
map p.date_updated << func do
|
82
|
+
Time.now
|
83
|
+
end
|
84
|
+
map func >> c.updated do
|
85
|
+
Time.now
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|