Οδηγίες ενοποίησης μοντέλων με λογικά μοντέλα

Ακολουθεί ένας κατάλογος των όσων μπορούν να επιτελέσουν οι παροχείς μοντέλων προκειμένου να εκμεταλλευτούν τις λειτουργίες υποστήριξης λογικών μοντέλων μέσω των λειτουργιών συνεργασίας:

  1. Στις προβολές μοντέλου, προσαρμόζουν τα στοιχεία μοντέλου σε ResourceMapping προκειμένου να επιτρέψουν στις λειτουργίες που βασίζονται στα μοντέλα να εμφανιστούν στα στοιχεία μοντέλου.
  2. Καταχωρούν μια ModelProvider για να διασφαλίσουν ότι θα ζητηθεί η συμβουλή του μοντέλου σας όταν οι λειτουργίες εκτελούνται στους πόρους που σχετίζονται με το μοντέλο σας.
  3. Χρησιμοποιούν την κλάση ResourceChangeValidator όταν εκτελούνται λειτουργίες σε πόρους προκειμένου να διασφαλιστεί ότι οι οποιεσδήποτε, πιθανές παρενέργειες στα στοιχεία μοντέλου που σχετίζονται με τους πόρους αυτούς γνωστοποιούνται στο χρήστη.
  4. Υλοποιούν μια διεπαφή IResourceMappingMerger προκειμένου να συμμετάσχουν σε συγχωνεύσεις χωρίς γραφικό περιβάλλον που περιλαμβάνουν τους πόρους που σχετίζονται με το μοντέλο σας.
  5. Καταχωρούν μια teamContentProvider προκειμένου να συμμετάσχουν σε λειτουργίες προβολής όπως οι προεπισκοπήσεις συγχωνεύσεων.
  6. Παρέχουν μια διεπαφή IHistoryPageSource για να εμφανίσουν το ιστορικό λογικού μοντέλου στην προβολή ιστορικού συνεργασίας.
  7. Χρησιμοποιούν το ΑΡΙ συστήματος αρχείων Eclipse για να αποκτήσουν πρόσβαση στην απομακρυσμένη κατάσταση των έργων μοντέλου.
  8. Χρησιμοποιούν το ΑΡΙ SynchronizationStateTester για να διασφαλίσουν ότι θα λάβει χώρα η προσθήκη κατάλληλων διακριτικών στα στοιχεία μοντέλου που δεν έχουν αντιστοίχιση ένα-προς-ένα με πόρους.

Οι ακόλουθες ενότητες περιγράφουν με περισσότερες λεπτομέρειες κάθε ένα από αυτά τα σημεία. Η πρόσθετη λειτουργία org.eclipse.team.examples.filesystem περιέχει ένα παράδειγμα που απεικονίζει αρκετά από τα σημεία αυτά. Μπορείτε να αναλάβετε τον έλεγχο του έργου από το χώρο αποθήκευσης CVS και να το χρησιμοποιήσετε ως αναφορά, ενώ διαβάζετε το παρόν πρόγραμμα εκμάθησης. Αποποίηση ευθύνης: Ο πρωτογενής κώδικας στις πρόσθετες λειτουργίες του παραδείγματος μπορεί να αλλάξει με το χρόνο. Για να λάβετε ένα αντίγραφο για το τι ταιριάζει με όσα χρησιμοποιούνται στο παράδειγμα αυτό, μπορείτε να αναλάβετε τον έλεγχο του έργου χρησιμοποιώντας το προσδιοριστικό εκδοχής 3.2 (πιθανότατα R3_2) ή ένα προσδιοριστικό ημερομηνίας της 28ης Ιουνίου 2006.

Αντιστοιχίσεις πόρων

Το βασικό ΑΡΙ αντιστοίχισης πόρων

Το ΑΡΙ αντιστοίχισης πόρων είναι σκόπιμα απλό και παραλείπει τους χειρισμούς λογικού μοντέλου. Ο πελάτης δεν μπορεί να χρησιμοποιήσει τη διεπαφή αυτή για να παρουσιάσει λογικά μοντέλα ή να λάβει οποιαδήποτε πρόσθετη γνώση σχετικά με αυτά. Ο σκοπός της είναι απλώς η αντιστοίχιση ενός ή περισσότερων στοιχείων μοντέλου σε πόρους του χώρου εργασίας.

