working on history api
diff --git a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java
index 7d259a9..eb41865 100644
--- a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java
+++ b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/CoreServerTest.java
@@ -24,6 +24,7 @@
import org.eclipse.emf.emfstore.server.model.ModelFactory;
import org.eclipse.emf.emfstore.server.model.ProjectHistory;
import org.eclipse.emf.emfstore.server.model.ProjectId;
+import org.eclipse.emf.emfstore.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.server.model.ServerSpace;
import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
import org.eclipse.emf.emfstore.server.model.versioning.Versions;
@@ -146,6 +147,22 @@
}.run(false);
}
+ protected ProjectSpace checkout(final ProjectInfo projectInfo, final PrimaryVersionSpec baseVersion) {
+ return new EMFStoreCommandWithResult<ProjectSpace>() {
+ @Override
+ protected ProjectSpace doRun() {
+ try {
+ Workspace workspace = getWorkspace();
+ workspace.setConnectionManager(getConnectionMock());
+ return workspace.checkout(projectSpace.getUsersession(), ModelUtil.clone(projectInfo),
+ ModelUtil.clone(baseVersion), new NullProgressMonitor());
+ } catch (EmfStoreException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }.run(false);
+ }
+
protected void mergeWithBranch(final ProjectSpace trunk, final PrimaryVersionSpec latestOnBranch,
final int expectedConflicts) {
new EMFStoreCommand() {
diff --git a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java
index 05ab8b8..f927c25 100644
--- a/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java
+++ b/org.eclipse.emf.emfstore.client.test/src/org/eclipse/emf/emfstore/client/test/server/api/HistoryAPITests.java
@@ -22,10 +22,13 @@
* Branches for history test
*
* <pre>
- * b1 b2
- *
- * v5 o
- * v4 o |
+ * b1 b2 b3
+ *
+ * v7 o
+ * / |
+ * v6 / o
+ * v5 o /
+ * v4 o | /
* v3 | o
* v2 o /
* v1 \ o
@@ -39,11 +42,12 @@
public class HistoryAPITests extends CoreServerTest {
final private PrimaryVersionSpec[] versions = { Versions.PRIMARY("trunk", 0), Versions.PRIMARY("trunk", 1),
- Versions.PRIMARY("b1", 2), Versions.PRIMARY("b2", 3), Versions.PRIMARY("b1", 4), Versions.PRIMARY("b2", 5), };
+ Versions.PRIMARY("b1", 2), Versions.PRIMARY("b2", 3), Versions.PRIMARY("b1", 4), Versions.PRIMARY("b2", 5),
+ Versions.PRIMARY("b3", 6), Versions.PRIMARY("b3", 7) };
- final private String[] elementNames = { "v0", "v1", "v2", "v3", "v4", "v5" };
+ final private String[] elementNames = { "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7" };
- final private String[] branches = { "b1", "b2" };
+ final private String[] branches = { "b1", "b2", "b3" };
private ProjectSpace createHistory() {
ProjectSpace ps = getProjectSpace();
@@ -72,6 +76,16 @@
rename(ps2, 5);
assertEquals(versions[5], commit(ps2));
+ // v6
+ ProjectSpace thirdBranch = checkout(ps.getProjectInfo(), versions[3]);
+ rename(thirdBranch, 6);
+ assertEquals(versions[6], branch(thirdBranch, branches[2]));
+
+ // v7
+ mergeWithBranch(thirdBranch, versions[5], 1);
+ rename(thirdBranch, 7);
+ assertEquals(versions[7], commit(thirdBranch));
+
return ps;
}
@@ -106,20 +120,22 @@
List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 5, 25, true, false,
false, false));
- assertEquals(6, result.size());
- assertEquals(versions[5], result.get(0).getPrimerySpec());
- assertEquals(versions[4], result.get(1).getPrimerySpec());
- assertEquals(versions[3], result.get(2).getPrimerySpec());
- assertEquals(versions[2], result.get(3).getPrimerySpec());
- assertEquals(versions[1], result.get(4).getPrimerySpec());
- assertEquals(versions[0], result.get(5).getPrimerySpec());
+ assertEquals(8, result.size());
+ assertEquals(versions[7], result.get(0).getPrimerySpec());
+ assertEquals(versions[6], result.get(1).getPrimerySpec());
+ assertEquals(versions[5], result.get(2).getPrimerySpec());
+ assertEquals(versions[4], result.get(3).getPrimerySpec());
+ assertEquals(versions[3], result.get(4).getPrimerySpec());
+ assertEquals(versions[2], result.get(5).getPrimerySpec());
+ assertEquals(versions[1], result.get(6).getPrimerySpec());
+ assertEquals(versions[0], result.get(7).getPrimerySpec());
}
@Test
public void rangequeryIncludeCp() throws EmfStoreException {
ProjectSpace ps = createHistory();
- List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 5, 25, false, false,
+ List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 1, 25, false, false,
false, true));
assertEquals(4, result.size());
@@ -174,22 +190,26 @@
public void rangequeryIncoming() throws EmfStoreException {
ProjectSpace ps = createHistory();
- List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[0], 0, 0, false, false,
+ List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[7], 0, 2, false, true,
false, false));
- // TODO implement
- assertTrue(false);
+ assertEquals(3, result.size());
+ assertEquals(versions[7], result.get(0).getPrimerySpec());
+ assertEquals(versions[6], result.get(1).getPrimerySpec());
+ assertEquals(versions[5], result.get(2).getPrimerySpec());
}
@Test
public void rangequeryOutgoing() throws EmfStoreException {
ProjectSpace ps = createHistory();
- List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[0], 0, 0, false, false,
- false, false));
+ List<HistoryInfo> result = ps.getHistoryInfo(HistoryQueryBuilder.rangeQuery(versions[3], 2, 0, false, false,
+ true, false));
- // TODO implement
- assertTrue(false);
+ assertEquals(3, result.size());
+ assertEquals(versions[6], result.get(0).getPrimerySpec());
+ assertEquals(versions[5], result.get(1).getPrimerySpec());
+ assertEquals(versions[3], result.get(2).getPrimerySpec());
}
@Test
diff --git a/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java b/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java
index 19e09f0..22c6ca3 100644
--- a/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java
+++ b/org.eclipse.emf.emfstore.server/src/org/eclipse/emf/emfstore/server/core/subinterfaces/HistorySubInterfaceImpl.java
@@ -19,6 +19,8 @@
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.emfstore.common.model.ModelElementId;
@@ -153,6 +155,7 @@
result.add(version);
result.addAll(addBackwardVersions(project, version, query.getLowerLimit(), query.isIncludeIncoming(),
query.isIncludeOutgoing()));
+ Collections.sort(result, new VersionComparator(false));
return result;
}
@@ -245,32 +248,48 @@
return result;
}
- private List<Version> addForwardVersions(ProjectHistory project, Version version, int limit,
+ private Collection<Version> addForwardVersions(ProjectHistory project, Version version, int limit,
boolean includeIncoming, boolean includeOutgoing) {
- List<Version> result = new ArrayList<Version>();
+ if (limit == 0) {
+ return Collections.emptyList();
+ }
+ SortedSet<Version> result = new TreeSet<Version>(new VersionComparator(false));
Version currentVersion = version;
while (currentVersion != null && result.size() < limit) {
- if (currentVersion.getBranchedVersions().size() > 0) {
+ if (includeOutgoing && currentVersion.getBranchedVersions().size() > 0) {
result.addAll(currentVersion.getBranchedVersions());
}
+ if (includeIncoming && currentVersion.getMergedFromVersion().size() > 0) {
+ result.addAll(currentVersion.getMergedFromVersion());
+ }
+
currentVersion = currentVersion.getNextVersion();
if (currentVersion != null) {
result.add(currentVersion);
}
}
- Collections.sort(result, new VersionComparator(false));
- if (result.size() > limit) {
- result = result.subList(0, limit - 1);
+ if (limit > 0 && result.size() > limit) {
+ return new ArrayList<Version>(result).subList(0, limit);
}
return result;
}
- private List<Version> addBackwardVersions(ProjectHistory project, Version version, int limit,
+ private Collection<Version> addBackwardVersions(ProjectHistory project, Version version, int limit,
boolean includeIncoming, boolean includeOutgoing) {
- ArrayList<Version> result = new ArrayList<Version>();
+ if (limit == 0) {
+ return Collections.emptyList();
+ }
+ SortedSet<Version> result = new TreeSet<Version>(new VersionComparator(false));
Version currentVersion = version;
- while (currentVersion != null && limit > 0) {
+ while (currentVersion != null && result.size() < limit) {
+ if (includeOutgoing && currentVersion.getBranchedVersions().size() > 0) {
+ result.addAll(currentVersion.getBranchedVersions());
+ }
+ if (includeIncoming && currentVersion.getMergedFromVersion().size() > 0) {
+ result.addAll(currentVersion.getMergedFromVersion());
+ }
+ // move in tree
if (currentVersion.getPreviousVersion() != null) {
currentVersion = currentVersion.getPreviousVersion();
} else if (currentVersion.getAncestorVersion() != null) {
@@ -278,12 +297,14 @@
} else {
currentVersion = null;
}
+ // add versions
if (currentVersion != null) {
result.add(currentVersion);
- limit--;
}
}
-
+ if (limit > 0 && result.size() > limit) {
+ return new ArrayList<Version>(result).subList(0, limit);
+ }
return result;
}