1 | """ |
---|
2 | Image classes |
---|
3 | """ |
---|
4 | |
---|
5 | import data |
---|
6 | import logging |
---|
7 | from galaxy.datatypes.metadata import MetadataElement |
---|
8 | from galaxy.datatypes import metadata |
---|
9 | from galaxy.datatypes.sniff import * |
---|
10 | from urllib import urlencode, quote_plus |
---|
11 | import zipfile |
---|
12 | import os, subprocess, tempfile |
---|
13 | |
---|
14 | log = logging.getLogger(__name__) |
---|
15 | |
---|
16 | class Image( data.Data ): |
---|
17 | """Class describing an image""" |
---|
18 | def set_peek( self, dataset, is_multi_byte=False ): |
---|
19 | if not dataset.dataset.purged: |
---|
20 | dataset.peek = 'Image in %s format' % dataset.extension |
---|
21 | dataset.blurb = data.nice_size( dataset.get_size() ) |
---|
22 | else: |
---|
23 | dataset.peek = 'file does not exist' |
---|
24 | dataset.blurb = 'file purged from disk' |
---|
25 | |
---|
26 | class Pdf( Image ): |
---|
27 | def sniff(self, filename): |
---|
28 | """Determine if the file is in pdf format. |
---|
29 | """ |
---|
30 | headers = get_headers(filename, None, 1) |
---|
31 | try: |
---|
32 | if headers[0][0].startswith("%PDF"): |
---|
33 | return True |
---|
34 | else: |
---|
35 | return False |
---|
36 | except IndexError: |
---|
37 | return False |
---|
38 | |
---|
39 | def create_applet_tag_peek( class_name, archive, params ): |
---|
40 | text = """ |
---|
41 | <!--[if !IE]>--> |
---|
42 | <object classid="java:%s" |
---|
43 | type="application/x-java-applet" |
---|
44 | height="30" width="200" align="center" > |
---|
45 | <param name="archive" value="%s"/>""" % ( class_name, archive ) |
---|
46 | for name, value in params.iteritems(): |
---|
47 | text += """<param name="%s" value="%s"/>""" % ( name, value ) |
---|
48 | text += """ |
---|
49 | <!--<![endif]--> |
---|
50 | <object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" |
---|
51 | height="30" width="200" > |
---|
52 | <param name="code" value="%s" /> |
---|
53 | <param name="archive" value="%s"/>""" % ( class_name, archive ) |
---|
54 | for name, value in params.iteritems(): |
---|
55 | text += """<param name="%s" value="%s"/>""" % ( name, value ) |
---|
56 | text += """</object> |
---|
57 | <!--[if !IE]>--> |
---|
58 | </object> |
---|
59 | <!--<![endif]--> |
---|
60 | """ |
---|
61 | return """<div><p align="center">%s</p></div>""" % text |
---|
62 | |
---|
63 | class Gmaj( data.Data ): |
---|
64 | """Class describing a GMAJ Applet""" |
---|
65 | file_ext = "gmaj.zip" |
---|
66 | copy_safe_peek = False |
---|
67 | def set_peek( self, dataset, is_multi_byte=False ): |
---|
68 | if not dataset.dataset.purged: |
---|
69 | if hasattr( dataset, 'history_id' ): |
---|
70 | params = { |
---|
71 | "bundle":"display?id=%s&tofile=yes&toext=.zip" % dataset.id, |
---|
72 | "buttonlabel": "Launch GMAJ", |
---|
73 | "nobutton": "false", |
---|
74 | "urlpause" :"100", |
---|
75 | "debug": "false", |
---|
76 | "posturl": quote_plus( "history_add_to?%s" % "&".join( [ "%s=%s" % ( key, value ) for key, value in { 'history_id': dataset.history_id, 'ext': 'maf', 'name': 'GMAJ Output on data %s' % dataset.hid, 'info': 'Added by GMAJ', 'dbkey': dataset.dbkey, 'copy_access_from': dataset.id }.items() ] ) ) |
---|
77 | } |
---|
78 | class_name = "edu.psu.bx.gmaj.MajApplet.class" |
---|
79 | archive = "/static/gmaj/gmaj.jar" |
---|
80 | dataset.peek = create_applet_tag_peek( class_name, archive, params ) |
---|
81 | dataset.blurb = 'GMAJ Multiple Alignment Viewer' |
---|
82 | else: |
---|
83 | dataset.peek = "After you add this item to your history, you will be able to launch the GMAJ applet." |
---|
84 | dataset.blurb = 'GMAJ Multiple Alignment Viewer' |
---|
85 | else: |
---|
86 | dataset.peek = 'file does not exist' |
---|
87 | dataset.blurb = 'file purged from disk' |
---|
88 | def display_peek(self, dataset): |
---|
89 | try: |
---|
90 | return dataset.peek |
---|
91 | except: |
---|
92 | return "peek unavailable" |
---|
93 | def get_mime(self): |
---|
94 | """Returns the mime type of the datatype""" |
---|
95 | return 'application/zip' |
---|
96 | def sniff(self, filename): |
---|
97 | """ |
---|
98 | NOTE: the sniff.convert_newlines() call in the upload utility will keep Gmaj data types from being |
---|
99 | correctly sniffed, but the files can be uploaded (they'll be sniffed as 'txt'). This sniff function |
---|
100 | is here to provide an example of a sniffer for a zip file. |
---|
101 | """ |
---|
102 | if not zipfile.is_zipfile( filename ): |
---|
103 | return False |
---|
104 | contains_gmaj_file = False |
---|
105 | zip_file = zipfile.ZipFile(filename, "r") |
---|
106 | for name in zip_file.namelist(): |
---|
107 | if name.split(".")[1].strip().lower() == 'gmaj': |
---|
108 | contains_gmaj_file = True |
---|
109 | break |
---|
110 | zip_file.close() |
---|
111 | if not contains_gmaj_file: |
---|
112 | return False |
---|
113 | return True |
---|
114 | |
---|
115 | class Html( data.Text ): |
---|
116 | """Class describing an html file""" |
---|
117 | file_ext = "html" |
---|
118 | |
---|
119 | def set_peek( self, dataset, is_multi_byte=False ): |
---|
120 | if not dataset.dataset.purged: |
---|
121 | dataset.peek = "HTML file" |
---|
122 | dataset.blurb = data.nice_size( dataset.get_size() ) |
---|
123 | else: |
---|
124 | dataset.peek = 'file does not exist' |
---|
125 | dataset.blurb = 'file purged from disk' |
---|
126 | def get_mime(self): |
---|
127 | """Returns the mime type of the datatype""" |
---|
128 | return 'text/html' |
---|
129 | def sniff( self, filename ): |
---|
130 | """ |
---|
131 | Determines whether the file is in html format |
---|
132 | |
---|
133 | >>> fname = get_test_fname( 'complete.bed' ) |
---|
134 | >>> Html().sniff( fname ) |
---|
135 | False |
---|
136 | >>> fname = get_test_fname( 'file.html' ) |
---|
137 | >>> Html().sniff( fname ) |
---|
138 | True |
---|
139 | """ |
---|
140 | headers = get_headers( filename, None ) |
---|
141 | try: |
---|
142 | for i, hdr in enumerate(headers): |
---|
143 | if hdr and hdr[0].lower().find( '<html>' ) >=0: |
---|
144 | return True |
---|
145 | return False |
---|
146 | except: |
---|
147 | return True |
---|
148 | |
---|
149 | class Laj( data.Text ): |
---|
150 | """Class describing a LAJ Applet""" |
---|
151 | file_ext = "laj" |
---|
152 | copy_safe_peek = False |
---|
153 | |
---|
154 | def set_peek( self, dataset, is_multi_byte=False ): |
---|
155 | if not dataset.dataset.purged: |
---|
156 | if hasattr( dataset, 'history_id' ): |
---|
157 | params = { |
---|
158 | "alignfile1": "display?id=%s" % dataset.id, |
---|
159 | "buttonlabel": "Launch LAJ", |
---|
160 | "title": "LAJ in Galaxy", |
---|
161 | "posturl": quote_plus( "history_add_to?%s" % "&".join( [ "%s=%s" % ( key, value ) for key, value in { 'history_id': dataset.history_id, 'ext': 'lav', 'name': 'LAJ Output', 'info': 'Added by LAJ', 'dbkey': dataset.dbkey, 'copy_access_from': dataset.id }.items() ] ) ), |
---|
162 | "noseq": "true" |
---|
163 | } |
---|
164 | class_name = "edu.psu.cse.bio.laj.LajApplet.class" |
---|
165 | archive = "/static/laj/laj.jar" |
---|
166 | dataset.peek = create_applet_tag_peek( class_name, archive, params ) |
---|
167 | else: |
---|
168 | dataset.peek = "After you add this item to your history, you will be able to launch the LAJ applet." |
---|
169 | dataset.blurb = 'LAJ Multiple Alignment Viewer' |
---|
170 | else: |
---|
171 | dataset.peek = 'file does not exist' |
---|
172 | dataset.blurb = 'file purged from disk' |
---|
173 | def display_peek(self, dataset): |
---|
174 | try: |
---|
175 | return dataset.peek |
---|
176 | except: |
---|
177 | return "peek unavailable" |
---|