Το API αποτελείται από τις ακόλουθες κλάσεις:

Υπάρχουν δυο είδη πρόσθετων λειτουργιών που ενδιαφέρονται για την αντιστοίχιση πόρων: Εκείνες που παρέχουν ένα μοντέλο που αποτελείται από πόρους στο χώρο εργασίας ή που βρίσκεται μόνιμα αποθηκευμένο σε αυτούς, καθώς και εκείνες που επιθυμούν την εκτέλεση λειτουργιών σε πόρους. Οι πρώτες καλύπτονται στην επόμενη ενότητα ενώ οι τελευταίες καλύπτονται στην ενότητα Οδηγίες ενοποίησης χώρων αποθήκευσης με λογικά μοντέλα

Προσαρμογή μοντέλου σε μια ResourceMapping

Οι πρόσθετες λειτουργίες που έχουν προσαρμόσει τα αντικείμενα μοντέλου τους σε μια IResource προκειμένου να προβάλλουν συγκεκριμένες ενέργειες των πόρων στο μενού περιβάλλοντος μπορούν τώρα να προσαρμοστούν στη ResourceMapping εάν είναι περισσότερο ωφέλιμη μια πιο εμπλουτισμένη περιγραφή του τρόπου, με τον οποίο το αντικείμενο προσαρμόζεται στους πόρους. Ωστόσο, δεν είναι υποχρεωμένες να το κάνουν εάν από αυτό δεν προκύπτει όφελος. Για παράδειγμα, μια μονάδα μεταγλώττισης (όπως π.χ., ένα *.java file που εμφανίζεται σε προβολή JDT), η οποία αυτή τη στιγμή προσαρμόζεται σε IFile, δεν χρειάζεται να προσαρμοστεί σε ResourceMapping εφόσον από την προσαρμογή αυτή δεν προκύπτει κανένα όφελος. Ωστόσο, ένα πακέτο Java θα έπρεπε να προσαρμοστεί σε ResourceMapping προκειμένου να δηλώσει ότι αυτό το πακέτο αποτελείται μόνο από τα αρχεία του αντίστοιχου φακέλου και όχι των υποφακέλων.

Ο προτεινόμενος τρόπος για την προσαρμογή των στοιχείων μοντέλου σε μια αντιστοίχιση πόρων είναι μέσω της χρήσης μιας μεθόδου κατασκευής προσαρμογέων. Ακολουθεί η σήμανση XML για τη συνεισφορά μιας μεθόδου κατασκευής προσαρμογέων σε μια δήλωση πρόσθετης λειτουργίας.

   <extension
point="org.eclipse.core.runtime.adapters">
<factory
class="org.eclipse.example.library.logical.AdapterFactory"
adaptableType="org.eclipse.example.library.Book">
<adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/>
</factory>
<factory
class="org.eclipse.example.library.logical.AdapterFactory"
adaptableType="org.eclipse.example.library.Library">
<adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/>
</factory>
...
</extension>

Η υλοποίηση της μεθόδου κατασκευής προσαρμογέων θα μοιάζει κάπως έτσι:

public class AdapterFactory implements IAdapterFactory {
public Object getAdapter(Object adaptableObject, Class adapterType) {
if((adaptableObject instanceof EObject) && adapterType == ResourceMapping.class) {
return new EObjectResourceMapping((EObject)adaptableObject);
}
return null;
}

public Class[] getAdapterList() {
return new Class[] {ResourceMapping.class};
}
}

Τα αντικείμενα μοντέλου μπορούν να υλοποιήσουν τη διεπαφή IAdaptable. Όταν το κάνουν, θα πρέπει να έχουν εξασφαλίσει ότι ζητείται η συμβουλή της λειτουργίας διαχείρισης του προσαρμογέα πλατφόρμας. Αυτό είναι εφικτό είτε μέσω της δημιουργίας υποκλάσης για την κλάση PlatformObject είτε μέσω της χρήσης της ακόλουθης γραμμής κώδικα:

