[81] | 1 | from os import makedirs
|
---|
| 2 | import tempfile
|
---|
| 3 | from typing import Union
|
---|
| 4 | from uuid import UUID, uuid4
|
---|
| 5 |
|
---|
| 6 | from pyson.JsonValue import JsonValue
|
---|
| 7 |
|
---|
| 8 | import os.path as path
|
---|
| 9 |
|
---|
| 10 | NoneType = type(None)
|
---|
| 11 |
|
---|
| 12 | class FileLocation :
|
---|
| 13 | '''
|
---|
| 14 | This contains a "system independent" {@link File}. This is represented by a
|
---|
| 15 | {@link UUID}. See {@link #getFile()} to get the file referenced by this. The
|
---|
| 16 | file may or may not yet exist (depending on whether your party already wrote
|
---|
| 17 | some contents in that file in previous runs), may or may not be empty (your
|
---|
| 18 | choice), and can contain any type of data. The original intent of this is
|
---|
| 19 | that parties can store learned data in this file, while the name can be kept
|
---|
| 20 | for later re-use in later runs (eg negotiation sessions) on the same machine.
|
---|
| 21 | <p>
|
---|
| 22 | This file is to be used locally on some other machine (typically a
|
---|
| 23 | partiesserver). This object itself only contains a file name.
|
---|
| 24 | {@link #getFile()} turns it into a system-specific {@link File}. <br>
|
---|
| 25 | <h2>WARNING</h2> if used multiple times on different machines, multiple,
|
---|
| 26 | separate files will be involved, there is no magical synchronization of
|
---|
| 27 | multiple items with the same UUID used on different machines.
|
---|
| 28 | '''
|
---|
| 29 |
|
---|
| 30 | _TMP = tempfile.gettempdir()
|
---|
| 31 | _GENIUSWEBPYTHON = "geniuswebpython";
|
---|
| 32 | _rootpath = path.join(_TMP, _GENIUSWEBPYTHON)
|
---|
| 33 |
|
---|
| 34 | def __init__(self, name: Union[UUID,NoneType]=None ):
|
---|
| 35 | '''
|
---|
| 36 | @param name the name of the file (must be UUID to prevent injection of
|
---|
| 37 | bad filenames like /.. or C:) Use {@link #FileLocation()} to
|
---|
| 38 | create new FileLocation. That should ensure a new UUID that
|
---|
| 39 | does not collide with existing ones. If None, then this
|
---|
| 40 | creates a new random UUID.
|
---|
| 41 | '''
|
---|
| 42 | if not path.exists(self._rootpath) :
|
---|
| 43 | makedirs(self._rootpath);
|
---|
| 44 | # don't print the location, python parties would crash
|
---|
| 45 | if name==None:
|
---|
| 46 | name=uuid4()
|
---|
| 47 | self._name:UUID = name #type:ignore
|
---|
| 48 |
|
---|
| 49 | @JsonValue()
|
---|
| 50 | def getName(self) -> UUID:
|
---|
| 51 | return self._name
|
---|
| 52 |
|
---|
| 53 | def getFile(self) ->str :
|
---|
| 54 | '''
|
---|
| 55 | @return Actual filename that can be used for read/write operations. This file
|
---|
| 56 | usually resides in the geniuswebpython folder inside the tmpdir.
|
---|
| 57 | This temp dir depends on the run configuration,
|
---|
| 58 | eg some directory inside the user's home directory, or a temp
|
---|
| 59 | folder inside tomcat.
|
---|
| 60 | '''
|
---|
| 61 | return path.join(self._rootpath, str(self._name))
|
---|
| 62 |
|
---|
| 63 | def __repr__(self):
|
---|
| 64 | return "FileLocation[" + self._name + "]"
|
---|
| 65 |
|
---|
| 66 | def __hash__(self):
|
---|
| 67 | return hash(self._name)
|
---|
| 68 |
|
---|
| 69 |
|
---|
| 70 | def __eq__(self, other):
|
---|
| 71 | return isinstance(other, self.__class__) and \
|
---|
| 72 | self._name==other._name
|
---|
| 73 |
|
---|