diff options
author | Tomasz Zarna | 2014-02-06 10:56:26 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2014-02-18 20:00:10 +0000 |
commit | f4a4742e74ae1aa4a2b8bf1cb6f1aeb8eb29382f (patch) | |
tree | 1ec623cbfcdf82cbc38006fb6d521dc343a2a2fe | |
parent | b98d8b27a3b346a6e6773c289d826de89f6f6d09 (diff) | |
download | org.eclipse.mylyn.reviews-f4a4742e74ae1aa4a2b8bf1cb6f1aeb8eb29382f.tar.gz org.eclipse.mylyn.reviews-f4a4742e74ae1aa4a2b8bf1cb6f1aeb8eb29382f.tar.xz org.eclipse.mylyn.reviews-f4a4742e74ae1aa4a2b8bf1cb6f1aeb8eb29382f.zip |
425945: image compare does not work
* update EMF model to keep binary content
* identify if the changed file is binary
* if so, fetch its content (base and target)
* works only in Gerrit 2.7+
Bug: 425945
Change-Id: I1487bd33dbff03cbbcaef8faf6cb21b425ea3665
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=425945
Signed-off-by: Tomasz Zarna <tomasz.zarna@tasktop.com>
17 files changed, 564 insertions, 34 deletions
diff --git a/org.eclipse.mylyn.gerrit.core.tests/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClientTest.java b/org.eclipse.mylyn.gerrit.core.tests/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClientTest.java index 5d1274d2b..943b467e6 100644 --- a/org.eclipse.mylyn.gerrit.core.tests/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClientTest.java +++ b/org.eclipse.mylyn.gerrit.core.tests/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClientTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Christian Trutz. + * Copyright (c) 2011 Christian Trutz and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,21 +7,31 @@ * * Contributors: * Christian Trutz - initial API and implementation + * Tasktop Technologies - ongoing maintenance *******************************************************************************/ package org.eclipse.mylyn.internal.gerrit.core.client; +import static org.junit.Assert.assertArrayEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import java.io.IOException; +import org.apache.commons.httpclient.HttpMethodBase; import org.eclipse.core.runtime.AssertionFailedException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.mylyn.commons.net.AbstractWebLocation; import org.eclipse.mylyn.internal.gerrit.core.client.GerritHttpClient.JsonEntity; +import org.eclipse.mylyn.internal.gerrit.core.client.GerritHttpClient.Request; +import org.eclipse.mylyn.internal.gerrit.core.client.GerritHttpClient.Request.HttpMethod; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import com.google.gson.reflect.TypeToken; + /** * Unit tests for {@link GerritHttpClient}. * @@ -69,4 +79,22 @@ public class GerritHttpClientTest { gerritHttpClient.postJsonRequest("not null", null, progressMonitor); //$NON-NLS-1$ } + @Test + public void restRequestCanReturnBinaryContent() throws IOException { + // given + final TypeToken<Byte[]> byteArrayType = new TypeToken<Byte[]>() { + }; + Request<byte[]> request = new GerritHttpClient(abstractWebLocation).new RestRequest<byte[]>(HttpMethod.GET, + "serviceUri", null /*input*/, byteArrayType.getType(), null /*error handler*/); //$NON-NLS-1$ + HttpMethodBase httpMethodBase = mock(HttpMethodBase.class); + byte[] binary = "binary".getBytes(); //$NON-NLS-1$ + when(httpMethodBase.getResponseBody()).thenReturn(binary); + + // when + byte[] result = request.process(httpMethodBase); + + // then + assertArrayEquals(binary, result); + } + } diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritClient.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritClient.java index f271d06b7..1d7d4ba03 100644 --- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritClient.java +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritClient.java @@ -53,6 +53,7 @@ import org.eclipse.mylyn.internal.gerrit.core.client.compat.ChangeDetailX; import org.eclipse.mylyn.internal.gerrit.core.client.compat.ChangeManageService; import org.eclipse.mylyn.internal.gerrit.core.client.compat.GerritConfigX; import org.eclipse.mylyn.internal.gerrit.core.client.compat.PatchDetailService; +import org.eclipse.mylyn.internal.gerrit.core.client.compat.PatchScriptX; import org.eclipse.mylyn.internal.gerrit.core.client.compat.PatchSetPublishDetailX; import org.eclipse.mylyn.internal.gerrit.core.client.compat.ProjectAdminService; import org.eclipse.mylyn.internal.gerrit.core.client.compat.ProjectDetailX; @@ -87,7 +88,6 @@ import com.google.gerrit.common.data.ApprovalDetail; import com.google.gerrit.common.data.ChangeDetail; import com.google.gerrit.common.data.ChangeListService; import com.google.gerrit.common.data.GerritConfig; -import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchSetDetail; import com.google.gerrit.common.data.ReviewerResult; import com.google.gerrit.common.data.SingleListChangeInfo; @@ -98,6 +98,7 @@ import com.google.gerrit.reviewdb.ApprovalCategoryValue; import com.google.gerrit.reviewdb.Change; import com.google.gerrit.reviewdb.ContributorAgreement; import com.google.gerrit.reviewdb.Patch; +import com.google.gerrit.reviewdb.Patch.ChangeType; import com.google.gerrit.reviewdb.PatchLineComment; import com.google.gerrit.reviewdb.PatchSet; import com.google.gerrit.reviewdb.PatchSet.Id; @@ -110,7 +111,7 @@ import com.google.gwtjsonrpc.client.VoidResult; /** * Facade to the Gerrit RPC API. - * + * * @author Mikael Kober * @author Thomas Westling * @author Steffen Pingel @@ -356,7 +357,7 @@ public class GerritClient extends ReviewsClient { patchSetContent.setTargetDetail(targetDetail); } for (Patch patch : patchSetContent.getTargetDetail().getPatches()) { - PatchScript patchScript = getPatchScript(patch.getKey(), baseId, targetId, monitor); + PatchScriptX patchScript = getPatchScript(patch.getKey(), baseId, targetId, monitor); if (patchScript != null) { patchSetContent.putPatchScriptByPatchKey(patch.getKey(), patchScript); } @@ -391,17 +392,32 @@ public class GerritClient extends ReviewsClient { return new GerritSystemInfo(version, contributorAgreements, account); } - private PatchScript getPatchScript(final Patch.Key key, final PatchSet.Id leftId, final PatchSet.Id rightId, + private PatchScriptX getPatchScript(final Patch.Key key, final PatchSet.Id leftId, final PatchSet.Id rightId, IProgressMonitor monitor) throws GerritException { //final AccountDiffPreference diffPrefs = getDiffPreference(monitor); //final AccountDiffPreference diffPrefs = new AccountDiffPreference(getAccount(monitor).getId()); final AccountDiffPreference diffPrefs = createAccountDiffPreference(); - return execute(monitor, new Operation<PatchScript>() { + PatchScriptX patchScript = execute(monitor, new Operation<PatchScriptX>() { @Override public void execute(IProgressMonitor monitor) throws GerritException { - getPatchDetailService(monitor).patchScript(key, leftId, rightId, diffPrefs, this); + getPatchDetailService(monitor).patchScriptX(key, leftId, rightId, diffPrefs, this); } }); + if (patchScript.isBinary() && isVersion27OrLater(monitor)) { + final TypeToken<Byte[]> byteArrayType = new TypeToken<Byte[]>() { + }; + if (patchScript.getChangeType() != ChangeType.ADDED) { + String keyBaseEncoded = encode(key.toString() + "^1"); //$NON-NLS-1$ + byte[] binBase = executeGetRestRequest("/cat/" + keyBaseEncoded, byteArrayType.getType(), monitor); //$NON-NLS-1$ + patchScript.setBinaryA(binBase); + } + if (patchScript.getChangeType() != ChangeType.DELETED) { + String keyTargetEncoded = encode(key.toString() + "^0"); //$NON-NLS-1$ + byte[] binTarget = executeGetRestRequest("/cat/" + keyTargetEncoded, byteArrayType.getType(), monitor); //$NON-NLS-1$ + patchScript.setBinaryB(binTarget); + } + } + return patchScript; } private AccountDiffPreference createAccountDiffPreference() { @@ -872,7 +888,7 @@ public class GerritClient extends ReviewsClient { /** * Sends a query for the changes visible to the caller to the gerrit server. - * + * * @param monitor * A progress monitor * @param queryString @@ -888,7 +904,7 @@ public class GerritClient extends ReviewsClient { /** * Sends a query for the changes visible to the caller to the gerrit server with the possibility of adding options * to the query. - * + * * @param monitor * A progress monitor * @param queryString @@ -932,7 +948,7 @@ public class GerritClient extends ReviewsClient { /** * Sends a query for the changes visible to the caller to the gerrit server. Uses the gerrit REST API. - * + * * @param monitor * A progress monitor * @param queryString @@ -948,7 +964,7 @@ public class GerritClient extends ReviewsClient { /** * Sends a query for the changes visible to the caller to the gerrit server with the possibility of adding options * to the query. Uses the gerrit REST API. - * + * * @param monitor * A progress monitor * @param queryString @@ -960,17 +976,13 @@ public class GerritClient extends ReviewsClient { */ public List<GerritQueryResult> executeQueryRest(IProgressMonitor monitor, final String queryString, String optionString) throws GerritException { - try { - String uri = "/changes/?q=" + URLEncoder.encode(queryString, "UTF-8"); //$NON-NLS-1$ //$NON-NLS-2$ - if (StringUtils.isNotBlank(optionString)) { - uri += "&o=" + URLEncoder.encode(optionString, "UTF-8"); //$NON-NLS-1$ //$NON-NLS-2$ - } - TypeToken<List<GerritQueryResult>> queryResultListType = new TypeToken<List<GerritQueryResult>>() { - }; - return executeGetRestRequest(uri, queryResultListType.getType(), monitor); - } catch (UnsupportedEncodingException e) { - throw new GerritException(e); + String uri = "/changes/?q=" + encode(queryString); //$NON-NLS-1$ + if (StringUtils.isNotBlank(optionString)) { + uri += "&o=" + encode(optionString); //$NON-NLS-1$ } + TypeToken<List<GerritQueryResult>> queryResultListType = new TypeToken<List<GerritQueryResult>>() { + }; + return executeGetRestRequest(uri, queryResultListType.getType(), monitor); } /** @@ -1235,4 +1247,11 @@ public class GerritClient extends ReviewsClient { } } + private static String encode(String string) throws GerritException { + try { + return URLEncoder.encode(string, "UTF-8"); //$NON-NLS-1$ + } catch (UnsupportedEncodingException e) { + throw new GerritException(e); + } + } } diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClient.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClient.java index 730c78996..326de52d2 100644 --- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClient.java +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/GerritHttpClient.java @@ -48,6 +48,7 @@ import com.google.gerrit.common.auth.SignInMode; import com.google.gerrit.common.auth.openid.DiscoveryResult; import com.google.gerrit.common.auth.openid.DiscoveryResult.Status; import com.google.gerrit.common.auth.userpass.LoginResult; +import com.google.gson.reflect.TypeToken; /** * Abstract class that handles the http communications with the Gerrit server. @@ -107,7 +108,8 @@ public class GerritHttpClient { } - private class RestRequest<T> extends Request<T> { + // visible for testing + class RestRequest<T> extends Request<T> { private final JSonSupport json = new JSonSupport(); @@ -154,8 +156,13 @@ public class GerritHttpClient { return method; } + @SuppressWarnings("unchecked") @Override public T process(HttpMethodBase method) throws IOException { + Type rawType = TypeToken.get(resultType).getRawType(); + if (rawType == Byte[].class || rawType == byte[].class) { + return (T) method.getResponseBody(); + } String content = method.getResponseBodyAsString(); return json.parseResponse(content, resultType); } diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/PatchSetContent.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/PatchSetContent.java index 7f11974db..6964de51c 100644 --- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/PatchSetContent.java +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/PatchSetContent.java @@ -14,7 +14,8 @@ package org.eclipse.mylyn.internal.gerrit.core.client; import java.util.HashMap; import java.util.Map; -import com.google.gerrit.common.data.PatchScript; +import org.eclipse.mylyn.internal.gerrit.core.client.compat.PatchScriptX; + import com.google.gerrit.common.data.PatchSetDetail; import com.google.gerrit.reviewdb.Patch; import com.google.gerrit.reviewdb.PatchSet; @@ -35,7 +36,7 @@ public class PatchSetContent { private PatchSetDetail targetDetail; - Map<Patch.Key, PatchScript> patchScriptByPatchKey; + Map<Patch.Key, PatchScriptX> patchScriptByPatchKey; /** * Creates empty patch set content using detailed target. @@ -47,7 +48,7 @@ public class PatchSetContent { public PatchSetContent(PatchSet base, PatchSetDetail targetDetail) { this.base = base; this.targetDetail = targetDetail; - this.patchScriptByPatchKey = new HashMap<Patch.Key, PatchScript>(); + this.patchScriptByPatchKey = new HashMap<Patch.Key, PatchScriptX>(); } /** @@ -60,7 +61,7 @@ public class PatchSetContent { public PatchSetContent(PatchSet base, PatchSet target) { this.base = base; this.target = target; - this.patchScriptByPatchKey = new HashMap<Patch.Key, PatchScript>(); + this.patchScriptByPatchKey = new HashMap<Patch.Key, PatchScriptX>(); } public PatchSet getBase() { @@ -88,11 +89,11 @@ public class PatchSetContent { this.targetDetail = targetDetail; } - void putPatchScriptByPatchKey(Patch.Key key, PatchScript script) { + void putPatchScriptByPatchKey(Patch.Key key, PatchScriptX script) { patchScriptByPatchKey.put(key, script); } - public PatchScript getPatchScript(Patch.Key key) { + public PatchScriptX getPatchScript(Patch.Key key) { return patchScriptByPatchKey.get(key); } diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchDetailService.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchDetailService.java index 01e7e7d58..8db438f8c 100644 --- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchDetailService.java +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchDetailService.java @@ -14,7 +14,10 @@ package org.eclipse.mylyn.internal.gerrit.core.client.compat; import java.util.List; import com.google.gerrit.common.data.ReviewerResult; +import com.google.gerrit.reviewdb.AccountDiffPreference; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.Patch; +import com.google.gerrit.reviewdb.PatchSet; import com.google.gwt.user.client.rpc.AsyncCallback; /** @@ -24,4 +27,7 @@ public interface PatchDetailService extends com.google.gerrit.common.data.PatchD void addReviewers(Change.Id id, List<String> reviewers, boolean confirmed, AsyncCallback<ReviewerResult> callback); + void patchScriptX(Patch.Key key, PatchSet.Id a, PatchSet.Id b, AccountDiffPreference diffPrefs, + AsyncCallback<PatchScriptX> callback); + } diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java new file mode 100644 index 000000000..f28dafa28 --- /dev/null +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2014 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.internal.gerrit.core.client.compat; + +import com.google.gerrit.common.data.PatchScript; + +/** + * Provides support for binary content. + */ +public class PatchScriptX extends PatchScript { + + private byte[] binaryA; + + private byte[] binaryB; + + public boolean isBinary() { + for (String header : getPatchHeader()) { + if (header.contains("Binary files differ")) { //$NON-NLS-1$ + return true; + } + } + return false; + } + + public byte[] getBinaryA() { + return binaryA; + } + + public void setBinaryA(byte[] binaryA) { + this.binaryA = binaryA; + } + + public byte[] getBinaryB() { + return binaryB; + } + + public void setBinaryB(byte[] binaryB) { + this.binaryB = binaryB; + } + +} diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/remote/PatchSetContentRemoteFactory.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/remote/PatchSetContentRemoteFactory.java index 0acf269f8..d3692f0cc 100644 --- a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/remote/PatchSetContentRemoteFactory.java +++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/remote/PatchSetContentRemoteFactory.java @@ -24,6 +24,7 @@ import org.eclipse.mylyn.internal.gerrit.core.GerritUtil; import org.eclipse.mylyn.internal.gerrit.core.ReviewItemCache; import org.eclipse.mylyn.internal.gerrit.core.client.GerritException; import org.eclipse.mylyn.internal.gerrit.core.client.PatchSetContent; +import org.eclipse.mylyn.internal.gerrit.core.client.compat.PatchScriptX; import org.eclipse.mylyn.reviews.core.model.IComment; import org.eclipse.mylyn.reviews.core.model.IFileItem; import org.eclipse.mylyn.reviews.core.model.IFileVersion; @@ -159,13 +160,17 @@ public abstract class PatchSetContentRemoteFactory<RemoteKeyType> extends } items.add(item); - PatchScript patchScript = content.getPatchScript(patch.getKey()); + PatchScriptX patchScript = content.getPatchScript(patch.getKey()); if (patchScript != null) { IFileVersion baseVersion = (IFileVersion) getCache().getItem(baseId); if (baseVersion == null) { baseVersion = IReviewsFactory.INSTANCE.createFileVersion(); baseVersion.setId(baseId); - baseVersion.setContent(patchScript.getA().asString()); + if (patchScript.isBinary()) { + baseVersion.setBinaryContent(patchScript.getBinaryA()); + } else { + baseVersion.setContent(patchScript.getA().asString()); + } baseVersion.setPath(patchScript.getA().getPath()); baseVersion.setDescription((content.getBase() != null) ? NLS.bind("Patch Set {0}", content.getBase().getPatchSetId()) : "Base"); @@ -180,7 +185,11 @@ public abstract class PatchSetContentRemoteFactory<RemoteKeyType> extends targetVersion = IReviewsFactory.INSTANCE.createFileVersion(); targetVersion.setId(targetId); SparseFileContent target = patchScript.getB().apply(patchScript.getA(), patchScript.getEdits()); - targetVersion.setContent(target.asString()); + if (patchScript.isBinary()) { + targetVersion.setBinaryContent(patchScript.getBinaryB()); + } else { + targetVersion.setContent(target.asString()); + } targetVersion.setPath(patchScript.getB().getPath()); targetVersion.setDescription(NLS.bind("Patch Set {0}", content.getTargetDetail() .getPatchSet() diff --git a/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java index 9ac2e2a11..da348a5eb 100644 --- a/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java +++ b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/AllGerritTests.java @@ -24,6 +24,7 @@ import org.eclipse.mylyn.gerrit.tests.core.client.GerritClientTest; import org.eclipse.mylyn.gerrit.tests.core.client.GerritVersionTest; import org.eclipse.mylyn.gerrit.tests.core.client.OpenIdAuthenticationTest; import org.eclipse.mylyn.gerrit.tests.core.client.compat.ChangeDetailXTest; +import org.eclipse.mylyn.gerrit.tests.core.client.compat.PatchScriptXTest; import org.eclipse.mylyn.gerrit.tests.core.client.rest.AbandonInputTest; import org.eclipse.mylyn.gerrit.tests.core.client.rest.AccountInfoTest; import org.eclipse.mylyn.gerrit.tests.core.client.rest.AddReviewerResultTest; @@ -74,6 +75,7 @@ public class AllGerritTests { suite.addTestSuite(SubmitInfoTest.class); suite.addTestSuite(SubmitInputTest.class); suite.addTestSuite(ChangeDetailXTest.class); + suite.addTestSuite(PatchScriptXTest.class); if (!configuration.isLocalOnly()) { // network tests suite.addTestSuite(OpenIdAuthenticationTest.class); diff --git a/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/core/client/compat/PatchScriptXTest.java b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/core/client/compat/PatchScriptXTest.java new file mode 100644 index 000000000..043ab00b3 --- /dev/null +++ b/org.eclipse.mylyn.gerrit.tests/src/org/eclipse/mylyn/gerrit/tests/core/client/compat/PatchScriptXTest.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2014 Tasktop Technologies and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.gerrit.tests.core.client.compat; + +import java.io.File; +import java.io.IOException; + +import junit.framework.TestCase; + +import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil; +import org.eclipse.mylyn.internal.gerrit.core.client.JSonSupport; +import org.eclipse.mylyn.internal.gerrit.core.client.compat.PatchScriptX; +import org.junit.Test; + +public class PatchScriptXTest extends TestCase { + @Test + public void testPatchScriptIsNotBinary() throws Exception { + PatchScriptX patchScript = parseFile("testdata/PatchScript_java.json"); + + assertFalse(patchScript.isBinary()); + } + + @Test + public void testPatchScriptIsBinary() throws Exception { + PatchScriptX patchScript = parseFile("testdata/PatchScript_gif.json"); + + assertTrue(patchScript.isBinary()); + } + + private PatchScriptX parseFile(String path) throws IOException { + File file = CommonTestUtil.getFile(this, path); + String content = CommonTestUtil.read(file); + PatchScriptXAsResult result = new JSonSupport().parseResponse(content, PatchScriptXAsResult.class); + + assertEquals("2.0", result.jsonrpc); + assertTrue(result.id > 0); //any positive integer is acceptable + assertNotNull(result.result); + return result.result; + } + + private class PatchScriptXAsResult { + private String jsonrpc; + + private int id; + + private PatchScriptX result; + } +} diff --git a/org.eclipse.mylyn.gerrit.tests/testdata/PatchScript_gif.json b/org.eclipse.mylyn.gerrit.tests/testdata/PatchScript_gif.json new file mode 100644 index 000000000..fbd222a01 --- /dev/null +++ b/org.eclipse.mylyn.gerrit.tests/testdata/PatchScript_gif.json @@ -0,0 +1,94 @@ +{ + "jsonrpc" : "2.0", + "id" : 9, + "result" : { + "changeId" : { + "id" : "I4934f8b639737119d8ef28b08d24c4b47a02e23a" + }, + "changeType" : "DELETED", + "newName" : "org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif", + "oldMode" : "FILE", + "newMode" : "FILE", + "header" : ["diff --git a/org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif b/org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif\n", "deleted file mode 100644\n", "index a61b2d6..0000000\n", "--- a/org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif\n", "+++ /dev/null\n", "Binary files differ\n"], + "diffPrefs" : { + "accountId" : { + "id" : 118 + }, + "ignoreWhitespace" : "N", + "tabSize" : 8, + "lineLength" : 100, + "syntaxHighlighting" : true, + "showWhitespaceErrors" : true, + "intralineDifference" : true, + "showTabs" : true, + "context" : 10, + "skipDeleted" : false, + "skipUncommented" : false, + "expandAllComments" : false, + "retainHeader" : false, + "manualReview" : false, + "showLineEndings" : true + }, + "a" : { + "path" : "org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif", + "ranges" : [], + "size" : 2, + "missingNewlineAtEnd" : true + }, + "b" : { + "ranges" : [], + "size" : 0, + "missingNewlineAtEnd" : false + }, + "edits" : [], + "displayMethodA" : "DIFF", + "displayMethodB" : "NONE", + "comments" : { + "a" : [], + "b" : [], + "accounts" : { + "accounts" : [] + } + }, + "history" : [{ + "key" : { + "patchSetId" : { + "changeId" : { + "id" : 20222 + }, + "patchSetId" : 1 + }, + "fileName" : "org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif" + }, + "changeType" : "M", + "patchType" : "U", + "nbrComments" : 0, + "nbrDrafts" : 0, + "insertions" : 0, + "deletions" : 0, + "reviewedByCurrentUser" : false + }, { + "key" : { + "patchSetId" : { + "changeId" : { + "id" : 20222 + }, + "patchSetId" : 2 + }, + "fileName" : "org.eclipse.egit.ui/icons/obj16/gerrit_fetch.gif" + }, + "changeType" : "M", + "patchType" : "U", + "nbrComments" : 0, + "nbrDrafts" : 0, + "insertions" : 0, + "deletions" : 0, + "reviewedByCurrentUser" : false + } + ], + "hugeFile" : false, + "intralineDifference" : false, + "intralineFailure" : false, + "intralineTimeout" : false + } +} diff --git a/org.eclipse.mylyn.gerrit.tests/testdata/PatchScript_java.json b/org.eclipse.mylyn.gerrit.tests/testdata/PatchScript_java.json new file mode 100644 index 000000000..2f008af99 --- /dev/null +++ b/org.eclipse.mylyn.gerrit.tests/testdata/PatchScript_java.json @@ -0,0 +1,132 @@ +{ + "jsonrpc" : "2.0", + "id" : 6, + "result" : { + "changeId" : { + "id" : "I1487bd33dbff03cbbcaef8faf6cb21b425ea3665" + }, + "changeType" : "ADDED", + "newName" : "org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java", + "oldMode" : "FILE", + "newMode" : "FILE", + "header" : ["diff --git a/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java\n", "new file mode 100644\n", "index 0000000..088aa25\n", "--- /dev/null\n", "+++ b/org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java\n"], + "diffPrefs" : { + "accountId" : { + "id" : 118 + }, + "ignoreWhitespace" : "N", + "tabSize" : 8, + "lineLength" : 100, + "syntaxHighlighting" : true, + "showWhitespaceErrors" : true, + "intralineDifference" : true, + "showTabs" : true, + "context" : 10, + "skipDeleted" : false, + "skipUncommented" : false, + "expandAllComments" : false, + "retainHeader" : false, + "manualReview" : false, + "showLineEndings" : true + }, + "a" : { + "ranges" : [], + "size" : 0, + "missingNewlineAtEnd" : false + }, + "b" : { + "path" : "org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java", + "ranges" : [{ + "base" : 0, + "lines" : ["/*******************************************************************************", " * Copyright (c) 2014 Tasktop Technologies and others.", " * All rights reserved. This program and the accompanying materials", " * are made available under the terms of the Eclipse Public License v1.0", " * which accompanies this distribution, and is available at", " * http://www.eclipse.org/legal/epl-v10.html", " *", " * Contributors:", " * Tasktop Technologies - initial API and implementation", " *******************************************************************************/", "", "package org.eclipse.mylyn.internal.gerrit.core.client.compat;", "", "import com.google.gerrit.common.data.PatchScript;", "", "/**", " * Provides support for binary content.", " * ", " * @author Tomasz Zarna", " */", "public class PatchScriptX extends PatchScript {", "", "\tprivate byte[] binaryA;", "", "\tprivate byte[] binaryB;", "", "\tpublic boolean isBinary() {", "\t\tfor (String header : getPatchHeader()) {", "\t\t\tif (header.contains(\"Binary files differ\")) { //$NON-NLS-1$", "\t\t\t\treturn true;", "\t\t\t}", "\t\t}", "\t\treturn false;", "\t}", "", "\tpublic byte[] getBinaryA() {", "\t\treturn binaryA;", "\t}", "", "\tpublic void setBinaryA(byte[] binaryA) {", "\t\tthis.binaryA \u003d binaryA;", "\t}", "", "\tpublic byte[] getBinaryB() {", "\t\treturn binaryB;", "\t}", "", "\tpublic void setBinaryB(byte[] binaryB) {", "\t\tthis.binaryB \u003d binaryB;", "\t}", "", "}"] + } + ], + "size" : 52, + "missingNewlineAtEnd" : false + }, + "edits" : [[0, 0, 0, 52]], + "displayMethodA" : "NONE", + "displayMethodB" : "DIFF", + "comments" : { + "a" : [], + "b" : [], + "accounts" : { + "accounts" : [] + } + }, + "history" : [{ + "key" : { + "patchSetId" : { + "changeId" : { + "id" : 21486 + }, + "patchSetId" : 1 + }, + "fileName" : "org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java" + }, + "changeType" : "M", + "patchType" : "U", + "nbrComments" : 0, + "nbrDrafts" : 0, + "insertions" : 0, + "deletions" : 0, + "reviewedByCurrentUser" : false + }, { + "key" : { + "patchSetId" : { + "changeId" : { + "id" : 21486 + }, + "patchSetId" : 2 + }, + "fileName" : "org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java" + }, + "changeType" : "M", + "patchType" : "U", + "nbrComments" : 0, + "nbrDrafts" : 0, + "insertions" : 0, + "deletions" : 0, + "reviewedByCurrentUser" : false + }, { + "key" : { + "patchSetId" : { + "changeId" : { + "id" : 21486 + }, + "patchSetId" : 3 + }, + "fileName" : "org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java" + }, + "changeType" : "M", + "patchType" : "U", + "nbrComments" : 2, + "nbrDrafts" : 0, + "insertions" : 0, + "deletions" : 0, + "reviewedByCurrentUser" : false + }, { + "key" : { + "patchSetId" : { + "changeId" : { + "id" : 21486 + }, + "patchSetId" : 4 + }, + "fileName" : "org.eclipse.mylyn.gerrit.core/src/org/eclipse/mylyn/internal/gerrit/core/client/compat/PatchScriptX.java" + }, + "changeType" : "M", + "patchType" : "U", + "nbrComments" : 0, + "nbrDrafts" : 0, + "insertions" : 0, + "deletions" : 0, + "reviewedByCurrentUser" : false + } + ], + "hugeFile" : false, + "intralineDifference" : false, + "intralineFailure" : false, + "intralineTimeout" : false + } +} diff --git a/org.eclipse.mylyn.reviews.core/model/reviews.ecore b/org.eclipse.mylyn.reviews.core/model/reviews.ecore index 2f059d7bb..f5bec44f5 100644 --- a/org.eclipse.mylyn.reviews.core/model/reviews.ecore +++ b/org.eclipse.mylyn.reviews.core/model/reviews.ecore @@ -126,6 +126,7 @@ <eStructuralFeatures xsi:type="ecore:EReference" name="file" eType="#//FileItem"/> <eStructuralFeatures xsi:type="ecore:EAttribute" name="fileRevision" eType="#//IFileRevision" transient="true" derived="true"/> + <eStructuralFeatures xsi:type="ecore:EAttribute" name="binaryContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EByteArray"/> </eClassifiers> <eClassifiers xsi:type="ecore:EClass" name="Indexed" abstract="true" interface="true"> <eStructuralFeatures xsi:type="ecore:EAttribute" name="index" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong" diff --git a/org.eclipse.mylyn.reviews.core/model/reviews.genmodel b/org.eclipse.mylyn.reviews.core/model/reviews.genmodel index 1da578d04..1a49097d2 100644 --- a/org.eclipse.mylyn.reviews.core/model/reviews.genmodel +++ b/org.eclipse.mylyn.reviews.core/model/reviews.genmodel @@ -121,6 +121,7 @@ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute reviews.ecore#//FileVersion/content"/> <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference reviews.ecore#//FileVersion/file"/> <genFeatures createChild="false" ecoreFeature="ecore:EAttribute reviews.ecore#//FileVersion/fileRevision"/> + <genFeatures createChild="false" ecoreFeature="ecore:EAttribute reviews.ecore#//FileVersion/binaryContent"/> </genClasses> <genClasses image="false" ecoreClass="reviews.ecore#//Indexed"> <genFeatures property="Readonly" createChild="false" ecoreFeature="ecore:EAttribute reviews.ecore#//Indexed/index"/> diff --git a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/model/IFileVersion.java b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/model/IFileVersion.java index 61bae1792..695f3181c 100644 --- a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/model/IFileVersion.java +++ b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/core/model/IFileVersion.java @@ -22,6 +22,7 @@ import org.eclipse.team.core.history.IFileRevision; * <li>{@link org.eclipse.mylyn.reviews.core.model.IFileVersion#getContent <em>Content</em>}</li> * <li>{@link org.eclipse.mylyn.reviews.core.model.IFileVersion#getFile <em>File</em>}</li> * <li>{@link org.eclipse.mylyn.reviews.core.model.IFileVersion#getFileRevision <em>File Revision</em>}</li> + * <li>{@link org.eclipse.mylyn.reviews.core.model.IFileVersion#getBinaryContent <em>Binary Content</em>}</li> * </ul> * </p> * @@ -151,4 +152,29 @@ public interface IFileVersion extends IReviewItem { */ void setFileRevision(IFileRevision value); + /** + * Returns the value of the '<em><b>Binary Content</b></em>' attribute. <!-- begin-user-doc --> + * <p> + * If the meaning of the '<em>Binary Content</em>' attribute isn't clear, there really should be more of a + * description here... + * </p> + * <!-- end-user-doc --> + * + * @return the value of the '<em>Binary Content</em>' attribute. + * @see #setBinaryContent(byte[]) + * @generated + */ + byte[] getBinaryContent(); + + /** + * Sets the value of the '{@link org.eclipse.mylyn.reviews.core.model.IFileVersion#getBinaryContent + * <em>Binary Content</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @param value + * the new value of the '<em>Binary Content</em>' attribute. + * @see #getBinaryContent() + * @generated + */ + void setBinaryContent(byte[] value); + } // IFileVersion diff --git a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/FileVersion.java b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/FileVersion.java index 669e13eaa..308bd22f1 100644 --- a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/FileVersion.java +++ b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/FileVersion.java @@ -30,6 +30,7 @@ import org.eclipse.team.core.history.IFileRevision; * <li>{@link org.eclipse.mylyn.reviews.internal.core.model.FileVersion#getContent <em>Content</em>}</li> * <li>{@link org.eclipse.mylyn.reviews.internal.core.model.FileVersion#getFile <em>File</em>}</li> * <li>{@link org.eclipse.mylyn.reviews.internal.core.model.FileVersion#getFileRevision <em>File Revision</em>}</li> + * <li>{@link org.eclipse.mylyn.reviews.internal.core.model.FileVersion#getBinaryContent <em>Binary Content</em>}</li> * </ul> * </p> * @@ -127,6 +128,26 @@ public class FileVersion extends ReviewItem implements IFileVersion { protected IFileRevision fileRevision = FILE_REVISION_EDEFAULT; /** + * The default value of the '{@link #getBinaryContent() <em>Binary Content</em>}' attribute. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @see #getBinaryContent() + * @generated + * @ordered + */ + protected static final byte[] BINARY_CONTENT_EDEFAULT = null; + + /** + * The cached value of the '{@link #getBinaryContent() <em>Binary Content</em>}' attribute. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @see #getBinaryContent() + * @generated + * @ordered + */ + protected byte[] binaryContent = BINARY_CONTENT_EDEFAULT; + + /** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated @@ -292,6 +313,29 @@ public class FileVersion extends ReviewItem implements IFileVersion { * * @generated */ + public byte[] getBinaryContent() { + return binaryContent; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public void setBinaryContent(byte[] newBinaryContent) { + byte[] oldBinaryContent = binaryContent; + binaryContent = newBinaryContent; + if (eNotificationRequired()) { + eNotify(new ENotificationImpl(this, Notification.SET, ReviewsPackage.FILE_VERSION__BINARY_CONTENT, + oldBinaryContent, binaryContent)); + } + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { @@ -308,6 +352,8 @@ public class FileVersion extends ReviewItem implements IFileVersion { return basicGetFile(); case ReviewsPackage.FILE_VERSION__FILE_REVISION: return getFileRevision(); + case ReviewsPackage.FILE_VERSION__BINARY_CONTENT: + return getBinaryContent(); } return super.eGet(featureID, resolve, coreType); } @@ -335,6 +381,9 @@ public class FileVersion extends ReviewItem implements IFileVersion { case ReviewsPackage.FILE_VERSION__FILE_REVISION: setFileRevision((IFileRevision) newValue); return; + case ReviewsPackage.FILE_VERSION__BINARY_CONTENT: + setBinaryContent((byte[]) newValue); + return; } super.eSet(featureID, newValue); } @@ -362,6 +411,9 @@ public class FileVersion extends ReviewItem implements IFileVersion { case ReviewsPackage.FILE_VERSION__FILE_REVISION: setFileRevision(FILE_REVISION_EDEFAULT); return; + case ReviewsPackage.FILE_VERSION__BINARY_CONTENT: + setBinaryContent(BINARY_CONTENT_EDEFAULT); + return; } super.eUnset(featureID); } @@ -384,6 +436,10 @@ public class FileVersion extends ReviewItem implements IFileVersion { return file != null; case ReviewsPackage.FILE_VERSION__FILE_REVISION: return FILE_REVISION_EDEFAULT == null ? fileRevision != null : !FILE_REVISION_EDEFAULT.equals(fileRevision); + case ReviewsPackage.FILE_VERSION__BINARY_CONTENT: + return BINARY_CONTENT_EDEFAULT == null + ? binaryContent != null + : !BINARY_CONTENT_EDEFAULT.equals(binaryContent); } return super.eIsSet(featureID); } @@ -408,6 +464,8 @@ public class FileVersion extends ReviewItem implements IFileVersion { result.append(content); result.append(", fileRevision: "); //$NON-NLS-1$ result.append(fileRevision); + result.append(", binaryContent: "); //$NON-NLS-1$ + result.append(binaryContent); result.append(')'); return result.toString(); } diff --git a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/ReviewsPackage.java b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/ReviewsPackage.java index e6dde01a3..bbc344248 100644 --- a/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/ReviewsPackage.java +++ b/org.eclipse.mylyn.reviews.core/src/org/eclipse/mylyn/reviews/internal/core/model/ReviewsPackage.java @@ -1333,13 +1333,21 @@ public class ReviewsPackage extends EPackageImpl { public static final int FILE_VERSION__FILE_REVISION = REVIEW_ITEM_FEATURE_COUNT + 4; /** + * The feature id for the '<em><b>Binary Content</b></em>' attribute. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + * @ordered + */ + public static final int FILE_VERSION__BINARY_CONTENT = REVIEW_ITEM_FEATURE_COUNT + 5; + + /** * The number of structural features of the '<em>File Version</em>' class. <!-- begin-user-doc --> <!-- end-user-doc * --> * * @generated * @ordered */ - public static final int FILE_VERSION_FEATURE_COUNT = REVIEW_ITEM_FEATURE_COUNT + 5; + public static final int FILE_VERSION_FEATURE_COUNT = REVIEW_ITEM_FEATURE_COUNT + 6; /** * The meta object id for the '{@link org.eclipse.mylyn.reviews.internal.core.model.ApprovalType @@ -2771,6 +2779,20 @@ public class ReviewsPackage extends EPackageImpl { } /** + * Returns the meta object for the attribute ' + * {@link org.eclipse.mylyn.reviews.core.model.IFileVersion#getBinaryContent <em>Binary Content</em>}'. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @return the meta object for the attribute '<em>Binary Content</em>'. + * @see org.eclipse.mylyn.reviews.core.model.IFileVersion#getBinaryContent() + * @see #getFileVersion() + * @generated + */ + public EAttribute getFileVersion_BinaryContent() { + return (EAttribute) fileVersionEClass.getEStructuralFeatures().get(5); + } + + /** * Returns the meta object for class '{@link org.eclipse.mylyn.reviews.core.model.IIndexed <em>Indexed</em>}'. <!-- * begin-user-doc --> <!-- end-user-doc --> * @@ -3212,6 +3234,7 @@ public class ReviewsPackage extends EPackageImpl { createEAttribute(fileVersionEClass, FILE_VERSION__CONTENT); createEReference(fileVersionEClass, FILE_VERSION__FILE); createEAttribute(fileVersionEClass, FILE_VERSION__FILE_REVISION); + createEAttribute(fileVersionEClass, FILE_VERSION__BINARY_CONTENT); indexedEClass = createEClass(INDEXED); createEAttribute(indexedEClass, INDEXED__INDEX); @@ -3602,6 +3625,10 @@ public class ReviewsPackage extends EPackageImpl { getFileVersion_FileRevision(), this.getIFileRevision(), "fileRevision", null, 0, 1, IFileVersion.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ + initEAttribute( + getFileVersion_BinaryContent(), + ecorePackage.getEByteArray(), + "binaryContent", null, 0, 1, IFileVersion.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ initEClass(indexedEClass, IIndexed.class, "Indexed", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$ initEAttribute( @@ -4331,6 +4358,14 @@ public class ReviewsPackage extends EPackageImpl { public static final EAttribute FILE_VERSION__FILE_REVISION = eINSTANCE.getFileVersion_FileRevision(); /** + * The meta object literal for the '<em><b>Binary Content</b></em>' attribute feature. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + public static final EAttribute FILE_VERSION__BINARY_CONTENT = eINSTANCE.getFileVersion_BinaryContent(); + + /** * The meta object literal for the '{@link org.eclipse.mylyn.reviews.core.model.IIndexed <em>Indexed</em>}' * class. <!-- begin-user-doc --> <!-- end-user-doc --> * diff --git a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/CompareUtil.java b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/CompareUtil.java index a3e3f621e..6e3d763e6 100644 --- a/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/CompareUtil.java +++ b/org.eclipse.mylyn.reviews.ui/src/org/eclipse/mylyn/internal/reviews/ui/compare/CompareUtil.java @@ -26,7 +26,11 @@ public class CompareUtil { public static byte[] getContent(IFileVersion version) { String content = version.getContent(); - return (content != null) ? content.getBytes() : new byte[0]; + if (content != null) { + return content.getBytes(); + } + byte[] binaryContent = version.getBinaryContent(); + return binaryContent != null ? binaryContent : new byte[0]; } static SourceViewer getSourceViewer(MergeSourceViewer sourceViewer) { @@ -35,7 +39,7 @@ public class CompareUtil { } else { Object returnValue; try { - Method getSourceViewerRefl = MergeSourceViewer.class.getDeclaredMethod("getSourceViewer"); + Method getSourceViewerRefl = MergeSourceViewer.class.getDeclaredMethod("getSourceViewer"); //$NON-NLS-1$ getSourceViewerRefl.setAccessible(true); returnValue = getSourceViewerRefl.invoke(sourceViewer); if (returnValue instanceof SourceViewer) { |