From d0ba9178aa64a2216b7a00934a29940b8f8970d4 Mon Sep 17 00:00:00 2001 From: Ryan D. Brooks Date: Tue, 3 May 2011 14:11:11 -0700 Subject: refinement: Expose recursive purge operation to client through http --- .../management/internal/OseeBranchService.java | 13 +++++- .../management/purge/PurgeBranchOperation.java | 4 ++ .../message/test/data/PurgeBranchRequestTest.java | 4 +- .../PurgeBranchRequestTranslatorTest.java | 2 +- .../framework/core/message/PurgeBranchRequest.java | 8 +++- .../translation/PurgeBranchRequestTranslator.java | 12 +++-- .../skynet/core/artifact/BranchPurgeTest.java | 6 +-- .../skynet/core/event/model/BranchEventTest.java | 54 ++++++---------------- .../skynet/core/artifact/BranchManager.java | 20 +------- .../PurgeBranchHttpRequestOperation.java | 7 +-- .../test/dbHealth/RelationIntegrityCheckTest.java | 7 +-- 11 files changed, 60 insertions(+), 77 deletions(-) (limited to 'plugins') diff --git a/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/OseeBranchService.java b/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/OseeBranchService.java index 36f2eb0a4a2..7cd28cdd44d 100644 --- a/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/OseeBranchService.java +++ b/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/internal/OseeBranchService.java @@ -21,7 +21,10 @@ import org.eclipse.osee.framework.branch.management.commit.CommitDbOperation; import org.eclipse.osee.framework.branch.management.creation.CreateBranchOperation; import org.eclipse.osee.framework.branch.management.purge.BranchOperation; import org.eclipse.osee.framework.branch.management.purge.IBranchOperationFactory; +import org.eclipse.osee.framework.branch.management.purge.IBranchesProvider; import org.eclipse.osee.framework.branch.management.purge.PurgeBranchOperationFactory; +import org.eclipse.osee.framework.branch.management.purge.RecursiveBranchProvider; +import org.eclipse.osee.framework.branch.management.purge.SingleBranchProvider; import org.eclipse.osee.framework.core.enums.BranchArchivedState; import org.eclipse.osee.framework.core.enums.BranchState; import org.eclipse.osee.framework.core.enums.BranchType; @@ -43,6 +46,7 @@ import org.eclipse.osee.framework.core.model.Branch; import org.eclipse.osee.framework.core.model.TransactionDelta; import org.eclipse.osee.framework.core.model.TransactionRecord; import org.eclipse.osee.framework.core.model.cache.BranchCache; +import org.eclipse.osee.framework.core.model.cache.BranchFilter; import org.eclipse.osee.framework.core.model.cache.TransactionCache; import org.eclipse.osee.framework.core.operation.AbstractOperation; import org.eclipse.osee.framework.core.operation.CompositeOperation; @@ -152,7 +156,14 @@ public class OseeBranchService implements IOseeBranchService { IBranchOperationFactory factory = new PurgeBranchOperationFactory(logger, branchCache, oseeDatabaseProvider.getOseeDatabaseService()); - return new BranchOperation(logger, factory, branch); + IBranchesProvider provider; + if (request.isRecursive()) { + provider = new RecursiveBranchProvider(branch, new BranchFilter()); + } else { + provider = new SingleBranchProvider(branch); + } + + return new BranchOperation(logger, factory, provider); } @Override diff --git a/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/purge/PurgeBranchOperation.java b/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/purge/PurgeBranchOperation.java index 3c0c79ddc19..e4bec2cce14 100644 --- a/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/purge/PurgeBranchOperation.java +++ b/plugins/org.eclipse.osee.framework.branch.management/src/org/eclipse/osee/framework/branch/management/purge/PurgeBranchOperation.java @@ -73,6 +73,10 @@ public class PurgeBranchOperation extends AbstractDbTxOperation { this.connection = connection; this.monitor = monitor; + if (branch.getStorageState() == StorageState.PURGED) { + return; + } + if (!branch.getAllChildBranches(false).isEmpty()) { throw new OseeArgumentException("Unable to purge a branch containing children: branchGuid[%s] branchType[%s]", branch.getGuid(), branch.getBranchType()); diff --git a/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/data/PurgeBranchRequestTest.java b/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/data/PurgeBranchRequestTest.java index 67df8e93b50..6dca5f10e85 100644 --- a/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/data/PurgeBranchRequestTest.java +++ b/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/data/PurgeBranchRequestTest.java @@ -12,8 +12,8 @@ package org.eclipse.osee.framework.core.message.test.data; import java.util.ArrayList; import java.util.Collection; -import org.junit.Assert; import org.eclipse.osee.framework.core.message.PurgeBranchRequest; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -33,7 +33,7 @@ public class PurgeBranchRequestTest { public PurgeBranchRequestTest(int expectedBranchId) { super(); - this.request = new PurgeBranchRequest(expectedBranchId); + this.request = new PurgeBranchRequest(expectedBranchId, false); this.branchId = expectedBranchId; } diff --git a/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/translation/PurgeBranchRequestTranslatorTest.java b/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/translation/PurgeBranchRequestTranslatorTest.java index d8b179b8f53..b0f649b832f 100644 --- a/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/translation/PurgeBranchRequestTranslatorTest.java +++ b/plugins/org.eclipse.osee.framework.core.message.test/src/org/eclipse/osee/framework/core/message/test/translation/PurgeBranchRequestTranslatorTest.java @@ -45,7 +45,7 @@ public class PurgeBranchRequestTranslatorTest extends BaseTranslatorTest translator = new PurgeBranchRequestTranslator(); for (int index = 1; index <= 2; index++) { - data.add(new Object[] {new PurgeBranchRequest(index * 3), translator}); + data.add(new Object[] {new PurgeBranchRequest(index * 3, false), translator}); } return data; } diff --git a/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/PurgeBranchRequest.java b/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/PurgeBranchRequest.java index 9495601f4e9..201bb393c63 100644 --- a/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/PurgeBranchRequest.java +++ b/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/PurgeBranchRequest.java @@ -16,13 +16,19 @@ package org.eclipse.osee.framework.core.message; */ public class PurgeBranchRequest { private final int branchId; + private final boolean recursive; - public PurgeBranchRequest(int branchId) { + public PurgeBranchRequest(int branchId, boolean recursive) { super(); this.branchId = branchId; + this.recursive = recursive; } public int getBranchId() { return branchId; } + + public boolean isRecursive() { + return recursive; + } } diff --git a/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/internal/translation/PurgeBranchRequestTranslator.java b/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/internal/translation/PurgeBranchRequestTranslator.java index f93dbc50e2e..068cc497b00 100644 --- a/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/internal/translation/PurgeBranchRequestTranslator.java +++ b/plugins/org.eclipse.osee.framework.core.message/src/org/eclipse/osee/framework/core/message/internal/translation/PurgeBranchRequestTranslator.java @@ -10,7 +10,6 @@ *******************************************************************************/ package org.eclipse.osee.framework.core.message.internal.translation; -import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.message.PurgeBranchRequest; import org.eclipse.osee.framework.core.translation.ITranslator; import org.eclipse.osee.framework.jdk.core.type.PropertyStore; @@ -21,20 +20,23 @@ import org.eclipse.osee.framework.jdk.core.type.PropertyStore; */ public class PurgeBranchRequestTranslator implements ITranslator { private static enum Entry { - BRANCH_ID + BRANCH_ID, + RECURSIVE } @Override - public PurgeBranchRequest convert(PropertyStore propertyStore) throws OseeCoreException { + public PurgeBranchRequest convert(PropertyStore propertyStore) { int branchId = propertyStore.getInt(Entry.BRANCH_ID.name()); - PurgeBranchRequest request = new PurgeBranchRequest(branchId); + boolean recursive = propertyStore.getBoolean(Entry.RECURSIVE.name()); + PurgeBranchRequest request = new PurgeBranchRequest(branchId, recursive); return request; } @Override - public PropertyStore convert(PurgeBranchRequest data) throws OseeCoreException { + public PropertyStore convert(PurgeBranchRequest data) { PropertyStore store = new PropertyStore(); store.put(Entry.BRANCH_ID.name(), data.getBranchId()); + store.put(Entry.RECURSIVE.name(), data.isRecursive()); return store; } } diff --git a/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/artifact/BranchPurgeTest.java b/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/artifact/BranchPurgeTest.java index 68256ff31f7..07f639d7a77 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/artifact/BranchPurgeTest.java +++ b/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/artifact/BranchPurgeTest.java @@ -20,7 +20,9 @@ import org.eclipse.osee.framework.core.data.SystemUser; import org.eclipse.osee.framework.core.enums.CoreArtifactTypes; import org.eclipse.osee.framework.core.enums.CoreAttributeTypes; import org.eclipse.osee.framework.core.model.Branch; +import org.eclipse.osee.framework.core.operation.Operations; import org.eclipse.osee.framework.skynet.core.UserManager; +import org.eclipse.osee.framework.skynet.core.httpRequests.PurgeBranchHttpRequestOperation; import org.eclipse.osee.framework.skynet.core.mocks.DbTestUtil; import org.eclipse.osee.framework.skynet.core.transaction.SkynetTransaction; import org.eclipse.osee.framework.skynet.core.util.FrameworkTestUtil; @@ -83,9 +85,7 @@ public class BranchPurgeTest { DbTestUtil.getTableRowCounts(postCreateBranchCount, tables); TestUtil.checkThatIncreased(preCreateCount, postCreateBranchCount); - // Purge branch - BranchManager.purgeBranchPending(branch); - + Operations.executeWorkAndCheckStatus(new PurgeBranchHttpRequestOperation(branch, false)); TestUtil.sleep(4000); // Count rows and check that same as when began diff --git a/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventTest.java b/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventTest.java index e5cead20edb..b0e89209a13 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventTest.java +++ b/plugins/org.eclipse.osee.framework.skynet.core.test/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventTest.java @@ -12,12 +12,8 @@ package org.eclipse.osee.framework.skynet.core.event.model; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; - import junit.framework.Assert; - import org.eclipse.osee.framework.core.data.IOseeBranch; import org.eclipse.osee.framework.core.data.TokenFactory; import org.eclipse.osee.framework.core.enums.BranchArchivedState; @@ -40,6 +36,7 @@ import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal; import org.eclipse.osee.framework.skynet.core.event.OseeEventManager; import org.eclipse.osee.framework.skynet.core.event.filter.IEventFilter; import org.eclipse.osee.framework.skynet.core.event.listener.IBranchEventListener; +import org.eclipse.osee.framework.skynet.core.httpRequests.PurgeBranchHttpRequestOperation; import org.eclipse.osee.support.test.util.TestUtil; /** @@ -51,7 +48,7 @@ public class BranchEventTest { private Sender resultSender = null; public static List ignoreLogging = Arrays.asList(""); private static String BRANCH_NAME_PREFIX = "BranchEventManagerTest"; - private static Set branches = new HashSet(); + private static Branch topLevel; @org.junit.Test public void testRegistration() throws Exception { @@ -79,14 +76,14 @@ public class BranchEventTest { try { OseeEventManager.getPreferences().setPendRunning(true); - Branch topLevel = testEvents__topLevelAdded(); - Branch workingBranch = testEvents__workingAdded(topLevel); + testEvents__topLevelAdded(); + Branch workingBranch = testEvents__workingAdded(); testEvents__workingRenamed(workingBranch); testEvents__typeChange(workingBranch); testEvents__stateChange(workingBranch); testEvents__deleted(workingBranch); - testEvents__purged(topLevel); - Branch committedBranch = testEvents__committed(topLevel); + testEvents__purged(); + Branch committedBranch = testEvents__committed(); testEvents__changeArchiveState(committedBranch); TestUtil.severeLoggingEnd(monitorLog, (isRemoteTest() ? ignoreLogging : new ArrayList())); @@ -118,11 +115,10 @@ public class BranchEventTest { return committedBranch; } - private Branch testEvents__committed(Branch topLevel) throws Exception { + private Branch testEvents__committed() throws Exception { clearEventCollections(); Branch workingBranch = BranchManager.createWorkingBranch(topLevel, BRANCH_NAME_PREFIX + " - to commit", UserManager.getUser()); - branches.add(workingBranch); Assert.assertNotNull(workingBranch); @@ -146,18 +142,17 @@ public class BranchEventTest { return workingBranch; } - private Branch testEvents__purged(Branch topLevel) throws Exception { + private Branch testEvents__purged() throws Exception { clearEventCollections(); Branch workingBranch = BranchManager.createWorkingBranch(topLevel, BRANCH_NAME_PREFIX + " - to purge", UserManager.getUser()); - branches.add(workingBranch); Assert.assertNotNull(workingBranch); final String guid = workingBranch.getGuid(); Assert.assertNotNull(workingBranch); - BranchManager.purgeBranchPending(workingBranch); + Operations.executeWorkAndCheckStatus(new PurgeBranchHttpRequestOperation(workingBranch, false)); Assert.assertNotNull(resultBranchEvent); Assert.assertEquals(BranchEventType.Purged, resultBranchEvent.getEventType()); @@ -258,11 +253,10 @@ public class BranchEventTest { return workingBranch; } - private Branch testEvents__workingAdded(Branch topLevel) throws Exception { + private Branch testEvents__workingAdded() throws Exception { clearEventCollections(); Branch workingBranch = BranchManager.createWorkingBranch(topLevel, BRANCH_NAME_PREFIX + " - working", UserManager.getUser()); - branches.add(workingBranch); Assert.assertNotNull(workingBranch); Thread.sleep(4000); @@ -282,9 +276,8 @@ public class BranchEventTest { final String guid = GUID.create(); final String branchName = String.format("%s - top level branch", BRANCH_NAME_PREFIX); IOseeBranch branchToken = TokenFactory.createBranch(guid, branchName); - Branch branch = BranchManager.createTopLevelBranch(branchToken); - branches.add(branch); - Assert.assertNotNull(branch); + topLevel = BranchManager.createTopLevelBranch(branchToken); + Assert.assertNotNull(topLevel); Thread.sleep(2000); @@ -296,7 +289,7 @@ public class BranchEventTest { Assert.assertTrue(resultSender.isLocal()); } Assert.assertEquals(guid, resultBranchEvent.getBranchGuid()); - return branch; + return topLevel; } protected boolean isRemoteTest() { @@ -317,34 +310,15 @@ public class BranchEventTest { } } - @org.junit.BeforeClass - public static void cleanUpBefore() { - branches.clear(); - } - @org.junit.AfterClass public static void cleanUpAfter() throws OseeCoreException { - for (Branch branch : branches) { - purgeBranch(branch); - } + Operations.executeWorkAndCheckStatus(new PurgeBranchHttpRequestOperation(topLevel, true)); } - private static void purgeBranch(Branch branch) throws OseeCoreException { - if (!branch.getChildBranches().isEmpty()) { - for (Branch childBranch : branch.getChildren()) { - purgeBranch(childBranch); - } - } else { - if (branch.getStorageState() != StorageState.PURGED) { - BranchManager.purgeBranchPending(branch); - } - } - } // artifact listener create for use by all tests to just capture result eventArtifacts for query private final BranchEventListener branchEventListener = new BranchEventListener(); public void clearEventCollections() { resultBranchEvent = null; } - } \ No newline at end of file diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java index b9ca98a451e..1a835f25caa 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java @@ -225,24 +225,8 @@ public class BranchManager { return Operations.executeAsJob(operation, true); } - public static void purgeBranchPending(Branch branch) throws OseeCoreException { - Operations.executeWorkAndCheckStatus(new PurgeBranchHttpRequestOperation(branch)); - } - - public static void purgeBranch(final Branch branch) { - purgeBranch(Arrays.asList(branch)); - } - - /** - * Purges branches from the system. (sets branch state to purged. operation is undo-able) - */ - public static Job purgeBranch(final List branches) { - List ops = new ArrayList(); - for (Branch branch : branches) { - ops.add(new PurgeBranchHttpRequestOperation(branch)); //can this be done in one http request? - } - return Operations.executeAsJob(new CompositeOperation("Purging multiple branches...", Activator.PLUGIN_ID, ops), - true); + public static void purgeBranch(final Branch branch) throws OseeCoreException { + Operations.executeWorkAndCheckStatus(new PurgeBranchHttpRequestOperation(branch, false)); } public static void updateBranchType(IProgressMonitor monitor, final int branchId, String branchGuid, final BranchType type) throws OseeCoreException { diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/PurgeBranchHttpRequestOperation.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/PurgeBranchHttpRequestOperation.java index 97fd55eb217..a4db8839840 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/PurgeBranchHttpRequestOperation.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/httpRequests/PurgeBranchHttpRequestOperation.java @@ -12,7 +12,6 @@ package org.eclipse.osee.framework.skynet.core.httpRequests; import java.util.HashMap; import java.util.Map; - import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.osee.framework.core.data.OseeServerContext; import org.eclipse.osee.framework.core.enums.CoreTranslatorId; @@ -37,15 +36,17 @@ import org.eclipse.osee.framework.skynet.core.internal.Activator; */ public final class PurgeBranchHttpRequestOperation extends AbstractOperation { private final Branch branch; + private final boolean recursive; - public PurgeBranchHttpRequestOperation(Branch branch) { + public PurgeBranchHttpRequestOperation(Branch branch, boolean recursive) { super("Purge " + branch, Activator.PLUGIN_ID); this.branch = branch; + this.recursive = recursive; } @Override protected void doWork(IProgressMonitor monitor) throws OseeCoreException { - PurgeBranchRequest requestData = new PurgeBranchRequest(branch.getId()); + PurgeBranchRequest requestData = new PurgeBranchRequest(branch.getId(), recursive); Map parameters = new HashMap(); parameters.put("function", Function.PURGE_BRANCH.name()); diff --git a/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/dbHealth/RelationIntegrityCheckTest.java b/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/dbHealth/RelationIntegrityCheckTest.java index a49be862fa1..08b90547a1c 100644 --- a/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/dbHealth/RelationIntegrityCheckTest.java +++ b/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/dbHealth/RelationIntegrityCheckTest.java @@ -10,7 +10,6 @@ *******************************************************************************/ package org.eclipse.osee.framework.ui.skynet.test.dbHealth; -import java.util.Arrays; import java.util.LinkedList; import java.util.List; import junit.framework.Assert; @@ -20,6 +19,7 @@ import org.eclipse.osee.framework.core.enums.CoreArtifactTypes; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.exception.OseeDataStoreException; import org.eclipse.osee.framework.core.model.Branch; +import org.eclipse.osee.framework.core.operation.Operations; import org.eclipse.osee.framework.database.core.ConnectionHandler; import org.eclipse.osee.framework.database.core.IOseeStatement; import org.eclipse.osee.framework.jdk.core.type.DoubleKeyHashMap; @@ -31,6 +31,7 @@ import org.eclipse.osee.framework.skynet.core.artifact.BranchManager; import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery; import org.eclipse.osee.framework.skynet.core.conflict.ConflictManagerExternal; import org.eclipse.osee.framework.ui.skynet.dbHealth.LocalRelationLink; +import org.eclipse.osee.framework.skynet.core.httpRequests.PurgeBranchHttpRequestOperation; import org.eclipse.osee.framework.ui.skynet.dbHealth.RelationIntegrityCheck; import org.junit.After; import org.junit.Before; @@ -42,7 +43,7 @@ import org.junit.Test; * Tests data integrity case where a new relation is persisted on a deleted artifact. Checks that if the situation * exists and runs applyFix() to resolve the issue. *

- * + * * @author Karol M. Wilk */ public class RelationIntegrityCheckTest { @@ -143,6 +144,6 @@ public class RelationIntegrityCheckTest { @After public void tearDown() throws Exception { - BranchManager.purgeBranch(Arrays.asList(workingBranch, parentBranch)); + Operations.executeWorkAndCheckStatus(new PurgeBranchHttpRequestOperation(parentBranch, true)); } } -- cgit v1.2.3