Progettazione ed implementazione di una base di dati per la gestione di emissioni inquinanti alimentata da file xml
1. UNIVERSITÀ DEGLI STUDI DI TRIESTE
FACOLTÀ DI INGEGNERIA
DIPARTIMENTO DI INGEGNERIA ED ARCHITETTURA
Tesi di laurea in
BASI DI DATI
PROGETTAZIONE ED IMPLEMENTAZIONE DI UNA
BASE DI DATI PER LA GESTIONE DI EMISSIONI
INQUINANTI ALIMENTATA DA FILE XML
Relatore: Chiar.mo prof. Maurizio Fermeglia
Laureando: Francesco Occhioni
Anno accademico: 2011-2012
5. 7.2.12 ProductionVolume...................................................................................... 31
7.3 Validazione File Xml ........................................................................................... 32
7.4 Mybatis ............................................................................................................. 33
7.4.1 Connessione al Server SQL........................................................................... 33
7.4.2 Mapping del DB ........................................................................................... 34
7.5 Interfaccia Grafica ............................................................................................. 35
7.5.1 Descrizione ................................................................................................. 35
7.5.2 Codice ........................................................................................................ 36
8.Conclusioni ............................................................................................................. 39
Bibliografia................................................................................................................. 40
Indice delle figure ...................................................................................................... 40
IV
6. 1.Introduzione
La tesi proposta all’interno di questo documento andrà a trattare e sviluppare l’analisi e la
gestione di un sistema informativo, nella fattispecie di un database volto a raccogliere dati
storici riguardanti dati di inquinamento all’interno dell’unione europea e forniti da altri
sistemi informativi.
Tale sistema verrà sviluppato in ambiente proprietario SQL SERVER 2008 in modo da
mantenere la stessa struttura e logistica del complesso sistema informativo preesistente su
cui basarsi.
L’obbiettivo è quello di analizzare la struttura dei sistemi database preesistenti, nonché
studiare il modo in cui i database trasmettono le informazioni e le inviano al database da
creare. Il passo successivo consiste nel progettare il nuovo sistema secondo le leggi date
dalla normativa UE e le specifiche date dall’analisi precedentemente effettuata.
Lo sviluppo verrà realizzato interamente in locale per poi eventualmente porsi l’obbiettivo
di portare il sistema su macchina remota.
I capitoli della tesi sono così distribuiti:
• 2) e 3) presentano le specifiche richieste dal committente e la relativa analisi del
progetto;
• 4) descrive le strumentazioni hardware e software necessarie;
• 5) propone un setup per poter procedere nel progetto;
• 6) analizza e progetta la base di dati su cui operare;
• 7) crea l’applicativo per alimentare la base di dati con file XML;
• 8) propone migliorie e spunti futuri del lavoro creato.
1
7. 2.Presentazione delle Richieste
Il commissionario del progetto non ha presentato particolari richieste se non quelle di un
sistema informativo funzionante e dalla struttura similare ai server forniti nei vari stati
d’Europa.
Il responsabile del progetto ha fornito le seguenti richieste:
• Distinguere all’interno del sistema quelle che sono le Nazioni di riferimento
• Avere una lista separata del gruppo di autorità competente
• Considerare diversi periodi di analisi dei dati
• Salvare all’interno di una datatable quelli che sono gli output forniti dai server
• Avere una versione in inglese del sistema
• Essere ad alto indice di usabilità
Oltretutto è già stata fornita una linea guida sulla struttura da seguire per la creazione del
sistema informativo.
3.Analisi delle richieste
Il progetto, per la sua realizzazione, richiede uno studio approfondito di strutture dati
utilizzabili principalmente su motore SQL Server o Access.
Non meno importante sarà lo studio approfondito della struttura del server in quanto un
errata progettazione potrebbe portare a problemi di incompatibilità non verificabile
immediatamente nella fase di test del sistema.
Ancor più interessante sarà riempire il database opportunamente progettato con una
struttura dati fornita da altri database esterni.
2
8. 4.Strumenti necessari allo sviluppo del Progetto
Il progetto necessita dell’utilizzo del seguente elenco di hardware e software.
Di seguito ne descriveremo le caratteristiche.
4.1 Hardware
4.1.1. PC Notebook SONY VAIO VPCEB1S1E
È il portatile a disposizione del laureando, montante un processore INTEL CORE I5
DUALCORE e scheda grafica ATI MOBILITY RADEON HD 5650 con 1 GB di memoria
grafica dedicata, HARD DISK da 500 GB e 4 GB di RAM DDR III.
Figura 1: Sony Vaio VPCEB1S1E
4.2 Software
4.2.1 SQL Server 2008
È il DBMS che verrà utilizzato per l’intero sviluppo del progetto.
3
9. 4.2.2 Microsoft Access 2010
Software appartenente alla suite MICROSOFT OFFICE 2010, sarà utile per la gestione dei
dati contenuti nel database a disposizione per l’end-user.
4.2.3 Eclipse
Eclipse è un ambiente di sviluppo integrato multi-linguaggio e multipiattaforma. Nello
specifico verrà utilizzato per la produzione di software applicativo in linguaggio Java. La
versione utilizzata è la Juno (4.2), rilasciata il 27 giugno 2012.
4.2.4 Software Java
Java è un linguaggio di programmazione e una piattaforma di elaborazione sviluppati da
Sun Microsystems nel 1995. Dal download del software Java si ottiene Java Runtime
Environment (JRE). JRE è composto dalla Macchina virtuale Java (JVM), dalle classi core
della piattaforma Java e dalle librerie Java di supporto.
4
10. 5. Prima di Cominciare
5.1 Attivazione Protocollo TCP/IP SQL Server 2008
Attivando questo protocollo si ottiene il supporto al DB per le connessioni remote, la cui
procedura è descritta qui sotto (valida anche per SQL Server 2005):
1. Accedere al server a livello dati sul quale è definita l'istanza del database.
2. Fare clic sul pulsante Start, scegliere Tutti i programmi, Microsoft SQL Server
2005 o Microsoft SQL Server 2008, Strumenti di configurazione, quindi fare clic su
Gestione configurazione SQL Server.
3. Nel riquadro della struttura ad albero fare clic su Servizi di SQL Server
2005 o Servizi di SQL Server 2008.
4. Nel riquadro dei risultati verificare che, nella colonna Stato, appaia In
esecuzione accanto al nome di ogni servizio.
Se è presente Arrestato, fare clic con il pulsante destro del mouse sul nome del
servizio, quindi scegliere Avvia.
Figura 2: Attivazione Protocollo TCP/IP SQL Server 2008/1
5. Nel riquadro della struttura ad albero fare clic su Configurazione di rete SQL Server
2005 o Configurazione di rete SQL Server 2008 per espanderlo, quindi
scegliere Protocolli per MSSQLServer/NomeIstanza.
Se durante l'installazione è stata specificata l'istanza predefinita, il nome dell'istanza
sarà MSSQLSERVER.
6. Nel riquadro dei risultati verificare che, nella colonna Stato, appaia Attivato accanto
al nome del protocollo TCP/IP.
5
11. Se appare Disattivato, fare clic con il pulsante destro del mouse su TCP/IP, quindi
scegliere Attiva.
Figura 3: Attivazione Protocollo TCP/IP SQL Server 2008/2
7. Nel riquadro della struttura ad albero fare clic su Configurazione SQL Native
Client per espanderlo, quindi fare clic su Protocolli client.
8. Nel riquadro dei risultati verificare che, nella colonna Stato, appaia Attivato accanto
al nome del protocollo TCP/IP.
Se appare Disattivato, fare clic con il pulsante destro del mouse su TCP/IP, quindi
scegliere Attiva.
Figura 4: Attivazione Protocollo TCP/IP SQL Server 2008/3
6
12. 5.2 Librerie Eclipse
5.2.1 Driver JDBC
JDBC è un'interfaccia di programmazione che lavora da tramite tra codice Java e database.
Più in particolare, JDBC racchiude una serie di classi che permettono l'accesso ad una base
di dati mediante metodi e schemi di funzionamento che sono intuitivi e perfettamente in
linea con lo stile di programmazione tipico del linguaggio di Sun. In sostanza, quindi, è
possibile connettersi ad un particolare database sfruttando un apposito driver JDBC,
costituito da una classe Java. Tutti i principali DBMS dispongono oramai di un driver JDBC
appositamente studiato. Esiste poi un particolare driver, chiamato ponte JDBC-ODBC, che
permette l'utilizzo di qualsiasi fonte di dati per la quale è disponibile un driver ODBC. Ogni
DBMS dotato di un'interfaccia ODBC, ad esempio Microsoft Access, può così essere
immediatamente sfruttato da Java e JSP, senza la necessità di un driver appositamente
studiato per la connettività da applicazioni Java. Tra JDBC ed il ponte ODBC, quindi, Java è
virtualmente dotato della possibilità di interagire con tutti i DBMS in circolazione.
5.2.2 XMLBeans
XMLBeans è una libreria scritta dalla Apache che permette di manipolare il contenuto di un
file XML fornendo una visione a oggetti dei dati e implementando tutte le funzionalità
necessarie allo sviluppatore per gestire in modo automatico le operazioni di lettura,
scrittura e validazione di un file XML. Mediante XMLBeans è possibile generare delle classi
java che permettono di leggere, scrivere o validare un file xml.
5.2.3 MyBatis
MyBatis è un framework per la persistenza che offre supporto per scrivere delle query,
delle stored procedures o mapping avanzati attraverso l’uso di SQL e semplici regole di
XML o attraverso l’uso delle Annotations. La principale caratteristica è che grazie a MyBatis
viene eliminata la necessità di scrivere codice JDBC, di settare manualmente i parametri di
connessione al DB e inoltre anche il retrieve dei risultati risulta essere automatico.
7
13. 5.2.4 Installazione Librerie
Per installare il queste librerie all’interno del progetto java si è seguito il seguente
procedimento:
1. Eseguito il download delle librerie.
2. Nella cartella “lib” del progetto Java presente in Eclipse sono stati inseriti i file con
estensione .jar relativi.
3. In Eclipse click col tasto destro del mouse sul progetto java, poi “BuildPath” ->
“Configure BuildPath” e nella scheda “Libraries” click su “Add JARs…” e selezionato i
file .jar precedentemente inseriti.
Figura 5: Installazione Driver JDBC – XMLBeans - MyBatis
8
14. 6. Studio del file XSD
Una "XML Schema Definition" (XSD) è un esempio (instance) di schema XML scritto in
linguaggio XML Schema. Una XSD definisce il tipo di un documento XML in termini di
vincoli: quali elementi ed attributi possono apparire, in quale relazione reciproca, quale
tipo di dati può contenere, ed altro. Può essere usata anche con un programma di
validazione, al fine di accertare a quale tipo appartiene un determinato documento XML.
La differenza principale fra XSD ed altri linguaggi di descrizione del contenuto XML sta nel
fatto che XSD è stato sviluppato con l'intento che la determinazione della validità di un
documento possa produrre una collezione di informazioni aderenti a specifici tipi di dati.
In questo caso particolare il file XSD è fornito direttamente dalla UE al seguente indirizzo:
http://www.eionet.europa.eu/schemas/eprtr/PollutantReleaseAndTransferReport_2p0.xsd.
Si è proceduto quindi allo studio dello schema XML per poter ottenere uno schema Entity-
Relationship sul quale creare il database.
Lo schema che si ottiene è il seguente:
Figura 6: Schema Entity-Relationship
9
15. 6.1 Analisi Entità
Si passa a questo punto ad analizzare in maniera esplicita e descrittiva le singole entità:
• Country: descrive lo stato membro di provenienza del report.
• CompetentAuthorityParty: descrive uno o più gruppi di autorità competenti
incaricate di rispondere alle richieste del pubblico.
• Facility: descrive nel dettaglio le imprese che riportano i dati inquinanti.
• Report: descrive nel dettaglio i dati inquinanti.
• Chemical: descrive il tipo di inquinamento (aria/terra/acqua) e il metodo
usato per la rilevazione dei dati.
• Period: descrive il periodo di rilevazione del dato (tipicamente annuale).
6.2 Analisi Relazioni
Analogamente a quanto fatto con le entità, si analizzano ora le relazioni:
6.2.1 Presenza Country-CompetentAuthorityParty
La relazione descrive la presenza di una o più autorità di competenza nello stato di
riferimento. A uno stato vengono associate più autorità le quali possono essere associate
ad uno ed un solo stato.
6.2.2 Presenza Country-Facility
La relazione descrive la presenza di una o più Imprese all’interno dello stato di riferimento.
Come è logico pensare, per ogni stato sono presenti più Imprese, le quali vengono
associate ad uno ed un solo stato.
6.2.3 Rilevazioni Facility-Report
Descrive le rilevazioni dei report d’inquinamento fatta da un’unica impresa. Per ogni
impresa possono essere associati più report.
6.2.4 Dettaglio Report-Chemical
La relazione serve a descrivere più in dettaglio quelli che sono i report dell’azienda.
10
16. 6.2.5 Associato A Report-Periodo
Descrive la relazione che intercorre tra un report e il suo periodo di rilevazione. Relazione
banale ma da tenere particolarmente d’occhio in quanto il database da creare necessita di
una classificazione storica dei dati.
6.3 Traduzione verso il modello Relazionale
Il passo successivo consiste nell' analizzare singolarmente il file XSD fornito dall’Unione
Europea per progettare in dettaglio le tabelle che costituiranno il sistema informativo
cercando di far riferimento, per quanto possibile, allo schema Entity-Relationship creato.
6.3.1 PollutantReleaseAndTransferReport
Reporting of the E-PRTR data
Attributo Descrizione Tipo di Dato Null
ReportingYear The calendar year for which ReportingYearType
data on releases of pollutants
and off-site transfers is
gathered.
CountryID The Member State reporting. TextType
CoordinateSystemID The coordinate system used in TextType
reporting of coordinates of the
facilities.
RemarkText Textual remark from MS. Will LongTextType SI
not be published on the web-
site.
CompetentAuthorityParty One or more competent CompetentAuthorityPartyType
authorities in charge to respond
to requests from the public.
FacilityReport A facility report for each facility FacilityReportType
reporting E-PRTR data.
11
17. 6.3.2 CompetentAuthorityParty
Describes details about the competent authority in charge to respond to requests from the
public.
Attributo Descrizione Tipo di Dato Null
Name The name of the TextType
competent authority.
Address The address of the CompetentAuthorityAddressType
competent authority.
TelephoneCommunication The phone number TelecommunicationCommunicationType
FaxCommunication The fax number. TelecommunicationCommunicationType
EmailCommunication The e-mail address EmailCommunicationType
ContactPersonName Name of contact TextType SI
person. If reported,
data will be published.
6.3.3 NationalID
The national identification of a facility.
Attributo Descrizione Tipo di Dato Null
NationalID The national TextType
Identification of a
facility.
12
18. 6.3.4 PreviousNationalID
The previously reported national identification of a facility.
Attributo Descrizione Tipo di Dato Null
NationalID The previously reported national NationalIDType
identification. If the national identification
has not changed or the facility has not
previously been reported, this must
correspond to the current national
identification.
ReportingYear The reporting year of which the previous ReportingYearType
national identification was reported. If the
facility has not previously been reported,
this must correspond to the current
reporting year.
6.3.5 FacilityReport
Holds the reporting for a given facility
Attributo Descrizione Tipo di Dato Null
NationalID The national Identification of NationalIDType
the facility.
PreviousNationalID The previously reported PreviousNationalIDType
national identification of the
facility
ParentCompanyName Name of the parent company, TextType SI
i.e. the company that owns or
controls the company
operating the facility.
Required unless
confidentiality is claimed.
FacilityName Name of the facility (operator TextType SI
or owner). Required unless
confidentiality is claimed.
13
19. Attributo Descrizione Tipo di Dato Null
Address The address of the facility. FacilityAddressType SI
Required unless
confidentiality is claimed.
GeographicalCoordinate The coordinates of the GeographicalCoordinateType
location of the facility should
be expressed in longitude and
latitude coordinates giving a
precision of the order of at
least +/- 500 meters and
referring to the geographical
centre of the site of the
facility.
RiverBasinDistrictID Identifies the river basin TextType
district according to according
to Article 3(1) of Directive
2000/60/EC (“Water
Framework Directive”).
NACEMainEconomicActivityCode Identifies the NACE code TextType
according to the NACE 2
revision and thereby the main
economic activity.
MainEconomicActivityName The main economic activity TextType SI
corresponding to the NACE
code in plain text.
CompetentAuthorityPartyName identifies the competent TextType
authority in MS for public
requests. Must correspond to
the name of one of the
CompetentAuthorityParty
elements.
ProductionVolume The total production volume ProductionVolumeType SI
related to the main activity of
the facility.
TotalIPPCInstallationQuantity The total number of IPPC nonNegativeInteger SI
installations covered by the
facility.
14
20. Attributo Descrizione Tipo di Dato Null
OperationHours The number of operating nonNegativeInteger SI
hours in reporting year.
TotalEmployeeQuantity The number of employees. nonNegativeInteger SI
NutsRegionID Identifies the region that the TextType SI
facility belongs to as defined
by NUTS.
WebsiteCommunication The website address of the WebsiteCommunicationType SI
facility. Will be published
even if protection of voluntary
data is claimed.
PublicInformation Additional information to be LongTextType SI
published on web site as-is
(e.g. e-mail, contact person
etc.). Will be published even
if protection of voluntary data
is claimed.
ConfidentialIndicator Indicates if confidentiality for Boolean
mandatory data is claimed or
not. True marks
confidentiality, false marks no
confidentiality.
ConfidentialCode Identifies the reason for TextType SI
confidentiality according to
Directive 2003/4/EC, Article
4(2). Required if
confidentiality is claimed for
mandatory data.
ProtectVoluntaryData Indicates if voluntary data Boolean
should be protected or not. In
this case all voluntary data of
the facility is considered
protected with a few
exceptions at stated in the
descriptions of the individual
elements.
15
21. Attributo Descrizione Tipo di Dato Null
RemarkText Textual remark, e.g. LongTextType SI
information in changes of the
history of the facility,
elaboration on the reason for
confidentiality etc. Will not be
published even if protection
of voluntary data is not
claimed.
Activity The reported Annex I ActivityType
activities of the facility.
PollutantRelease The reported releases of PollutantReleaseType SI
pollutants to air/water/land
reported for the facility.
PollutantTransfer The reported off-site transfer PollutantTransferType SI
of pollutants in waste-water
for the facility.
WasteTransfer The reported off-site transfer WasteTransferType SI
of pollutants in waste-water
for the facility.
6.3.6 Activity
A reported E-PRTR Annex I Activity for a facility.
Attributo Descrizione Tipo di Dato Null
RankingNumeric Consecutive ranking of the activities positiveInteger
starting with 1. The activity with ranking
= 1 shall be the main PRTR activity.
AnnexIActivityCode Identifies the Annex I activity according TextType
to Regulation 166/2006 Annex I.
16
22. 6.3.7 PollutantRelease
Describes releases of pollutant to air/water/land
Attributo Descrizione Tipo di Dato Null
MediumCode Identifies the environmental medium (air, TextType
water, land).
PollutantCode The address of the competent authority. TextType
MethodBasisCode Identifies the basis of the main method used TextType
(M/C/E).
MethodUsed Identifies the calculation and measurement MethodUsedType SI
method(s) used for determination of the total
quantity. Required if method basis is M or C
and confidentiality is not claimed.
TotalQuantity Total quantity including accidental quantity PollutantMassQuantityType
[kg/year]. Values below threshold are
considered voluntary and will not be published.
AccidentalQuantity Accidental quantity [kg/year]. PollutantMassQuantityType SI
ConfidentialIndicator Indicates if confidentiality is claimed or not. Boolean
True marks confidentiality, false marks no
confidentiality.
ConfidentialCode Identifies the reason for confidentiality TextType SI
according to Directive 2003/4/EC, Article 4(2).
For releases of pollutants the legal reasons for
confidentiality are restricted to Article 4(2)(b),
(c) and transferred. Required if confidentiality
is claimed.
RemarkText Textual remark, e.g. elaboration on the reason LongTextType SI
for confidentiality. Will not be published.
17
23. 6.3.8 PollutantTransfer
Describes off-site transfer of pollutant in waste-waster
Attributo Descrizione Tipo di Dato Null
PollutantCode Identifies the pollutant. If confidentiality TextType
is claimed the pollutant group must be
reported instead of the individual
pollutant.
MethodBasisCode Identifies the basis of the main method TextType
used (M/C/E).
MethodUsed Identifies the calculation and MethodUsedType SI
measurement method(s) used for
determination of the quantity. Required
if method basis is M or C and
confidentiality is not claimed.
Quantity Total quantity [kg/year]. Values below PollutantMassQuantityType
threshold are considered voluntary and
will not be published.
ConfidentialIndicator Indicates if confidentiality is claimed or Boolean
not. True marks confidentiality, false
marks no confidentiality.
ConfidentialCode Identifies the reason for confidentiality TextType SI
according to Directive 2003/4/EC, Article
4(2). Required if confidentiality is
claimed.
RemarkText Textual remark, e.g. elaboration on the LongTextType SI
reason for confidentiality. Will not be
published.
18
24. 6.3.9 WasteTransfer
Describes off-site transfer of waste (except in waste-waster)
Attributo Descrizione Tipo di Dato Null
WasteTypeCode Identifies the type of waste (non- TextType
hazardous, hazardous within country
and hazardous outside country).
WasteTreatmentCode Identifies the waste treatment operation TextType SI
(recovery or disposal). Required unless
confidentiality is claimed.
MethodBasisCode Identifies the basis of the main method TextType SI
used (M/C/E).
Quantity Quantity [t/year]. Required unless WasteMassQuantityType SI
confidentiality is claimed.
MethodUsed Identifies the calculation and MethodUsedType SI
measurement method(s) used for
determination of the quantity. Required
if method basis is M or C and
confidentiality is not claimed.
ConfidentialIndicator Indicates if confidentiality is claimed or Boolean
not. True marks confidentiality, false
marks no confidentiality.
ConfidentialCode Identifies the reason for confidentiality TextType SI
according to Directive 2003/4/EC, Article
4(2). Required if confidentiality is
claimed.
RemarkText Textual remark, e.g. elaboration on the LongTextType SI
reason for confidentiality. Will not be
published.
WasteHandlerParty Identifies the recoverer/disposer of the WasteHandlerPartyType SI
waste. Required for transfer of
hazardous waste outside the country
unless confidentiality is claimed.
19
25. 6.3.10 MethodUsed
Describes a measurement/calculation method used for determination of quantities of
pollutants and waste.
Attributo Descrizione Tipo di Dato Null
MethodTypeCode Identifies the type of method used TextType
(CEN/ISO, ETS, etc.). Notice that the
method type “WEIGH” (i.e. weighing)
only is allowed for waste transfer.
Designation A short designation or description of the TextType SI
method used. Required for some
method types as indicated in the list of
legal method type codes.
6.3.11 WasteHandlerParty
Recoverer/Disposer of hazardous waste transferred outside the country
Attributo Descrizione Tipo di Dato Null
Name Name of recoverer/disposer. Required TextType SI
unless confidentiality is claimed for the
WasteTransfer element.
Address The address of the recoverer/disposer. AddressType SI
Required unless confidentiality is claimed
for the WasteTransfer
SiteAddress The address of the actual AddressType SI
recoverer/disposer site. Required unless
confidentiality is claimed for the
WasteTransfer element.
20
26. 6.3.12 Address
The base format for addresses in PRTR.
Attributo Descrizione Tipo di Dato Null
StreetName The name, expressed as text, of a street in the TextType SI
address.
BuildingNumber The building number, expressed as text, in the TextType SI
address.
CityName The name, expressed as text, of the city, town or TextType SI
village in the address.
Attributo Descrizione Tipo di Dato Null
PostcodeCode The postcode, expressed as text, if the address. ShortTextType SI
CountryID The unique identifier of a country in the structured TextType SI
address (Reference ISO 3166 and UN/ECE Rec 3).
6.3.13 CompetentAuthorityAddress
The address for a competent authority. The country is assumed to correspond to the
country reporting.
Attributo Descrizione Tipo di Dato Null
StreetName The street name. TextType
BuildingNumber The building number. If reported, data will be TextType SI
published..
CityName The Town/village. TextType
PostcodeCode The postal code. If reported, data will be published. ShortTextType SI
21
27. 6.3.14 FacilityAddress
The format for addresses for facilities. The country is assumed to correspond to the
country reporting
Attributo Descrizione Tipo di Dato Null
StreetName The street name of the facility. Required unless TextType SI
confidentiality is claimed.
BuildingNumber The building number of the facility TextType SI
CityName The Town/village of the facility. Required unless TextType SI
confidentiality is claimed.
PostcodeCode The Postal code of the facility. Required unless ShortTextType SI
confidentiality is claimed.
6.3.15 TelecommunicationCommunication
Information necessary to establish an electronic telecommunication connection for the
purpose of a telephone or facsimile exchange (Fax or Telephone).
Attributo Descrizione Tipo di Dato Null
CompleteNumberText The text string of characters that make up the ShortTextType
complete number for this telecommunication.
6.3.16 EmailCommunication
An address for the delivery of electronic mail.
Attributo Descrizione Tipo di Dato Null
EmailURIID The Uniform Resource Identifier (URI) for this email TextType
communication. Must contain an @
22
28. 6.3.17 WebsiteCommunication
An address for the exchange of information from and to a website over the Internet.
Attributo Descrizione Tipo di Dato Null
WebsiteURIID The Uniform Resource Identifier (URI) of this website TextType
communication. Must start with “http://”.
6.3.18 GeographicalCoordinate
The latitude and longitude of a place, by which its relative situation on the globe is known.
Attributo Descrizione Tipo di Dato Null
LongitudeMeasure minInclusive value=”-180” float
maxInclusive value=”180”
LatitudeMeasure minInclusive value=”-90” float
maxInclusive value=”90”
6.3.19 ProductionVolume
Attributo Descrizione Tipo di Dato Null
ProductName The product/product group TextType
Quantity The total volume. The unit must be ProductionVolumeQuantityType
given in attribute unitCode
6.3.20 ProductionVolumeQuantity
Production volume quantity. Units must be given in unitCode attribute.
Attributo Descrizione Tipo di Dato Null
QuantityType The UN/ECE Recommendation 20 code identifying the ShortTextType
unit for this quantity, such as “KGM” for kilograms.”
23
29. 6.3.21 PollutantMassQuantity
Pollutant mass quantity. Must be reported in kilograms with three significant digits.
Attributo Descrizione Tipo di Dato Null
QuantityType The UN/ECE Recommendation 20 code identifying the ShortTextType
unit for this quantity, such as “KGM” for kilograms.”
6.3.22 WasteMassQuantity
A data type for quantities.
Attributo Descrizione Tipo di Dato Null
QuantityType The quantity of waste must be reported in tonnes ShortTextType
6.3.23 Quantity
A data type for quantities.
Attributo Descrizione Tipo di Dato Null
QuantityType The UN/ECE Recommendation 20 code identifying the ShortTextType
unit for this quantity, such as “KGM” for kilograms.”
24
30. 6.4 Considerazioni
A questo punto dell’analisi è necessario inserire alcune considerazioni fatte prima di
passare alla creazione effettiva delle tabelle e delle relazioni che intercorrono tra di esse.
6.4.1 Valori Null
L’introduzione dei valori Null è stata fatta per ogni attributo ogniqualvolta che, nello
schema XML, è stata incontrata la dicitura: “minOccurs=”0””. Tale dicitura indica infatti
che l’elemento di riferimento può occorrere un numero pari a zero volte.
6.4.2 Tipi di Dato
Durante l’analisi sono stati riscontrati dei tipi di dato a cui daremo un corrispettivo
significato per la creazione in SQl Server:
• ShortTextType: oggetto di tipo stringa con lunghezza variabile da 1 a 50
• TextType: oggetto di tipo stringa con lunghezza variabile da 1 a 255
• LongTextType: oggetto di tipo stringa con lunghezza variabile da 1 a 100000
• Float: numero in virgola mobile
• Boolean: valore Vero o Falso
• positiveInteger: valore intero maggiore di zero
• nonNegativeInteger: valore intero maggiore o uguale a zero
Gli altri tipi di dato rilevati non sono altro che “ponti di collegamento” con le altre tabelle,
andando a formare così delle relazioni considerando rispettivamente chiave primarie e
chiavi esterne.
25
31. 6.5 Accorpamento Tabelle – Denormalizzazione
A questo punto si decide di accorpare alcune tabelle all’interno di tabelle più grandi
rinunciando così alla seconda forma normale per la quale si dovrebbero spezzare tabelle
che descrivono entità separate. Nello specifico verranno considerati i seguenti
accorpamenti:
• PollutantReleaseAndTransferReport
• CompetentAuthorityParty (Address, TelephoneCommunication, FaxCommunication,
EmailCommunication)
• FacilityReport (NationalID, PreviousNationalID, GeographicalCoordinate,
WebsiteCommunication)
• ProductionVolume (NationalID)
• Activity (NationalID)
• PollutantRelease
• PollutantTransfer
• WasteTransfer
• WasteHandlerParty
• PollutantRelaseMethodUsed
• PollutantTransferMethodUsed
• WasteTransferMethodUsed
Si riduce così il numero di tabelle da realizzare da 23 a 12.
6.6 Scelta delle chiavi primarie
All’interno di ogni tabella vengono inserite come chiavi primarie degli ID che
rappresentano univocamente gli elementi della tabella e che serviranno a stabilire relazioni
con chiavi esterne appartenenti ad altre tabelle.
Per convenzione gli ID di ogni tabella prenderanno il nome ID[NomeTabella]. Le chiavi
esterne associate invece prenderanno il nome [NomeTabella]ID. Le chiavi primarie di ogni
tabella verranno generate automaticamente dal DBMS in modo tale che siano tutte
distinte. La generazione automatica degli ID viene imposto nelle proprietà del tipo di dato
settando: Identity = Yes, IdentityIncrement = 1, Identity Seed = 1.
26
33. 7. Creazione Applicativo per Caricare File XML
Il Linguaggio scelto per creare l’applicativo che leggerà il file XML e che andrà a popolare il
database SQLServer precedentemente progettato è il linguaggio Java. Più nello specifico
verranno utilizzati come strumenti di supporto XmlBeans, una libreria scritta dalla Apache
che permette di manipolare il contenuto di un file XML, e MyBatis, un framework per la
persistenza che offre supporto per scrivere delle query, delle stored procedures o mapping
avanzati attraverso l’uso di SQL e semplici regole di XML.
7.1 XmlBeans
XMLBeans è una libreria scritta dalla Apache che permette di manipolare il contenuto di un
file XML fornendo una visione a oggetti dei dati e implementando tutte le funzionalità
necessarie allo sviluppatore per gestire in modo automatico le operazioni di lettura,
scrittura e validazione di un file XML. Mediante XMLBeans è possibile generare delle classi
java che permettono di leggere, scrivere o validare un file xml. Per generare le classi
occorre preparare un file xsd (in questo caso già fornito dalla UE) nel quale sono definite
tutte le regole a cui i file XML devono essere conformi.
Per generare le classi java che permettono di gestire i file XML conformi alla seguente
struttura si apre il prompt dei comandi, ci si porta nella directory nella quale è contenuto il
file xsd da leggere e viene lanciato il seguente comando:
D:>scomp -out pratr2p0.jar PollutantReleaseAndTransferReport_2p0.xsd
Con questo comando viene creata la libreria (pratr2p0.jar) che contiene le classi java che
permettono di scrivere e leggere i file XML compatibili con l’xsd.
7.2 Creazione Oggetti-Tabelle Java
Per poter popolare il database progettato si è rivelato necessario creare per ogni tabella il
relativo oggetto Java di riferimento (il cui nome corrisponde al nome della tabella) al cui
interno sono presenti le variabili rappresentanti gli attributi di ogni singola tabella.
Infine, per ogni variabile descrivente l’attributo, sono stati associati i metodi “get” e “set”.
(Note: I metodi get e set sono stati rimossi per rendere più leggibile il documento )
28
37. 7.3 Validazione File Xml
Per verificare se la struttura e i dati del documento xml sono coerenti con quanto
specificato nello schema di definizione, l'interfaccia creata contenente i metodi per
accedere alla lettura del file XML, PollutantReleaseAndTransferReportDocument, mette a
disposizione il metodo validate.
public void validateXML(PollutantReleaseAndTransferReportDocument pratrd)
throws XmlException {
boolean isValid;
Collection errors = new ArrayList();
XmlOptions options = new XmlOptions();
xo.setErrorListener(errors);
isValid = pratrd.validate(options);
if (!isValid) {
XmlException e = new XmlException("Validation errors", null, errors);
throw e;
}
}
Per tenere traccia degli eventuali errori riscontrati in fase di validazione, si può attivare
l'opzione setErrorListener, la quale si occupa di aggiungere ad una collezione di errori un
oggetto di tipo XmlError per ogni mancata conformità del file xml rispetto a quanto
definito nello schema. All'interno dell'oggetto di tipo XmlError si può risalire facilmente ad
informazioni importanti per identificare l'errore quali:
• la linea del file in cui è presente l'errore
• il messaggio di errore
• l'elemento o l'attributo alla base dell'errore
Nel seguente metodo si può vedere come stampare informazioni relative agli errori nel
momento in cui si riceve un'eccezione di tipo XmlException durante la validazione.
public static void printErrors(XmlException e){
Iterator errorsIterator = e.getErrors().iterator();
while(errorsIterator.hasNext()){
XmlError error = (XmlError) errorsIterator.next();
System.err.println("Line "+ error.getLine()+": "+error.getMessage());
}
}
Da notare che il numero di linea in cui si è verificato l'errore è disponibile solo nel caso in
cui in fase di lettura del file contenente l'errore è stata attivata l'opzione
setLoadLineNumbers.
32
38. 7.4 Mybatis
7.4.1 Connessione al Server SQL
MyBatis è un framework per la persistenza che offre supporto per scrivere delle query,
delle stored procedures o mapping avanzati attraverso l’uso di SQL e semplici regole di
XML o attraverso l’uso delle Annotations. La principale caratteristica è che grazie a MyBatis
viene eliminata la necessità di scrivere codice JDBC, di settare manualmente i parametri di
connessione al DB e inoltre anche il retrieve dei risultati risulta essere automatico. Ogni
applicazione di MyBatis gira intorno all’istanza di SqlSessionFactory. Un’istanza di questo
oggetto può essere ottenuta grazie alla classe SqlSessionFactoryBuilder, che prende in
pasto un file XML (o un’istanza della classe Configuration).
Il codice per ottenere un SqlSessionFactory attraverso un file XML è molto semplice: basta
infatti definire la risorsa che contiene il path del file, come una stringa. Opzionalmente è
possibile specificare l’environment che vorremmo che sia utilizzato.
Nel caso specifico abbiamo:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-
config.dtd">
<configuration>
<typeAliases>
<package name="com.sefiant.units.projectx.bean"/>
</typeAliases>
<environments default="sviluppo">
<environment id="sviluppo">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property value="com.microsoft.sqlserver.jdbc.SQLServerDriver"name="driver"/>
<property value="jdbc:sqlserver://localhost:1433;integratedSecurity=true;databaseName=E-PRTR;"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sefiant/units/projectx/prs/dao/Activity.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/CompetentAuthorityParty.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/FacilityReport.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/PollutantRelease.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/PollutantReleaseMethodUsed.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/PollutantTransfer.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/PollutantTransferMethodUsed.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/WasteTransfer.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/WasteTransferMethodUsed.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/WasteHandlerParty.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/ProductionVolume.xml" />
<mapper resource="com/sefiant/units/projectx/prs/dao/PollutantReleaseAndTransferReport.xml" />
</mappers>
</configuration>
33
39. Una volta ottenuta la SqlSessionFactory, per ottenere una SqlSession basta invocare il
metodo openSession().
SqlSession session = SqlSessionFactory.openSession(); //Per Aprire La Sessione
session.commit(); //Per Effettuare un Commit
session.close(); //Per Chiudere la Sessione
Una volta ottenuta la SqlSession e finita la fase di setup e sarà possibile utilizzare MyBatis
per interrogare e/o modificare il DB.
7.4.2 Mapping del DB
Vengono realizzati i mapper che ci permetteranno di inserire le informazioni nelle tabelle
del DB. Per prima cosa realizziamo i file [NomeTabella]DAO.java per ogni tabella i quali
rappresentano le interfacce contenenti i metodi che andremo a invocare. In seguito sono
stati creati i relativi file XML [NomeTabella].xml i quali contengono le query che verranno
eseguite sul database. Le query utilizzate per questo progetto sono essenzialmente due:
1. Una INSERT che preleva i dati dagli oggetti java (riempiti tramite lettura del file
XML) e li inserisce all’interno delle tabelle del DB.
2. Una SELECT che salva la chiave primaria subito dopo il comando INSERT e la
inserisce nel relativo oggetto java. Questa operazione è necessaria quando il
contenuto della chiave primaria appena inserita viene usato per essere
successivamente inserito come chiave esterna in un'altra tabella.
34
40. 7.5 Interfaccia Grafica
7.5.1 Descrizione
Finita la progettazione riguardante la connessione al server, la lettura del file XML e
l’inserimento dei dati nel DB, ci si è occupati di creare un interfaccia grafica per
l’applicativo. L’obbiettivo dell’interfaccia grafica è principalmente quello di aumentare
l’usabilità del sistema e di creare un interfaccia User-Friendly che permetta la selezione del
file XML da inserire posto all’interno del file system.
Figura 8: GUI XML Importer
L’interfaccia prevede, oltre a quelli classici windows, due bottoni: il primo apre la
visualizzazione del file system per permettere all’utente di cercare il file XML da inserire, il
secondo avvia l’import dei dati all’interno del database. Fin quando non è stato selezionato
un file Xml ovviamente non è possibile cliccare il bottone “Import”. Una volta cliccato
“Select xml..” si ottiene la seguente interfaccia per la selezione del file all’interno del file
system.
Figura 9: Interfaccia di selezione file
35
41. Selezionato il file il programma conferma a console il nome del file selezionato e il bottone
“Import” diventa cliccabile.
Figura 10: Interfaccia Precaricamento file
Cliccando su “Import” si avvia la procedura di caricamento dei dati presenti nell’XML e il
programma informa l’utente dell’avvenuto caricamento o del fallimento (in caso di errori di
forma nel file XML) della procedura.
Figura 11: Interfaccia Completamento Operazione
7.5.2 Codice
package com.sefiant.units.projectx.swing;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;
import com.sefiant.units.projectx.XmlEngine;
public class XmlImporterSwing extends JPanel {
private static final long serialVersionUID = 4026831139065829791L;
private static final String newline = "n";
private JButton openButton, saveButton;
private JTextArea log;
private JFileChooser fc;
private File fileXml;
36
42. public XmlImporterSwing() {
super(new BorderLayout());
//Create the log first, because the action listeners
//need to refer to it.
log = new JTextArea(5,20);
log.setMargin(new Insets(5,5,5,5));
log.setEditable(false);
JScrollPane logScrollPane = new JScrollPane(log);
//Create a file chooser
fc = new JFileChooser();
//Add a custom file filter and disable the default
//(Accept All) file filter.
fc.addChoosableFileFilter(new XmlFilter());
fc.setAcceptAllFileFilterUsed(false);
//Create the open button. We use the image from the JLF
//Graphics Repository (but we extracted it from the jar).
openButton = new JButton("Select xml...", createImageIcon("images/Open16.gif"));
openButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Handle open button action.
int returnVal = fc.showOpenDialog(XmlImporterSwing.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
fileXml = fc.getSelectedFile();
//This is where a real application would open the file.
log.append("File selezionato: " + fileXml.getName() + "." + newline);
saveButton.setEnabled(true);
} else {
log.append("Comando cancellato dall'utente." + newline);
}
log.setCaretPosition(log.getDocument().getLength());
}
});
//Create the save button. We use the image from the JLF
//Graphics Repository (but we extracted it from the jar).
saveButton = new JButton("Import", createImageIcon("images/Save16.gif"));
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//Handle save button action.
Thread worker = new Thread() {
public void run() {
openButton.setEnabled(false);
saveButton.setEnabled(false);
log.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
log.append("Importazione file in corso..." + newline);
try {
//Do the XML import
XmlEngine xe = new XmlEngine();
xe.processaFile(fileXml.getAbsolutePath());
log.append("File " + fileXml.getName() + " importato." + newline);
} catch (Exception e){
e.printStackTrace();
log.append("Errore durante l'importazione del file " +
fileXml.getName() + ": " + e.getMessage() + newline);
}
log.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
openButton.setEnabled(true);
saveButton.setEnabled(true);
}
};
worker.start();
log.setCaretPosition(log.getDocument().getLength());
37
43. }
}
saveButton.setEnabled(false);
//For layout purposes, put the buttons in a separate panel
JPanel buttonPanel = new JPanel(); //use FlowLayout
buttonPanel.add(openButton);
buttonPanel.add(saveButton);
//Add the buttons and the log to this panel.
add(buttonPanel, BorderLayout.PAGE_START);
add(logScrollPane, BorderLayout.CENTER);
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = XmlImporterSwing.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
/**
* Create the GUI and show it
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Xml importer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add content to the window.
frame.add(new XmlImporterSwing());
frame.setResizable(false);
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
frame.setLocation(screenWidth / 3, screenHeight / 3);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//Turn off metal's use of bold fonts
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
}
}
}
38
44. 8.Conclusioni
Lo sviluppo del sistema informativo commissionato è risultato di grosso interesse anche a
livello formativo. L’utilizzo di un software proprietario come SQL Server mi ha dato la
possibilità di studiare e analizzare oltre che un nuovo tool, un nuovo linguaggio di
interrogazione di database collegato con l’universalità del linguaggio XML.
L’apprendimento è stato lento inizialmente, ma i problemi richiesti sono stati affrontati e
risolti senza troppe difficoltà.
L’impiego ha occupato una trentina di ore per l’apprendimento di caratteristiche avanzate,
mentre circa 200 ore sono state dedicate all’analisi dello schema XML e della relativa
scrittura del codice Java.
Mi ritengo piuttosto soddisfatto della possibilità fornitami, poiché l’apprendimento di un
tool a me sconosciuto all’inizio del progetto, e la possibilità di apprendere quali siano i
sistemi di gestione di unità inquinanti all’interno dell’Unione Europea, mi hanno permesso
di migliorare le mie conoscenze ed arricchire il mio curriculum.
Possibili sviluppi futuri sono:
• Presentazione dell’applicativo al committente (il progetto realizzato è infatti al
momento da considerarsi un prototipo).
• Fase di Test.
• Creazione di query e viste per migliorare l’usabilità del database.
• Creazione di una funzione che controlli il caricamento di un file XML già
precedentemente caricato.
• Creazione di una funzione che verifichi l’inserimento di un file XML già
precedentemente caricato e ne rilevi eventuali modifiche e/o errori.
• Trovare una procedura che modifichi il caricamento del file ad ogni aggiornamento
dello schema XML fornito dall’Unione Europea.
• Creazione di documentazione necessaria relativa al database.
39
45. Bibliografia
Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone – Basi di dati - Modelli e
linguaggi di interrogazione
Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone – Basi di dati -
Architetture e linee di evoluzione
Cay Horstmann – Concetti di informatica e fondamenti di Java
Documentazione JAVA
• http://docs.oracle.com/javase/6/docs/api/
mybatis:
• https://code.google.com/p/mybatis/
Xmlbeans:
• http://xmlbeans.apache.org/
Risorse online per gli sviluppatori di SQL Server:
• http://msdn.microsoft.com/it-it/sqlserver/aa336270.aspx
Indice delle figure
Figura 1: Sony Vaio VPCEB1S1E ...................................................................................................... 3
Figura 2: Attivazione Protocollo TCP/IP SQL Server 2008/1 ....................................................... 5
Figura 3: Attivazione Protocollo TCP/IP SQL Server 2008/2 ....................................................... 6
Figura 4: Attivazione Protocollo TCP/IP SQL Server 2008/3 ....................................................... 6
Figura 5: Installazione Driver JDBC – XMLBeans - MyBatis ........................................................ 8
Figura 6: Schema Entity-Relationship ............................................................................................. 9
Figura 7: Schema Finale Database ............................................................................................... 27
Figura 8: GUI XML Importer .......................................................................................................... 35
Figura 9: Interfaccia di selezione file ............................................................................................ 35
Figura 10: Interfaccia Precaricamento file ................................................................................... 36
Figura 11: Interfaccia Completamento Operazione .................................................................... 36
40