diff options
author | Angel Avila | 2015-03-19 21:35:45 +0000 |
---|---|---|
committer | Angel Avila | 2015-03-19 21:35:45 +0000 |
commit | 31e9dfa097245373b0d094666c99eeb3e2f2a1e5 (patch) | |
tree | 997ec938fb350c2eefd1424b4476eeaf703f2201 /plugins | |
parent | 16d6f7ef8479b053a3df4b0f66411306e86d5f7e (diff) | |
download | org.eclipse.osee-31e9dfa097245373b0d094666c99eeb3e2f2a1e5.tar.gz org.eclipse.osee-31e9dfa097245373b0d094666c99eeb3e2f2a1e5.tar.xz org.eclipse.osee-31e9dfa097245373b0d094666c99eeb3e2f2a1e5.zip |
feature[ats_4LWQB]: Implement ORCS Branch JAX-RS API
Change-Id: Ibf2953218199d48bd5dd31931af73eaad221eee0
Signed-off-by: Angel Avila <angel.avila2@boeing.com>
Diffstat (limited to 'plugins')
13 files changed, 948 insertions, 32 deletions
diff --git a/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/OseeClient.java b/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/OseeClient.java index c3c824bffc2..4b66ed5abea 100644 --- a/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/OseeClient.java +++ b/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/OseeClient.java @@ -14,6 +14,7 @@ import java.io.Writer; import java.util.Collection; import java.util.Properties; import org.eclipse.osee.framework.core.data.IOseeBranch; +import org.eclipse.osee.orcs.rest.model.BranchEndpoint; /** * @author John Misinco @@ -30,4 +31,6 @@ public interface OseeClient { Collection<String> getIdeClientSupportedVersions(); + BranchEndpoint getBranchEndpoint(); + } diff --git a/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/internal/OseeClientImpl.java b/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/internal/OseeClientImpl.java index 08261e8287c..cb164cecdda 100644 --- a/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/internal/OseeClientImpl.java +++ b/plugins/org.eclipse.osee.orcs.rest.client/src/org/eclipse/osee/orcs/rest/client/internal/OseeClientImpl.java @@ -37,6 +37,7 @@ import org.eclipse.osee.orcs.rest.client.internal.search.PredicateFactoryImpl; import org.eclipse.osee.orcs.rest.client.internal.search.QueryBuilderImpl; import org.eclipse.osee.orcs.rest.client.internal.search.QueryExecutor; import org.eclipse.osee.orcs.rest.client.internal.search.QueryOptions; +import org.eclipse.osee.orcs.rest.model.BranchEndpoint; import org.eclipse.osee.orcs.rest.model.IdeVersion; import org.eclipse.osee.orcs.rest.model.search.artifact.Predicate; import org.eclipse.osee.orcs.rest.model.search.artifact.RequestType; @@ -176,4 +177,9 @@ public class OseeClientImpl implements OseeClient, QueryExecutor { } } + @Override + public BranchEndpoint getBranchEndpoint() { + return client.targetProxy(baseUri, BranchEndpoint.class); + } + } diff --git a/plugins/org.eclipse.osee.orcs.rest.model/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.orcs.rest.model/META-INF/MANIFEST.MF index a4c7e6d6184..bb1613a7fec 100644 --- a/plugins/org.eclipse.osee.orcs.rest.model/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.orcs.rest.model/META-INF/MANIFEST.MF @@ -8,9 +8,14 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: org.eclipse.osee.orcs.rest.model, org.eclipse.osee.orcs.rest.model.search.artifact, org.eclipse.osee.orcs.rest.model.search.branch -Import-Package: javax.xml.bind.annotation, +Import-Package: javax.annotation.security;version="1.2.0", + javax.ws.rs;version="2.0.0", + javax.ws.rs.core;version="2.0.0", + javax.xml.bind.annotation, + org.eclipse.osee.framework.core.data, org.eclipse.osee.framework.core.enums, org.eclipse.osee.framework.core.exception, + org.eclipse.osee.framework.core.model.change, org.eclipse.osee.framework.core.util, org.eclipse.osee.framework.jdk.core.type, org.eclipse.osee.framework.jdk.core.util diff --git a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Branch.java b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Branch.java index 92ab72b0861..a1fe15534a6 100644 --- a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Branch.java +++ b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Branch.java @@ -21,40 +21,138 @@ import org.eclipse.osee.framework.core.enums.BranchType; @XmlRootElement public class Branch { - private String uuid; + private static final int DEFAULT_INT = -1; + + private long branchUuid; private String name; - private BranchType branchType; - private BranchState branchState; - private BranchArchivedState branchArchivedState; - private Transaction baseTransaction; - private Transaction sourceTransaction; + private long parentBranchUuid; + + private int associatedArtifactId = DEFAULT_INT; + private int baseTransaction = DEFAULT_INT; + private int sourceTransaction = DEFAULT_INT; + + private BranchArchivedState archiveState = BranchArchivedState.UNARCHIVED; + private BranchState branchState = BranchState.CREATED; + private BranchType branchType = BranchType.WORKING; + private boolean inheritAccessControl = false; + + public Branch() { + super(); + } + + public long getBranchUuid() { + return branchUuid; + } - public String getId() { - return uuid; + public void setBranchUuid(long branchUuid) { + this.branchUuid = branchUuid; } public String getName() { return name; } - public BranchType getBranchType() { - return branchType; + public void setName(String name) { + this.name = name; } - public BranchState getBranchState() { - return branchState; + public int getAssociatedArtifactId() { + return associatedArtifactId; } - public BranchArchivedState getArchiveState() { - return branchArchivedState; + public void setAssociatedArtifactId(int artId) { + associatedArtifactId = artId; } - public Transaction getBaseTransaction() { + public int getBaseTransactionId() { return baseTransaction; } - public Transaction getSourceTransaction() { + public void setBaseTransactionId(int baseTx) { + baseTransaction = baseTx; + } + + public int getSourceTransactionId() { return sourceTransaction; } + public void setSourceTransactionId(int sourceTx) { + sourceTransaction = sourceTx; + } + + public long getParentBranchUuid() { + return parentBranchUuid; + } + + public void setParentBranchUuid(long parentBranchUuid) { + this.parentBranchUuid = parentBranchUuid; + } + + public boolean hasParentBranchUuid() { + return getParentBranchUuid() > 0; + } + + public BranchArchivedState getArchiveState() { + return archiveState; + } + + public void setArchiveState(BranchArchivedState state) { + this.archiveState = state; + } + + public BranchState getBranchState() { + return branchState; + } + + public void setBranchState(BranchState state) { + this.branchState = state; + } + + public BranchType getBranchType() { + return branchType; + } + + public void setBranchType(BranchType type) { + branchType = type; + } + + public boolean isInheritAccessControl() { + return inheritAccessControl; + } + + public void setInheritAccessControl(boolean inheritAccessControl) { + this.inheritAccessControl = inheritAccessControl; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (branchUuid ^ (branchUuid >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Branch other = (Branch) obj; + if (branchUuid != other.branchUuid) { + return false; + } + return true; + } + + @Override + public String toString() { + return "Branch [branchUuid=" + getBranchUuid() + ", name=" + name + ", parentBranchUuid=" + getParentBranchUuid() + ", associatedArtifactId=" + associatedArtifactId + ", baseTransaction=" + baseTransaction + ", sourceTransaction=" + sourceTransaction + ", archiveState=" + archiveState + ", branchState=" + branchState + ", branchType=" + branchType + ", inheritAccessControl=" + inheritAccessControl + "]"; + } + } diff --git a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/BranchCommitOptions.java b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/BranchCommitOptions.java new file mode 100644 index 00000000000..e52653ec648 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/BranchCommitOptions.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.orcs.rest.model; + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * @author Roberto E. Escobar + */ +@XmlRootElement +public class BranchCommitOptions { + + private static final int DEFAULT_COMMITTER_ID = -1; + + private int committerId = DEFAULT_COMMITTER_ID; + private boolean archive; + + public int getCommitterId() { + return committerId; + } + + public void setCommitterId(int committerId) { + this.committerId = committerId; + } + + public boolean isArchive() { + return archive; + } + + public void setArchive(boolean archive) { + this.archive = archive; + } + +} diff --git a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/BranchEndpoint.java b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/BranchEndpoint.java new file mode 100644 index 00000000000..a48e3a4fbb0 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/BranchEndpoint.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * 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.orcs.rest.model; + +import java.util.List; +import javax.annotation.security.RolesAllowed; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.eclipse.osee.framework.core.enums.BranchState; +import org.eclipse.osee.framework.core.enums.BranchType; +import org.eclipse.osee.framework.jdk.core.type.SystemRoles; + +/** + * @author Roberto E. Escobar + */ +@Path("branches") +@RolesAllowed(SystemRoles.ROLES_AUTHENTICATED) +public interface BranchEndpoint { + + @GET + @Produces({MediaType.APPLICATION_JSON}) + List<Branch> getBranches(); + + @GET + @Path("baseline") + @Produces(MediaType.APPLICATION_JSON) + List<Branch> getBaselineBranches(); + + @GET + @Path("working") + @Produces(MediaType.APPLICATION_JSON) + List<Branch> getWorkingBranches(); + + @GET + @Path("{branch-uuid}") + @Produces({MediaType.APPLICATION_JSON}) + Branch getBranch(@PathParam("branch-uuid") long branchUuid); + + @GET + @Path("{branch-uuid}/diff/{branch-uuid2}") + @Produces({MediaType.APPLICATION_JSON}) + CompareResults compareBranches(@PathParam("branch-uuid") long branchUuid, @PathParam("branch-uuid2") long branchUuid2); + + @POST + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + Response createBranch(NewBranch data); + + @POST + @Path("{branch-uuid}") + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + Response createBranchWithId(@PathParam("branch-uuid") long branchUuid, NewBranch data); + + @POST + @Path("{branch-uuid}/commit/{destination-branch-uuid}") + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + Response commitBranch(@PathParam("branch-uuid") long branchUuid, @PathParam("destination-branch-uuid") long destinationBranchUuid, BranchCommitOptions options); + + @POST + @Path("{branch-uuid}/archive") + Response archiveBranch(@PathParam("branch-uuid") long branchUuid); + + @PUT + @Path("{branch-uuid}/name/{branch-name}") + Response setBranchName(@PathParam("branch-uuid") long branchUuid, @PathParam("branch-name") String newName); + + @PUT + @Path("{branch-uuid}/type/{branch-type}") + Response setBranchType(@PathParam("branch-uuid") long branchUuid, @PathParam("branch-type") BranchType newType); + + @PUT + @Path("{branch-uuid}/state/{branch-state}") + Response setBranchState(@PathParam("branch-uuid") long branchUuid, @PathParam("branch-state") BranchState newState); + + @PUT + @Path("{branch-uuid}/associated-artifact/{art-id}") + Response associateBranchToArtifact(@PathParam("branch-uuid") long branchUuid, @PathParam("art-id") int artifactId); + + @DELETE + @Path("{branch-uuid}") + Response purgeBranch(@PathParam("branch-uuid") long branchUuid, @DefaultValue("false") @QueryParam("recurse") boolean recurse); + + @DELETE + @Path("{branch-uuid}/associated-artifact") + Response unassociateBranch(@PathParam("branch-uuid") long branchUuid); + + @DELETE + @Path("{branch-uuid}/commit/{destination-branch-uuid}") + @Produces({MediaType.APPLICATION_JSON}) + Response unCommitBranch(@PathParam("branch-uuid") long branchUuid, @PathParam("destination-branch-uuid") long destinationBranchUuid); + + @DELETE + @Path("{branch-uuid}/archive") + @Produces({MediaType.APPLICATION_JSON}) + Response unarchiveBranch(@PathParam("branch-uuid") long branchUuid); + +}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/CompareResults.java b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/CompareResults.java new file mode 100644 index 00000000000..35cf58e6494 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/CompareResults.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * 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.orcs.rest.model; + +import java.util.Collections; +import java.util.List; +import javax.xml.bind.annotation.XmlRootElement; +import org.eclipse.osee.framework.core.model.change.ChangeItem; + +/** + * @author Roberto E. Escobar + */ +@XmlRootElement +public class CompareResults { + + private List<ChangeItem> changes; + + public List<ChangeItem> getChanges() { + return changes != null ? changes : Collections.<ChangeItem> emptyList(); + } + + public void setChanges(List<ChangeItem> changes) { + this.changes = changes; + } + + @Override + public String toString() { + return "CompareResults [changes=" + changes + "]"; + } + +} diff --git a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/NewBranch.java b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/NewBranch.java new file mode 100644 index 00000000000..321b4a9978d --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/NewBranch.java @@ -0,0 +1,123 @@ +/******************************************************************************* + * 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.orcs.rest.model; + +import javax.xml.bind.annotation.XmlRootElement; +import org.eclipse.osee.framework.core.enums.BranchType; + +/** + * @author Roberto E. Escobar + */ +@XmlRootElement +public class NewBranch { + + private String branchName; + private long parentBranchId; + private int associatedArtifactId; + private BranchType branchType; + + private int authorId; + private int sourceTransactionId; + private String creationComment; + private int mergeAddressingQueryId; + private long mergeDestinationBranchId; + private boolean txCopyBranchType; + + public NewBranch() { + super(); + } + + public String getBranchName() { + return branchName; + } + + public long getParentBranchId() { + return parentBranchId; + } + + public int getAssociatedArtifactId() { + return associatedArtifactId; + } + + public BranchType getBranchType() { + return branchType; + } + + public int getAuthorId() { + return authorId; + } + + public int getSourceTransactionId() { + return sourceTransactionId; + } + + public String getCreationComment() { + return creationComment; + } + + public int getMergeAddressingQueryId() { + return mergeAddressingQueryId; + } + + public long getMergeDestinationBranchId() { + return mergeDestinationBranchId; + } + + public boolean isTxCopyBranchType() { + return txCopyBranchType; + } + + public void setBranchName(String branchName) { + this.branchName = branchName; + } + + public void setParentBranchId(long parentBranchId) { + this.parentBranchId = parentBranchId; + } + + public void setAssociatedArtifactId(int associatedArtifactId) { + this.associatedArtifactId = associatedArtifactId; + } + + public void setBranchType(BranchType branchType) { + this.branchType = branchType; + } + + public void setAuthorId(int authorId) { + this.authorId = authorId; + } + + public void setSourceTransactionId(int sourceTransactionId) { + this.sourceTransactionId = sourceTransactionId; + } + + public void setCreationComment(String creationComment) { + this.creationComment = creationComment; + } + + public void setMergeAddressingQueryId(int mergeAddressingQueryId) { + this.mergeAddressingQueryId = mergeAddressingQueryId; + } + + public void setMergeDestinationBranchId(long mergeDestinationBranchId) { + this.mergeDestinationBranchId = mergeDestinationBranchId; + } + + public void setTxCopyBranchType(boolean txCopyBranchType) { + this.txCopyBranchType = txCopyBranchType; + } + + @Override + public String toString() { + return "NewBranch [branchName=" + branchName + ", parentBranchId=" + parentBranchId + ", associatedArtifactId=" + associatedArtifactId + ", branchType=" + branchType + ", authorId=" + authorId + ", sourceTransactionId=" + sourceTransactionId + ", creationComment=" + creationComment + ", mergeAddressingQueryId=" + mergeAddressingQueryId + ", mergeDestinationBranchId=" + mergeDestinationBranchId + ", txCopyBranchType=" + txCopyBranchType + "]"; + } + +} diff --git a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Transaction.java b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Transaction.java index 7ddae90abe6..2a26a9822cf 100644 --- a/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Transaction.java +++ b/plugins/org.eclipse.osee.orcs.rest.model/src/org/eclipse/osee/orcs/rest/model/Transaction.java @@ -20,13 +20,22 @@ import org.eclipse.osee.framework.core.enums.TransactionDetailsType; @XmlRootElement public class Transaction { - private String branchUuid; + private int txId = -1; + private long branchUuid; private TransactionDetailsType txType; private String comment; - private Date time; - private int authorArtId; + private Date timestamp; + private int authorId; private int commitArtId; + public int getTxId() { + return txId; + } + + public void setTxId(int txId) { + this.txId = txId; + } + public TransactionDetailsType getTxType() { return txType; } @@ -35,11 +44,11 @@ public class Transaction { this.txType = txType; } - public String getBranchId() { + public long getBranchUuid() { return branchUuid; } - public void setBranchId(String branchUuid) { + public void setBranchUuid(long branchUuid) { this.branchUuid = branchUuid; } @@ -52,27 +61,32 @@ public class Transaction { } public Date getTimeStamp() { - return time; + return timestamp; } - public void setTimeStamp(Date time) { - this.time = time; + public void setTimeStamp(Date timestamp) { + this.timestamp = timestamp; } - public int getAuthor() { - return authorArtId; + public int getAuthorId() { + return authorId; } - public void setAuthor(int authorArtId) { - this.authorArtId = authorArtId; + public void setAuthorId(int authorId) { + this.authorId = authorId; } - public int getCommit() { + public int getCommitArtId() { return commitArtId; } - public void setCommit(int commitArtId) { + public void setCommitArtId(int commitArtId) { this.commitArtId = commitArtId; } + @Override + public String toString() { + return "Transaction [txId=" + getTxId() + ", branchUuid=" + branchUuid + ", txType=" + txType + ", comment=" + comment + ", timestamp=" + timestamp + ", authorArtId=" + authorId + ", commitArtId=" + commitArtId + "]"; + } + } diff --git a/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF index 46f8aaecca0..2d7e7b8e991 100644 --- a/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF @@ -19,13 +19,16 @@ Import-Package: com.google.common.base;version="[11.0.0,15.0.0)", org.eclipse.osee.framework.core.enums, org.eclipse.osee.framework.core.model, org.eclipse.osee.framework.core.model.cache, + org.eclipse.osee.framework.core.model.change, org.eclipse.osee.framework.jdk.core.type, org.eclipse.osee.framework.jdk.core.util, + org.eclipse.osee.jaxrs, org.eclipse.osee.jaxrs.mvc, org.eclipse.osee.orcs, org.eclipse.osee.orcs.data, org.eclipse.osee.orcs.rest.model, org.eclipse.osee.orcs.rest.model.search.artifact, org.eclipse.osee.orcs.rest.model.search.branch, - org.eclipse.osee.orcs.search + org.eclipse.osee.orcs.search, + org.eclipse.osee.orcs.transaction Osee-JaxRs-Resource: OSEE-INF/web/*;path=/orcs/script/ui diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/BranchEndpointImpl.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/BranchEndpointImpl.java new file mode 100644 index 00000000000..f0a049c6288 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/BranchEndpointImpl.java @@ -0,0 +1,366 @@ +/******************************************************************************* + * 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.orcs.rest.internal; + +import static org.eclipse.osee.framework.jdk.core.util.Compare.isDifferent; +import static org.eclipse.osee.orcs.rest.internal.OrcsRestUtil.asBranch; +import static org.eclipse.osee.orcs.rest.internal.OrcsRestUtil.asBranches; +import static org.eclipse.osee.orcs.rest.internal.OrcsRestUtil.asResponse; +import static org.eclipse.osee.orcs.rest.internal.OrcsRestUtil.asTransaction; +import static org.eclipse.osee.orcs.rest.internal.OrcsRestUtil.executeCallable; +import java.net.URI; +import java.util.List; +import java.util.concurrent.Callable; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriBuilder; +import javax.ws.rs.core.UriInfo; +import org.eclipse.osee.framework.core.data.IOseeBranch; +import org.eclipse.osee.framework.core.data.TokenFactory; +import org.eclipse.osee.framework.core.enums.BranchArchivedState; +import org.eclipse.osee.framework.core.enums.BranchState; +import org.eclipse.osee.framework.core.enums.BranchType; +import org.eclipse.osee.framework.core.enums.CoreBranches; +import org.eclipse.osee.framework.core.model.change.ChangeItem; +import org.eclipse.osee.framework.jdk.core.type.ResultSet; +import org.eclipse.osee.framework.jdk.core.util.Lib; +import org.eclipse.osee.framework.jdk.core.util.Strings; +import org.eclipse.osee.jaxrs.OseeWebApplicationException; +import org.eclipse.osee.orcs.ApplicationContext; +import org.eclipse.osee.orcs.OrcsApi; +import org.eclipse.osee.orcs.OrcsBranch; +import org.eclipse.osee.orcs.data.ArchiveOperation; +import org.eclipse.osee.orcs.data.ArtifactReadable; +import org.eclipse.osee.orcs.data.BranchReadable; +import org.eclipse.osee.orcs.data.CreateBranchData; +import org.eclipse.osee.orcs.data.TransactionReadable; +import org.eclipse.osee.orcs.rest.model.Branch; +import org.eclipse.osee.orcs.rest.model.BranchCommitOptions; +import org.eclipse.osee.orcs.rest.model.BranchEndpoint; +import org.eclipse.osee.orcs.rest.model.CompareResults; +import org.eclipse.osee.orcs.rest.model.NewBranch; +import org.eclipse.osee.orcs.search.BranchQuery; +import org.eclipse.osee.orcs.search.QueryFactory; +import org.eclipse.osee.orcs.search.TransactionQuery; + +/** + * @author Roberto E. Escobar + */ +public class BranchEndpointImpl implements BranchEndpoint { + + private final OrcsApi orcsApi; + + @Context + private UriInfo uriInfo; + + public BranchEndpointImpl(OrcsApi orcsApi) { + this.orcsApi = orcsApi; + } + + public void setUriInfo(UriInfo uriInfo) { + this.uriInfo = uriInfo; + } + + public UriInfo getUriInfo() { + return uriInfo; + } + + private ApplicationContext newContext() { + return new ApplicationContext() { + + @Override + public String getSessionId() { + return null; + } + }; + } + + private QueryFactory newQuery() { + return orcsApi.getQueryFactory(newContext()); + } + + private BranchQuery newBranchQuery() { + return newQuery().branchQuery(); + } + + private TransactionQuery newTxQuery() { + return newQuery().transactionQuery(); + } + + private OrcsBranch getBranchOps() { + return orcsApi.getBranchOps(newContext()); + } + + private ArtifactReadable getArtifactById(IOseeBranch branch, int id) { + ArtifactReadable artifact = null; + if (id > 0) { + artifact = newQuery().fromBranch(branch).andLocalId(id).getResults().getExactlyOne(); + } + return artifact; + } + + private Long getBranchUuidFromTxId(int tx) { + TransactionQuery txQuery = newQuery().transactionQuery(); + Long branchId = txQuery.andTxId(tx).getResults().getExactlyOne().getBranchId(); + return branchId; + } + + private BranchReadable getBranchById(long branchUuid) { + ResultSet<BranchReadable> results = newBranchQuery().andUuids(branchUuid)// + .includeArchived()// + .includeDeleted()// + .getResults(); + return results.getExactlyOne(); + } + + @Override + public List<Branch> getBranches() { + ResultSet<BranchReadable> results = newBranchQuery()// + .includeArchived()// + .includeDeleted()// + .getResults(); + return asBranches(results); + } + + @Override + public List<Branch> getBaselineBranches() { + ResultSet<BranchReadable> results = newBranchQuery()// + .includeArchived(false) // + .includeDeleted(false) // + .andIsOfType(BranchType.BASELINE)// + .getResults(); + return asBranches(results); + } + + @Override + public List<Branch> getWorkingBranches() { + ResultSet<BranchReadable> results = newBranchQuery()// + .includeArchived(false) // + .includeDeleted(false) // + .andIsOfType(BranchType.WORKING)// + .getResults(); + return asBranches(results); + } + + @Override + public Branch getBranch(long branchUuid) { + BranchReadable branch = getBranchById(branchUuid); + return asBranch(branch); + } + + @Override + public CompareResults compareBranches(long branchUuid, long branchUuid2) { + TransactionReadable sourceTx = newTxQuery().andIsHead(branchUuid).getResults().getExactlyOne(); + TransactionReadable destinationTx = newTxQuery().andIsHead(branchUuid2).getResults().getExactlyOne(); + + Callable<List<ChangeItem>> op = getBranchOps().compareBranch(sourceTx, destinationTx); + List<ChangeItem> changes = executeCallable(op); + + CompareResults data = new CompareResults(); + data.setChanges(changes); + return data; + } + + @Override + public Response createBranch(NewBranch data) { + long branchUuid = Lib.generateUuid(); + return createBranchWithId(branchUuid, data); + } + + @Override + public Response createBranchWithId(long branchUuid, NewBranch data) { + if (branchUuid <= 0) { + throw new OseeWebApplicationException(Status.BAD_REQUEST, "branchUuid [%d] uuid must be > 0", branchUuid); + } + + CreateBranchData createData = new CreateBranchData(); + createData.setUuid(branchUuid); + createData.setName(data.getBranchName()); + createData.setBranchType(data.getBranchType()); + createData.setCreationComment(data.getCreationComment()); + + createData.setUserArtifact(getArtifactById(CoreBranches.COMMON, data.getAuthorId())); + createData.setAssociatedArtifact(getArtifactById(CoreBranches.COMMON, data.getAssociatedArtifactId())); + + createData.setFromTransaction(TokenFactory.createTransaction(data.getSourceTransactionId())); + createData.setParentBranchUuid(getBranchUuidFromTxId(data.getSourceTransactionId())); + + createData.setMergeDestinationBranchId(data.getMergeDestinationBranchId()); + createData.setMergeAddressingQueryId(data.getMergeAddressingQueryId()); + + createData.setTxCopyBranchType(data.isTxCopyBranchType()); + + Callable<BranchReadable> op = getBranchOps().createBranch(createData); + BranchReadable result = executeCallable(op); + + UriInfo uriInfo = getUriInfo(); + URI uri = getBranchLocation(uriInfo, result); + return Response.created(uri).entity(asBranch(result)).build(); + } + + private URI getBranchLocation(UriInfo uriInfo, BranchReadable branch) { + URI location = null; + String path = uriInfo.getPath(); + if (Strings.isValid(path)) { + String value = path.replace("branches", ""); + value = value.replaceAll("/", ""); + if (Strings.isNumeric(value)) { + try { + Long id = Long.parseLong(value); + if (branch.getGuid().equals(id)) { + location = uriInfo.getRequestUri(); + } + } catch (Exception ex) { + // do nothing + } + } + } + + if (location == null) { + location = uriInfo.getRequestUriBuilder().path("{branch-uuid}").build(branch.getGuid()); + } + return location; + } + + @Override + public Response commitBranch(long branchUuid, long destinationBranchUuid, BranchCommitOptions options) { + BranchReadable srcBranch = getBranchById(branchUuid); + BranchReadable destBranch = getBranchById(destinationBranchUuid); + + ArtifactReadable committer = getArtifactById(CoreBranches.COMMON, options.getCommitterId()); + Callable<TransactionReadable> op = getBranchOps().commitBranch(committer, srcBranch, destBranch); + TransactionReadable tx = executeCallable(op); + + if (options.isArchive()) { + Callable<?> op2 = getBranchOps().archiveUnarchiveBranch(srcBranch, ArchiveOperation.ARCHIVE); + executeCallable(op2); + } + + UriInfo uriInfo = getUriInfo(); + URI location = getTxLocation(uriInfo, tx); + return Response.created(location).entity(asTransaction(tx)).build(); + } + + private URI getTxLocation(UriInfo uriInfo, TransactionReadable tx) { + UriBuilder builder = uriInfo.getRequestUriBuilder(); + URI location = builder.path("..").path("..").path("txs").path("{tx-id}").build(tx.getGuid()); + return location; + } + + @Override + public Response archiveBranch(long branchUuid) { + BranchReadable branch = getBranchById(branchUuid); + + boolean modified = false; + BranchArchivedState currentState = branch.getArchiveState(); + if (BranchArchivedState.UNARCHIVED == currentState) { + Callable<?> op = getBranchOps().archiveUnarchiveBranch(branch, ArchiveOperation.ARCHIVE); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response setBranchName(long branchUuid, String newName) { + BranchReadable branch = getBranchById(branchUuid); + boolean modified = false; + if (isDifferent(branch.getName(), newName)) { + Callable<?> op = getBranchOps().changeBranchName(branch, newName); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response setBranchType(long branchUuid, BranchType newType) { + BranchReadable branch = getBranchById(branchUuid); + boolean modified = false; + if (isDifferent(branch.getBranchType(), newType)) { + Callable<?> op = getBranchOps().changeBranchType(branch, newType); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response setBranchState(long branchUuid, BranchState newState) { + BranchReadable branch = getBranchById(branchUuid); + boolean modified = false; + if (isDifferent(branch.getBranchState(), newState)) { + Callable<?> op = getBranchOps().changeBranchState(branch, newState); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response associateBranchToArtifact(long branchUuid, int artifactId) { + BranchReadable branch = getBranchById(branchUuid); + boolean modified = false; + if (isDifferent(branch.getAssociatedArtifactId(), artifactId)) { + ArtifactReadable artifact = + newQuery().fromBranch(CoreBranches.COMMON).andLocalId(artifactId).getResults().getExactlyOne(); + Callable<?> op = getBranchOps().associateBranchToArtifact(branch, artifact); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response purgeBranch(long branchUuid, boolean recurse) { + boolean modified = false; + BranchReadable branch = getBranchById(branchUuid); + if (branch != null) { + Callable<?> op = getBranchOps().purgeBranch(branch, recurse); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response unarchiveBranch(long branchUuid) { + BranchReadable branch = getBranchById(branchUuid); + BranchArchivedState state = branch.getArchiveState(); + + boolean modified = false; + if (BranchArchivedState.ARCHIVED == state) { + Callable<?> op = getBranchOps().archiveUnarchiveBranch(branch, ArchiveOperation.UNARCHIVE); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + + @Override + public Response unCommitBranch(long branchUuid, long destinationBranchUuid) { + throw new UnsupportedOperationException("Not yet implemented"); + } + + @Override + public Response unassociateBranch(long branchUuid) { + BranchReadable branch = getBranchById(branchUuid); + boolean modified = false; + if (branch.getAssociatedArtifactId() != -1) { + Callable<?> op = getBranchOps().unassociateBranch(branch); + executeCallable(op); + modified = true; + } + return asResponse(modified); + } + +} diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsApplication.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsApplication.java index 40ac38260bc..c687b402476 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsApplication.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsApplication.java @@ -47,6 +47,8 @@ public class OrcsApplication extends Application { resources.add(new TypesQueryResource(orcsApi)); resources.add(new BranchQueryResource(orcsApi)); resources.add(new IdeClientResource()); + + resources.add(new BranchEndpointImpl(orcsApi)); } public void stop() { diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsRestUtil.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsRestUtil.java new file mode 100644 index 00000000000..2f97d1e7908 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/OrcsRestUtil.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * 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.orcs.rest.internal; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; +import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; +import org.eclipse.osee.framework.jdk.core.type.ResultSet; +import org.eclipse.osee.orcs.data.BranchReadable; +import org.eclipse.osee.orcs.data.TransactionReadable; +import org.eclipse.osee.orcs.rest.model.Branch; +import org.eclipse.osee.orcs.rest.model.Transaction; + +/** + * @author Roberto E. Escobar + */ +public final class OrcsRestUtil { + + private OrcsRestUtil() { + // Utility class + } + + public static <T> T executeCallable(Callable<T> callable) { + try { + return callable.call(); + } catch (Exception ex) { + if (ex instanceof OseeCoreException) { + throw (OseeCoreException) ex; + } else { + throw new OseeCoreException(ex); + } + } + } + + public static Response asResponse(boolean modified) { + ResponseBuilder builder; + if (modified) { + builder = Response.ok(); + } else { + builder = Response.notModified(); + } + return builder.build(); + } + + public static List<Transaction> asTransactions(ResultSet<? extends TransactionReadable> results) { + List<Transaction> toReturn = new ArrayList<Transaction>(results.size()); + for (TransactionReadable data : results) { + toReturn.add(asTransaction(data)); + } + return toReturn; + } + + public static List<Branch> asBranches(ResultSet<? extends BranchReadable> results) { + List<Branch> toReturn = new ArrayList<Branch>(results.size()); + for (BranchReadable data : results) { + toReturn.add(asBranch(data)); + } + return toReturn; + } + + public static Branch asBranch(BranchReadable src) { + Branch data = new Branch(); + data.setArchiveState(src.getArchiveState()); + data.setAssociatedArtifactId(src.getAssociatedArtifactId()); + data.setBaseTransactionId(src.getBaseTransaction()); + data.setBranchState(src.getBranchState()); + data.setBranchType(src.getBranchType()); + data.setInheritAccessControl(src.isInheritAccessControl()); + data.setName(src.getName()); + data.setParentBranchUuid(src.getParentBranch()); + data.setSourceTransactionId(src.getSourceTransaction()); + data.setBranchUuid(src.getGuid()); + return data; + } + + public static Transaction asTransaction(TransactionReadable tx) { + Transaction data = new Transaction(); + data.setTxId(tx.getGuid()); + data.setAuthorId(tx.getAuthorId()); + data.setBranchUuid(tx.getBranchId()); + data.setComment(tx.getComment()); + data.setCommitArtId(tx.getCommit()); + data.setTimeStamp(tx.getDate()); + data.setTxType(tx.getTxType()); + return data; + } +} |