Platform.getAdapterManager().getAdapter(Object, Class)

Το παραπάνω αποτελεί την προτιμητέα μέθοδο. Ωστόσο, το αντικείμενο μοντέλου μπορεί να υλοποιήσει τη διεπαφή IAdaptable και όταν απαιτηθεί να υλοποιήσει την getAdapter(Class) για να δημιουργηθεί μια χρήση της ResourceMapping. Η μέθοδος αυτή είναι αμεσότερη, αλλά είναι και η λιγότερο επιθυμητή, καθώς το μοντέλο πρέπει να έχει ρητή γνώση της προσαρμογής σε πόρους.

Σε ορισμένες περιπτώσεις, ο παροχέας ενός λογικού μοντέλου ίσως να μην επιθυμεί την προσαρμογή του μοντέλου του σε IResource σε κάθε περιβάλλον, ενώ σε άλλες περιπτώσεις να επιθυμεί το αντικείμενο να προσαρμόζεται διαφορετικά για συνεισφορές αντικειμένων και διαφορετικά για άλλα περιβάλλοντα. Ο πάγκος εργασίας UI παρέχει για αυτό τον σκοπό έναν ιδιαίτερο, ενδιάμεσο ΑΡΙ παροχέα, τον IContributorResourceAdapter. Όταν τα αντικείμενα προσαρμόζονται σε IResource στο περιβάλλον συνεισφορών αντικειμένων, ο πάγκος εργασίας αποπειράται πρώτα να προσαρμόσει τον πόρο σε IContributorResourceAdapter προτού προσπαθήσει να τον προσαρμόσει απευθείας σε IResource. Προστέθηκε μια νέα υποδιεπαφή της διεπαφής IContributorResourceAdapter2, η οποία παρέχει την ίδια δυνατότητα για τη ResourceMapping. Η μόνη διαφορά είναι ότι ο παροχέας μοντέλων πρέπει να δηλώσει μια μέθοδο κατασκευής για την IContributorResourceAdapter επειδή ο πάγκος εργασίας ελέγχει (μέσω της instanceof) αν ο συνεισφερόμενος παροχέας αποτελεί επίσης χρήση της IContributorResourceAdapter2.

Η εφαρμογή της υποκλάσης ResourceMapping για ένα πακέτο Java θα έχει μια μορφή σαν την ακόλουθη:

public class JavaPackageResourceMapping extends ResourceMapping {
IPackageFragment package;
...
public getModelObject() {
return package;
}
public ResourceTraversals[] getTraversals(
ResourceMappingContext context,
IProgressMonitor monitor) {
return new ResourceTraversal[] {
new ResourceTraversal(
new IResource[] { package.getCorrespondingResource() },
IResource.DEPTH_ONE, IResource.NONE)
}
}
}

Η παραπάνω αποτελεί μια αρκετά άμεση αντιστοίχιση, οπότε η υλοποίηση δεν είναι σύνθετη. Η πολυπλοκότητα της υλοποίησης της αντιστοίχισης πόρων θα διαφέρει βεβαίως από μοντέλο σε μοντέλο.

Περιβάλλον αντιστοίχισης πόρων

Ένα από τα πλεονεκτήματα του ΑΡΙ αντιστοίχισης πόρων είναι ότι επιτρέπει στις πρόσθετες λειτουργίες να υλοποιήσουν οποιαδήποτε λειτουργία επιθυμούν σχετικά με την αντιστοίχιση πόρων (για παράδειγμα, ενημέρωση CVS, δέσμευση CVS, προσδιοριστικά CVS, διακριτικά εκκρεμών αλλαγών κλπ.). Ωστόσο, το ΑΡΙ που έχουμε έως τώρα συναντήσει ασχολείται μόνο με την τοπική κατάσταση του μοντέλου. Όταν εργάζεστε με μοντέλα, των οποίων η χρήση είναι κοινή ανάμεσα στους προγραμματιστές, η απομακρυσμένη κατάσταση του μοντέλου (δηλαδή, η κατάσταση του μοντέλου, του οποίου την ανάληψη ελέγχου στο χώρο αποθήκευσης έχει ένας άλλος χρήστης) ίσως διαφέρει από την κατάσταση στο χώρο εργασίας. Εάν εκτελέσετε ενημέρωση CVS, θα θέλετε η τοπική κατάσταση του μοντέλου να ταιριάζει με την απομακρυσμένη κατάσταση ακόμη και αν αυτό σήμαινε ότι θα χρειαζόταν η προσθήκη ή η αφαίρεση ορισμένων αρχείων.

