home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2008 January / Mac_easy_01_08.iso / Software / Office / papers.dmg / Papers.app / Contents / Headers / PapersImporterPluginProtocol.h < prev    next >
Encoding:
Text File  |  2007-11-01  |  15.5 KB  |  471 lines

  1. //
  2. //  PapersImporterPluginProtocol.h
  3. //
  4. //  Created by Alexander Griekspoor on Fri Jan 23 2007.
  5. //  Copyright (c) 2007 Mekentosj.com. All rights reserved.
  6. // 
  7. //  For use outside of the Papers application structure, please contact
  8. //  feedback@mekentosj.com
  9. //  DO NOT REDISTRIBUTE WITHOUT ALL THE FILES THAT ARE CONTAINED IN THE PACKAGE THAT INCLUDED THIS FILE
  10.  
  11. #import <Cocoa/Cocoa.h>
  12.  
  13. /////////////////////////////////////////////////////////////
  14. /*  Importing records
  15. Papers allows you through this protocol to write your own importer plugins.
  16. These can not only be used to import files but any kind of data from any source.
  17. It's important to note that the plugin's method performImportWithURLs: runs in 
  18. its own thread, although you normally would not have to worry about that, keep 
  19. in mind that if you do fancy stuff you use "performMethodOnMainThread: to prevent
  20. trouble. The plugin signals it's progress to the delegate using a number of delegate 
  21. methods. Make sure you ALWAYS call the delegate methods to signal your progress.
  22. A normal cycle of the plugin would be:
  23.  
  24. Delegate -> Plugin        - (BOOL) readyToPerformImport;                        // Is the plugin Ready, if not importPreparationError is retrieved.
  25.  
  26. Delegate -> Plugin        - (void) performImportWithURLs: (NSArray *)urls;    // Delegate provides plugin with urls, initiates import.
  27.     
  28.         Delegate <- Plugin        - (void)didBeginImport:(id)sender;                // Plugin informs delegate that it has started.
  29.  
  30.         Delegate <- Plugin        - (void)didImportObject:(NSDictionary *)dict;    // Plugin hands over found paper to delegate (optionally repeated).
  31.  
  32.         Delegate <- Plugin        - (void)didEndImport:(id)sender;                // Plugin signals it's done.
  33.  
  34. Delegate -> Plugin        - (BOOL) successfulCompletion;                        // Delegate asks plugin if success, if not importCompletionError is retrieved.
  35.  
  36. Delegate -> Plugin        - (void) performCleanup;                            // Allows the plugin to cleanup and reset for next import.
  37.  
  38. The structure of the dictionary containing imported objects is as follows. Note that you are 
  39. encouraged to fill as many of these fields as you can. You can also provide other fields if 
  40. you wish but these will be ignored within Papers in the current version. Potential 
  41. other programs that also use these plugins might use this info though. 
  42. NOTE: you do not have to list all fields except those marked as obligatory
  43.  
  44. Note that at the root of the dictionary you can provide one or more arrays named:
  45. - papers, an array containing dictionaries representing a paper.
  46. - authors, an array containing dictionaries representing an author.
  47. - journals, an array containing dictionaries representing a journal.
  48. - keywords, an array containing dictionaries representing a keyword.
  49. - publicationTypes, an array containing dictionaries representing a publication type.
  50.  
  51. Each can only occur once (!) and contains an array of the corresponding model dictionaries below.
  52. Usually you will only return Papers, but in case you would like to import a list of journals
  53. or authors irrespective outside the context of a paper this is the way to do it.
  54.  
  55. NOTE: IF YOU ADD AN AUTHOR, JOURNAL, KEYWORD, OR PUBLICATION TYPE TO A PAPER, DON'T ADD IT
  56. SEPARATELY AGAIN IN THE AUTHORS, JOURNALS, KEYWORDS, or PUBLICATION TYPES ARRAYS!! ONLY USE
  57. THE OTHER CATEGORIES IF YOU DON'T IMPORT PAPERS OR IF YOU ADD EXTRA MODEL OBJECTS NOT 
  58. ASSOCIATED TO THE PAPERS YOU IMPORTED.
  59.  
  60. Below follows an example for each category
  61. Unless otherwise noted NSStrings are expected for all field  
  62.  
  63. AUTHORS
  64. - correspondence
  65. - email
  66. - firstName
  67. - homepage
  68. - initials
  69. - lastName - required
  70. - mugshot (NSImage)
  71. - nickName
  72. - notes
  73.  
  74. Example: 
  75.  
  76. <key>authors</key>
  77. <array>
  78.     <dict>
  79.         <key>correspondence</key>
  80.         <string>The European Bioinformatics Institute</string>
  81.         <key>email</key>
  82.         <string>mek@mekentosj.com</string>
  83.         <key>firstName</key>
  84.         <string>Alexander</string>
  85.         <key>homepage</key>
  86.         <string>http://mekentosj.com</string>
  87.         <key>initials</key>
  88.         <string>AC</string>
  89.         <key>lastName</key>
  90.         <string>Griekspoor</string>
  91.         <key>mugshot</key>
  92.         NSImage object
  93.         <key>nickName</key>
  94.         <string>Mek</string>
  95.         <key>notes</key>
  96.         <string>These are example notes</string>
  97.     </dict>
  98.     <dict>
  99.         .. next author ..
  100.     </dict>
  101. </array>
  102.  
  103.  
  104. JOURNALS
  105. - abbreviation
  106. - archives
  107. - authorGuidelines
  108. - cover (NSImage)
  109. - currentissue
  110. - etoc
  111. - homepage
  112. - impactFactor (NSNumber - Float)
  113. - issn
  114. - language
  115. - name - required
  116. - nlmID
  117. - notes
  118. - openAccess (NSNumber - BOOL)
  119. - publisher
  120. - startYear (NSNumber - Int)
  121. - summary
  122.  
  123. Example: 
  124.  
  125. <key>journals</key>
  126. <array>
  127.     <dict>
  128.         <key>abbreviation</key>
  129.         <string>PLoS Biol.</string>
  130.         <key>archives</key>
  131.         <string>http://biology.plosjournals.org/perlserv/?request=get-archive&issn=1545-7885</string>
  132.         <key>authorGuidelines</key>
  133.         <string>http://journals.plos.org/plosbiology/guidelines.php</string>
  134.         <key>cover</key>
  135.         NSImage object
  136.         <key>currentissue</key>
  137.         <string>Vol. 4(12) December 2006</string>
  138.         <key>etoc</key>
  139.         <string>http://biology.plosjournals.org/perlserv/?request=get-toc&issn=1545-7885</string>
  140.         <key>homepage</key>
  141.         <string>http://biology.plosjournals.org/</string>
  142.         <key>impactFactor</key>
  143.         <real>14.2</real>
  144.         <key>issn</key>
  145.         <string>1545-7885</string>
  146.         <key>language</key>
  147.         <string>eng</string>
  148.         <key>name</key>
  149.         <string>PLoS Biology</string>
  150.         <key>nlmID</key>
  151.         <string>101183755</string>
  152.         <key>notes</key>
  153.         <string>More info here...</string>
  154.         <key>openAccess</key>
  155.         <true/>
  156.         <key>publisher</key>
  157.         <string>Public Library of Science</string>
  158.         <key>startYear</key>
  159.         <integer>2003</integer>
  160.         <key>summary</key>
  161.         <string>PLoS Biology is an open-access, peer-reviewed general biology journal published by the Public Library of Science (PLoS), a nonprofit organization of scientists and physicians committed to making the world's scientific and medical literature a public resource. New articles are published online weekly; issues are published monthly.</string>
  162.     </dict>
  163.     <dict>
  164.         .. next journal ..
  165.     </dict>
  166. </array>
  167.  
  168.  
  169. KEYWORDS
  170. - identifier
  171. - name - required
  172. - qualifier
  173. - type
  174. - subtype
  175.  
  176. Example: 
  177.  
  178. <key>keywords</key>
  179. <array>
  180.     <dict>
  181.         <key>identifier</key>
  182.         <string>an identifier</string>
  183.         <key>name</key>
  184.         <string>Breast Cancer</string>
  185.         <key>qualifier</key>
  186.         <string>a qualifier</string>
  187.         <key>subtype</key>
  188.         <string>Major Topic</string>
  189.         <key>type</key>
  190.         <string>MeSH Heading</string>
  191.     </dict>
  192.     <dict>
  193.     .. next keyword ..
  194.     </dict>
  195. </array>
  196.  
  197.  
  198. PUBLICATION TYPES
  199. - name - required
  200.  
  201. Example: 
  202.  
  203. <key>publicationTypes</key>
  204. <array>
  205.     <dict>
  206.         <key>name</key>
  207.         <string>Journal Article</string>
  208.     </dict>
  209.     <dict>
  210.     .. next publication type ..
  211.     </dict>
  212. </array>
  213.  
  214.  
  215. PAPERS
  216. -abstract
  217. -acceptedDate (NSDate)
  218. -affiliation
  219. -authors (NSArray of author dictionaries - see above)
  220. -category
  221. -doi
  222. -image (NSImage)
  223. -issue
  224. -journal (NSArray with a single journal dictionaries - see above)
  225. -keywords (NSArray of keywords dictionaries - see above)
  226. -label
  227. -language
  228. -notes
  229. -openAccess (NSNumber - BOOL)
  230. -pages
  231. -path (NOTE that providing a path to a pdf file will automatically invoke auto-archiving if enabled)
  232. -pii
  233. -pmid
  234. -publicationTypes (NSArray of publication type dictionaries - see above)
  235. -publishedDate (NSDate)
  236. -receivedDate (NSDate)
  237. -revisedDate (NSDate)
  238. -status
  239. -timesCited (NSNumber - Int)
  240. -title
  241. -url
  242. -volume
  243. -year (NSNumber - Int)
  244.  
  245. Example: 
  246.  
  247. <key>Papers</key>
  248. <array>
  249.     <dict>
  250.         <key>abstract</key>
  251.         <string>MicroRNAs (miRNAs) interact with target...</string>
  252.         <key>acceptedDate</key>
  253.         NSDate object
  254.         <key>affiliation</key>
  255.         <string>Computational Biology Center</string>
  256.         <key>authors</key>
  257.             ... HERE AN ARRAY OF AUTHOR DICTIONARIES LIKE ABOVE ...
  258.         <array/>
  259.         <key>category</key>
  260.         <string>Journal Article</string>
  261.         <key>doi</key>
  262.         <string>10.1371/journal.pbio.0020363</string>
  263.         <key>image</key>
  264.         NSImage object
  265.         <key>issue</key>
  266.         <string>3</string>
  267.         <key>journal</key>
  268.             ... HERE AN ARRAY WITH A SINGLE JOURNAL DICTIONARY LIKE ABOVE ...
  269.         <array/>
  270.         <key>keywords</key>
  271.             ... HERE AN ARRAY OF KEYWORD DICTIONARIES LIKE ABOVE ...
  272.         <array/>
  273.         <key>label</key>
  274.         <string>Cell Biology</string>
  275.         <key>language</key>
  276.         <string>eng</string>
  277.         <key>notes</key>
  278.         <string>Here more info...</string>
  279.         <key>openAccess</key>
  280.         <true/>
  281.         <key>pages</key>
  282.         <string>e363</string>
  283.         <key>path</key>
  284.         <string>/Users/griek/Documents/Papers/1550875.pdf</string>
  285.         <key>pii</key>
  286.         <string>0020363</string>
  287.         <key>pmid</key>
  288.         <string>15502875</string>
  289.         <key>publicationTypes</key>
  290.             ... HERE AN ARRAY OF PUBLICATION TYPE DICTIONARIES LIKE ABOVE ...
  291.         <array/>
  292.         <key>publishedDate</key>
  293.         NSDate object
  294.         <key>receivedDate</key>
  295.         NSDate object
  296.         <key>revisedDate</key>
  297.         NSDate object
  298.         <key>status</key>
  299.         <string>In press</string>
  300.         <key>timesCited</key>
  301.         <integer>12</integer>
  302.         <key>title</key>
  303.         <string>Human MicroRNA targets</string>
  304.         <key>url</key>
  305.         <string>http://biology.plosjournals.org/perlserv/?request=get-document&doi=10.1371/journal.pbio.0020363</string>
  306.         <key>volume</key>
  307.         <string>2</string>
  308.         <key>year</key>
  309.         <integer>2006</integer>
  310.     </dict>
  311. </array>
  312.  
  313. SEE THE COMPLETE EXAMPLE PLIST THAT CAME WITH THIS PACKAGE. 
  314. NOTE THAT WE EXPECT THE ORIGINAL DICTIONARY, NOT A PLIST OR SERIALIZED DICTIONARY
  315.  
  316. */
  317.  
  318. /////////////////////////////////////////////////////////////
  319.  
  320.  
  321. /////////////////////////////////////////////////////////////
  322. /*  USING NSERRORS
  323. NSErrors are returned by two of the methods below in order to allow
  324. the main application to inform the user of problems that occur while 
  325. trying to use the plugin.  
  326. The domain should always be "Papers Importer Error"
  327.  
  328. The user dictionary should have two keys:
  329. "title" and "description".  By default, they will be used to create
  330.  the text of an informative dialog as: "title:  description"
  331.  So design your messages accordingly.  
  332.  
  333.  PLEASE LOCALIZE YOUR MESSAGES WITHIN YOUR PLUGIN
  334.  Make sure the "title" and "description" keys are in an appropriate language by
  335.  the time the application gets the NSError.  This will allow the bundle to be
  336.  entirely self-contained.
  337.  Even if you don't know any other languages, provide the structure within your
  338.  plugin to allow others to do the localization.
  339. */
  340.  
  341. /////////////////////////////////////////////////////////////
  342.  
  343.  
  344. // THESE ARE METHODS THE PLUGIN DELEGATE IMPLEMENTS AND YOU SHOULD CALL
  345.  
  346. @protocol PapersImporterPluginDelegate <NSObject>
  347.  
  348. // Signal the delegate that you started the import process
  349. // Allows the delegate to prepare the interface before displaying new data
  350. - (void)didBeginImport:(id)sender;    
  351.  
  352. // Tell the delegate to create a new folder with name "name"
  353. // With level you indicate the hierarchy, use level 0 for "root" level
  354. // all objects you import after calling this method are added to the 
  355. // last created Group
  356. - (void)shouldCreateGroupWithName: (NSString *)name level: (int)level;
  357.  
  358. // Provide here an autoreleased dictionary containing the results from your import. The structure of what this
  359. // dictionary should look like is shown above. Papers will convert this dictionary in the corresponding model objects for you.
  360. // If you provide no or an empty dictionary Papers will warn the user no records were imported. 
  361. // You can post the results one at the time or in batches or all at once. If you provide them all at once, return nil for
  362. // itemsToImport so that an indeterminate progressbar is shown.
  363. - (void)didImportObject:(NSDictionary *)dict;        
  364.  
  365. // Signal the delegate that you are done. The delegate will inform how things went so be sure to set any errors and be ready
  366. // to answer didCompleteSuccessfully.
  367. - (void)didEndImport:(id)sender;                    
  368.  
  369. // Inform the delegate of a status change, use when statusString, importedItems or itemsToImport changes.
  370. // Status updates are automatically issued by calling any of the methods above
  371. - (void)updateStatus:(id)sender;
  372.  
  373. // Ask the delegate for its internet connection status
  374. - (BOOL)isConnectedToInternet;
  375.  
  376. @end
  377.  
  378.  
  379.  
  380. // THESE ARE METHODS YOUR PLUGIN SHOULD IMPLEMENT
  381.  
  382. @protocol  PapersImporterPluginProtocol
  383.  
  384. // gives you a handle to the delegate object to which you deliver results and notify progress (see above)
  385. // do not retain the delegate
  386. - (id)delegate;
  387. - (void)setDelegate: (id)del;
  388.  
  389. // this should return an array of all menu items as strings.  Menu titles should be as descriptive as possible,
  390. // so that we don't have naming collisions.
  391. - (NSArray *) menuTitles;
  392.  
  393. // if your plugin works with files return YES, Papers will run the open panel for you (with the
  394. // indicated allowedFileTypes and accessoryView if required.
  395. // 
  396. // NOTE: that your plugin can import anything you like and doesn't have to start with a file. 
  397. // You can open a sheet, interact with a website, fetch data etc. Just return NO here in that case.
  398. - (BOOL) shouldShowOpenPanel;
  399.  
  400. // if your plugin returns YES on the above method, you have to return the allowedFileTypes as well.
  401. - (NSArray *) allowedFileTypes;
  402.  
  403. // indicate what can be selected. Return NO when you don't open a file.
  404. - (BOOL) canChooseFiles;
  405. - (BOOL) canChooseDirectories;
  406. - (BOOL) canChooseMultiple;
  407.  
  408.  
  409. // if you would like to customize the openpanel even further, set one up and return your own. 
  410. // Otherwise return nil for the default one.
  411. - (NSOpenPanel *) openPanel;
  412.  
  413. // if you would like to show options while the open panel is shown, return a custom view here and it will
  414. // be used as accessoryView. Otherwise return nil.
  415. - (NSView *) accessoryView;
  416.     
  417. // Return YES if you need an active internet connection in order to import your objects. 
  418. // If you return YES, Papers will check whether a connection is available.
  419. - (BOOL)requiresInternetConnection;
  420.  
  421. // a method to make sure everything's set to go before starting, do some setup or tests here if necessary.
  422. // and a method to find out what the problems are if things aren't set. See above for usage of errorCodes.
  423. - (BOOL) readyToPerformImport;
  424. - (NSError *) importPreparationError;
  425.  
  426.  
  427. // Return YES if you support cancelling the current import session (strongly advised).
  428. - (BOOL)canCancelImport;
  429.  
  430. // Return YES if imported results should be linked to existing objects as much as possible (like authors). Returning NO might 
  431. // result in duplicates
  432. - (BOOL)shouldMerge;
  433.  
  434. // Return YES if imported results should overwrite existing fields during a merge. For instance you are importing an author already 
  435. // present in the library with a different email address.
  436. - (BOOL)shouldOverwrite;
  437.  
  438.  
  439. // this method is the main worker method and launches the import process, here you are handed over
  440. // the URLs that were selected in the open panel, this array can be empty or nil if you return NO
  441. // to shouldShowOpenPanel, in case you want to ignore this argument anyway.
  442. // NOTE that this method runs in a separate thread. Signal your progress to the delegate.
  443. - (void) performImportWithURLs: (NSArray *)urls;
  444.  
  445. // informs us that we should stop importing. Since we're running in a thread we should check regularly
  446. // if we have been cancelled
  447. - (void) cancelImport;
  448.  
  449.  
  450. // return the number of items you found and are about to import. As long as this value is nil an indeterminate
  451. // progress bar is shown, the moment you return a non-nil value for both the progress will be shown to the user. 
  452. // use in combination with the delegate method updateStatus: to push changes to the delegate and force an update.
  453. - (NSNumber *)itemsToImport;
  454. - (NSNumber *)importedItems;
  455.  
  456. // return the current status of your plugin to inform the user. make sure these strings are localizable!
  457. // use in combination with the delegate method updateStatus: to push changes to the delegate and force an update.
  458. - (NSString *)statusString;
  459.  
  460.  
  461. // A method to check whether the import finished properly
  462. // and one to get at any errors that resulted. See above for usage of errorCodes.
  463. - (BOOL) successfulCompletion;
  464. - (NSError *) importCompletionError;
  465.  
  466. // let the plugin get rid of any data that needs to be reset for a new import.
  467. - (void) performCleanup;
  468.  
  469. @end
  470.  
  471.