160 likes | 270 Views
Utviklingsstrategi – Mobility. Kai Quale, Bjørn Kristoffersen. Innledning. WS for utveksling av studentdata mellom europeiske utdanningsinstitusjoner http://www.rs3g.org Toveis A lle noder skal kunne være både klient og tjener Utveksling av data kan initieres av begge
E N D
Utviklingsstrategi – Mobility Kai Quale, Bjørn Kristoffersen
Innledning • WS for utveksling av studentdata mellom europeiske utdanningsinstitusjoner • http://www.rs3g.org • Toveis • Alle noder skal kunne være både klient og tjener • Utveksling av data kan initieres av begge • Hver operasjon kommer i 2 utgaver: sendX & getX • Disse er ”inverse” (sendXRequest ~ getXResponse) • SOAP er valgt, WSDL er definert (eksternt)
Forskjeller fra eksisterende FSWS • XML-skjema er predefinert (WSDL) • Medfører at strukturen er svært forskjellig fra FS • Operasjonene tar XML-parametre • Full ”speiling” av alle operasjoner • sendX/getX* klient/tjener (* request/response) • Max gjenbruk mellom varianter av operasjon X • Klientdelen må kunne startes fra FS-klienten
Arkitekturvalg • Mappingen går langs to akser: • Fysisk (format): XML Database • Logisk (domene): Mobility FS • Skiller disse aksene fra hverandre: • Fysisk: JAX-WS/Hibernate=>”Relasjonell XML” • Logisk: Relasjonell mapping
Fordeler • Fysisk (XML Hibernate-tabeller) • Gjenbrukbar metode (bruk av annotasjoner) • (Prosjektspesifikke annotasjoner) • Logisk (Hibernate-tabeller FS) • Gjenbrukbar mappingmotor (gen. dynamisk SQL) • Kvalitetskontroll via rapportering • Felt som ikke er mappet • Felt som er mappet > 1 gang for samme melding • … • (Prosjektspesifikke metadata)
Plattform • JBoss EAP 5.1 • JAX-WS / JAXB / wsconsume • Oracle 10gR2 Relational schema mapper ORM FSWS Mobility FS Mobility JBoss, Java Oracle, PL/SQL
Mønster – generert SQL INSERT INTO Target_Tabell ( ”Element1” , ... , ”ElementN” ) SELECT KonvFunk_1 (tab_i.”DataFelt”...) , ... , KonvFunk_N (tab_j.”DataFelt”...) FROM ”Source_Tabell_1” tab_1 , ... , ”Source_Tabell_M” tab_M WHERE -- Join tab_1.”JoinFelt1” = tab_2.JoinFelt2 ... AND tab_M-1.”JoinFeltM-1” = tab_M.”JoinFeltM” -- -- Filter (søkekriterier) AND tab_i.”SøkeFelt_i” = :SøkeKrit_i ...
Utviklingsoppgaver • Engangsjobb • Design og implementasjon av mappingmotor • Tabellstruktur • Rutine som traverserer strukturen og genererer dynamisk SQL • Registrering av FS-spesifikkemetadata (dictionary) • Impl. av GUI for registrering av mappinger (etterhvert) • Jobb som må gjøres for hver ”kunde” • Registrering av kundespesifikke metadata • Tabeller (dictionary) • Mappinger (manuelt) • Impl. av kundespesifikke konv.funksjoner (manuelt)
Unsolved problems • Post-processingofgenerated DDL is manual • Renameconstraints • Addcolumns used by themappingengine • Hibernateannotationsareaddedmanually (problem when WSDL changes) • XML configuration files? • Programmatictechniques?
Datamodell – mappingmotor MOBILITY / FS For Prosjekt Deltager Rolle Oppdatering Home/Administrative Partner/Institutional For Sender data i Entitet Rolle Komb Rolle Kombinasjon = = Kontekst Req/Resp GetV/Send Skiller på EntRollKomb Betingelse Annen Rolle Oppdat Rolle Attributt Bet RelopVerdi Har Home Partner - Administrative Institutional - For Har Entitet Attributt Eier agreementData UTVAVTALE Er Returverdi for Medlem PK UK FK Nøkkel Funksjons Kall Aktuell Parameter Har Instansierer Instansierer Formell Parameter Funksjon Returnerer data tilhørende Har
Database Read & Write • Bothrequests and responsesare Java treestructures • May be persisted to and fetched from database with a single save/getinvocation from the (req/resp) ”root” • Make Hibernate ”eager” and ”cascading” GetXResponsegetX(GetXRequestreq) { session.save(req); // Schema mapper addsresponse to database returnsession.get(GetXResponse.class, req.getID()); }
Tables & Columns • Basic rule: Class = Table, Property=Column • Make a table: @Entity • Classwithonly simple properties: @Embedded • Little need to do anything to make columns • Hibernate likes surrogatekeys • Addkey to everyclass: @Id • Autonumbering: @GeneratedValue • Key is not part ofthe XML: @XmlTransient
Naming • Implemented a subclass of org.hibernate.cfg.DefaultNamingStrategy • Length • Oracle has a 30 character limit onidentifiers • WSDL namesare longer + need for prefix • Case • Oracle uses default UPPERCASE • We preserve WSDL CamelCase (startMiddleEnd) • to avoid even longer names (START_MIDDLE_END) • for clarity in error messages • Encloseidentifiers in ”double quotes”
Dates • JAXB usesXMLGregorianCalendar • Replacewithjava.util.Date • @Temporal (value=TemporalType.DATE) • Adapter class for parsing/serialization • @XmlElement (required=true) • @XmlSchemaType (name="date") • @XmlJavaTypeAdapter (CalendarAdapter.class)
Relationships • N:1 relationships (propertyof type X*) * X is a ”Mobilityclass” • @ManyToOne (cascade=CascadeType.ALL) • @JoinColumn (name="LogicalName") • 1:N relationships (propertyof type List<X*>) • @OneToMany (CascadeType.ALL, FetchType.EAGER) • @Fetch (FetchMode.SUBSELECT) • @JoinColumn (name="LogicalName") • 1:N relationships (propertyof type List<String>) • @CollectionOfElements (targetElement=String.class) • @JoinTable (name="TableName“,@JoinColumn(name="FK")) • @CollectionId (@Column(name="ID"), @Type(type="string")) • @Column (name=”ColumnName", nullable=false)
Subclasses & Multiple embedded • Subclasses • Fullynormalized (tables for thesuperclass and eachsubclass, whichinheritprimarykey from superclass): • @Inheritance (strategy=InheritanceType.JOINED) • Multiple embeddedclasses (classcontains multiple propertiesofthe same type X*) • @Embedded • @AttributeOverrides • { @(name="x", column=@Column(name="RoleN”))}