Το παραπάνω δεν αποτελεί πρόβλημα για ορισμένα λογικά μοντέλα. Για παράδειγμα, ένα πακέτο java είναι μια θέση υποδοχής, στην οποία πραγματοποιείται επίσκεψη βάθους ένα (1) ανεξάρτητα από την απομακρυσμένη κατάσταση του μοντέλου. Δεδομένου του παραπάνω, ένας παροχέας χώρου αποθήκευσης μπορεί εύκολα να καθορίσει ότι οι εξερχόμενες διαγραφές θα συμπεριλαμβάνονται σε περιπτώσεις δέσμευσης ή ότι οι εισερχόμενες προσθήκες θα συμπεριλαμβάνονται σε περιπτώσεις ενημέρωσης. Ωστόσο, οι πόροι που αποτελούν ορισμένα λογικά μοντέλα μπορεί να αλλάζουν με τον καιρό. Για παράδειγμα, οι πόροι που αποτελούν ένα στοιχείο μοντέλου ίσως εξαρτώνται από τα περιεχόμενα ενός αρχείου δήλωσης (ή ενός άλλου παρόμοιου μηχανισμού). Προκειμένου η αντιστοίχιση πόρων να επιστρέψει την ορθή διάσχιση, πρέπει να αποκτήσει πρόσβαση στα απομακρυσμένα περιεχόμενα του αρχείου δήλωσης (εάν αυτά διαφέρουν από τα τοπικά περιεχόμενα) έτσι ώστε να διαπιστώσει εάν υπάρχουν πρόσθετοι πόροι που πρέπει να συμπεριληφθούν. Οι πρόσθετοι αυτοί πόροι ίσως να μην υπάρχουν στο χώρο εργασίας, ο παροχέας χώρου αποθήκευσης όμως γνωρίζει πώς να διαπιστώσει ότι υπήρχαν τη στιγμή εκτέλεσης της επιλεγμένης ενέργειας.

Για την υποστήριξη αυτών των συνθετότερων μοντέλων, μπορεί να μεταβιβαστεί μια RemoteResourceMappingContext στη μέθοδο ResourceMapping#getTraversals. Εάν παρέχεται περιβάλλον, η αντιστοίχιση μπορεί να το χρησιμοποιήσει για να διασφαλίσει ότι όλοι οι απαραίτητοι πόροι περιλαμβάνονται στη διάσχιση. Εάν δεν παρέχεται περιβάλλον, η αντιστοίχιση μπορεί να υποθέσει ότι μόνο η τοπική κατάσταση έχει σημασία.

Πότε η ResourceMapping πρέπει να ανησυχήσει για το RemoteResourceMappingContext;

Η ResourceMapping πρέπει να ανησυχήσει για το περιβάλλον που παρέχεται στη μέθοδο getTraversals μόνο στις περιπτώσεις, κατά τις οποίες οι πόροι που απαρτίζουν ένα μοντέλο αλλάζουν με το πέρασμα του χρόνου και η σχέση μεταξύ του μοντέλου και των πόρων δεν μπορεί να περιγραφεί από μια απλή διάσχιση, η οποία να εγγυάται ότι περιλαμβάνει τους πόρους αυτούς (και μόνο τους πόρους αυτούς), οι οποίοι αποτελούν το μοντέλο. Για παράδειγμα, παρΆ όλο που οι πόροι ενός πακέτου Java μπορεί να αλλάξουν με τον καιρό, το πακέτο μπορεί να περιγραφεί ως ένας φάκελος βάθους ένα (1), οπότε η αντιστοίχιση πόρων για τα πακέτα java δεν θα χρειάζεται να χρησιμοποιήσει το περιβάλλον της αντιστοίχισης πόρων.

