Eclipsen ominaisuuksiin kuuluvat ohjelmointirajapinnat, joiden avulla voi hallita työtilan resurssien ja toisessa sijainnissa olevien resurssien välisen synkronoinnin tilaa ja tuoda tilan näyttöön. Työtilan ulkopuolella olevia resursseja kutsutaan resurssien muunnoksiksi. Synkronoinnissa eri paikoissa olevien resurssien väliset erot tuodaan näyttöön ja käyttäjä voi mahdollisesti vaikuttaa synkronoinnin tilaan tekemällä toiminnon. Synkronoinnin ohjelmointirajapinnat ovat ortogonaalisia RepositoryProvider-ohjelmointirajapintoihin nähden, ja niitä voi käyttää ilman tietovaraston toimittajaa. Synkronoinnin ohjelmointirajapinnan tarkoituksena on helpottaa resurssien synkronointitilan esittämiseen käytettyjen erilaisten menetelmien käyttöönottoa. Näin ollen ohjelmointirajapinnan on voitava lähettää kysely resurssien synkronointitilasta, mutta se ei tarvitse mitään keinoja tilan muuttamiseksi. Tilan muuttoon vaikuttavat keinot jätetään toteuttajalle (joskin käyttöliittymässä on ripustimia, joiden avulla valikkoihin voi lisätä toimittajakohtaisia valikoiden vaihtoehtoja).
Ennen synkronoinnin ohjelmointirajapinnan kuvausta kannattaa tutustua termeihin ja käsitteisiin, jotka liittyvät työtilan synkronointiin.
Resurssimuunnos: Paikallista resurssia, joka on määritetty vastaamaan toisessa sijainnissa olevaa resurssia, voidaan kutsua kyseisen resurssin muunnokseksi. Resurssit ovat yleensä hyvin samankaltaisia, mutta ne saattavat erota toisistaan hieman (joko paikallista resurssia on muutettu tai muut käyttäjät ovat muuttaneet sen etäversiota). Ohjeissa ja dokumentaatiossa käytetään paikalliseen työtilaan keskittyvää näkökulmaa, jolloin paikallista versiota kutsutaan resurssiksi ja mahdollisia etäversioita kutsutaan resurssimuunnoksiksi.
Synkronointi: Synkronoinniksi kutsutaan resurssin muunnosten välisten erojen esitystä käyttäjälle. Synkronointi ei vaikuta muunnosten tilaan, mutta tuo näyttöön näkymän, jonka avulla käyttäjä voi selvittää muunnosten väliset erot. Synkronoinnin yhteydessä käyttäjälle annetaan kuitenkin usein mahdollisuus vaikuttaa muunnosten tilaan (eli käyttäjä voi kuitata sisään tai palauttaa).
Kaksisuuntainen ja kolmisuuntainen synkronointi: Synkronointitilan määritykseen on kaksi peruskeinoa: kaksisuuntainen ja kolmisuuntainen vertailu. Kaksisuuntaisessa vertailussa verrataan vain paikallista resurssia ja yksittäistä resurssimuunnosta, jota kutsutaan etäresurssimuunnokseksi. Tällaisessa resurssissa näyttöön voidaan tuoda vain kahden resurssin väliset erot mutta ei tietoa siitä, millaisessa suhteessa muutokset ovat toisiinsa. Useimmat koodin tietovarastojärjestelmät tukevat kolmisuuntaista vertailua synkronointitilan määritystä varten. Tällaisessa vertailussa käytetään paikallista resurssia, etäresurssimuunnosta ja perusresurssimuunnosta. Perusresurssimuunnos edustaa paikallisen resurssin ja etäresurssin yhteistä esijäsentä. Tällöin synkronointitilat voidaan esittää tarkemmin niin, että myös muutoksen suunta ilmoitetaan.
Taulukko 1: Synkronointitilat
Kaksisuuntainen Kolmisuuntainen Muuttunut
Poistettu
LisättyLähtevä muutos
Saapuva muutos
Lähtevä poisto
Saapuva poisto
Lähtevä lisäys
Saapuva lisäys
Ristiriitainen muutos
Ristiriitainen poisto
Ristiriitainen lisäys
Laajennuspisteen org.eclipse.team.core.synchronize luokkien avulla kuvataan synkronointitila. Tärkein luokka on SyncInfo, koska siinä määritetään varsinainen synkronoinnin tila. Luokkaa käytetään seuraavasti:
SyncInfo info = getSyncInfo(resource); // tämä on simuloitu metodi, jolla haetaan resurssin synkronointitiedot
int changekind = info.getKind();
if(info.getResourceComparator().isThreeWay()) {
if((changeKind & SyncInfo.DIRECTION_MASK) == SyncInfo.INCOMING) {
// tehdään jotakin
}
} else if(changeKind == SyncInfo.CHANGE) {
// tehdään jotakin muuta
}
SyncInfo-luokassa on sekä kaksisuuntaisen että kolmisuuntaisen vertailun algoritmit, ja työaseman on toimitettava resurssien vertailuun käytettävät resurssit ja luokka (IResourceVariantComparator). Seuraavassa on esimerkki muunnoksen vertailutoiminnosta:
public class TimestampVariantComparator implements IResourceVariantComparator {
protected boolean compare(IResourceVariant e1, IResourceVariant e2) {
if(e1.isContainer()) {
if(e2.isContainer()) {
return true;
}
return false;
}
if(e1 instanceof MyResourceVariant && e2 instanceof MyResourceVariant) {
MyResourceVariant myE1 = (MyResourceVariant)e1;
MyResourceVariant myE2 = (MyResourceVariant)e2;
return myE1.getTimestamp().equals(myE2.getTimestamp());
}
return false;
}
protected boolean compare(IResource e1, IResourceVariant e2) {
}
public boolean isThreeWay() {
return true;
}
}
SyncInfo info = new SyncInfo(resource, variant1, variant2, new TimestampComparator());
info.init(); // lasketaan synkronointitiedot
Paketti sisältää myös kokoelmia, jotka on suunniteltu erityisesti sisältämään SyncInfo-luokan ja suodattimet, joita voidaan käyttää SyncInfo-ilmentymiin.
Aiempien esimerkkien mukaisesti SyncInfo- ja IResourceVariantComparator-luokka mahdollistavat resurssien synkronointitilan käsittelyn. Seuraavaksi selvitetään, miten tilaa hallitaan. Synkronoinnin valvontatoiminto mahdollistaa paikallisen työtilan resurssien ja resurssimuunnosten joukon välisen synkronointitilan käsittelyn käyttämällä joko kaksisuuntaista tai kolmisuuntaista vertailua synkronoinnin valvontatoiminnon luonteen mukaan. Synkronoinnin valvontatoimintoon liittyvät seuraavat toiminnot:
Ohjelmointirajapinnat eivät määritä, kuinka synkronoinnin valvontatoiminto luodaan, vaan se jätetään varsinaisten toteutusten tehtäväksi. CVS-lisäosa esimerkiksi luo yhden synkronoinnin valvontatoiminnon suorittaessaan yhdistämisen, yhden vertailua varten ja yhden synkronoidessaan paikallisen työtilan nykyisen haaran kanssa.
Seuraavassa esimerkissä palataan ensimmäiseen SyncInfo-luokan käyttöesimerkkiin ja tutkitaan, kuinka synkronoinnin valvontatoimintoa voidaan käyttää SyncInfo-luokan käsittelyyn.
// Luodaan tiedostojärjestelmän synkronoinnin valvontatoiminto ja määritetään,
// että synkronoinnin valvontatoiminto synkronoi tiedot annetun tiedostojärjestelmän sijainnin kanssa
Subscriber subscriber = new FileSystemSubscriber("c:\temp\repo");
// Annetaan synkronoinnin valvontatoiminnon verestää tilansa
subscriber.refresh(subscriber.roots(), IResource.DEPTH_INFINITE, monitor);
// Kerätään kaikki synkronointitilat ja tulostetaan
IResource[] children = subscriber.roots();
for (int i = 0; i < children.length; i++) {
printSyncState(children[i]);
}
...
void printSyncState(Subscriber subscriber, IResource resource) {
System.out.println(subscriber.getSyncInfo(resource).toString());
IResource[] children = subscriber.members(resource);
for (int i = 0; i < children.length; i++) {
IResource child = children[i];
if(! child.exists()) {
System.out.println("Työtilassa ei ole resurssia " + resource.getFullPath());
}
printSyncState(subscriber, children[i]);
}
}
On tärkeää muistaa, että synkronoinnin valvontatoiminto tietää myös sellaisista resursseista, joita ei ole työtilassa, joten tällaiset resurssit voidaan palauttaa Subscriber#members()- ja SyncInfo#getLocal()-luokista.
Synkronointitilan hallintaa ei tässä käsitellä enempää, vaan seuraavaksi selvitetään, kuinka tila saadaan tuotua käyttäjän nähtäväksi. ISynchronizeParticipant-luokka on käyttöliittymän komponentti, joka näyttää synkronointitilan ja jossa käyttäjä voi vaikuttaa sen tilaan. Synkronoinnin osapuolet näkyvät synkronointinäkymässä, mutta ne voidaan näyttää myös valintaikkunoissa ja ohjatuissa toiminnoissa. Osapuoli on hyvin yleisluonteinen komponentti, jotta käyttäjille saadaan näytettyä kaikki synkronointitilan lajit, myös muut kuin SyncInfo- ja Subscribers-luokkiin perustuvat lajit.
Käytettävissä on myös laajennuspiste org.eclipse.team.ui.synchronizeWizards, jonka avulla voidaan lisätä ohjattu synkronoinnin luontitoiminto. Laajennuspiste vie ohjatun toiminnon yleiseen synkronointitoimintoon ja synkronointinäkymään, jolloin käyttäjät voivat helposti luoda lajisi mukaisen synkronoinnin.
Jos olet kuitenkin toteuttanut synkronoinnin valvontatoiminnon, voit hyödyntää varsinaista osapuolta SubscriberParticipant, joka toteuttaa seuraavat toiminnot:
Käsitteiden merkityksen ymmärtää parhaiten, kun niitä näkee käytettävän sopivassa esimerkissä. Paikallisten historiatietojen synkronointi -esimerkissä näytetään, kuinka kaikkia näitä osia voidaan käyttää yhdessä. Jos haluat vinkkejä kehittyneempien ohjelmointirajapintojen käytöstä, siirry kohtaan Lisätietoja synkronoinnista.