private static final Logger LOG = Logger.getInstance(SvnBranchPointsCalculator.class);
private ValueHolder<WrapperInvertor, KeyData> myCache;
- private PersistentHolder myPersistentHolder;
+ private SmallMapSerializer<String, TreeMap<String, BranchCopyData>> myPersistentMap;
+ @NotNull private final Object myPersistenceLock = new Object();
private File myFile;
private final Project myProject;
}
public void activate() {
- myPersistentHolder = new PersistentHolder(myFile);
+ synchronized (myPersistenceLock) {
+ myPersistentMap = new SmallMapSerializer<>(myFile, EnumeratorStringDescriptor.INSTANCE, new BranchDataExternalizer());
+ }
+
myCache = new ValueHolder<WrapperInvertor, KeyData>() {
public WrapperInvertor getValue(KeyData dataHolder) {
- final WrapperInvertor result =
- myPersistentHolder.getBestHit(dataHolder.getRepoUrl(), dataHolder.getSourceUrl(), dataHolder.getTargetUrl());
+ WrapperInvertor result = getBestHit(dataHolder.getRepoUrl(), dataHolder.getSourceUrl(), dataHolder.getTargetUrl());
if (LOG.isDebugEnabled()) {
LOG.debug("Persistent for: " + dataHolder.toString() + " returned: " + (result == null ? null : result.toString()));
}
return result;
}
+
public void setValue(WrapperInvertor value, KeyData dataHolder) {
if (LOG.isDebugEnabled()) {
LOG.debug("Put into persistent: key: " + dataHolder.toString() + " value: " + value.toString());
}
- myPersistentHolder.put(dataHolder.getRepoUrl(), value.getWrapped().getTarget(), value.getWrapped());
+ persist(dataHolder.getRepoUrl(), value.getWrapped().getTarget(), value.getWrapped());
}
};
}
+ @Nullable
+ public WrapperInvertor getBestHit(String repoUrl, String source, String target) {
+ synchronized (myPersistenceLock) {
+ WrapperInvertor result = null;
+ TreeMap<String, BranchCopyData> map = myPersistentMap.get(repoUrl);
+
+ if (map != null) {
+ BranchCopyData sourceData = getBranchData(map, source);
+ BranchCopyData targetData = getBranchData(map, target);
+
+ if (sourceData != null && targetData != null) {
+ boolean inverted = sourceData.getTargetRevision() > targetData.getTargetRevision();
+ result = new WrapperInvertor(inverted, inverted ? sourceData : targetData);
+ }
+ else if (sourceData != null) {
+ result = new WrapperInvertor(true, sourceData);
+ }
+ else if (targetData != null) {
+ result = new WrapperInvertor(false, targetData);
+ }
+ }
+
+ return result;
+ }
+ }
+
public void deactivate() {
- myPersistentHolder.close();
+ synchronized (myPersistenceLock) {
+ myPersistentMap.force();
+ myPersistentMap = null;
+ }
myCache = null;
- myPersistentHolder = null;
}
- private static class BranchDataExternalizer implements DataExternalizer<TreeMap<String,BranchCopyData>> {
- public void save(@NotNull DataOutput out, TreeMap<String,BranchCopyData> value) throws IOException {
+ private void persist(String uid, String target, BranchCopyData data) {
+ // todo - rewrite of rather big piece; consider rewriting
+ synchronized (myPersistenceLock) {
+ TreeMap<String, BranchCopyData> map = myPersistentMap.get(uid);
+ if (map == null) {
+ map = new TreeMap<>();
+ }
+ map.put(target, data);
+ myPersistentMap.put(uid, map);
+ myPersistentMap.force();
+ }
+ }
+
+ @Nullable
+ private static BranchCopyData getBranchData(@NotNull NavigableMap<String, BranchCopyData> map, String url) {
+ Map.Entry<String, BranchCopyData> branchData = map.floorEntry(url);
+ return branchData != null && url.startsWith(branchData.getKey()) ? branchData.getValue() : null;
+ }
+
+ private static class BranchDataExternalizer implements DataExternalizer<TreeMap<String, BranchCopyData>> {
+ public void save(@NotNull DataOutput out, TreeMap<String, BranchCopyData> value) throws IOException {
out.writeInt(value.size());
for (Map.Entry<String, BranchCopyData> entry : value.entrySet()) {
out.writeUTF(entry.getKey());
}
}
- public TreeMap<String,BranchCopyData> read(@NotNull DataInput in) throws IOException {
- final TreeMap<String,BranchCopyData> result = new TreeMap<>();
+ public TreeMap<String, BranchCopyData> read(@NotNull DataInput in) throws IOException {
+ final TreeMap<String, BranchCopyData> result = new TreeMap<>();
final int num = in.readInt();
for (int i = 0; i < num; i++) {
}
}
- private static class PersistentHolder {
- @NotNull private final SmallMapSerializer<String, TreeMap<String, BranchCopyData>> myPersistentMap;
- @NotNull private final Object myLock = new Object();
-
- PersistentHolder(@NotNull File file) {
- myPersistentMap = new SmallMapSerializer<>(file, EnumeratorStringDescriptor.INSTANCE, new BranchDataExternalizer());
- }
-
- public void close() {
- myPersistentMap.force();
- }
-
- public void put(String uid, String target, BranchCopyData data) {
- // todo - rewrite of rather big piece; consider rewriting
- synchronized (myLock) {
- TreeMap<String, BranchCopyData> map = myPersistentMap.get(uid);
- if (map == null) {
- map = new TreeMap<>();
- }
- map.put(target, data);
- myPersistentMap.put(uid, map);
- }
- myPersistentMap.force();
- }
-
- @Nullable
- public WrapperInvertor getBestHit(String repoUrl, String source, String target) {
- synchronized (myLock) {
- WrapperInvertor result = null;
- TreeMap<String, BranchCopyData> map = myPersistentMap.get(repoUrl);
-
- if (map != null) {
- BranchCopyData sourceData = getBranchData(map, source);
- BranchCopyData targetData = getBranchData(map, target);
-
- if (sourceData != null && targetData != null) {
- boolean inverted = sourceData.getTargetRevision() > targetData.getTargetRevision();
- result = new WrapperInvertor(inverted, inverted ? sourceData : targetData);
- }
- else if (sourceData != null) {
- result = new WrapperInvertor(true, sourceData);
- }
- else if (targetData != null) {
- result = new WrapperInvertor(false, targetData);
- }
- }
-
- return result;
- }
- }
-
- @Nullable
- private static BranchCopyData getBranchData(@NotNull NavigableMap<String, BranchCopyData> map, String url) {
- Map.Entry<String, BranchCopyData> branchData = map.floorEntry(url);
- return branchData != null && url.startsWith(branchData.getKey()) ? branchData.getValue() : null;
- }
- }
-
private static class Loader implements ThrowableConvertor<KeyData, WrapperInvertor, VcsException> {
private SvnVcs myVcs;
if (correct) {
branchCopyData = new BranchCopyData(keyData.getSourceUrl(), copyData.getCopySourceRevision(), keyData.getTargetUrl(),
copyData.getCopyTargetRevision());
- } else {
+ }
+ else {
branchCopyData = new BranchCopyData(keyData.getTargetUrl(), copyData.getCopySourceRevision(), keyData.getSourceUrl(),
copyData.getCopyTargetRevision());
}
- WrapperInvertor invertor = new WrapperInvertor(! correct, branchCopyData);
+ WrapperInvertor invertor = new WrapperInvertor(!correct, branchCopyData);
if (LOG.isDebugEnabled()) {
LOG.debug("Loader17 returned: for key: " + keyData.toString() + " result: " + (invertor.toString()));
}
}
public TaskDescriptor getFirstCopyPointTask(final String repoUID, final String sourceUrl, final String targetUrl,
- final Consumer<TransparentlyFailedValueI<WrapperInvertor, VcsException>> consumer) {
+ final Consumer<TransparentlyFailedValueI<WrapperInvertor, VcsException>> consumer) {
KeyData in = new KeyData(repoUID, sourceUrl, targetUrl);
TransparentlyFailedValueI<WrapperInvertor, VcsException> value = new ThreadSafeTransparentlyFailedValue<>();