diff options
author | Roberto E. Escobar | 2014-06-07 04:17:58 +0000 |
---|---|---|
committer | Roberto E. Escobar | 2014-06-18 17:21:20 +0000 |
commit | 3f0b3f1feb61e00cf2100396b233f6b819d883ee (patch) | |
tree | 1aedc35698c792f77ac12d83cf22e281dedecaf2 | |
parent | 72650555ae15a8b604d5f0e92019d4d4deadea76 (diff) | |
download | org.eclipse.osee-3f0b3f1feb61e00cf2100396b233f6b819d883ee.tar.gz org.eclipse.osee-3f0b3f1feb61e00cf2100396b233f6b819d883ee.tar.xz org.eclipse.osee-3f0b3f1feb61e00cf2100396b233f6b819d883ee.zip |
feature[ats_ATS64153]: Create ORCS Account Subscriptions storage
Change-Id: I56165a4dc0dcd24f55a727e2cf0907a7ed22a90f
10 files changed, 669 insertions, 2 deletions
diff --git a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/OrcsAccountTestSuite.java b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/OrcsAccountTestSuite.java index 3e0c0eac99c..7ccb349e6f5 100644 --- a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/OrcsAccountTestSuite.java +++ b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/OrcsAccountTestSuite.java @@ -11,6 +11,7 @@ package org.eclipse.osee.orcs.account.admin; import org.eclipse.osee.orcs.account.admin.integration.OsgiIntegrationTestSuite; +import org.eclipse.osee.orcs.account.admin.internal.OrcsAccountInternalTestSuite; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -18,7 +19,7 @@ import org.junit.runners.Suite; * @author Roberto E. Escobar */ @RunWith(Suite.class) -@Suite.SuiteClasses({OsgiIntegrationTestSuite.class}) +@Suite.SuiteClasses({OsgiIntegrationTestSuite.class, OrcsAccountInternalTestSuite.class}) public class OrcsAccountTestSuite { // Test Suite } diff --git a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OrcsSubscriptionStorageTest.java b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OrcsSubscriptionStorageTest.java new file mode 100644 index 00000000000..3b3306aff0c --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OrcsSubscriptionStorageTest.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.account.admin.integration; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; +import java.util.HashMap; +import java.util.Map; +import org.eclipse.osee.account.admin.Account; +import org.eclipse.osee.account.admin.AccountPreferences; +import org.eclipse.osee.account.admin.CreateAccountRequest; +import org.eclipse.osee.account.admin.Subscription; +import org.eclipse.osee.account.admin.SubscriptionGroup; +import org.eclipse.osee.account.admin.ds.AccountStorage; +import org.eclipse.osee.account.admin.ds.SubscriptionStorage; +import org.eclipse.osee.framework.jdk.core.type.Identifiable; +import org.eclipse.osee.framework.jdk.core.type.ResultSet; +import org.eclipse.osee.orcs.account.admin.internal.OrcsSubscriptionStorage; +import org.eclipse.osee.orcs.db.mock.OsgiService; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.rules.TestName; +import org.junit.rules.TestRule; +import org.mockito.Mock; + +/** + * Test Case for {@link OrcsSubscriptionStorage} + * + * @author Roberto E. Escobar + */ +public class OrcsSubscriptionStorageTest { + + private static final String SUBSCRIPTION_GROUP = "Subscription-Group1"; + + @Rule + public TestRule osgi = OrcsIntegrationRule.integrationRule(this, "osee.demo.hsql"); + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Rule + public TestName testName = new TestName(); + + @OsgiService + private SubscriptionStorage storage; + + @OsgiService + private AccountStorage accountStorage; + + // @formatter:off + @Mock private CreateAccountRequest request; + @Mock private AccountPreferences preferences; + // @formatter:on + + private String name; + private String email; + private String username; + private boolean active; + private Map<String, String> prefs; + + private Identifiable<String> newAccount; + + @Before + public void testSetup() { + initMocks(this); + + String methodName = testName.getMethodName(); + + name = String.format("displayName-%s", methodName); + email = String.format("%s@email.com", methodName); + username = String.format("userName-%s", methodName); + active = true; + + prefs = new HashMap<String, String>(); + prefs.put("a", "1"); + prefs.put("b", "2"); + prefs.put("c", "true"); + + when(request.getDisplayName()).thenReturn(name); + when(request.getEmail()).thenReturn(email); + when(request.getUserName()).thenReturn(username); + when(request.getPreferences()).thenReturn(prefs); + when(request.isActive()).thenReturn(active); + + newAccount = accountStorage.createAccount(request); + } + + @Test + public void testSubscriptionAPI() { + Account account = accountStorage.getAccountByUuid(newAccount.getGuid()).getExactlyOne(); + + long accountId = account.getId(); + ResultSet<Subscription> results = storage.getSubscriptionsByAccountLocalId(accountId); + assertEquals(true, results.isEmpty()); + + assertEquals(false, storage.subscriptionGroupNameExists(SUBSCRIPTION_GROUP)); + + SubscriptionGroup group = storage.createSubscriptionGroup(SUBSCRIPTION_GROUP); + assertNotNull(group); + + assertEquals(true, storage.subscriptionGroupNameExists(SUBSCRIPTION_GROUP)); + + SubscriptionGroup group1 = storage.getSubscriptionGroups().getExactlyOne(); + assertEquals(group, group1); + + ResultSet<Account> members = storage.getSubscriptionGroupMembersByLocalId(group.getId()); + assertEquals(true, members.isEmpty()); + + Subscription subscription = storage.getSubscriptionsByAccountLocalId(account.getId()).getExactlyOne(); + assertEquals(group.getId(), subscription.getGroupId()); + assertEquals(group.getName(), subscription.getName()); + assertEquals(account.getId(), subscription.getAccountId()); + assertEquals(account.getName(), subscription.getAccountName()); + + assertEquals(false, subscription.isActive()); + + // Activate Subscription + storage.updateSubscription(subscription.getAccountId(), subscription.getGroupId(), true); + + String subscriptionUuid = subscription.getGuid(); + subscription = storage.getSubscription(subscriptionUuid); + assertEquals(true, subscription.isActive()); + + members = storage.getSubscriptionGroupMembersByLocalId(group.getId()); + assertEquals(1, members.size()); + Account member = members.getExactlyOne(); + assertEquals(account, member); + + // De-Activate Subscription + storage.updateSubscription(subscription.getAccountId(), subscription.getGroupId(), false); + + subscription = storage.getSubscription(subscriptionUuid); + assertEquals(false, subscription.isActive()); + + members = storage.getSubscriptionGroupMembersByLocalId(group.getId()); + assertEquals(true, members.isEmpty()); + + storage.deleteSubscriptionGroup(group); + assertEquals(false, storage.subscriptionGroupNameExists(SUBSCRIPTION_GROUP)); + } + +} diff --git a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OsgiIntegrationTestSuite.java b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OsgiIntegrationTestSuite.java index b0cc10a2bda..2641093105b 100644 --- a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OsgiIntegrationTestSuite.java +++ b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/integration/OsgiIntegrationTestSuite.java @@ -17,7 +17,7 @@ import org.junit.runners.Suite; * @author Roberto E. Escobar */ @RunWith(Suite.class) -@Suite.SuiteClasses({OrcsAccountStorageTest.class}) +@Suite.SuiteClasses({OrcsAccountStorageTest.class, OrcsSubscriptionStorageTest.class}) public class OsgiIntegrationTestSuite { // Test Suite } diff --git a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/internal/OrcsAccountInternalTestSuite.java b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/internal/OrcsAccountInternalTestSuite.java new file mode 100644 index 00000000000..5275be31918 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/internal/OrcsAccountInternalTestSuite.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.account.admin.internal; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +/** + * @author Roberto E. Escobar + */ +@RunWith(Suite.class) +@Suite.SuiteClasses({SubscriptionUtilTest.class}) +public class OrcsAccountInternalTestSuite { + // Test Suite +} diff --git a/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/internal/SubscriptionUtilTest.java b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/internal/SubscriptionUtilTest.java new file mode 100644 index 00000000000..cd2cb761857 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin.test/src/org/eclipse/osee/orcs/account/admin/internal/SubscriptionUtilTest.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.account.admin.internal; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.eclipse.osee.account.admin.Subscription; +import org.eclipse.osee.orcs.account.admin.internal.SubscriptionUtil.ActiveDelegate; +import org.eclipse.osee.orcs.data.ArtifactReadable; +import org.junit.Test; +import org.mockito.Mockito; + +/** + * Test Case for {@link SubscriptionUtil} + * + * @author Roberto E. Escobar + */ +public class SubscriptionUtilTest { + + private static final int ACCOUNT_ID = 3242; + private static final String ACCOUNT_NAME = "account-name"; + + private static final int GROUP_ID = 97012; + private static final String SUBSCRIPTION_NAME = "subscription-name"; + + @Test + public void testEncodeDecodeSubscription() { + String encodedUuid = SubscriptionUtil.toEncodedUuid(ACCOUNT_ID, ACCOUNT_NAME, GROUP_ID, SUBSCRIPTION_NAME); + + ActiveDelegate delegate = Mockito.mock(ActiveDelegate.class); + + Subscription actual = SubscriptionUtil.fromEncodedUuid(encodedUuid, delegate); + assertEquals(encodedUuid, actual.getGuid()); + assertEquals(SUBSCRIPTION_NAME, actual.getName()); + assertEquals(ACCOUNT_ID, actual.getAccountId()); + assertEquals(ACCOUNT_NAME, actual.getAccountName()); + assertEquals(GROUP_ID, actual.getGroupId()); + + when(delegate.isActive(ACCOUNT_ID, GROUP_ID)).thenReturn(true); + boolean isActive = actual.isActive(); + + assertEquals(true, isActive); + verify(delegate).isActive(ACCOUNT_ID, GROUP_ID); + } + + @Test + public void testFromData() { + String encodedUuid = SubscriptionUtil.toEncodedUuid(ACCOUNT_ID, ACCOUNT_NAME, GROUP_ID, SUBSCRIPTION_NAME); + + Subscription actual = + SubscriptionUtil.fromData(ACCOUNT_ID, ACCOUNT_NAME, GROUP_ID, SUBSCRIPTION_NAME, true); + + assertEquals(encodedUuid, actual.getGuid()); + assertEquals(SUBSCRIPTION_NAME, actual.getName()); + assertEquals(ACCOUNT_ID, actual.getAccountId()); + assertEquals(ACCOUNT_NAME, actual.getAccountName()); + assertEquals(GROUP_ID, actual.getGroupId()); + assertEquals(true, actual.isActive()); + + actual = SubscriptionUtil.fromData(ACCOUNT_ID, ACCOUNT_NAME, GROUP_ID, SUBSCRIPTION_NAME, false); + + assertEquals(encodedUuid, actual.getGuid()); + assertEquals(SUBSCRIPTION_NAME, actual.getName()); + assertEquals(ACCOUNT_ID, actual.getAccountId()); + assertEquals(ACCOUNT_NAME, actual.getAccountName()); + assertEquals(GROUP_ID, actual.getGroupId()); + assertEquals(false, actual.isActive()); + } + + public void testFromArtifactData() { + String encodedUuid = SubscriptionUtil.toEncodedUuid(ACCOUNT_ID, ACCOUNT_NAME, GROUP_ID, SUBSCRIPTION_NAME); + + ArtifactReadable accountArt = Mockito.mock(ArtifactReadable.class); + when(accountArt.getLocalId()).thenReturn(ACCOUNT_ID); + when(accountArt.getName()).thenReturn(ACCOUNT_NAME); + + ArtifactReadable subscriptionArt = Mockito.mock(ArtifactReadable.class); + when(subscriptionArt.getLocalId()).thenReturn(GROUP_ID); + when(subscriptionArt.getName()).thenReturn(SUBSCRIPTION_NAME); + + Subscription actual = SubscriptionUtil.fromArtifactData(accountArt, subscriptionArt, true); + + assertEquals(encodedUuid, actual.getGuid()); + assertEquals(SUBSCRIPTION_NAME, actual.getName()); + assertEquals(ACCOUNT_ID, actual.getAccountId()); + assertEquals(ACCOUNT_NAME, actual.getAccountName()); + assertEquals(GROUP_ID, actual.getGroupId()); + assertEquals(true, actual.isActive()); + + actual = SubscriptionUtil.fromArtifactData(accountArt, subscriptionArt, false); + + assertEquals(encodedUuid, actual.getGuid()); + assertEquals(SUBSCRIPTION_NAME, actual.getName()); + assertEquals(ACCOUNT_ID, actual.getAccountId()); + assertEquals(ACCOUNT_NAME, actual.getAccountName()); + assertEquals(GROUP_ID, actual.getGroupId()); + assertEquals(false, actual.isActive()); + } +} diff --git a/plugins/org.eclipse.osee.orcs.account.admin/OSGI-INF/orcs.subscription.ds.xml b/plugins/org.eclipse.osee.orcs.account.admin/OSGI-INF/orcs.subscription.ds.xml new file mode 100644 index 00000000000..2ccb565de59 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin/OSGI-INF/orcs.subscription.ds.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop"> + <implementation class="org.eclipse.osee.orcs.account.admin.internal.OrcsSubscriptionStorage"/> + <service> + <provide interface="org.eclipse.osee.account.admin.ds.SubscriptionStorage"/> + </service> + <reference bind="setLogger" cardinality="1..1" interface="org.eclipse.osee.logger.Log" name="Log" policy="static"/> + <reference bind="setOrcsApi" cardinality="1..1" interface="org.eclipse.osee.orcs.OrcsApi" name="OrcsApi" policy="static"/> + <reference bind="setAccountFactory" cardinality="1..1" interface="org.eclipse.osee.orcs.account.admin.internal.AccountFactory" name="AccountFactory" policy="static"/> +</scr:component> diff --git a/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountFactory.java b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountFactory.java index 68b35e9e8e7..32ef66ecbf8 100644 --- a/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountFactory.java +++ b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountFactory.java @@ -14,6 +14,7 @@ import java.util.Date; import org.eclipse.osee.account.admin.Account; import org.eclipse.osee.account.admin.AccountPreferences; import org.eclipse.osee.account.admin.AccountSession; +import org.eclipse.osee.account.admin.SubscriptionGroup; import org.eclipse.osee.framework.jdk.core.type.ResultSet; import org.eclipse.osee.framework.jdk.core.type.ResultSetTransform.Function; import org.eclipse.osee.framework.jdk.core.type.ResultSets; @@ -26,6 +27,8 @@ public class AccountFactory { private final Function<String, ArtifactReadable, Account> function1 = new ArtifactToAccount(); private final Function<String, ArtifactReadable, AccountPreferences> function2 = new ArtifactToAccountPreferences(); + private final Function<String, ArtifactReadable, SubscriptionGroup> function3 = + new ArtifactToAccountSubscriptionGroup(); public ResultSet<Account> newAccountResultSet(ResultSet<ArtifactReadable> results) { return ResultSets.transform(results, function1); @@ -76,4 +79,21 @@ public class AccountFactory { session.setAccessedFrom(accessedFrom); return session; } + + public SubscriptionGroup newAccountSubscriptionGroup(ArtifactReadable source) { + return new AccountSubscriptionGroupImpl(source.getGuid(), source); + } + + public ResultSet<SubscriptionGroup> newAccountSubscriptionGroupResultSet(ResultSet<ArtifactReadable> results) { + return ResultSets.transform(results, function3); + } + + private class ArtifactToAccountSubscriptionGroup implements Function<String, ArtifactReadable, SubscriptionGroup> { + + @Override + public SubscriptionGroup apply(ArtifactReadable source) { + return newAccountSubscriptionGroup(source); + } + } + } diff --git a/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountSubscriptionGroupImpl.java b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountSubscriptionGroupImpl.java new file mode 100644 index 00000000000..4791ea44ed6 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/AccountSubscriptionGroupImpl.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.account.admin.internal; + +import org.eclipse.osee.account.admin.SubscriptionGroup; +import org.eclipse.osee.framework.core.enums.CoreAttributeTypes; +import org.eclipse.osee.framework.jdk.core.type.BaseIdentity; +import org.eclipse.osee.orcs.data.ArtifactReadable; + +/** + * @author Roberto E. Escobar + */ +public class AccountSubscriptionGroupImpl extends BaseIdentity<String> implements SubscriptionGroup { + + private static final String NOT_AVAILABLE = "N/A"; + private final ArtifactReadable artifact; + + public AccountSubscriptionGroupImpl(String uuid, ArtifactReadable artifact) { + super(artifact.getGuid()); + this.artifact = artifact; + } + + @Override + public long getId() { + return artifact.getLocalId(); + } + + @Override + public String getName() { + return artifact.getSoleAttributeValue(CoreAttributeTypes.Name, NOT_AVAILABLE); + } + + @Override + public String toString() { + return "AccountSubscriptionGroupImpl [artifact=" + artifact + "]"; + } + +} diff --git a/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/OrcsSubscriptionStorage.java b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/OrcsSubscriptionStorage.java new file mode 100644 index 00000000000..0da96c2f02b --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/OrcsSubscriptionStorage.java @@ -0,0 +1,189 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.account.admin.internal; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import org.eclipse.osee.account.admin.Account; +import org.eclipse.osee.account.admin.Subscription; +import org.eclipse.osee.account.admin.SubscriptionGroup; +import org.eclipse.osee.account.admin.ds.SubscriptionStorage; +import org.eclipse.osee.framework.core.enums.CoreArtifactTypes; +import org.eclipse.osee.framework.core.enums.CoreRelationTypes; +import org.eclipse.osee.framework.jdk.core.type.ResultSet; +import org.eclipse.osee.framework.jdk.core.type.ResultSets; +import org.eclipse.osee.orcs.account.admin.internal.SubscriptionUtil.ActiveDelegate; +import org.eclipse.osee.orcs.data.ArtifactId; +import org.eclipse.osee.orcs.data.ArtifactReadable; +import org.eclipse.osee.orcs.transaction.TransactionBuilder; +import org.eclipse.osee.orcs.utility.OrcsUtil; + +/** + * @author Roberto E. Escobar + */ +public class OrcsSubscriptionStorage extends AbstractOrcsStorage implements SubscriptionStorage { + + @Override + public ResultSet<Subscription> getSubscriptionsByAccountLocalId(long accountId) { + int intAccountId = Long.valueOf(accountId).intValue(); + ResultSet<ArtifactReadable> accountResults = + newQuery().andIsOfType(CoreArtifactTypes.User).andLocalId(intAccountId).getResults(); + ArtifactReadable account = accountResults.getExactlyOne(); + + ResultSet<ArtifactReadable> allGroups = newQuery().andIsOfType(CoreArtifactTypes.SubscriptionGroup).getResults(); + List<Subscription> subscriptions = new ArrayList<Subscription>(); + for (ArtifactReadable group : allGroups) { + boolean related = account.areRelated(CoreRelationTypes.Users_Artifact, group); + subscriptions.add(SubscriptionUtil.fromArtifactData(account, group, related)); + } + return ResultSets.newResultSet(subscriptions); + } + + @Override + public void updateSubscription(long accountId, long groupId, boolean activate) { + int intAccountId = Long.valueOf(accountId).intValue(); + int intGroupId = Long.valueOf(groupId).intValue(); + + ArtifactReadable account = newQuery().andLocalId(intAccountId).getResults().getExactlyOne(); + ArtifactReadable group = + newQuery().andLocalId(intGroupId).andIsOfType(CoreArtifactTypes.SubscriptionGroup).getResults().getExactlyOne(); + + String txComment = + String.format("%s user [%s] to [%s].", activate ? "Subscribe" : "Unsubscribe", account.getName(), + group.getName()); + TransactionBuilder tx = newTransaction(txComment); + // relate/unrelate (Side_A Art) <- Users -> (Side_B Art) + if (activate) { + tx.relate(group, CoreRelationTypes.Users_Artifact, account); + } else { + tx.unrelate(group, CoreRelationTypes.Users_Artifact, account); + } + tx.commit(); + } + + @Override + public Subscription getSubscription(String subscriptionUuid) { + return SubscriptionUtil.fromEncodedUuid(subscriptionUuid, new LazyActiveDelegate()); + } + + private class LazyActiveDelegate implements ActiveDelegate { + + private final AtomicBoolean wasRun = new AtomicBoolean(false); + private volatile boolean isActive; + + @Override + public boolean isActive(long accountId, long groupId) { + if (wasRun.compareAndSet(false, true)) { + int intAccountId = Long.valueOf(accountId).intValue(); + int intGroupId = Long.valueOf(groupId).intValue(); + + ArtifactReadable account = newQuery().andLocalId(intAccountId).getResults().getExactlyOne(); + ArtifactReadable group = newQuery().andLocalId(intGroupId).getResults().getExactlyOne(); + isActive = account.areRelated(CoreRelationTypes.Users_Artifact, group); + } + return isActive; + } + } + + @Override + public ResultSet<SubscriptionGroup> getSubscriptionGroups() { + ResultSet<ArtifactReadable> results = newQuery().andIsOfType(CoreArtifactTypes.SubscriptionGroup).getResults(); + return getFactory().newAccountSubscriptionGroupResultSet(results); + } + + @Override + public ResultSet<SubscriptionGroup> getSubscriptionGroupByLocalId(long groupId) { + int intGroupId = Long.valueOf(groupId).intValue(); + ResultSet<ArtifactReadable> results = + newQuery().andLocalId(intGroupId).andIsOfType(CoreArtifactTypes.SubscriptionGroup).getResults(); + return getFactory().newAccountSubscriptionGroupResultSet(results); + } + + @Override + public ResultSet<SubscriptionGroup> getSubscriptionGroupByName(String name) { + ResultSet<ArtifactReadable> results = + newQuery().andIsOfType(CoreArtifactTypes.SubscriptionGroup).andNameEquals(name).getResults(); + return getFactory().newAccountSubscriptionGroupResultSet(results); + } + + @Override + public ResultSet<SubscriptionGroup> getSubscriptionGroupByUuid(String uuid) { + ResultSet<ArtifactReadable> results = + newQuery().andGuid(uuid).andIsOfType(CoreArtifactTypes.SubscriptionGroup).getResults(); + return getFactory().newAccountSubscriptionGroupResultSet(results); + } + + @SuppressWarnings("unchecked") + @Override + public SubscriptionGroup createSubscriptionGroup(String name) { + String comment = String.format("Create subscription group [%s]", name); + + TransactionBuilder tx = newTransaction(comment); + ArtifactId artId = tx.createArtifact(CoreArtifactTypes.SubscriptionGroup, name); + tx.commit(); + + ArtifactReadable groupArt = newQuery().andIds(artId).getResults().getExactlyOne(); + return getFactory().newAccountSubscriptionGroup(groupArt); + } + + @Override + public void deleteSubscriptionGroup(SubscriptionGroup group) { + ArtifactId artId = OrcsUtil.newArtifactId(group.getGuid(), group.getName()); + + String comment = String.format("Delete subscription group [%s]", group.getName()); + TransactionBuilder tx = newTransaction(comment); + tx.deleteArtifact(artId); + tx.commit(); + } + + @Override + public ResultSet<Account> getSubscriptionGroupMembersByLocalId(long groupId) { + int intGroupId = Long.valueOf(groupId).intValue(); + ResultSet<ArtifactReadable> results = + newQuery().andIsOfType(CoreArtifactTypes.User).andRelatedToLocalIds(CoreRelationTypes.Users_Artifact, + intGroupId).getResults(); + return getFactory().newAccountResultSet(results); + } + + @Override + public ResultSet<Account> getSubscriptionGroupMembersByName(String name) { + ResultSet<ArtifactReadable> results = + newQuery().andIsOfType(CoreArtifactTypes.SubscriptionGroup).andNameEquals(name).getResults(); + ArtifactReadable group = results.getOneOrNull(); + return getMembers(group); + } + + @Override + public ResultSet<Account> getSubscriptionGroupMembersByUuid(String uuid) { + ResultSet<ArtifactReadable> results = + newQuery().andIsOfType(CoreArtifactTypes.SubscriptionGroup).andGuid(uuid).getResults(); + ArtifactReadable group = results.getOneOrNull(); + return getMembers(group); + } + + private ResultSet<Account> getMembers(ArtifactReadable group) { + ResultSet<Account> toReturn; + if (group != null) { + ResultSet<ArtifactReadable> related = group.getRelated(CoreRelationTypes.Users_User); + toReturn = getFactory().newAccountResultSet(related); + } else { + toReturn = ResultSets.emptyResultSet(); + } + return toReturn; + } + + @Override + public boolean subscriptionGroupNameExists(String groupName) { + int count = newQuery().andIsOfType(CoreArtifactTypes.SubscriptionGroup).andNameEquals(groupName).getCount(); + return count > 0; + } +} diff --git a/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/SubscriptionUtil.java b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/SubscriptionUtil.java new file mode 100644 index 00000000000..e0df4c30bed --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.account.admin/src/org/eclipse/osee/orcs/account/admin/internal/SubscriptionUtil.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2014 Boeing. + * 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: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.account.admin.internal; + +import org.eclipse.osee.account.admin.Subscription; +import org.eclipse.osee.framework.jdk.core.type.NamedIdentity; +import org.eclipse.osee.framework.jdk.core.util.EncryptUtility; +import org.eclipse.osee.orcs.data.ArtifactReadable; + +/** + * @author Roberto E. Escobar + */ +public final class SubscriptionUtil { + + private static final String SUBSCRIPTION_SECRET = "lRL2uka3CwLL88Q1"; + + public static interface ActiveDelegate { + + boolean isActive(long accountId, long groupId); + } + + public static String toEncodedUuid(long accountId, String accountDisplayName, long groupId, String subscriptionName) { + String rawData = String.format("%s:%s:%s:%s", accountId, accountDisplayName, groupId, subscriptionName); + return EncryptUtility.encrypt(rawData, SUBSCRIPTION_SECRET); + } + + public static Subscription fromEncodedUuid(String subscriptionUuid, ActiveDelegate delegate) { + String decrypted = EncryptUtility.decrypt(subscriptionUuid, SUBSCRIPTION_SECRET); + String[] data = decrypted.split(":"); + int index = 0; + int accountId = Integer.parseInt(data[index++]); + String accountDisplayName = data[index++]; + int groupId = Integer.parseInt(data[index++]); + String subscriptionName = data[index++]; + return new DelegatingActiveSubscriptionImpl(subscriptionUuid, accountId, accountDisplayName, groupId, + subscriptionName, delegate); + } + + public static Subscription fromData(long accountId, String accountDisplayName, long groupId, String subscriptionName, boolean isActive) { + String encodedUuid = toEncodedUuid(accountId, accountDisplayName, groupId, subscriptionName); + return new SubscriptionImpl(encodedUuid, accountId, accountDisplayName, groupId, subscriptionName, isActive); + } + + public static Subscription fromArtifactData(ArtifactReadable account, ArtifactReadable subscription, boolean isActive) { + int accountId = account.getLocalId(); + String accountName = account.getName(); + int groupId = subscription.getLocalId(); + String subscriptionName = subscription.getName(); + return fromData(accountId, accountName, groupId, subscriptionName, isActive); + } + + private static final class DelegatingActiveSubscriptionImpl extends SubscriptionImpl { + + private final ActiveDelegate provider; + + private DelegatingActiveSubscriptionImpl(String encodedUuid, long accountId, String accountDisplayName, long groupId, String subscriptionName, ActiveDelegate provider) { + super(encodedUuid, accountId, accountDisplayName, groupId, subscriptionName, false); + this.provider = provider; + } + + @Override + public boolean isActive() { + return provider.isActive(getAccountId(), getGroupId()); + } + } + + private static class SubscriptionImpl extends NamedIdentity<String> implements Subscription { + + private final long accountId; + private final String accountDisplayName; + private final long groupId; + private final boolean active; + + private SubscriptionImpl(String encodedUuid, long accountId, String accountDisplayName, long groupId, String subscriptionName, boolean active) { + super(encodedUuid, subscriptionName); + this.accountId = accountId; + this.accountDisplayName = accountDisplayName; + this.groupId = groupId; + this.active = active; + } + + @Override + public long getAccountId() { + return accountId; + } + + @Override + public String getAccountName() { + return accountDisplayName; + } + + @Override + public long getGroupId() { + return groupId; + } + + @Override + public boolean isActive() { + return active; + } + + @Override + public String toString() { + return "SubscriptionImpl [accountId=" + accountId + ", accountDisplayName=" + accountDisplayName + ", groupId=" + groupId + ", active=" + isActive() + "]"; + } + + } +}
\ No newline at end of file |