pull/1/head
Ivan Olexyn 5 years ago
parent 40f2f21172
commit 9977c3f14d

@ -53,8 +53,8 @@ Sync files across directories.
- To do so .listDeleted would need to be a field of Dir
- And the .lists of every dir would need to be calculated before any deletion took place.
- Check if the reduced reobustness is worth the prettier solution.
- File is created in DirA
- Sync creates the file in DirB
- File is created in DirB
- Sync creates the file in DirA
- Sync creates the file in DirB
- this means the file in DirB is overwritten with `cp` for no reason.
- implement a check to prevent this.

@ -38,7 +38,7 @@ public class Flow {
String stateFilePath = syncDirectory.stateFilePath(path);
if (new File(stateFilePath).exists()) {
syncDirectory.readStateFile(syncDirectory.path);
syncDirectory.readStateFile();
} else {
syncDirectory.writeStateFile(path);
}
@ -53,11 +53,11 @@ public class Flow {
String path = syncDirectory.path;
syncDirectory.readState(path);
syncDirectory.readState();
syncDirectory.makeListCreated(path);
syncDirectory.makeListDeleted(path);
syncDirectory.makeListModified(path);
syncDirectory.makeListCreated();
syncDirectory.makeListDeleted();
syncDirectory.makeListModified();
syncDirectory.doCreate();
syncDirectory.doDelete();

@ -40,7 +40,7 @@ public class SyncDirectory {
/**
* NOTE that the SFile().lastModifiedOld is not set here, so it is 0 by default.
*/
public Map<String, SyncFile> readState(String path) {
public Map<String, SyncFile> readState() {
Map<String, SyncFile> filemap = new HashMap<>();
Execute.TwoBr find = x.execute(new String[]{"find",
@ -64,7 +64,7 @@ public class SyncDirectory {
/**
* READ the contents of StateFile to Map.
*/
public Map<String, SyncFile> readStateFile(String path) {
public Map<String, SyncFile> readStateFile() {
Map<String, SyncFile> filemap = new HashMap<>();
List<String> lines = tools.fileToLines(new File(stateFilePath(path)));
@ -76,7 +76,7 @@ public class SyncDirectory {
String sFilePath = line.replace(modTimeString + " ", "");
SyncFile sfile = new SyncFile(sFilePath);
sfile.setLastModifiedOld(modTime);
sfile.setStateFileTime(modTime);
filemap.put(sFilePath, sfile);
}
@ -92,10 +92,10 @@ public class SyncDirectory {
*
* @return
*/
public void makeListCreated(String path) {
public void makeListCreated() {
listCreated = new ArrayList<>();
Map<String, SyncFile> fromA = readState(path);
Map<String, SyncFile> substractB = readStateFile(path);
Map<String, SyncFile> fromA = readState();
Map<String, SyncFile> substractB = readStateFile();
listCreated = tools.mapMinus(fromA, substractB);
}
@ -112,10 +112,10 @@ public class SyncDirectory {
*
* @return
*/
public void makeListDeleted(String path) {
public void makeListDeleted() {
listDeleted = new ArrayList<>();
Map<String, SyncFile> fromA = readStateFile(path);
Map<String, SyncFile> substractB = readState(path);
Map<String, SyncFile> fromA = readStateFile();
Map<String, SyncFile> substractB = readState();
listDeleted = tools.mapMinus(fromA, substractB);
@ -128,12 +128,12 @@ public class SyncDirectory {
*
* @return
*/
public void makeListModified(String path) {
public void makeListModified() {
listModified = new ArrayList<>();
Map<String, SyncFile> oldMap = readStateFile(path);
Map<String, SyncFile> oldMap = readStateFile();
for (Map.Entry<String, SyncFile> newFileEntry : readState(path).entrySet()) {
for (Map.Entry<String, SyncFile> newFileEntry : readState().entrySet()) {
// If KEY exists in OLD , thus FILE was NOT created.
String newFileKey = newFileEntry.getKey();
@ -144,7 +144,7 @@ public class SyncDirectory {
long lastModifiedNew = newFile.lastModified();
long lastModifiedOld = oldMap.get(newFileKey).lastModifiedOld();
long lastModifiedOld = oldMap.get(newFileKey).stateFileTime();
if (lastModifiedNew > lastModifiedOld) {
listModified.add(newFile);
@ -178,61 +178,114 @@ public class SyncDirectory {
}
public void doCreate() {
private class Info {
private String relativePath = null;
private String thisFilePath = null;
private String otherFilePath = null;
private File otherFile = null;
private String otherParentPath = null;
private File otherParentFile = null;
private long thisStateFileTime = 0;
private long thisTimeModified = 0;
private long otherTimeModified = 0;
for (File createdFile : listCreated) {
for (Map.Entry<String, SyncDirectory> otherEntry : syncEntity.syncDirectories.entrySet()) {
SyncDirectory otherSyncDirectory = otherEntry.getValue();
if (!this.equals(otherSyncDirectory)) {
private Info(SyncDirectory thisSD,
SyncFile sFile,
SyncDirectory otherSD) {
// Example:
// syncDirectory /foo
// otherSyncDirectory /bar
// createdFile /foo/hello/created-file.gif
// relativePath /hello/created-file.gif
String relativePath = createdFile.getPath().replace(this.path, "");
String targetPath = otherSyncDirectory.path + relativePath;
String targetParentPath = new File(targetPath).getParent();
if (!new File(targetParentPath).exists()) {
String[] cmd = new String[]{"mkdir",
"-p",
targetParentPath};
x.execute(cmd);
this.relativePath = sFile.getPath().replace(thisSD.path, "");
this.thisFilePath = sFile.getPath();
this.otherFilePath = otherSD.path + relativePath;
this.otherFile = new File(otherFilePath);
this.otherParentPath = otherFile.getParent();
this.otherParentFile = new File(otherParentPath);
if (thisSD.readStateFile().get(thisFilePath) != null) {
this.thisStateFileTime = thisSD.readStateFile().get(thisFilePath).stateFileTime();
} else {
// thisFile does not exist in StateFile, a value of 0 can be seen as equal to "never existed".
this.thisStateFileTime = 0;
}
this.thisTimeModified = sFile.lastModified();
String[] cmd = new String[]{"cp",
createdFile.getPath(),
otherSyncDirectory.path + relativePath};
x.execute(cmd);
if (otherFile.exists()) {
this.otherTimeModified = otherFile.lastModified();
} else {
if (otherSD.readStateFile().get(otherFilePath) != null) {
this.otherTimeModified = otherSD.readStateFile().get(otherFilePath).stateFileTime();
} else {
this.otherTimeModified = 0;
}
}
}
}
public void doCreate() {
for (SyncFile createdFile : listCreated) {
if (createdFile.isFile()) {
for (Map.Entry<String, SyncDirectory> otherEntry : syncEntity.syncDirectories.entrySet()) {
SyncDirectory otherSyncDirectory = otherEntry.getValue();
if (!this.equals(otherSyncDirectory)) {
Info info = new Info(this, createdFile, otherSyncDirectory);
createFile(info);
}
}
}
}
}
/**
*
*/
public void doDelete() {
for (File deletedFile : listDeleted) {
for (SyncFile deletedFile : listDeleted) {
for (Map.Entry<String, SyncDirectory> otherEntry : syncEntity.syncDirectories.entrySet()) {
SyncDirectory otherSyncDirectory = otherEntry.getValue();
if (!this.equals(otherSyncDirectory)) {
String relativePath = deletedFile.getPath().replace(this.path, "");
Info info = new Info(this, deletedFile, otherSyncDirectory);
if (info.otherFile.isFile()) {
// if the otherFile was created with ensync it will have the == TimeModified.
if (info.thisStateFileTime >= info.otherTimeModified) {
String[] cmd = new String[]{"rm",
"-r",
otherSyncDirectory.path + relativePath};
info.otherFilePath};
x.execute(cmd);
}
}
}
}
}
}
public void doModify() {
for (SyncFile modifiedFile : this.listModified) {
@ -244,42 +297,36 @@ public class SyncDirectory {
if (!this.equals(otherSyncDirectory)) {
String relativePath = modifiedFile.getPath().replace(this.path, "");
Info info = new Info(this, modifiedFile, otherSyncDirectory);
String otherFilePath = otherSyncDirectory.path + relativePath;
SyncFile otherFile = new SyncFile(otherFilePath);
createFile(info);
if (otherFile.exists()) {
if (modifiedFile.lastModified() > otherFile.lastModified()) {
// IF both Files exist, and this File NEWER -> UPDATE the other File
String[] cmd = new String[]{"cp",
modifiedFile.getPath(),
otherFilePath};
x.execute(cmd);
}
} else {
// IF other file does NOT exist -> UPDATE (i.e. create) the other File
String[] cmd = new String[]{"mkdir",
"-p",
otherFilePath};
x.execute(cmd);
cmd = new String[]{"cp",
modifiedFile.getPath(),
otherFilePath};
x.execute(cmd);
}
}
}
}
}
private void createFile(Info info) {
if (!info.otherFile.exists() || info.thisTimeModified > info.otherTimeModified) {
if (!info.otherParentFile.exists()) {
String[] cmd = new String[]{"mkdir",
"-p",
info.otherParentPath};
x.execute(cmd);
}
String[] cmd = new String[]{"cp",
"-p",
info.thisFilePath,
info.otherFilePath};
x.execute(cmd);
}
}
}

@ -6,7 +6,8 @@ public class SyncFile extends File {
// Very IMPORTANT field. Allows to store lastModified as it is stored in the StateFile.
private long lastModifiedOld = 0;
private long stateFileTime = 0;
public SyncFile(String pathname) {
@ -15,12 +16,16 @@ public class SyncFile extends File {
public long lastModifiedOld(){
return lastModifiedOld;
public long stateFileTime(){
return stateFileTime;
}
public void setLastModifiedOld(long value){
lastModifiedOld = value;
public void setStateFileTime(long value){
stateFileTime = value;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 55 KiB

@ -4,31 +4,31 @@
<element>
<id>UMLObject</id>
<coordinates>
<x>700</x>
<y>720</y>
<w>110</w>
<x>890</x>
<y>380</y>
<w>150</w>
<h>40</h>
</coordinates>
<panel_attributes>Directory B</panel_attributes>
<panel_attributes>otherDirectory</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>700</x>
<y>680</y>
<w>110</w>
<x>890</x>
<y>340</y>
<w>150</w>
<h>40</h>
</coordinates>
<panel_attributes>Directory A</panel_attributes>
<panel_attributes>this.Directory</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>700</x>
<y>530</y>
<w>110</w>
<x>980</x>
<y>280</y>
<w>90</w>
<h>40</h>
</coordinates>
<panel_attributes>Delete
@ -39,9 +39,9 @@ group=1</panel_attributes>
<element>
<id>UMLObject</id>
<coordinates>
<x>700</x>
<y>570</y>
<w>110</w>
<x>1070</x>
<y>280</y>
<w>90</w>
<h>40</h>
</coordinates>
<panel_attributes>Create
@ -52,9 +52,9 @@ group=1</panel_attributes>
<element>
<id>UMLObject</id>
<coordinates>
<x>700</x>
<y>610</y>
<w>110</w>
<x>1160</x>
<y>280</y>
<w>90</w>
<h>40</h>
</coordinates>
<panel_attributes>Modify
@ -65,305 +65,379 @@ group=1</panel_attributes>
<element>
<id>UMLState</id>
<coordinates>
<x>850</x>
<y>830</y>
<x>1050</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>YES
bg=green</panel_attributes>
<panel_attributes>File
bg=red
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>890</x>
<y>280</y>
<w>90</w>
<h>40</h>
</coordinates>
<panel_attributes>Unchanged
bg=white
group=1</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>850</x>
<y>720</y>
<x>1120</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File </panel_attributes>
<panel_attributes>File
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>940</x>
<y>720</y>
<x>1050</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
bg=red
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1300</x>
<y>830</y>
<x>1120</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
bg=red</panel_attributes>
<panel_attributes>File
bg=red
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<id>UMLState</id>
<coordinates>
<x>700</x>
<y>490</y>
<w>110</w>
<x>1410</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>Unchanged
bg=white
group=1</panel_attributes>
<panel_attributes>File
bg=green
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>850</x>
<y>680</y>
<x>1410</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File </panel_attributes>
<panel_attributes>File
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>940</x>
<y>680</y>
<x>1340</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File </panel_attributes>
<panel_attributes>File
bg=green
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1030</x>
<y>720</y>
<x>1340</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
bg=green
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1030</x>
<y>680</y>
<x>1700</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
bg=yellow
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1120</x>
<y>720</y>
<x>1700</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1120</x>
<y>680</y>
<x>1630</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File </panel_attributes>
<panel_attributes>File
bg=yellow
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1210</x>
<y>720</y>
<x>1630</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
bg=yellow
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1210</x>
<y>680</y>
<x>1190</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
bg=red
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1300</x>
<y>720</y>
<x>1190</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=yellow</panel_attributes>
bg=green
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1300</x>
<y>680</y>
<x>1260</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File </panel_attributes>
<panel_attributes>File
bg=red
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1390</x>
<y>720</y>
<x>1260</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=yellow</panel_attributes>
bg=yellow
group=2</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1390</x>
<y>680</y>
<x>1550</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=yellow</panel_attributes>
bg=green
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1550</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=yellow
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1050</x>
<y>440</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>do
nothing</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1120</x>
<y>440</y>
<w>790</w>
<h>40</h>
</coordinates>
<panel_attributes> cp if newer
try: time deletet = last time present in StateFile, else time deleted = 0 (~never existed)
halign=left</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1480</x>
<y>680</y>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
bg=red
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1480</x>
<y>720</y>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
bg=green
group=3</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1570</x>
<y>680</y>
<x>1770</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
bg=yellow
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1570</x>
<y>720</y>
<x>1840</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=yellow</panel_attributes>
bg=green
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1660</x>
<y>680</y>
<x>1840</x>
<y>340</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
bg=yellow
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1660</x>
<y>720</y>
<x>1770</x>
<y>380</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=yellow</panel_attributes>
bg=red
group=4</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLNote</id>
<id>UMLObject</id>
<coordinates>
<x>830</x>
<y>490</y>
<w>150</w>
<h>80</h>
<x>1050</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>2^4 = 16
however only 10
because 6 are symmetrical.
bg=white</panel_attributes>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>700</x>
<y>830</y>
<w>110</w>
<x>1340</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>Covered?</panel_attributes>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<id>UMLObject</id>
<coordinates>
<x>940</x>
<y>830</y>
<x>1410</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
@ -372,10 +446,10 @@ bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<id>UMLObject</id>
<coordinates>
<x>1120</x>
<y>830</y>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
@ -383,76 +457,406 @@ bg=green</panel_attributes>
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>880</x>
<y>760</y>
<w>150</w>
<h>40</h>
</coordinates>
<panel_attributes>otherDirectory</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>880</x>
<y>670</y>
<w>150</w>
<h>40</h>
</coordinates>
<panel_attributes>this.Directory</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1390</x>
<y>830</y>
<x>1340</x>
<y>670</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
<panel_attributes>File
bg=red</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1570</x>
<y>830</y>
<x>1250</x>
<y>770</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
bg=red</panel_attributes>
<panel_attributes>File
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1660</x>
<y>830</y>
<x>1090</x>
<y>670</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
bg=red</panel_attributes>
<panel_attributes>File </panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1490</x>
<y>670</y>
<w>80</w>
<h>140</h>
</coordinates>
<panel_attributes>result</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1170</x>
<y>670</y>
<w>70</w>
<h>140</h>
</coordinates>
<panel_attributes>time
of
last
lool</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1580</x>
<y>770</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1210</x>
<y>830</y>
<x>1580</x>
<y>670</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
<panel_attributes>File
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>890</x>
<y>1040</y>
<w>150</w>
<h>40</h>
</coordinates>
<panel_attributes>otherDirectory</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>890</x>
<y>950</y>
<w>150</w>
<h>40</h>
</coordinates>
<panel_attributes>this.Directory</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1470</x>
<y>950</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1480</x>
<y>830</y>
<x>1180</x>
<y>1050</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1100</x>
<y>950</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
<panel_attributes>File </panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1630</x>
<y>950</y>
<w>80</w>
<h>140</h>
</coordinates>
<panel_attributes>result</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1270</x>
<y>950</y>
<w>70</w>
<h>140</h>
</coordinates>
<panel_attributes>time
of
last
lool</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1720</x>
<y>950</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=red</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1030</x>
<y>830</y>
<x>1720</x>
<y>1050</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>NO
<panel_attributes>File
bg=red</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>880</x>
<y>600</y>
<w>720</w>
<h>30</h>
</coordinates>
<panel_attributes>Deleted Files are tracked by their last existance in a StateFile.</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1190</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1260</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1360</x>
<y>950</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLState</id>
<coordinates>
<x>1360</x>
<y>1050</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>File
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1560</x>
<y>950</y>
<w>70</w>
<h>140</h>
</coordinates>
<panel_attributes>current
loop</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1420</x>
<y>670</y>
<w>70</w>
<h>140</h>
</coordinates>
<panel_attributes>current
loop</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1110</x>
<y>640</y>
<w>280</w>
<h>50</h>
</coordinates>
<panel_attributes>lt=-</panel_attributes>
<additional_attributes>10.0;30.0;10.0;10.0;260.0;10.0;260.0;30.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1380</x>
<y>900</y>
<w>140</w>
<h>70</h>
</coordinates>
<panel_attributes>lt=&lt;-
comprison &gt;=</panel_attributes>
<additional_attributes>10.0;50.0;10.0;20.0;120.0;20.0;120.0;50.0</additional_attributes>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1480</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>RED
bg=gray</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1550</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1630</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1700</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>YES
bg=green</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1770</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>RED
bg=gray</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLObject</id>
<coordinates>
<x>1840</x>
<y>510</y>
<w>70</w>
<h>40</h>
</coordinates>
<panel_attributes>RED
bg=gray</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1110</x>
<y>700</y>
<w>200</w>
<h>160</h>
</coordinates>
<panel_attributes>lt=&lt;-
comprison &gt;=</panel_attributes>
<additional_attributes>10.0;10.0;10.0;140.0;180.0;140.0;180.0;110.0</additional_attributes>
</element>
</diagram>

Loading…
Cancel
Save