Για ένα πιο σύνθετο παράδειγμα, ας υποθέσουμε ότι έχουμε ένα αρχείο HTML που περιέχει διάφορες εικόνες. Ας υποθέσουμε ότι όλες οι παραπομπές εικόνας από ένα αρχείο HTML αποτελούν μέρος του μοντέλου του αρχείου αυτού. Κατά την ενημέρωση των τοπικών περιεχομένων του αρχείου HTML από ένα χώρο αποθήκευσης, ο χρήστης θα περίμενε ότι θα συμπεριλαμβανόταν κάθε νέα εικόνα. Η μέθοδος getTraversals για ένα ResourceMapping για το μοντέλο του αρχείου HTML θα έχει μορφή παρόμοια με την ακόλουθη:

public class HTMLResourceMapping extends ResourceMapping {
private HTMLFile htmlFile;
public ResourceTraversal[] getTraversals(ResourceMappingContext context,
IProgressMonitor monitor)
IResource[] resources = htmlFile.getResources();
if (context instanceof RemoteResourceMappingContext) {
// Look for any additional resources on the server
RemoteResourceMappingContext remoteContext = (RemoteResourceMappingContext)context;
IFile file = htmlFile.getFile();
if (remoteContext.hasRemoteChange(file, monitor)) {
IStorage storage = remoteContext.fetchRemoteContents(file, monitor);
IResource[] additionalResources = getReferences(storage.getContents());
resources = combine(resources, additionalResources);
}
if (remoteContext.isThreeWay() && remoteContext.hasLocalChange(file, monitor)) {
IStorage storage = remoteContext.fetchBaseContents(file, monitor);
IResource[] additionalResources = getReferences(storage.getContents());
resources = combine(resources, additionalResources);
}
}
return new ResourceTraversal[] {
new ResourceTraversal(resources, IResource.DEPTH_ZERO, IResource.NONE)};
}
}

Σημειώστε ότι υπάρχουν δυο σύνολα πόρων που περιλαμβάνονται στο μοντέλο: το σύνολο των πόρων που προέρχονται από τα τοπικά περιεχόμενα του αρχείου HTML στο χώρο εργασίας και το σύνολο των πόρων που έχουν ληφθεί από τα περιεχόμενα του απομακρυσμένου αρχείου και του αρχείου βάσης. Σε κάθε ένα από αυτά τα δυο σύνολα, μπορεί να υπάρχουν πόροι που δεν υφίστανται στο χώρο εργασίας. Για παράδειγμα, το τοπικό αρχείο HTML μπορεί να περιέχει μια σχετική διασύνδεση σε μια εικόνα που δεν υπάρχει στο χώρο εργασίας. Ο πόρος αυτός θα πρέπει να συμπεριληφθεί έτσι ώστε να ανακτηθεί εάν υπάρχει απομακρυσμένα. Όσο για το απομακρυσμένο αρχείο, αυτό ίσως περιέχει ένα νέο αντίγραφο που να παραπέμπει σε πρόσθετες εικόνες που θα πρέπει να ανακτηθούν μετά τη μεταφόρτωση των νέων, απομακρυσμένων περιεχομένων.

Παροχείς μοντέλων

