1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.commons.compress.changes;
20
21 import java.io.InputStream;
22 import java.util.Iterator;
23 import java.util.LinkedHashSet;
24 import java.util.Set;
25 import java.util.regex.Pattern;
26
27 import org.apache.commons.compress.archivers.ArchiveEntry;
28 import org.apache.commons.compress.changes.Change.ChangeType;
29
30
31
32
33
34
35
36 public final class ChangeSet<E extends ArchiveEntry> {
37
38 private final Set<Change<E>> changes = new LinkedHashSet<>();
39
40
41
42
43
44
45
46 public void add(final E entry, final InputStream input) {
47 this.add(entry, input, true);
48 }
49
50
51
52
53
54
55
56
57
58 public void add(final E entry, final InputStream input, final boolean replace) {
59 addAddition(new Change<>(entry, input, replace));
60 }
61
62
63
64
65
66
67 @SuppressWarnings("resource")
68 private void addAddition(final Change<E> addChange) {
69 if (Change.ChangeType.ADD != addChange.getType() || addChange.getInputStream() == null) {
70 return;
71 }
72
73 if (!changes.isEmpty()) {
74 for (final Iterator<Change<E>> it = changes.iterator(); it.hasNext();) {
75 final Change<E> change = it.next();
76 if (change.getType() == Change.ChangeType.ADD && change.getEntry() != null) {
77 final ArchiveEntry entry = change.getEntry();
78
79 if (entry.equals(addChange.getEntry())) {
80 if (addChange.isReplaceMode()) {
81 it.remove();
82 changes.add(addChange);
83 }
84
85 return;
86 }
87 }
88 }
89 }
90 changes.add(addChange);
91 }
92
93
94
95
96
97
98 private void addDeletion(final Change<E> deleteChange) {
99 if (ChangeType.DELETE != deleteChange.getType() && ChangeType.DELETE_DIR != deleteChange.getType() || deleteChange.getTargetFileName() == null) {
100 return;
101 }
102 final String source = deleteChange.getTargetFileName();
103 final Pattern pattern = Pattern.compile(source + "/.*");
104 if (source != null && !changes.isEmpty()) {
105 for (final Iterator<Change<E>> it = changes.iterator(); it.hasNext();) {
106 final Change<E> change = it.next();
107 if (change.getType() == ChangeType.ADD && change.getEntry() != null) {
108 final String target = change.getEntry().getName();
109 if (target == null) {
110 continue;
111 }
112 if (ChangeType.DELETE == deleteChange.getType() && source.equals(target)
113 || ChangeType.DELETE_DIR == deleteChange.getType() && pattern.matcher(target).matches()) {
114 it.remove();
115 }
116 }
117 }
118 }
119 changes.add(deleteChange);
120 }
121
122
123
124
125
126
127 public void delete(final String fileName) {
128 addDeletion(new Change<>(fileName, ChangeType.DELETE));
129 }
130
131
132
133
134
135
136 public void deleteDir(final String dirName) {
137 addDeletion(new Change<>(dirName, ChangeType.DELETE_DIR));
138 }
139
140
141
142
143
144
145 Set<Change<E>> getChanges() {
146 return new LinkedHashSet<>(changes);
147 }
148 }