source: DASISH/t5.6/client/chrome/markingcollection/content/markingcollection/pubmedcentral.js @ 2709

Last change on this file since 2709 was 2709, checked in by sroth, 11 years ago

Wired-Marker initial source code with minor adjustments.

  • Property svn:executable set to *
File size: 23.1 KB
Line 
1var bitsPubmedCentralService = {
2        _init     : false,
3        _threadID : 0,
4        _mainThread : null,
5        _backgroundThread : null,
6        _stack : [],
7
8        _capture : {
9                confirm : false,
10                substitution : {
11                        confirm : false,
12                        format  : "MEDLINE.SO from PMC",
13                },
14        },
15
16        get STRING()  { return document.getElementById("MarkingCollectionOverlayString"); },
17        get UNICODE() { return Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].getService(Components.interfaces.nsIScriptableUnicodeConverter); },
18
19        get Common()   { return window.top.bitsObjectMng.Common; },
20        get Database() { return window.top.bitsObjectMng.Database;   },
21
22        get mainThread() { return this._mainThread; },
23        get backgroundThread() { return this._backgroundThread; },
24
25        get SIDEBAR()     { return window.top.document.getElementById("sidebar"); },
26        get SIDEBAR_WIN() {try{return this.SIDEBAR.contentWindow;}catch(e){return undefined;}},
27        get SIDEBAR_DOC() {try{return this.SIDEBAR.contentDocument;}catch(e){return undefined;}},
28
29/////////////////////////////////////////////////////////////////////
30        init : function(aEvent){
31                if(!this._init){
32                        var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
33                        this._app_version = parseInt(info.version);
34                        if(this._app_version>=3){
35                                this._capture.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.confirm", true);
36                                this._capture.substitution.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.substitution.confirm", true);
37                                var format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format");
38                                if(format == null) nsPreferences.setUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format", this._capture.substitution.format);
39
40                                this._mainThread = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread;
41                        }
42                        this._init = true;
43                }
44        },
45
46/////////////////////////////////////////////////////////////////////
47        done : function(aEvent){
48                if(this._backgroundThread) delete this._backgroundThread;
49                if(this._mainThread) delete this._mainThread;
50        },
51
52/////////////////////////////////////////////////////////////////////
53        formatPMCID : function(aPMCID){
54                try{
55                        if(!aPMCID) return undefined;
56                        if(aPMCID.match(/^\d+$/)) aPMCID = "PMC"+aPMCID;
57                        if(!aPMCID.match(/^PMC\d+$/)) return undefined;
58                        return aPMCID;
59                }catch(err){
60                        this._dump("bitsPubmedCentralService.getExtensionDir():"+err);
61                        return undefined;
62                }
63        },
64
65/////////////////////////////////////////////////////////////////////
66        getExtensionDir : function(aPMCID){
67                try{
68                        aPMCID = this.formatPMCID(aPMCID);
69                        if(!aPMCID) return undefined;
70                        var extensionDir = this.Common.getExtensionDir().clone();
71                        extensionDir.append("PubmedCentral");
72                        var arr = aPMCID.split("");
73                        while(arr.length>0){
74                                extensionDir.append(arr.shift());
75                        }
76                        return extensionDir;
77                }catch(err){
78                        this._dump("bitsPubmedCentralService.getExtensionDir():"+err);
79                        return undefined;
80                }
81        },
82
83/////////////////////////////////////////////////////////////////////
84        getPubmedInfo : function(aObject){
85                this._capture.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.confirm", true);
86                this._capture.substitution.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.substitution.confirm", true);
87                this._capture.substitution.format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format");
88                if(!this._capture.confirm) return;
89                if(!aObject) return;
90                if(!aObject.con_url.match(/^http:\/\/www\.pubmedcentral\.nih\.gov\/.+?\?artid=(\d+)/) && !aObject.con_url.match(/^http:\/\/www\.ncbi\.nlm\.nih\.gov\/pmc\/articles\/([^\/]+)/)) return;
91                var pmcid = RegExp.$1;
92                pmcid = this.formatPMCID(pmcid);
93                this.execThread(pmcid,function(aResult){
94                        if(!aObject.oid_property) aObject.oid_property = '<PROPERTY/>';
95                        var parser = new DOMParser();
96                        var xml_property = parser.parseFromString(aObject.oid_property, "text/xml");
97                        parser = undefined;
98                        var extras_msg = xml_property.getElementsByTagName("EXTENDED_MESSAGE")[0];
99                        if(!extras_msg){
100                                extras_msg = xml_property.createElement("EXTENDED_MESSAGE");
101                                xml_property.documentElement.appendChild(extras_msg);
102                        }
103                        elem_medline = xml_property.createElement("MEDLINE");
104                        extras_msg.appendChild(elem_medline);
105                        if(aResult.medline.PMID){
106                                var elem_pmid = xml_property.createElement("PMID");
107                                elem_pmid.appendChild(xml_property.createTextNode(aResult.medline.PMID));
108                                elem_medline.appendChild(elem_pmid);
109                        }
110                        if(aResult.medline.SO){
111                                var elem_so = xml_property.createElement("SO");
112                                elem_so.appendChild(xml_property.createTextNode(aResult.medline.SO));
113                                elem_medline.appendChild(elem_so);
114                        }
115                        aResult.medline.PMCID = pmcid;
116                        var elem_pmcid = xml_property.createElement("PMCID");
117                        elem_pmcid.appendChild(xml_property.createTextNode(pmcid));
118                        elem_medline.appendChild(elem_pmcid);
119                        var s = new XMLSerializer();
120                        aObject.oid_property = s.serializeToString(xml_property);
121                        s = undefined;
122                        if(bitsPubmedCentralService._capture.substitution.confirm){
123                                var keys_arr = [];
124                                for(var key in aResult.medline){
125                                        keys_arr.push(key);
126                                }
127                                keys_arr.sort();
128                                keys_arr.sort(function(a,b){return b.length-a.length;});
129                                var format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format");
130                                for(var i=0;i<keys_arr.length;i++){
131                                        var regexp = new RegExp("MEDLINE\\."+keys_arr[i],"g");
132                                        format = format.replace(regexp,aResult.medline[keys_arr[i]]);
133                                }
134                                aObject.doc_title = format;
135                        }
136                        var dbtype = aObject.dbtype;
137                        delete aObject.dbtype;
138                        delete aObject.fid_style;
139                        delete aObject.fid_title;
140                        delete aObject.folder_order;
141                        bitsPubmedCentralService.Database.updateObject(aObject,dbtype);
142                        setTimeout(function(){
143                                aObject.dbtype = dbtype;
144                                var contentWindow = bitsPubmedCentralService.SIDEBAR_WIN;
145                                var contentDocument = bitsPubmedCentralService.SIDEBAR_DOC;
146                                var mcTreeHandler = null;
147                                if(contentWindow && contentWindow.mcPropertyView) mcPropertyView = contentWindow.mcPropertyView;
148                                if(mcPropertyView && mcPropertyView._id == aObject.oid && mcPropertyView._dbtype == aObject.dbtype){
149                                        mcPropertyView.dispProperty(aObject);
150                                }
151                        },500);
152                })
153        },
154
155/////////////////////////////////////////////////////////////////////
156        getPubmedInfoSync : function(aObject){
157                this._capture.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.confirm", true);
158                this._capture.substitution.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.substitution.confirm", true);
159                this._capture.substitution.format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format");
160                if(!this._capture.confirm) return aObject;
161                if(!aObject) return aObject;
162                if(!aObject.con_url.match(/^http:\/\/www\.pubmedcentral\.nih\.gov\/.+?\?artid=(\d+)/) && !aObject.con_url.match(/^http:\/\/www\.ncbi\.nlm\.nih\.gov\/pmc\/articles\/([^\/]+)/)) return;
163                var pmcid = RegExp.$1;
164                pmcid = this.formatPMCID(pmcid);
165                var aResult = this.execThread(pmcid);
166                if(!aObject.oid_property) aObject.oid_property = '<PROPERTY/>';
167                var parser = new DOMParser();
168                var xml_property = parser.parseFromString(aObject.oid_property, "text/xml");
169                parser = undefined;
170                var extras_msg = xml_property.getElementsByTagName("EXTENDED_MESSAGE")[0];
171                if(!extras_msg){
172                        extras_msg = xml_property.createElement("EXTENDED_MESSAGE");
173                        xml_property.documentElement.appendChild(extras_msg);
174                }
175                elem_medline = xml_property.createElement("MEDLINE");
176                extras_msg.appendChild(elem_medline);
177                if(aResult.medline.PMID){
178                        var elem_pmid = xml_property.createElement("PMID");
179                        elem_pmid.appendChild(xml_property.createTextNode(aResult.medline.PMID));
180                        elem_medline.appendChild(elem_pmid);
181                }
182                if(aResult.medline.SO){
183                        var elem_so = xml_property.createElement("SO");
184                        elem_so.appendChild(xml_property.createTextNode(aResult.medline.SO));
185                        elem_medline.appendChild(elem_so);
186                }
187                aResult.medline.PMCID = pmcid;
188                var elem_pmcid = xml_property.createElement("PMCID");
189                elem_pmcid.appendChild(xml_property.createTextNode(pmcid));
190                elem_medline.appendChild(elem_pmcid);
191                var s = new XMLSerializer();
192                aObject.oid_property = s.serializeToString(xml_property);
193                s = undefined;
194                if(bitsPubmedCentralService._capture.substitution.confirm){
195                        var keys_arr = [];
196                        for(var key in aResult.medline){
197                                keys_arr.push(key);
198                        }
199                        keys_arr.sort();
200                        keys_arr.sort(function(a,b){return b.length-a.length;});
201                        var format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format");
202                        for(var i=0;i<keys_arr.length;i++){
203                                var regexp = new RegExp("MEDLINE\\."+keys_arr[i],"g");
204                                format = format.replace(regexp,aResult.medline[keys_arr[i]]);
205                        }
206                        aObject.doc_title = format;
207                }
208                return aObject;
209        },
210
211/////////////////////////////////////////////////////////////////////
212        execThread : function(aPMCID,aCB){
213                //Threadを䜿甚しない
214                if(aCB){
215                        setTimeout(function(){
216                                var func = new bitsPubmedCentralServiceFunc(aPMCID,aCB);
217                                var aResult = func.run();
218                                if(aCB) (aCB)(aResult);
219                        },0);
220                        return;
221                }else{
222                        var func = new bitsPubmedCentralServiceFunc(aPMCID,aCB);
223                        var aResult = func.run();
224                        return aResult;
225                }
226                //Threadを䜿甚する
227                if(!this._mainThread) return;
228                this._threadID++;
229                if(this._backgroundThread){
230                        this._stack.push({pmcid : aPMCID, callback : aCB});
231                }else{
232                        this._backgroundThread = Components.classes["@mozilla.org/thread-manager;1"].getService().newThread(0);
233                        this.backgroundThread.dispatch(new bitsPubmedCentralServiceWorkingThread(this._threadID, aPMCID, aCB), this.backgroundThread.DISPATCH_NORMAL);
234                }
235        },
236
237/////////////////////////////////////////////////////////////////////
238        exitThread : function(aResult,aCB){
239                if(this._backgroundThread) delete this._backgroundThread;
240                this._backgroundThread = null;
241                if(aCB) (aCB)(aResult);
242                if(this._stack.length){
243                        var stack = this._stack.shift();
244                        this.execThread(stack.pmcid,stack.callback);
245                }
246        },
247
248/////////////////////////////////////////////////////////////////////
249        _dump : function(aString){
250                window.top.bitsMarkingCollection._dump(aString);
251        },
252};
253
254/////////////////////////////////////////////////////////////////////
255var bitsPubmedCentralServiceFunc = function(aPMCID, aCB) {
256        this.pmcid = aPMCID;
257        this.callback = aCB; //互換性の為、実際には䜿甚しない
258        this.result = 0;
259};
260
261bitsPubmedCentralServiceFunc.prototype = {
262        getText : function(pUrl){
263                var text = null;
264                try{
265                        var xmlhttp = new XMLHttpRequest();
266                        if(xmlhttp){
267                                xmlhttp.open("GET",pUrl,false);
268                                xmlhttp.send(null);
269                                if(xmlhttp.status == 200){
270                                        if(xmlhttp.responseText.length >0) return xmlhttp.responseText;
271                                }else{
272                                        bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.getText():error=["+ req.status +" "+ req.statusText+"]");
273                                }
274                        }
275                }catch(err){
276                        Components.utils.reportError(err);
277                }
278                return undefined;
279        },
280
281        getXML : function(pUrl){
282                var xmldoc = null;
283                try{
284                        var responseText = this.getText(pUrl);
285                        if(responseText){
286                                var parser = new DOMParser();
287                                xmldoc = parser.parseFromString(responseText, "text/xml");
288                                parser = undefined;
289                        }
290                }catch(err){
291                        Components.utils.reportError(err);
292                }
293                return xmldoc;
294        },
295
296        searchNCBI : function(aPMCID){
297                aPMCID = bitsPubmedCentralService.formatPMCID(aPMCID);
298                if(!aPMCID) return undefined;
299                const getURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=";
300                var url = getURL + aPMCID;
301                var xmldoc = this.getXML(url);
302                if(!xmldoc) return undefined;
303                var elemId = xmldoc.getElementsByTagName("Id")[0];
304                if(elemId){
305                        return elemId.textContent;
306                }else{
307                        return undefined;
308                }
309        },
310
311        fetchNCBI : function(aPMID, aRetmode){
312                const getMEDLINEURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=text&rettype=medline&id=";
313                const getXMLURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id=";
314                if(!aRetmode || aRetmode == 'xml'){
315                        return this.getXML(getXMLURL + aPMID);
316                }else{
317                        return this.getText(getMEDLINEURL + aPMID);
318                }
319                return undefined;
320        },
321
322        convertFormUnicode : function(aString, aCharset){
323                if(!aString) return "";
324                try {
325                        bitsPubmedCentralService.UNICODE.charset = aCharset;
326                        aString = bitsPubmedCentralService.UNICODE.ConvertFromUnicode(aString);
327                }catch(ex){}
328                return aString;
329        },
330
331        convertToUnicode : function(aString, aCharset){
332                if(!aString) return "";
333                try {
334                        bitsPubmedCentralService.UNICODE.charset = aCharset;
335                        aString = bitsPubmedCentralService.UNICODE.ConvertToUnicode(aString);
336                }catch(ex){}
337                return aString;
338        },
339
340        writeFile : function(aFile, aContent){
341                if(aFile.exists()) aFile.remove(false);
342                try {
343                        aFile.create(aFile.NORMAL_FILE_TYPE, 0666);
344                        var content = this.convertFormUnicode(aContent,"UTF-8");
345                        var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
346                        ostream.init(aFile, 2, 0x200, false);
347                        ostream.write(content, content.length);
348                        ostream.close();
349                }catch(ex){
350                        bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: Failed to write file: " + aFile.path + "["+ ex + "]");
351                }
352        },
353
354        readFile : function(aFile){
355                if(!aFile || !aFile.exists()) return undefined;
356                try {
357                        var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
358                        istream.init(aFile, 1, 0, false);
359                        var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
360                        sstream.init(istream);
361                        var content = sstream.read(sstream.available());
362                        sstream.close();
363                        istream.close();
364                        content = this.convertToUnicode(content,"UTF-8");
365                        return content;
366                }catch(ex){
367                        bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: readFile():" + ex);
368                        return undefined;
369                }
370        },
371
372        createXMLDocument : function(aXMLFile){
373                if(!aXMLFile) return undefined;
374                try{
375                        var fileContents = this.readFile(aXMLFile);
376                        var parser = new DOMParser();
377                        var xmlDocument = parser.parseFromString(fileContents, "text/xml");
378                        parser = undefined;
379                        return xmlDocument;
380                }catch(ex){
381                        bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.createXMLDocument():"+ ex);
382                        return undefined;
383                }
384        },
385
386        analysisMedline : function(aMedline){
387                if(!aMedline) return undefined;
388                try{
389                        var rtn = {};
390                        var arr = aMedline.replace(/\x0D\x0A|\x0D|\x0A/g,"\n").split("\n");
391                        var key = "";
392                        var val = "";
393                        for(var i=0;i<arr.length;i++){
394                                if(arr[i].match(/^([A-Z]+)\s*\-\s(.+)$/)){
395                                        key = RegExp.$1;
396                                        val = RegExp.$2;
397                                        if(rtn[key]){
398                                                if(typeof rtn[key] == "string"){
399                                                        var oldval = rtn[key];
400                                                        rtn[key] = [oldval];
401                                                }
402                                                rtn[key].push(val);
403                                        }else{
404                                                rtn[key] = val;
405                                        }
406                                }else if(arr[i].match(/^\s+?(\S.+)$/)){
407                                        val = RegExp.$1;
408                                        rtn[key] += ' ' + val;
409                                        rtn[key] = rtn[key].replace(/\s{2,}/g," ");
410                                }
411                        }
412                        return rtn;
413                }catch(ex){
414                        bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.analysisMedline():"+ ex);
415                        return undefined;
416                }
417        },
418
419        run : function() {
420                try {
421                        var xmldoc = null;
422                        var medline = null;
423                        var xmlFile = bitsPubmedCentralService.getExtensionDir(this.pmcid);
424                        var medlineFile = xmlFile.clone();
425                        xmlFile.append(this.pmcid+".xml");
426                        medlineFile.append(this.pmcid+".txt");
427                        if(!xmlFile.exists()){
428                                var pmid = this.searchNCBI(this.pmcid);
429                                if(pmid){
430                                        xmldoc = this.fetchNCBI(pmid);
431                                        if(xmldoc){
432                                                var s = new XMLSerializer();
433                                                var xml = s.serializeToString(xmldoc);
434                                                s = undefined;
435                                                this.writeFile(xmlFile, xml+"\n","UTF-8");
436                                        }
437                                        medline = this.fetchNCBI(pmid,'text');
438                                        if(medline) this.writeFile(medlineFile, medline,"UTF-8");
439                                }
440                        }else{
441                                xmldoc = this.createXMLDocument(xmlFile);
442                                medline = this.readFile(medlineFile);
443                        }
444                        if(medline) medline = this.analysisMedline(medline);
445                        this.result = {
446                                xmldoc  : xmldoc,
447                                medline : medline,
448                        };
449                        return this.result;
450
451                }catch(err){
452                        Components.utils.reportError(err);
453                }
454        }
455};
456
457/////////////////////////////////////////////////////////////////////
458var bitsPubmedCentralServiceMainThread = function(threadID, aResult, aCB) {
459        this.threadID = threadID;
460        this.result = aResult;
461        this.callback = aCB;
462};
463
464bitsPubmedCentralServiceMainThread.prototype = {
465        run: function() {
466                try {
467                        // ここでワヌキングスレッドの完了に察しお反応を返す
468                        bitsPubmedCentralService.exitThread(this.result,this.callback);
469                }catch(err){
470                        Components.utils.reportError(err);
471                }
472        },
473
474        QueryInterface: function(iid) {
475                if( iid.equals(Components.interfaces.nsIRunnable) ||
476                                iid.equals(Components.interfaces.nsISupports)) {
477                        return this;
478                }
479                throw Components.results.NS_ERROR_NO_INTERFACE;
480        }
481};
482
483/////////////////////////////////////////////////////////////////////
484var bitsPubmedCentralServiceWorkingThread = function(threadID, aPMCID, aCB) {
485        this.threadID = threadID;
486        this.pmcid = aPMCID;
487        this.callback = aCB;
488        this.result = 0;
489};
490
491bitsPubmedCentralServiceWorkingThread.prototype = {
492        getText : function(pUrl){
493                var text = null;
494                try{
495                        var xmlhttp = new XMLHttpRequest();
496                        if(xmlhttp){
497                                xmlhttp.open("GET",pUrl,false);
498                                xmlhttp.send(null);
499                                if(xmlhttp.status == 200){
500                                        if(xmlhttp.responseText.length >0) return xmlhttp.responseText;
501                                }else{
502                                        bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.getText():error=["+ req.status +" "+ req.statusText+"]");
503                                }
504                        }
505                }catch(err){
506                        Components.utils.reportError(err);
507                }
508                return undefined;
509        },
510
511        getXML : function(pUrl){
512                var xmldoc = null;
513                try{
514                        var responseText = this.getText(pUrl);
515                        if(responseText){
516                                var parser = new DOMParser();
517                                xmldoc = parser.parseFromString(responseText, "text/xml");
518                                parser = undefined;
519                        }
520                }catch(err){
521                        Components.utils.reportError(err);
522                }
523                return xmldoc;
524        },
525
526        searchNCBI : function(aPMCID){
527                aPMCID = bitsPubmedCentralService.formatPMCID(aPMCID);
528                if(!aPMCID) return undefined;
529                const getURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=";
530                var url = getURL + aPMCID;
531                var xmldoc = this.getXML(url);
532                if(!xmldoc) return undefined;
533                var elemId = xmldoc.getElementsByTagName("Id")[0];
534                if(elemId){
535                        return elemId.textContent;
536                }else{
537                        return undefined;
538                }
539        },
540
541        fetchNCBI : function(aPMID, aRetmode){
542                const getMEDLINEURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=text&rettype=medline&id=";
543                const getXMLURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id=";
544                if(!aRetmode || aRetmode == 'xml'){
545                        return this.getXML(getXMLURL + aPMID);
546                }else{
547                        return this.getText(getMEDLINEURL + aPMID);
548                }
549                return undefined;
550        },
551
552        convertFormUnicode : function(aString, aCharset){
553                if(!aString) return "";
554                try {
555                        bitsPubmedCentralService.UNICODE.charset = aCharset;
556                        aString = bitsPubmedCentralService.UNICODE.ConvertFromUnicode(aString);
557                }catch(ex){}
558                return aString;
559        },
560
561        convertToUnicode : function(aString, aCharset){
562                if(!aString) return "";
563                try {
564                        bitsPubmedCentralService.UNICODE.charset = aCharset;
565                        aString = bitsPubmedCentralService.UNICODE.ConvertToUnicode(aString);
566                }catch(ex){}
567                return aString;
568        },
569
570        writeFile : function(aFile, aContent){
571                if(aFile.exists()) aFile.remove(false);
572                try {
573                        aFile.create(aFile.NORMAL_FILE_TYPE, 0666);
574                        var content = this.convertFormUnicode(aContent,"UTF-8");
575                        var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
576                        ostream.init(aFile, 2, 0x200, false);
577                        ostream.write(content, content.length);
578                        ostream.close();
579                }catch(ex){
580                        bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: Failed to write file: " + aFile.path + "["+ ex + "]");
581                }
582        },
583
584        readFile : function(aFile){
585                if(!aFile || !aFile.exists()) return undefined;
586                try {
587                        var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
588                        istream.init(aFile, 1, 0, false);
589                        var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
590                        sstream.init(istream);
591                        var content = sstream.read(sstream.available());
592                        sstream.close();
593                        istream.close();
594                        content = this.convertToUnicode(content,"UTF-8");
595                        return content;
596                }catch(ex){
597                        bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: readFile():" + ex);
598                        return undefined;
599                }
600        },
601
602        createXMLDocument : function(aXMLFile){
603                if(!aXMLFile) return undefined;
604                try{
605                        var fileContents = this.readFile(aXMLFile);
606                        var parser = new DOMParser();
607                        var xmlDocument = parser.parseFromString(fileContents, "text/xml");
608                        parser = undefined;
609                        return xmlDocument;
610                }catch(ex){
611                        bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.createXMLDocument():"+ ex);
612                        return undefined;
613                }
614        },
615
616        analysisMedline : function(aMedline){
617                if(!aMedline) return undefined;
618                try{
619                        var rtn = {};
620                        var arr = aMedline.replace(/\x0D\x0A|\x0D|\x0A/g,"\n").split("\n");
621                        var key = "";
622                        var val = "";
623                        for(var i=0;i<arr.length;i++){
624                                if(arr[i].match(/^([A-Z]+)\s*\-\s(.+)$/)){
625                                        key = RegExp.$1;
626                                        val = RegExp.$2;
627                                        if(rtn[key]){
628                                                if(typeof rtn[key] == "string"){
629                                                        var oldval = rtn[key];
630                                                        rtn[key] = [oldval];
631                                                }
632                                                rtn[key].push(val);
633                                        }else{
634                                                rtn[key] = val;
635                                        }
636                                }else if(arr[i].match(/^\s+?(\S.+)$/)){
637                                        val = RegExp.$1;
638                                        rtn[key] += ' ' + val;
639                                        rtn[key] = rtn[key].replace(/\s{2,}/g," ");
640                                }
641                        }
642                        return rtn;
643                }catch(ex){
644                        bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.analysisMedline():"+ ex);
645                        return undefined;
646                }
647        },
648
649        run : function() {
650                try {
651                        // ここでワヌキングスレッドが凊理を行う
652                        var xmldoc = null;
653                        var medline = null;
654                        var xmlFile = bitsPubmedCentralService.getExtensionDir(this.pmcid);
655                        var medlineFile = xmlFile.clone();
656                        xmlFile.append(this.pmcid+".xml");
657                        medlineFile.append(this.pmcid+".txt");
658                        if(!xmlFile.exists()){
659                                var pmid = this.searchNCBI(this.pmcid);
660                                if(pmid){
661                                        xmldoc = this.fetchNCBI(pmid);
662                                        if(xmldoc){
663                                                var s = new XMLSerializer();
664                                                var xml = s.serializeToString(xmldoc);
665                                                s = undefined;
666                                                this.writeFile(xmlFile, xml+"\n","UTF-8");
667                                        }
668                                        medline = this.fetchNCBI(pmid,'text');
669                                        if(medline) this.writeFile(medlineFile, medline,"UTF-8");
670                                }
671                        }else{
672                                xmldoc = this.createXMLDocument(xmlFile);
673                                medline = this.readFile(medlineFile);
674                        }
675                        if(medline) medline = this.analysisMedline(medline);
676                        this.result = {
677                                xmldoc  : xmldoc,
678                                medline : medline,
679                        };
680                        // 凊理が終了したら、終了を知らせるためにメむンスレッドにコヌルバックする
681                        bitsPubmedCentralService.mainThread.dispatch(new bitsPubmedCentralServiceMainThread(this.threadID, this.result, this.callback), bitsPubmedCentralService.backgroundThread.DISPATCH_NORMAL);
682                }catch(err){
683                        Components.utils.reportError(err);
684                }
685        },
686
687        QueryInterface : function(iid) {
688                if(     iid.equals(Components.interfaces.nsIRunnable) ||
689                                iid.equals(Components.interfaces.nsISupports)) {
690                        return this;
691                }
692                throw Components.results.NS_ERROR_NO_INTERFACE;
693        }
694};
Note: See TracBrowser for help on using the repository browser.