Οι παροχείς μοντέλων αποτελούν μέσο ομαδοποίησης σχετικών αντιστοιχίσεων πόρων. Εδώ, βρίσκεται η διασύνδεση που οδηγεί στην κλάση ModelProvider. Η κλάση αυτή εξυπηρετεί τρεις κύριους σκοπούς:

  1. Από τον παροχέα μοντέλων, οι πελάτες μπορούν να λάβουν πρόσθετα τμήματα API για την εκτέλεση λειτουργιών σε ένα σύνολο αντιστοιχίσεων πόρων χρησιμοποιώντας τον προσαρμόσιμο μηχανισμό. Για παράδειγμα, η IResourceMappingMerger για το μοντέλο λαμβάνεται μέσω της προσαρμογής του παροχέα μοντέλων.
  2. Με δεδομένο ένα σύνολο πόρων συστήματος αρχείων, οι πελάτες μπορούν να υποβάλλουν ερωτήματα σχετικά με το αν ένας παροχέας μοντέλων διαθέτει στοιχεία μοντέλου αποθηκευμένα στους πόρους αυτούς και, εάν πράγματι διαθέτει, να λάβουν το σύνολο των αντιστοιχίσεων πόρων που περιγράφουν τη σχέση.
  3. Σχετικά με τις λειτουργίες σε ένα σύνολο πόρων, η λειτουργία επικύρωσης αλλαγής πόρου θα υποβάλλει ερώτημα στους παροχείς μοντέλων προκειμένου να καθορίσει εάν μια λειτουργία προκαλεί πιθανές παρενέργειες, για τις οποίες οι χρήστες θα πρέπει να είναι ενήμεροι. Το παραπάνω καλύπτεται σε ξεχωριστή ενότητα στην επικύρωση αλλαγής.

Το ακόλουθο αποτελεί παράδειγμα ορισμού επέκτασης modelProvider.

   <extension
id="modelProvider"
name="Library Example"
point="org.eclipse.core.resources.modelProviders">
<modelProvider
class="org.eclipse.team.examples.library.adapt.LibraryModelProvider"
name="Library Example"/>
<extends-model id="org.eclipse.core.resources.modelProvider"/>
<enablement> <test property="org.eclipse.core.resources.projectNature" value="org.eclipse.team.examples.library.view.nature" />
</enablement>
</extension>

Η LibraryModelProvider είναι υποκλάση της κλάσης ModelProvider. Ο κανόνας ενεργοποίησης (enablement) χρησιμοποιείται για την αντιστοίχιση πόρων στους οποίους το μοντέλο βιβλιοθήκης αποθηκεύει το μοντέλο του. Στο παραπάνω παράδειγμα, ο παροχέας μοντέλων θα αντιστοιχίσει κάθε πόρο σε ένα έργο που έχει τη φύση library.

Εφόσον ο παροχέας μοντέλων έχει οριστεί, η μέθοδος ResourceMapping#getModelProviderId() θα πρέπει να αντικατασταθεί για να επιστρέψει την ταυτότητα του παροχέα μοντέλων.

   public String getModelProviderId() {
return "org.eclipse.team.examples.library.adapt.modelProvider";
}

Για να λάβετε τη σωστή, αντίστροφη αντιστοίχιση προς τους πόρους που αντιστοιχούν στον κανόνα ενεργοποίησης του παροχέα σας, θα πρέπει επιπλέον να αντικαταστήσετε τη μία ή και τις δυο μεθόδους getMapping. Η μέθοδος που θα χρειαστεί να αντικαταστήσετε εξαρτάται από το αν το μοντέλο σας έχει στοιχεία που περιέχουν πολλαπλούς πόρους ή όχι. Εάν τα στοιχεία του μοντέλου αντιστοιχούν σε ένα και μοναδικό πόρο, μπορείτε να αντικαταστήσετε τη μέθοδο που δέχεται ένα και μοναδικό όρισμα IResource. Στην αντίθετη περίπτωση, θα πρέπει να αντικαταστήσετε τη μέθοδο που δέχεται έναν πίνακα πόρων. Ακολουθεί ένα παράδειγμα που χρησιμοποιεί την περίπτωση του ενός και μοναδικού πόρου.

Στο παράδειγμα αυτό, η μέθοδος περικλείει ένα αρχείο μοντέλου βιβλιοθήκης στην κατάλληλη αντιστοίχιση πόρων, καθώς επίσης και τους φακέλους που περιέχουν αρχεία που ενδιαφέρουν τον παροχέα μοντέλων.

