From a135552778dff6290526b48a9fa6771a74fde672 Mon Sep 17 00:00:00 2001 From: donald.g.dunne Date: Thu, 22 Oct 2015 10:41:47 -0700 Subject: feature[ats_ATS184131]: Create Work Package Endpoint Change-Id: If13c20b86bbdbbfa728d9d714fa3b482cb279378 --- .../osee/ats/api/ev/AtsWorkPackageEndpointApi.java | 46 +++++++++ .../osee/ats/api/ev/JaxWorkPackageData.java | 42 ++++++++ .../client/integration/tests/AtsClientService.java | 34 ++++-- .../tests/ats/ev/AtsTest_EV_TestSuite.java | 7 +- .../ats/ev/AtsWorkPackageEndpointImplTest.java | 59 +++++++++++ .../META-INF/MANIFEST.MF | 7 +- .../ats/core/client/internal/AtsClientService.java | 5 +- .../core/client/workflow/WorkItemJsonReader.java | 61 +++++++++++ .../core/client/workflow/WorkItemsJsonReader.java | 71 +++++++++++++ .../osee/ats/rest/internal/AtsApplication.java | 4 +- .../workitem/AtsWorkPackageEndpointImpl.java | 114 +++++++++++++++++++++ .../rest/internal/workitem/WorkItemJsonWriter.java | 1 + .../internal/workitem/WorkItemsJsonWriter.java | 16 +-- .../eclipse/osee/framework/jdk/core/util/Lib.java | 18 ++++ 14 files changed, 453 insertions(+), 32 deletions(-) create mode 100644 plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/AtsWorkPackageEndpointApi.java create mode 100644 plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/JaxWorkPackageData.java create mode 100644 plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsWorkPackageEndpointImplTest.java create mode 100644 plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemJsonReader.java create mode 100644 plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemsJsonReader.java create mode 100644 plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/AtsWorkPackageEndpointImpl.java diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/AtsWorkPackageEndpointApi.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/AtsWorkPackageEndpointApi.java new file mode 100644 index 00000000000..df2a89ebd1f --- /dev/null +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/AtsWorkPackageEndpointApi.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2015 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.ats.api.ev; + +import java.util.Collection; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.eclipse.osee.ats.api.IAtsWorkItem; + +/** + * @author Donald D. Dunne + */ +@Path("workpackage") +public interface AtsWorkPackageEndpointApi { + + @GET + @Path("{workPackageId}/workitem") + @Produces({MediaType.APPLICATION_JSON}) + public Collection getWorkItems(@PathParam("workPackageId") long workPackageId); + + @PUT + @Path("{workPackageId}") + @Consumes({MediaType.APPLICATION_JSON}) + public abstract Response setWorkPackage(@PathParam("workPackageId") long workPackageId, JaxWorkPackageData workPackageData); + + @DELETE + @Path("{workPackageId}/workitem") + @Consumes({MediaType.APPLICATION_JSON}) + Response deleteWorkPackageItems(@PathParam("workPackageId") long workPackageId, JaxWorkPackageData workPackageData); + +} diff --git a/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/JaxWorkPackageData.java b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/JaxWorkPackageData.java new file mode 100644 index 00000000000..a6171e15b40 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.api/src/org/eclipse/osee/ats/api/ev/JaxWorkPackageData.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2015 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.ats.api.ev; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Donald G. Dunne + */ +public class JaxWorkPackageData { + String asUserId; + List workItemUuids = new ArrayList<>(); + + public JaxWorkPackageData() { + } + + public List getWorkItemUuids() { + return workItemUuids; + } + + public void setWorkItemUuids(List workItemUuids) { + this.workItemUuids = workItemUuids; + } + + public String getAsUserId() { + return asUserId; + } + + public void setAsUserId(String asUserId) { + this.asUserId = asUserId; + } + +} diff --git a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/AtsClientService.java b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/AtsClientService.java index f638128eddb..4ab8e0f7821 100644 --- a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/AtsClientService.java +++ b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/AtsClientService.java @@ -13,6 +13,7 @@ package org.eclipse.osee.ats.client.integration.tests; import org.eclipse.osee.ats.api.agile.AgileEndpointApi; import org.eclipse.osee.ats.api.config.AtsConfigEndpointApi; import org.eclipse.osee.ats.api.country.CountryEndpointApi; +import org.eclipse.osee.ats.api.ev.AtsWorkPackageEndpointApi; import org.eclipse.osee.ats.api.insertion.InsertionActivityEndpointApi; import org.eclipse.osee.ats.api.insertion.InsertionEndpointApi; import org.eclipse.osee.ats.api.notify.AtsNotifyEndpointApi; @@ -20,6 +21,8 @@ import org.eclipse.osee.ats.api.program.ProgramEndpointApi; import org.eclipse.osee.ats.api.task.AtsTaskEndpointApi; import org.eclipse.osee.ats.api.workflow.AtsRuleEndpointApi; import org.eclipse.osee.ats.core.client.IAtsClient; +import org.eclipse.osee.ats.core.client.workflow.WorkItemJsonReader; +import org.eclipse.osee.ats.core.client.workflow.WorkItemsJsonReader; import org.eclipse.osee.framework.core.client.OseeClientProperties; import org.eclipse.osee.jaxrs.client.JaxRsClient; import org.eclipse.osee.jaxrs.client.JaxRsWebTarget; @@ -42,6 +45,7 @@ public class AtsClientService { private static AtsRuleEndpointApi ruleEp; private static AtsNotifyEndpointApi notifyEp; private static AtsConfigEndpointApi configEp; + private static AtsWorkPackageEndpointApi workPackageEp; public void setAtsClient(IAtsClient atsClient) { AtsClientService.atsClient = atsClient; @@ -51,19 +55,20 @@ public class AtsClientService { return atsClient; } - private static JaxRsWebTarget getTarget() { + private static JaxRsWebTarget getAtsTarget() { if (target == null) { String appServer = OseeClientProperties.getOseeApplicationServer(); String atsUri = String.format("%s/ats", appServer); JaxRsClient jaxRsClient = JaxRsClient.newBuilder().createThreadSafeProxyClients(true).build(); - target = jaxRsClient.target(atsUri); + target = jaxRsClient.target(atsUri).register(WorkItemJsonReader.class); + target = target.register(WorkItemsJsonReader.class); } return target; } public static AgileEndpointApi getAgile() { if (agile == null) { - agile = getTarget().newProxy(AgileEndpointApi.class); + agile = getAtsTarget().newProxy(AgileEndpointApi.class); } return agile; } @@ -80,58 +85,65 @@ public class AtsClientService { public static CountryEndpointApi getCountryEp() { if (countryEp == null) { - countryEp = getTarget().newProxy(CountryEndpointApi.class); + countryEp = getAtsTarget().newProxy(CountryEndpointApi.class); } return countryEp; } public static ProgramEndpointApi getProgramEp() { if (programEp == null) { - programEp = getTarget().newProxy(ProgramEndpointApi.class); + programEp = getAtsTarget().newProxy(ProgramEndpointApi.class); } return programEp; } public static InsertionEndpointApi getInsertionEp() { if (insertionEp == null) { - insertionEp = getTarget().newProxy(InsertionEndpointApi.class); + insertionEp = getAtsTarget().newProxy(InsertionEndpointApi.class); } return insertionEp; } public static InsertionActivityEndpointApi getInsertionActivityEp() { if (insertionActivityEp == null) { - insertionActivityEp = getTarget().newProxy(InsertionActivityEndpointApi.class); + insertionActivityEp = getAtsTarget().newProxy(InsertionActivityEndpointApi.class); } return insertionActivityEp; } public static AtsTaskEndpointApi getTaskEp() { if (taskEp == null) { - taskEp = getTarget().newProxy(AtsTaskEndpointApi.class); + taskEp = getAtsTarget().newProxy(AtsTaskEndpointApi.class); } return taskEp; } public static AtsRuleEndpointApi getRuleEp() { if (ruleEp == null) { - ruleEp = getTarget().newProxy(AtsRuleEndpointApi.class); + ruleEp = getAtsTarget().newProxy(AtsRuleEndpointApi.class); } return ruleEp; } public static AtsNotifyEndpointApi getNotifyEndpoint() { if (notifyEp == null) { - notifyEp = getTarget().newProxy(AtsNotifyEndpointApi.class); + notifyEp = getAtsTarget().newProxy(AtsNotifyEndpointApi.class); } return notifyEp; } public static AtsConfigEndpointApi getConfigEndpoint() { if (configEp == null) { - configEp = getTarget().newProxy(AtsConfigEndpointApi.class); + configEp = getAtsTarget().newProxy(AtsConfigEndpointApi.class); } return configEp; } + public static AtsWorkPackageEndpointApi getWorkPackageEndpoint() { + if (workPackageEp == null) { + workPackageEp = getAtsTarget().newProxy(AtsWorkPackageEndpointApi.class); + } + return workPackageEp; + } + } diff --git a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsTest_EV_TestSuite.java b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsTest_EV_TestSuite.java index b357e14785c..0213d85f79b 100644 --- a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsTest_EV_TestSuite.java +++ b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsTest_EV_TestSuite.java @@ -14,9 +14,12 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) -@Suite.SuiteClasses({SearchWorkPackageOperationTest.class, EarnedValueReportOperationTest.class}) +@Suite.SuiteClasses({ + EarnedValueReportOperationTest.class, + AtsWorkPackageEndpointImplTest.class, + SearchWorkPackageOperationTest.class}) + /** - * * @author Donald G. Dunne */ public class AtsTest_EV_TestSuite { diff --git a/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsWorkPackageEndpointImplTest.java b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsWorkPackageEndpointImplTest.java new file mode 100644 index 00000000000..204a6ee6cf6 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.client.integration.tests/src/org/eclipse/osee/ats/client/integration/tests/ats/ev/AtsWorkPackageEndpointImplTest.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2015 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.ats.client.integration.tests.ats.ev; + +import static org.junit.Assert.assertEquals; +import java.util.Collection; +import org.eclipse.osee.ats.api.IAtsWorkItem; +import org.eclipse.osee.ats.api.ev.AtsWorkPackageEndpointApi; +import org.eclipse.osee.ats.api.ev.JaxWorkPackageData; +import org.eclipse.osee.ats.client.integration.tests.AtsClientService; +import org.junit.Before; +import org.junit.Test; + +/** + * Test Unit for {@link AtsWorkPackageEndpointImpl} + * + * @author Donald G. Dunne + */ +public class AtsWorkPackageEndpointImplTest { + + public static Long SAW_Code_Team_WorkPackage_01 = 38512616L; + private AtsWorkPackageEndpointApi workPackageEp; + + @Before + public void setup() { + workPackageEp = AtsClientService.getWorkPackageEndpoint(); + } + + @Test + public void testGetWorkItems() { + Collection workItems = workPackageEp.getWorkItems(SAW_Code_Team_WorkPackage_01); + assertEquals(2, workItems.size()); + } + + @Test + public void testSetRemoveWorkPackageItems() { + Collection workItems = workPackageEp.getWorkItems(SAW_Code_Team_WorkPackage_01); + assertEquals(2, workItems.size()); + IAtsWorkItem workItem = workItems.iterator().next(); + JaxWorkPackageData data = new JaxWorkPackageData(); + data.setAsUserId(AtsClientService.get().getUserService().getCurrentUserId()); + data.getWorkItemUuids().add(workItem.getUuid()); + + workPackageEp.deleteWorkPackageItems(SAW_Code_Team_WorkPackage_01, data); + assertEquals(1, workPackageEp.getWorkItems(SAW_Code_Team_WorkPackage_01).size()); + + workPackageEp.setWorkPackage(SAW_Code_Team_WorkPackage_01, data); + assertEquals(2, workPackageEp.getWorkItems(SAW_Code_Team_WorkPackage_01).size()); + } + +} diff --git a/plugins/org.eclipse.osee.ats.core.client/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.ats.core.client/META-INF/MANIFEST.MF index 3a26178f2eb..787721905dc 100644 --- a/plugins/org.eclipse.osee.ats.core.client/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.ats.core.client/META-INF/MANIFEST.MF @@ -9,8 +9,11 @@ Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.google.common.cache, com.google.inject, - javax.ws.rs.client;version="2.0.0", - javax.ws.rs.core;version="2.0.0", + javax.ws.rs, + javax.ws.rs.client, + javax.ws.rs.core, + javax.ws.rs.ext, + org.codehaus.jackson, org.eclipse.core.runtime, org.eclipse.core.runtime.jobs, org.eclipse.osee.ats.core.ai, diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientService.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientService.java index 4c0fb9fcbce..c2002bd386b 100644 --- a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientService.java +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/internal/AtsClientService.java @@ -14,6 +14,7 @@ import org.eclipse.osee.ats.api.notify.AtsNotifyEndpointApi; import org.eclipse.osee.ats.api.task.AtsTaskEndpointApi; import org.eclipse.osee.ats.api.workflow.AtsRuleEndpointApi; import org.eclipse.osee.ats.core.client.IAtsClient; +import org.eclipse.osee.ats.core.client.workflow.WorkItemJsonReader; import org.eclipse.osee.framework.core.client.OseeClientProperties; import org.eclipse.osee.jaxrs.client.JaxRsClient; import org.eclipse.osee.jaxrs.client.JaxRsWebTarget; @@ -42,7 +43,7 @@ public class AtsClientService { String appServer = OseeClientProperties.getOseeApplicationServer(); String atsUri = String.format("%s/ats", appServer); JaxRsClient jaxRsClient = JaxRsClient.newBuilder().createThreadSafeProxyClients(true).build(); - target = jaxRsClient.target(atsUri); + target = jaxRsClient.target(atsUri).register(WorkItemJsonReader.class); } return target; } @@ -60,7 +61,7 @@ public class AtsClientService { } return notifyEp; } - + public static AtsRuleEndpointApi getRuleEp() { if (ruleEp == null) { ruleEp = getTarget().newProxy(AtsRuleEndpointApi.class); diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemJsonReader.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemJsonReader.java new file mode 100644 index 00000000000..18b02cbeb88 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemJsonReader.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * 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.ats.core.client.workflow; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.Provider; +import org.codehaus.jackson.JsonFactory; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonToken; +import org.eclipse.osee.ats.api.IAtsWorkItem; +import org.eclipse.osee.ats.core.client.internal.AtsClientService; +import org.eclipse.osee.framework.jdk.core.type.VariantData; + +/** + * @author Donald G. Dunne + */ +@Provider +public class WorkItemJsonReader implements MessageBodyReader { + + @Override + public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + return type == IAtsWorkItem.class; + } + + @Override + public IAtsWorkItem readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { + try { + JsonFactory jfactory = new JsonFactory(); + JsonParser jParser = jfactory.createJsonParser(entityStream); + + VariantData varData = new VariantData(); + while (jParser.nextToken() != JsonToken.END_OBJECT) { + String key = jParser.getCurrentName(); + if (key != null) { + jParser.nextToken(); + String value = jParser.getText(); + varData.put(key, value); + } + } + long uuid = Long.valueOf(varData.get("uuid")); + return AtsClientService.get().getQueryService().createQuery().andUuids(uuid).getResults().getAtMostOneOrNull(); + } catch (Exception ex) { + throw new IOException("Error deserializing a TraxRpcr Item.", ex); + } + } +} diff --git a/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemsJsonReader.java b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemsJsonReader.java new file mode 100644 index 00000000000..e6726460e43 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.core.client/src/org/eclipse/osee/ats/core/client/workflow/WorkItemsJsonReader.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright (c) 2015 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.ats.core.client.workflow; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.Provider; +import org.codehaus.jackson.JsonFactory; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonToken; +import org.eclipse.osee.ats.api.IAtsWorkItem; +import org.eclipse.osee.ats.core.client.internal.AtsClientService; +import org.eclipse.osee.framework.jdk.core.util.Lib; +import org.eclipse.osee.framework.jdk.core.util.Strings; + +/** + * @author Donald G. Dunne + */ +@Provider +public class WorkItemsJsonReader implements MessageBodyReader> { + + @Override + public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + return Lib.isCollectionOfType(type, genericType, IAtsWorkItem.class); + } + + @Override + public Collection readFrom(Class> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { + try { + JsonFactory jfactory = new JsonFactory(); + JsonParser jParser = jfactory.createJsonParser(entityStream); + + List uuids = new ArrayList<>(); + while (jParser.nextToken() != JsonToken.END_ARRAY) { + while (jParser.nextToken() != JsonToken.END_OBJECT) { + String key = jParser.getCurrentName(); + if ("uuid".equals(key)) { + jParser.nextToken(); + String value = jParser.getText(); + if (Strings.isNumeric(value)) { + long uuid = Long.valueOf(value); + uuids.add(uuid); + } + } + } + } + Collection items = AtsClientService.get().getQueryService().createQuery().andUuids( + uuids.toArray(new Long[uuids.size()])).getItems(); + return items; + } catch (Exception ex) { + throw new IOException("Error deserializing a IAtsWorkItem.", ex); + } + } +} diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsApplication.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsApplication.java index 0ffda6c9b94..f0da4050b36 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsApplication.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/AtsApplication.java @@ -36,9 +36,10 @@ import org.eclipse.osee.ats.rest.internal.cpa.CpaResource; import org.eclipse.osee.ats.rest.internal.cpa.CpaServiceRegistry; import org.eclipse.osee.ats.rest.internal.notify.AtsNotifyEndpointImpl; import org.eclipse.osee.ats.rest.internal.workitem.ActionUiResource; -import org.eclipse.osee.ats.rest.internal.workitem.AtsTaskEndpointImpl; import org.eclipse.osee.ats.rest.internal.workitem.AtsActionEndpointImpl; import org.eclipse.osee.ats.rest.internal.workitem.AtsRuleEndpointImpl; +import org.eclipse.osee.ats.rest.internal.workitem.AtsTaskEndpointImpl; +import org.eclipse.osee.ats.rest.internal.workitem.AtsWorkPackageEndpointImpl; import org.eclipse.osee.ats.rest.internal.workitem.StateResource; import org.eclipse.osee.framework.jdk.core.type.IResourceRegistry; import org.eclipse.osee.framework.jdk.core.type.ResourceRegistry; @@ -109,6 +110,7 @@ public class AtsApplication extends Application { singletons.add(new AtsConfigEndpointImpl(atsServer, orcsApi, logger)); singletons.add(new AtsTaskEndpointImpl(atsServer)); singletons.add(new AtsNotifyEndpointImpl(atsServer)); + singletons.add(new AtsWorkPackageEndpointImpl(atsServer)); // UIs singletons.add(new ActionUiResource(atsServer, logger)); diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/AtsWorkPackageEndpointImpl.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/AtsWorkPackageEndpointImpl.java new file mode 100644 index 00000000000..41bcec6e183 --- /dev/null +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/AtsWorkPackageEndpointImpl.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2015 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.ats.rest.internal.workitem; + +import java.util.Collection; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.eclipse.osee.ats.api.IAtsWorkItem; +import org.eclipse.osee.ats.api.data.AtsAttributeTypes; +import org.eclipse.osee.ats.api.ev.AtsWorkPackageEndpointApi; +import org.eclipse.osee.ats.api.ev.JaxWorkPackageData; +import org.eclipse.osee.ats.api.user.IAtsUser; +import org.eclipse.osee.ats.api.util.IAtsChangeSet; +import org.eclipse.osee.ats.impl.IAtsServer; +import org.eclipse.osee.framework.jdk.core.type.OseeArgumentException; +import org.eclipse.osee.orcs.data.ArtifactReadable; + +/** + * @author Donald G. Dunne + */ +public class AtsWorkPackageEndpointImpl implements AtsWorkPackageEndpointApi { + + private final IAtsServer atsServer; + + public AtsWorkPackageEndpointImpl(IAtsServer atsServer) { + this.atsServer = atsServer; + } + + @GET + @Path("{workPackageId}/workitem") + @Produces({MediaType.APPLICATION_JSON}) + @Override + public Collection getWorkItems(@PathParam("workPackageId") long workPackageId) { + ArtifactReadable workPackageArt = atsServer.getArtifactByUuid(workPackageId); + if (workPackageArt == null) { + throw new OseeArgumentException("Work Package with id [%s] Not Found", workPackageId); + } + return atsServer.getQueryService().createQuery().andAttr(AtsAttributeTypes.WorkPackageGuid, + workPackageArt.getGuid()).getResults().getList(); + } + + @PUT + @Path("{workPackageId}") + @Consumes({MediaType.APPLICATION_JSON}) + @Override + public Response setWorkPackage(@PathParam("workPackageId") long workPackageId, JaxWorkPackageData workPackageData) { + ArtifactReadable workPackageArt = atsServer.getArtifactByUuid(workPackageId); + if (workPackageArt == null) { + throw new OseeArgumentException("Work Package with id [%s] Not Found", workPackageId); + } + IAtsUser asUser = atsServer.getUserService().getUserById(workPackageData.getAsUserId()); + if (asUser == null) { + throw new OseeArgumentException("Author with id [%s] Not Found", workPackageData.getAsUserId()); + } + IAtsChangeSet changes = atsServer.getStoreService().createAtsChangeSet("Set Work Package", asUser); + for (Long workItemUuid : workPackageData.getWorkItemUuids()) { + IAtsWorkItem workItem = + atsServer.getQueryService().createQuery().andUuids(workItemUuid).getResults().getAtMostOneOrNull(); + if (workItem == null) { + throw new OseeArgumentException("Work Item with id [%s] Not Found", workItemUuid); + } + if (!workItem.isTask() && !workItem.isTeamWorkflow()) { + throw new OseeArgumentException("Work Packages can only be set on Team Workflow or Task, not [%s]", + workItem.getArtifactTypeName()); + } + changes.setSoleAttributeValue(workItem, AtsAttributeTypes.WorkPackageGuid, workPackageArt.getGuid()); + } + changes.execute(); + return Response.ok().build(); + } + + @DELETE + @Path("{workPackageId}/workitem") + @Consumes({MediaType.APPLICATION_JSON}) + @Override + public Response deleteWorkPackageItems(@PathParam("workPackageId") long workPackageId, JaxWorkPackageData workPackageData) { + ArtifactReadable workPackageArt = atsServer.getArtifactByUuid(workPackageId); + if (workPackageArt == null) { + throw new OseeArgumentException("Work Package with id [%s] Not Found", workPackageId); + } + IAtsUser asUser = atsServer.getUserService().getUserById(workPackageData.getAsUserId()); + if (asUser == null) { + throw new OseeArgumentException("Author with id [%s] Not Found", workPackageData.getAsUserId()); + } + IAtsChangeSet changes = atsServer.getStoreService().createAtsChangeSet("Remove Work Package", asUser); + for (Long workItemUuid : workPackageData.getWorkItemUuids()) { + IAtsWorkItem workItem = + atsServer.getQueryService().createQuery().andUuids(workItemUuid).getResults().getAtMostOneOrNull(); + if (workItem == null) { + throw new OseeArgumentException("Work Item with id [%s] Not Found", workItemUuid); + } + changes.deleteAttributes(workItem, AtsAttributeTypes.WorkPackageGuid); + } + if (!changes.isEmpty()) { + changes.execute(); + } + return Response.ok().build(); + } +} diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemJsonWriter.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemJsonWriter.java index f6205810d14..1c222e88d20 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemJsonWriter.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemJsonWriter.java @@ -104,6 +104,7 @@ public class WorkItemJsonWriter implements MessageBodyWriter { writer.writeStringField("Name", config.getName()); String atsId = action.getSoleAttributeValue(AtsAttributeTypes.AtsId, ""); writer.writeStringField("AtsId", atsId); + writer.writeStringField("ArtifactType", action.getArtifactType().getName()); String actionUrl = RestUtil.getActionUrl(atsId, ATS_UI_ACTION_PREFIX, atsServer); writer.writeStringField("actionLocation", actionUrl); if (!identityView) { diff --git a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemsJsonWriter.java b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemsJsonWriter.java index f678f391ab6..caea2438b05 100644 --- a/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemsJsonWriter.java +++ b/plugins/org.eclipse.osee.ats.rest/src/org/eclipse/osee/ats/rest/internal/workitem/WorkItemsJsonWriter.java @@ -13,7 +13,6 @@ package org.eclipse.osee.ats.rest.internal.workitem; import java.io.IOException; import java.io.OutputStream; import java.lang.annotation.Annotation; -import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; import javax.ws.rs.WebApplicationException; @@ -25,6 +24,7 @@ import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import org.eclipse.osee.ats.api.IAtsWorkItem; import org.eclipse.osee.ats.impl.IAtsServer; +import org.eclipse.osee.framework.jdk.core.util.Lib; import org.eclipse.osee.jaxrs.mvc.IdentityView; import org.eclipse.osee.orcs.data.AttributeTypes; @@ -57,19 +57,7 @@ public class WorkItemsJsonWriter implements MessageBodyWriter type, Type genericType, Annotation[] annotations, MediaType mediaType) { - boolean isWriteable = false; - if (Collection.class.isAssignableFrom(type) && genericType instanceof ParameterizedType) { - ParameterizedType parameterizedType = (ParameterizedType) genericType; - Type[] actualTypeArgs = parameterizedType.getActualTypeArguments(); - if (actualTypeArgs.length == 1) { - Type t = actualTypeArgs[0]; - if (t instanceof Class) { - Class clazz = (Class) t; - isWriteable = IAtsWorkItem.class.isAssignableFrom(clazz); - } - } - } - return isWriteable; + return Lib.isCollectionOfType(type, genericType, IAtsWorkItem.class); } private boolean matches(Class toMatch, Annotation[] annotations) { diff --git a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java index e60478ba303..ce281d881bb 100644 --- a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java +++ b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Lib.java @@ -35,6 +35,8 @@ import java.io.UnsupportedEncodingException; import java.io.Writer; import java.lang.management.ManagementFactory; import java.lang.management.MemoryUsage; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; @@ -1745,4 +1747,20 @@ public final class Lib { return result; } + public static boolean isCollectionOfType(Class type, Type genericType, Class ofType) { + boolean isWriteable = false; + if (Collection.class.isAssignableFrom(type) && genericType instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) genericType; + Type[] actualTypeArgs = parameterizedType.getActualTypeArguments(); + if (actualTypeArgs.length == 1) { + Type t = actualTypeArgs[0]; + if (t instanceof Class) { + Class clazz = (Class) t; + isWriteable = ofType.isAssignableFrom(clazz); + } + } + } + return isWriteable; + } + } -- cgit v1.2.3