Κατά την εκτέλεση της πλατφόρμας και ενώ η πρόσθετη λειτουργία πόρων είναι ενεργή, ο χώρος εργασίας αντιπροσωπεύεται από μια χρήση του IWorkspace, που παρέχει το πρωτόκολλο για την πρόσβαση στους πόρους που περιέχει. Μια χρήση IWorkspace αναπαριστά μια συσχετισμένη συλλογή αρχείων και καταλόγων σε ένα ή περισσότερα συστήματα αρχείων. Μπορείτε να αποκτήσετε πρόσβαση στο χώρο εργασίας από την κλάση πρόσθετης λειτουργίας των πόρων (ορίζεται στο σημείο επέκτασης org.eclipse.core.resources).
IWorkspace workspace = ResourcesPlugin.getWorkspace();
Όταν η πρόσθετη λειτουργία πόρων δεν εκτελείται, ο χώρος εργασίας υπάρχει μόνο στο σύστημα αρχείων και ο χρήστης τον προβάλλει ή τον χειρίζεται μέσω τυπικών εργαλείων που βασίζονται σε αρχεία. Ας δούμε τη μορφή ενός χώρου εργασίας στο δίσκο καθώς εξηγούμε το API πρόσθετης λειτουργίας πόρων.
Κατά την εκκίνηση της πλατφόρμα SDK, σας ζητήθηκε να παράσχετε έναν κατάλογο με το όνομα workspace. Αυτός είναι ο κατάλογος όπου διάφορες πρόσθετες λειτουργίες αποθηκεύουν ενδιαφέροντα μετα-δεδομένα, τα οποία είναι μοναδικά για μια συγκεκριμένη χρήση της πλατφόρμας. Ως προεπιλογή, η πρόσθετη λειτουργία πόρων αποθηκεύει κάθε έργο σε έναν υποκατάλογο του καταλόγου του χώρου εργασίας. Μέσα σε αυτούς τους υποκαταλόγους υπάρχουν φάκελοι και αρχεία τα οποία περιέχονται σε κάθε έργο.
Ασ υποθέσουμε ότι για το χώρο εργασίας σας επιλέγετε τον κατάλογο c:\MySDK\workspace. Μέσα στον κατάλογο αυτό, βρίσκουμε υποκαταλόγους με τα ονόματα των έργων MyWeb και MyServlet του χώρου εργασίας. Ονομάζονται κατάλογοι περιεχομένου έργου. Οι κατάλογοι περιεχομένου δημιουργούνται από την πλατφόρμα όταν ο χρήστης δημιουργεί κάποιο έργο.
Μέσα στον κάθε κατάλογο, βρίσκουμε τα αρχεία και τους φακέλους του έργου, με την ίδια ακριβώς διάταξη με αυτήν που υπάρχει στην διακλάδωση πόρων του χώρου εργασίας. Όλα τα ονόματα αρχείων είναι τα ίδια, και τα περιεχόμενα των αρχείων είναι τα ίδια είτε η πρόσβασή τους γίνεται από το σύστημα αρχείων είτε από το χώρο εργασίας. Η μόνη διαφορά είναι το αρχείο .έργο, που εξηγείται στη στιγμή.
C:\MySDK\workspace (workspace root) .metadata\ (platform metadata directory MyWeb\ (project content directory for MyWeb) .project index.html images\ logo.png MyServlet\ (project content directory for MyServlet) .project src\ main.java bin\ main.class
Η πλατφόρμα διαθέτει έναν ειδικό κατάλογο .μετα-δεδομένων για τη διατήρηση των εσωτερικών πληροφοριών της πλατφόρμας. Ο κατάλογος .μετα-δεδομένα του χώρου εργασίας μπορεί να θεωρηθεί ως ένα "μαύρο κουτί." Σημαντικές πληροφορίες σχετικά με τη δομή του χώρου εργασίας, όπως οι αναφορές έργου ή οι ιδιότητες πόρων, αποθηκεύονται στο τμήμα μετα-δεδομένων του χώρου εργασίας και η πρόσβαση σε αυτές θα πρέπει να επιτυγχάνεται μόνο με τη βοήθεια εργαλείων από το API της πλατφόρμας. Δεν θα πρέπει να επεξεργάζεστε ή να χειρίζεστε ποτέ αυτά τα αρχεία χρησιμοποιώντας το γενικό API συστήματος αρχείου.
Επιπλέον, κάθε έργο έχει το δικό του αρχείο .project, όπου διατηρούνται τα μετα-δεδομένα που αφορούν το έργο. Αυτό το αρχείο είναι βασικά ένα ισοδύναμο δίσκου των πληροφοριών που βρίσκονται στη διασύνδεση IProjectDescription ενός έργου.
Εκτός από τον κατάλογο .μετα-δεδομένα και τα αρχεία .project, οι φάκελοι και τα αρχεία στον κατάλογο του χώρου ενδέχεται να δυσχεραίνουν το χειρισμό άλλων εργαλείων. Ο χειρισμός των αρχείων και των φακέλων είναι δυνατός με τη βοήθεια μη-ενοποιημένων εργαλείων, όπως οι λειτουργίες επεξεργασίας κειμένου και βοηθητικά προγράμματα συστήματος αρχείου. Το θέμα είναι ότι ο χρήστης πρέπει να είναι προσεκτικός κατά την επεξεργασία αυτών των αρχείων τόσο στον πάγκο εργασίας όσο και εξωτερικά. (Δεν υπάρχει διαφορά όταν ο χρήστης επεξεργάζεται ένα αρχείο χρησιμοποιώντας δύο ανεξάρτητα μεμονωμένα εργαλεία.) Ο πάγκος εργασίας παρέχει λειτουργίες ανανέωσης για τη διευθέτηση της προβολής χώρου εργασίας των πόρων με την πραγματική κατάσταση στο σύστημα αρχείων, ενώ υπάρχει η επιλογή της περιοδικής ανανέωσης του χώρου εργασίας με βάση την κατάσταση του συστήματος αρχείων.
Το API πόρου επιτρέπει να χειρίζεστε αυτή την διακλάδωση πόρου σε κώδικα. Εδώ θα εξετάσουμε ορισμένα τμήματα κώδικα για μια γρήγορη γνωριμία με το API πόρου. Το API πόρου καθορίζεται σε μια σειρά διεπαφών στο σημείο επέκτασης org.eclipse.core.resources. Υπάρχουν διεπαφές για όλα τα είδη πόρων, όπως IProject, IFolder, και IFile. Το εκτεταμένο κοινό πρωτόκολλο καθορίζεται στο IResource. Θα χρησιμοποιήσουμε επίσης το σημείο επέκτασης org.eclipse.core.runtime της διεπαφής IPath, που αναπαριστά κατατμημένες διαδρομές όπως διαδρομές συστήματος αρχείων ή πόρων.
Ο χειρισμός πόρων είναι παρόμοιος με το χειρισμό αρχείων με χρήση του java.io.File. Το API βασίζεται σε ρουτίνες χειρισμού. Όταν χρησιμοποιείτε ένα API όπως getProject ή getFolder, επιστρέφετε μια ρουτίνα χειρισμού στον πόρο. Δεν υπάρχει εγγύηση ή απαίτηση ότι ο ο ίδιος ο πόρος υπάρχει μέχρι να προβείτε σε κάποια ενέργεια στη ρουτίνα χειρισμού. Αν πιστεύετε ότι ένα πόρος υπάρχει, μπορείτε να χρησιμοποιήσετε τη μέθοδο exists προκειμένου να επαληθεύσετε την παρουσία του.
Για να πλοηγηθείτε στο χώρο εργασίας από μια πρόσθετη λειτουργία, πρέπει πρώτα να λάβετε τη διεπαφή IWorkspaceRoot, που αναπαριστά την κορυφή της ιεραρχίας των πόρων στο χώρο εργασίας.
IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
Αφού αποκτήσετε τη ρίζα ενός χώρου εργασίας, μπορείτε να έχετε πρόσβαση στα έργα αυτού του χώρου εργασίας.
IProject myWebProject = myWorkspaceRoot.getProject("MyWeb"); // open if necessary if (myWebProject.exists() && !myWebProject.isOpen()) myWebProject.open(null);
Πριν μπορέσουμε να χειριστούμε ένα έργο, πρέπει να το ανοίξουμε. Το άνοιγμα ενός έργου διαβάζει τη δομή του έργου από το δίσκο και δημιουργεί την αναπαράσταση αντικειμένου μνήμης της διακλάδωσης πόρου του έργου. Το άνοιγμα ενός έργου είναι μια ρητή λειτουργία δεδομένου ότι κάθε ανοικτό έργο καταναλώνει μνήμη προκειμένου να αναπαραστήσει την διακλάδωση πόρου εσωτερικά και συμμετέχει σε διάφορα συμβάντα κύκλου ζωής πόρου (όπως η δόμηση) τα οποία μπορεί να διαρκέσουν πολύ. Γενικά, δεν είναι δυνατή η πρόσβαση σε κλειστά έργα και θα εμφανίζονται κενά παρόλο που οι πόροι υπάρχουν ακόμα στο σύστημα αρχείων.
Θα προσέξετε ότι πολλά από αυτά τα παραδείγματα πόρων μεταβιβάζουν μια παράμετρο null κατά το χειρισμό των πόρων. Πολλές λειτουργίες πόρων μπορεί να είναι αρκετά ισχυρές ώστε να εγγυούνται την αναφορά προόδου και να επιτρέπουν στο χρήστη να προβαίνει σε ακύρωση της λειτουργίας. Αν ο κώδικάς σας έχει περιβάλλον χρήστη, συνήθως θα μεταβιβάζετε μια διασύνδεση IProgressMonitor, η οποία επιτρέπει στην πρόσθετη λειτουργία πόρων να αναφέρει την πρόοδο κατά το χειρισμό του πόρου και δίνει τη δυνατότητα στο χρήστη να ακυρώνει τη λειτουργία εάν το επιθυμεί. Για την ώρα, απλά μεταβιβάζουμε null, υποδηλώνοντας ότι δεν υπάρχει παρακολούθηση προόδου.
Όταν έχουμε ένα ανοιχτό έργο, μπορούμε να αποκτήσουμε πρόσβαση στους φακέλους και τα αρχεία του, καθώς και να δημιουργήσουμε επιπρόσθετα αρχεία και φακέλους. Στο ακόλουθο παράδειγμα, δημιουργούμε έναν πόρο αρχείου από τα περιεχόμενα ενός αρχείου που βρίσκεται έξω από το χώρο εργασίας μας.
IFolder imagesFolder = myWebProject.getFolder("images"); if (imagesFolder.exists()) { // create a new file IFile newLogo = imagesFolder.getFile("newLogo.png"); FileInputStream fileStream = new FileInputStream( "c:/MyOtherData/newLogo.png"); newLogo.create(fileStream, false, null); // create closes the file stream, so no worries. }
Στο παραπάνω παράδειγμα, η πρώτη γραμμή αποκτά μια ρουτίνα χειρισμού στο φάκελο εικόνων. Πρέπει να ελέγξουμε ότι ο φάκελος υπάρχει πριν κάνουμε οτιδήποτε με αυτόν. Παρομοίως, όταν αποκτούμε το αρχείο newLogo, η ρουτίνα χειρισμού δεν αναπαριστά ένα πραγματικό αρχείο μέχρι να δημιουργήσουμε το αρχείο στην τελευταία γραμμή. Σε αυτό το παράδειγμα, δημιουργούμε το αρχείο συμπληρώνοντάς το με τα περιεχόμενα του logo.png.
Το ακόλουθο τμήμα κώδικα είναι παρόμοιο με το προηγούμενο, εκτός από το ότι αντιγράφει το αρχείο newLogo από το αρχικό λογότυπο και δεν δημιουργεί νέο από τα περιεχόμενά του.
IFile logo = imagesFolder.getFile("logo.png"); if (logo.exists()) { IPath newLogoPath = new Path("newLogo.png"); logo.copy(newLogoPath, false, null); IFile newLogo = imagesFolder.getFile("newLogo.png"); ... }
Τέλος, θα δημιουργήσουμε έναν άλλο φάκελο εικόνων και θα μετακινήσουμε το αρχείο που δημιουργήθηκε πρόσφατα σε αυτόν το φάκελο. Εξαιτίας της μετακίνησής του, θα πρέπει να μετονομάσουμε το αρχείο.
... IFolder newImagesFolder = myWebProject.getFolder("newimages"); newImagesFolder.create(false, true, null); IPath renamedPath = newImagesFolder.getFullPath().append("renamedLogo.png"); newLogo.move(renamedPath, false, null); IFile renamedLogo = newImagesFolder.getFile("renamedLogo.png");
Πολλές από τις μεθόδους του API πόρου περιλαμβάνουν έναν ενδείκτη λογικής τιμής force που καθορίζει εάν θα ενημερώνονται ούτως ή άλλως οι πόροι που βρίσκονται εκτός συγχρονισμού με τα αντίστοιχα αρχεία στο σύστημα αρχείων. Δείτε την ενότητα IResource για περισσότερες πληροφορίες. Μπορείτε επίσης να χρησιμοποιήσετε την κλάση IResource.isSynchronized για να καθορίσετε εάν κάποιος συγκεκριμένος πόρος είναι συγχρονισμένος με το σύστημα αρχείων.
Στο δείγμα διακλάδωσης πόρου, υποθέσαμε ότι όλοι οι κατάλογοι περιεχομένων έργου βρίσκονται στον κατάλογο χώρος εργασίας κάτω από τον κατάλογο ρίζας της πλατφόρμας (C:\MySDK\workspace). Πρόκειται για την προεπιλεγμένη ρύθμιση για έργα. Ωστόσο, ο κατάλογος περιεχομένου έργου μπορεί να αντιστοιχιστεί σε οποιονδήποτε αυθαίρετο κατάλογο σε ένα εφεδρικό σύστημα αρχείων, ίσως και σε ένα διαφορετικό υπολογιστή.
Η δυνατότητα αντιστοίχισης της θέσης ενός έργου ανεξάρτητα από άλλα έργα επιτρέπει στο χρήστη να αποθηκεύσει τα περιεχόμενα ενός έργου σε μια κατάλληλη, για το έργο και την ομάδα έργου, θέση. Ο κατάλογος περιεχομένων έργου θα πρέπει να επιδέχεται παρεμβάσεων. Ο χρήστης θα πρέπει δηλαδή να μπορεί να δημιουργήσει, να τροποποιήσει και να διαγράψει πόρους με χρήση των πρόσθετων λειτουργιών και του πάγκου εργασίας ή χρησιμοποιώντας απευθείας το σύστημα αρχείων που βασίζεται σε εργαλεία και λειτουργίες επεξεργασίας.
Τα ονόματα διαδρομής πόρου δεν είναι πλήρεις διαδρομές του συστήματος αρχείων. Οι διαδρομές πόρου βασίζονται πάντα στη θέση του έργου (συνήθως τον κατάλογο χώρος εργασίας). Για να αποκτήσετε την πλήρη διαδρομή του συστήματος αρχείων προς έναν πόρο, πρέπει να υποβάλλετε ερώτημα για τη θέση του χρησιμοποιώντας τη IResource.getLocationURI. Ωστόσο, δεν μπορείτε να χρησιμοποιήσετε τη μέθοδο IProjectDescription.setLocation για να αλλάξετε τη θέση του, διότι αυτή η μέθοδος είναι απλά μια μέθοδος ορισμού για μια δομή δεδομένων.
Αντιστρόφως, εάν θέλετε να λάβετε το αντίστοιχο αντικείμενο πόρου που έχει ανατεθεί σε μια διαδρομή συστήματος αρχείων, μπορείτε να χρησιμοποιήσετε τη IWorkspaceRoot.findFilesForLocationURI ή τη IWorkspaceRoot.findContainersForLocationURI.
Όταν χρησιμοποιούμε το API πόρων για να τροποποιήσουμε τη διακλάδωση του χώρου εργασίας μας, επιπλέον της ενημέρωσης των αντικειμένων πόρου αλλάζουν και τα αρχεία στο σύστημα αρχείων. Τι συμβαίνει όμως με τις αλλαγές σε αρχεία πόρων οι οποίες πραγματοποιούνται εκτός του API της πλατφόρμας;
Οι εξωτερικές αλλαγές σε πόρους δεν θα αντικατοπτρίζονται στο χώρο εργασίας και στα αντικείμενα πόρου μέχρι να εντοπιστούν από την πρόσθετη λειτουργία πόρων. Η πρόσθετη λειτουργία πόρων χρησιμοποιεί έναν κατάλληλο μηχανισμό για κάθε συγκεκριμένο ενσωματωμένο λειτουργικό σύστημα προκειμένου να εντοπίσει εξωτερικές αλλαγές που πραγματοποιήθηκαν στο σύστημα αρχείων. Επιπλέον, οι πελάτες μπορούν να χρησιμοποιήσουν το API πόρου για να διευθετήσουν ομαλά τα αντικείμενα του χώρου εργασίας και των πόρων με το τοπικό σύστημα αρχείων και χωρίς παρεμβάσεις από το χρήστη. Ο χρήστης μπορεί επίσης να προκαλέσει μια ρητή ανανέωση στην προβολή της λειτουργίας πλοήγησης πόρου του πάγκου εργασίας.
Πολλές από τις μεθόδους στα API πόρου περιλαμβάνουν μια παράμετρο ενεργοποίησης η οποία καθορίζει τον τρόπο χειρισμού των πόρων οι οποίοι βρίσκονται εκτός συγχρονισμού με το σύστημα αρχείων. Η παραπομπή API για κάθε μέθοδο παρέχει ειδικές πληροφορίες σχετικά με αυτή την παράμετρο. Επιπρόσθετες μέθοδοι στο API επιτρέπουν τον προγραμματιστικό έλεγχο της ανανέωσης του συστήματος αρχείων, όπως IResource.refreshLocal(int depth, IProgressMonitor monitor). Δείτε την ενότητα IResource για πληροφορίες σχετικά με τη σωστή χρήση και το κόστος.
Οι πρόσθετες λειτουργίες που επιθυμούν να παρέχουν το δικό τους μηχανισμό περιοδικής ανανέωσης του χώρου εργασίας με βάση την κατάσταση του εξωτερικού συστήματος αρχείων, μπορούν να το κάνουν χρησιμοποιώντας το σημείο επέκτασης org.eclipse.core.resources.refreshProviders. Δείτε την ενότητα Παροχείς ανανέωσης για περισσότερες πληροφορίες.