public class LibraryModelProvider extends ModelProvider {
public ResourceMapping[] getMappings(IResource resource,
ResourceMappingContext context, IProgressMonitor monitor) {
if (isModelFile(resource)) {
// Return a resource mapping on the file
return new LibraryResourceMapping(resource);
} if (containsModelFiles(resource)) {
// Create a deep resource mapping on the container
return new LibraryContainerResourceMapping(resource);
}
// The resource is not of interest to this model provider
return null;
}
}

Οι πελάτες μπορούν κατόπιν να αποκτήσουν πρόσβαση στον παροχέα μοντέλων προκειμένου να καθορίσουν εάν αυτός ενδιαφέρεται για τους πόρους, οι οποίοι ετοιμάζονται να λειτουργήσουν. Η επόμενη ενότητα περιγράφει το API που θα παρασχεθεί σε λειτουργίες συνεργασίας, οι οποίες χρησιμοποιούν το ΑΡΙ παροχέα μοντέλων για τον καθορισμό του πλήρους συνόλου των αντιστοιχίσεων πόρων που θα λειτουργήσουν κατά την εκτέλεση μιας λειτουργίας συνεργασίας σε ένα σύνολο επιλεγμένων πόρων ή στοιχείων μοντέλου.

Επικύρωση αλλαγής πόρων

Οι λειτουργίες που εκτελούνται σε πόρους θα πρέπει πρώτα να επικυρώνονται προκειμένου να διασφαλίσουν ότι ο χρήστης είναι ενήμερος για οποιαδήποτε πιθανή παρενέργεια. Ακολουθούν τα απαραίτητα βήματα για την επικύρωση της αλλαγής πόρου.

  1. Δομήστε μια περιγραφή της αλλαγής χρησιμοποιώντας τη διεπαφή IResourceChangeDescriptionFactory. Η μέθοδος κατασκευής παράγει μια IResourceDelta που αντανακλά την όψη που θα έχουν τα τροποποιημένα στοιχεία πόρου που προκύπτουν από τη στιγμή που η λειτουργία θα έχει εκτελεστεί.
  2. Επικυρώστε την αλλαγή χρησιμοποιώντας την κλάση ResourceChangeValidator. Η λειτουργία επικύρωσης συμβουλεύεται όλους τους παροχείς μοντέλων που έχουν καταχωρίσει το ενδιαφέρον τους για τους πόρους που έχουν επηρεαστεί από την αλλαγή. Το αποτέλεσμα είναι μια ή περισσότερες καταστάσεις που περιέχουν την ταυτότητα του μοντέλου από το οποίο προέρχονται και την περιγραφή της πιθανής παρενέργειας της λειτουργίας στο μοντέλο αυτό.
  3. Ενημερώστε το χρήστη για κάθε πιθανή παρενέργεια από μοντέλα που είναι άγνωστα στον εντολέα της λειτουργίας. Για παράδειγμα, εάν μια βελτιστοποίηση δομής Java refactoring έχει υποστεί παρενέργεια από το μοντέλο Java, αυτή η παρενέργεια μπορεί να αγνοηθεί μιας και η βελτιστοποίηση δομής κατανοεί τη σημασιολογία του μοντέλου Java. Ωστόσο, εάν μια παρενέργεια από το μοντέλο βιβλιοθήκης επιστραφεί, αυτό θα πρέπει να γνωστοποιηθεί στο χρήστη μιας και η Java δεν έχει γνώση των μοντέλων βιβλιοθήκης.

Συγχώνευση βάσει μοντέλων

