1: import os
2: import os.path
3: import stat
4: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
5: from Globals import InitializeClass,package_home
6: from OFS.SimpleItem import SimpleItem
7: import xml.dom.minidom
8: import OSAS_helpers
9: from OSAS_helpers import *
10:
11: class OSAS_storeOnlineServer(SimpleItem):
12: """Server for store Online system"""
13:
14: _v_metaFiles={} #chache fuer indexMeta
15: meta_type="OSAS_server"
16: def getSubDirsFromIndexMeta(self,path):
17:
18: """Gebe alle path untergeordenten Objekte aus
19: @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
20: @return: Directory [pfad auf das Objekt]->(fileType,''), fileType ist hierbei OSAS_dir_archive falls Object ein directory und OSAS_file_archive falls das Object ein File ist,der zweite Eintrag des Tupels ist zur Zeit immer '', spaeter wird hier die Beschreibung gemaess Metadaten stehen, wie bei readObjectsFromPath.
21: @todo: Rueckgabe einer Beschreibung gemaess Metadaten
22: """
23: ret={}
24: #server=xmlrpclib.Server(self.serverUrl)
25: indexMeta,stats=self.findIndexMetaWithStats(path)#findex index.meta zu path.
26:
27: if not indexMeta:
28: return ret
29:
30: realPath=os.path.split(indexMeta)[0]
31: path=path.replace(realPath,"")
32: if path and (path[0]==os.sep): #falls am Anfang os.sep steht lösche dieses.
33: path=path[1:]
34:
35:
36:
37: #teste ob schon im cache
38:
39: if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
40: return self._v_metaFiles[path][1]
41:
42: try:
43: dom=xml.dom.minidom.parse(indexMeta)
44: except:
45: zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
46: return ret
47:
48: dirs=[]
49: dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
50:
51: for dir in dirs:
52: pathes=dir.getElementsByTagName('path')
53: if pathes:
54: pathX=OSAS_helpers.getText(pathes[0].childNodes)
55: else:
56: pathX=""
57: names=dir.getElementsByTagName('name')
58: if names:
59: name=OSAS_helpers.getText(names[0].childNodes)
60: else:
61: name=""
62:
63: #print "PP",pathX,path
64: if pathX==path:
65: if dir.tagName=="dir":
66: fileType="OSAS_dir_archive"
67: else:
68: fileType="OSAS_file_archive"
69:
70: object=os.path.join(realPath,pathX,name)
71: ret[object.encode('utf-8')]=(fileType,'')
72:
73: self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache
74:
75: return ret
76:
77:
78:
79: def findIndexMeta(self,realPath=""):
80: """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
81: @keyword path: default ist "", Pfad auf das Object
82: @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
83: """
84:
85: #suche index.meta
86: while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):
87: realPath=os.path.split(realPath)[0]
88:
89: if realPath=='' or realPath=='/':
90: if os.path.exists(os.path.join(realPath,'index.meta')):
91: return (os.path.join(realPath,'index.meta'))
92: else:
93: return None
94: else:
95: return os.path.join(realPath,'index.meta')
96:
97: def findIndexMetaWithStats(self,path=""):
98: """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
99: @keyword path: default ist "", Pfad auf das Object
100: @return: None falls kein index.meta existiert sonst Tupel (Pfad auf das index.meta,stats(indexMeta)
101: """
102:
103: indexMeta=self.findIndexMeta(path)
104: if indexMeta:
105: return (indexMeta,self.getStat(indexMeta))
106: else:
107: return (None,[])
108:
109:
110: def getStat(self,path=""):
111: """Gibt stat von path aus
112: @keyword path: default ist "", Pfad
113: @return: stat[path]"""
114:
115: if not os.path.exists(path):
116: #return None,"(ERROR) path %s does not exist."%path
117: return None
118: else:
119: return [x for x in os.stat(path)]
120:
121:
122:
123:
124: def listdir(self,path=""):
125: """list dir"""
126: return os.listdir(path)
127:
128:
129: def getMetaFile(self,path):
130: """get index.meta and translate it to HTML"""
131: html=[]
132:
133: if not os.path.exists(path+"/index.meta"):
134:
135: return self.getMetaInfoFromIndexMeta(path)
136: #return "NO_METADATA"
137: else:
138:
139: f = os.popen("cat "+path+"/index.meta","r")
140: lines = f.read()
141:
142: dom = xml.dom.minidom.parseString(lines)
143: try:
144: name=getText(dom.getElementsByTagName("name")[0].childNodes)
145: except:
146: name="NOT_DEFINED!!!"
147: try:
148: creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
149: except:
150: creator="NOT_DEFINED!!!"
151:
152: try:
153: creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
154: except:
155: creation_date="NOT_DEFINED!!!"
156:
157: try:
158: description=getText(dom.getElementsByTagName("description")[0].childNodes)
159: except:
160: description="NOT_DEFINED!!!"
161:
162: try:
163: type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
164: except:
165: type=""
166: if type=="scanned document":
167: html="<h3>Document: "+name+"</h3>"
168: elif type=="folder":
169: html="<h3>Folder: "+name+"</h3>"
170: else:
171: html="<h3>Document: "+name+"</h3>"
172:
173: html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>"
174: html=html+"<h4>Description</h4><p>"+description+"</p>"
175: try:
176: bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
177: if bib.attributes.has_key('type'):
178: html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
179: else:
180: html=html+"<h4>Info</h4>"
181: html=html+getBib(bib.childNodes)
182:
183: except:
184: """none"""
185:
186: # html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace')
187:
188: return html
189:
190:
191: def getMetaInfoFromIndexMeta(self,path):
192: """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container)
193: @param path: Pfad auf das Object relativ zum rootFolderName
194: @return: metadata als html
195: """
196: xmlInfos=self.findEntryInIndexMeta(path)
197: if xmlInfos:
198: return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
199: else:
200: return ""
201:
202: def findEntryInIndexMeta(self,path):
203: """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.
204: @param path: Pfad auf das Object relativ zum rootFolderName
205: @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
206: """
207:
208: indexMeta=self.findIndexMeta(path) # suche index.meta
209:
210: if not indexMeta:
211: return None
212:
213: realPath=os.path.split(indexMeta)[0]
214: path=os.path.normpath(path)
215:
216: try:
217: dom=xml.dom.minidom.parse(indexMeta)
218: except:
219: zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
220: #ist path ein directory?
221: dirs=dom.getElementsByTagName('dir')
222: for dir in dirs:
223: pathes=dir.getElementsByTagName('path')
224: if pathes:
225: pathX=OSAS_helpers.getText(pathes[0].childNodes)
226: else:
227: pathX=""
228: names=dir.getElementsByTagName('name')
229: if names:
230: name=OSAS_helpers.getText(names[0].childNodes)
231: else:
232: name=""
233:
234: checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
235: if checkpath==path:
236:
237: return dir.toxml()
238:
239: #ist path ein file?
240: files=dom.getElementsByTagName('file')
241: for dir in dirs:
242: pathes=dir.getElementsByTagName('path')
243: if pathes:
244: pathX=OSAS_helpers.getText(pathes[0].childNodes)
245: else:
246: pathX=""
247: names=dir.getElementsByTagName('name')
248: if names:
249: name=OSAS_helpers.getText(names[0].childNodes)
250: else:
251: name=""
252:
253: checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
254: if checkpath==path:
255:
256: return dir.toxml()
257:
258:
259: return None
260:
261:
262: def manage_addOSAS_storeOnlineServerForm(self):
263: """interface for adding the OSAS_storeOnline"""
264: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnlineServer.zpt')).__of__(self)
265: return pt()
266:
267: def manage_addOSAS_storeOnlineServer(self,id,RESPONSE=None):
268: """add the OSAS_storeOnline
269: @param id: id
270: """
271: newObj=OSAS_storeOnlineServer(id)
272: self._setObject(id,newObj)
273: if RESPONSE is not None:
274: RESPONSE.redirect('manage_main')
275:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>