Όταν ένας παροχέας συνεργασίας αποπειράται να εκτελέσει συγχώνευση χωρίς γραφικό περιβάλλον, ακολουθεί τα παρακάτω βήματα:

  1. Λαμβάνει τις αντιστοιχίσεις πόρων από τα επιλεγμένα στοιχεία
  2. Καθορίζει τους συμμετέχοντες παροχείς μοντέλων χρησιμοποιώντας τη μέθοδο ResourceMapping#getModelProvider().
  3. Επεκτείνει την εμβέλεια της λειτουργίας έτσι ώστε να συμπεριληφθούν όλες οι απαραίτητες αντιστοιχίσεις πόρων.
  4. Δομεί μια περιγραφή της κατάστασης συγχρονισμού ανάμεσα στην τοπική και την απομακρυσμένη κατάσταση. Η περιγραφή αυτή παρέχεται στα μοντέλα μέσω του ΑΡΙ IMergeContext.
  5. Προσαρμόζει τους παροχείς μοντέλων σε IResourceMappingMerger.
  6. Καλεί τη μέθοδο validateMerge σε κάθε λειτουργία συγχώνευσης, μεταβιβάζοντας την περιγραφή συγχρονισμού έτσι ώστε να διασφαλίσει ότι δεν υφίσταται καμία συνθήκη που θα μπορούσε να αποτρέψει τη συγχώνευση.
  7. Αναθέτει τη συγχώνευση στις λειτουργίες συγχώνευσης μοντέλων.
  8. Οι παροχείς μοντέλων μπορούν να αναθέσουν τη συγχώνευση μεμονωμένων αρχείων ξανά στον παροχέα συνεργασίας εάν επιθυμούν να ελέγξουν τη σειρά συγχώνευσης ή μπορούν να εκτελέσουν τη συγχώνευση οι ίδιοι και να σημάνουν στον παροχέα συνεργασίας την ολοκλήρωσή της.

Περιεχόμενο μοντέλων στις προβολές λειτουργιών συνεργασίας

Η παρουσίαση των στοιχείων μοντέλου στο περιβάλλον μιας λειτουργίας συνεργασίας καθίσταται δυνατή μέσω του πλαισίου κοινής λειτουργίας πλοήγησης.

Τα παραπάνω βήματα επιτρέπουν στα μοντέλα να εμφανίζονται σε πλαίσια διαλόγου που χρησιμοποιούνται από λειτουργίες συνεργασίας. Υπάρχουν και πρόσθετα βήματα που απαιτούνται για την ενοποίηση σε μια προβολή συγχώνευσης.

Προβολή "Ιστορικό"

Οι ακόλουθες υλοποιήσεις έχουν λάβει χώρα στην περιοχή του ιστορικού του αρχείου και του ιστορικού του στοιχείου μοντέλου:

Απομακρυσμένη αναζήτηση

Τα ακόλουθα παρέχονται για την υποστήριξη απομακρυσμένης αναζήτησης:

Προσθήκη διακριτικών στα στοιχεία μοντέλου με την κατάσταση συνεργασίας

Οι παροχείς συνεργασίας μπορούν να προσθέσουν διακριτικά στα στοιχεία μοντέλου, μετατρέποντας τα διακριτικά μειωμένων λειτουργιών για να εργαστούν για τις αντιστοιχίσεις πόρων με τον ίδιο τρόπο που μετατρέπονται οι συνεισφορές αντικειμένων για να εργαστούν για αντιστοιχίσεις πόρων. Ωστόσο, υπάρχει μια πλευρά της προσθήκης διακριτικών στα στοιχεία λογικών μοντέλων που είναι προβληματική. Εάν ένα στοιχείο μοντέλου δεν έχει αντιστοίχιση ένα-προς-ένα με έναν πόρο, το στοιχείο μοντέλου ίσως να μη λάβει την ενημέρωση ετικέτας όταν ο υποκείμενος πόρος αλλάξει.

Για την αντιμετώπιση αυτού του προβλήματος, εισήχθη η κλάση ITeamStateProvider για να παράσχει στους παροχείς μοντέλων πρόσβαση στις αλλαγές κατάστασης που μπορεί να επηρεάσουν τα διακριτικά συνεργασίας. Επιπλέον, οι προβολές μοντέλων μπορούν να χρησιμοποιήσουν μια κλάση SynchronizationStateTester για να καθορίσουν πότε η ετικέτα ενός στοιχείου λογικού μοντέλου χρειάζεται ενημέρωση. Το API αυτό βασίζεται στη διεπαφή ITeamStateProvider για να καθορίσει πότε η κατάσταση συνεργασίας του πόρου άλλαξε και μπορεί να μεταβιβαστεί σε ένα διακριτικό συνεργασίας ως μέρος μιας διεπαφής IDecorationContext.