Skip to content

Commit

Permalink
added the ability to clone a previous version when creating new versi…
Browse files Browse the repository at this point in the history
…ons of plans, services, apps
  • Loading branch information
EricWittmann committed Jan 5, 2015
1 parent 9457733 commit 1b23fba
Show file tree
Hide file tree
Showing 11 changed files with 427 additions and 6 deletions.
Expand Up @@ -1106,6 +1106,7 @@ public ServiceVersionBean createServiceVersion(String organizationId, String ser
newVersion.setVersion(bean.getVersion());
newVersion.setGateways(bean.getGateways());
newVersion.setPlans(bean.getPlans());
newVersion.setPublicService(bean.isPublicService());

if (gateway != null) {
if (newVersion.getGateways() == null) {
Expand Down
Expand Up @@ -22,6 +22,7 @@
import io.apiman.manager.ui.client.local.AppMessages;
import io.apiman.manager.ui.client.local.pages.common.Breadcrumb;
import io.apiman.manager.ui.client.local.pages.common.VersionSelector;
import io.apiman.manager.ui.client.local.services.ContextKeys;
import io.apiman.manager.ui.client.local.services.rest.IRestInvokerCallback;
import io.apiman.manager.ui.client.local.util.MultimapUtil;

Expand Down Expand Up @@ -151,6 +152,8 @@ protected void loadPlanVersion(String version) {
public void onSuccess(PlanVersionBean response) {
versionBean = response;
planBean = versionBean.getPlan();
currentContext.setAttribute(ContextKeys.CURRENT_PLAN, planBean);
currentContext.setAttribute(ContextKeys.CURRENT_PLAN_VERSION, versionBean);
dataPacketLoaded();
onPlanVersionLoaded();
}
Expand Down
Expand Up @@ -22,6 +22,7 @@
import io.apiman.manager.ui.client.local.AppMessages;
import io.apiman.manager.ui.client.local.pages.common.Breadcrumb;
import io.apiman.manager.ui.client.local.pages.common.VersionSelector;
import io.apiman.manager.ui.client.local.services.ContextKeys;
import io.apiman.manager.ui.client.local.services.rest.IRestInvokerCallback;
import io.apiman.manager.ui.client.local.util.MultimapUtil;

Expand Down Expand Up @@ -156,6 +157,8 @@ protected void loadServiceVersion(String version) {
public void onSuccess(ServiceVersionBean response) {
versionBean = response;
serviceBean = versionBean.getService();
currentContext.setAttribute(ContextKeys.CURRENT_SERVICE, serviceBean);
currentContext.setAttribute(ContextKeys.CURRENT_SERVICE_VERSION, versionBean);
dataPacketLoaded();
onServiceVersionLoaded();
}
Expand Down
Expand Up @@ -16,10 +16,19 @@
package io.apiman.manager.ui.client.local.pages;

import io.apiman.manager.api.beans.apps.ApplicationVersionBean;
import io.apiman.manager.api.beans.contracts.ContractBean;
import io.apiman.manager.api.beans.contracts.NewContractBean;
import io.apiman.manager.api.beans.policies.PolicyBean;
import io.apiman.manager.api.beans.policies.PolicyType;
import io.apiman.manager.api.beans.summary.ContractSummaryBean;
import io.apiman.manager.api.beans.summary.PolicySummaryBean;
import io.apiman.manager.ui.client.local.AppMessages;
import io.apiman.manager.ui.client.local.services.ContextKeys;
import io.apiman.manager.ui.client.local.services.rest.IRestInvokerCallback;
import io.apiman.manager.ui.client.local.util.MultimapUtil;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
Expand All @@ -36,6 +45,7 @@
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.ui.SimpleCheckBox;
import com.google.gwt.user.client.ui.TextBox;


Expand All @@ -59,9 +69,17 @@ public class NewAppVersionPage extends AbstractPage {

@Inject @DataField
TextBox version;
@Inject @DataField
SimpleCheckBox cloneCB;

@Inject @DataField
AsyncActionButton createButton;

private int totalPolicies;
private int policyCounter;
private int totalContracts;
private int contractCounter;

/**
* Constructor.
*/
Expand All @@ -77,6 +95,13 @@ public void onKeyUp(KeyUpEvent event) {
}
};
version.addKeyUpHandler(kph);
ApplicationVersionBean oldApplication = (ApplicationVersionBean) currentContext.getAttribute(ContextKeys.CURRENT_APPLICATION_VERSION);
if (oldApplication != null) {
cloneCB.setValue(true);
} else {
cloneCB.setValue(false);
cloneCB.setEnabled(false);
}
}

/**
Expand All @@ -96,6 +121,149 @@ protected void onPageShown() {
@EventHandler("createButton")
public void onCreate(ClickEvent event) {
createButton.onActionStarted();

if (cloneCB.getValue()) {
createAndClone();
} else {
create();
}
}

/**
* Creates a new cloned version of the app.
*/
private void createAndClone() {
ApplicationVersionBean clonedVersion = new ApplicationVersionBean();
final String ver = version.getValue();

ApplicationVersionBean oldApplication = (ApplicationVersionBean) currentContext.getAttribute(ContextKeys.CURRENT_APPLICATION_VERSION);
final String oldVer = oldApplication.getVersion();
clonedVersion.setVersion(ver);
rest.createApplicationVersion(org, app, clonedVersion, new IRestInvokerCallback<ApplicationVersionBean>() {
@Override
public void onSuccess(ApplicationVersionBean response) {
rest.getApplicationPolicies(org, app, oldVer, new IRestInvokerCallback<List<PolicySummaryBean>>() {
@Override
public void onSuccess(List<PolicySummaryBean> response) {
clonePolicies(oldVer, response);
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
rest.getApplicationContracts(org, app, oldVer, new IRestInvokerCallback<List<ContractSummaryBean>>() {
@Override
public void onSuccess(List<ContractSummaryBean> response) {
cloneContracts(oldVer, response);
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}

/**
* Clones the list of policies.
* @param oldVersion
* @param policies
*/
protected void clonePolicies(final String oldVersion, List<PolicySummaryBean> policies) {
totalPolicies = policies.size();
policyCounter = 0;
for (PolicySummaryBean policySummaryBean : policies) {
clonePolicy(oldVersion, policySummaryBean);
}
}

/**
* Called to clone a single policy. This fetches the policy and makes a copy of it
* in the newly created application.
* @param oldVersion
* @param policySummaryBean
*/
protected void clonePolicy(String oldVersion, PolicySummaryBean policySummaryBean) {
final String ver = version.getValue();
rest.getPolicy(PolicyType.Application, org, app, oldVersion, policySummaryBean.getId(), new IRestInvokerCallback<PolicyBean>() {
@Override
public void onSuccess(PolicyBean response) {
PolicyBean clonedPolicy = new PolicyBean();
clonedPolicy.setConfiguration(response.getConfiguration());
clonedPolicy.setDefinition(response.getDefinition());
clonedPolicy.setName(response.getName());
clonedPolicy.setOrderIndex(response.getOrderIndex());
rest.createPolicy(PolicyType.Application, org, app, ver, clonedPolicy, new IRestInvokerCallback<PolicyBean>() {
@Override
public void onSuccess(PolicyBean response) {
policyCounter++;
if (contractCounter == totalContracts && policyCounter == totalPolicies) {
toApp.go(MultimapUtil.fromMultiple("org", org, "app", app, "version", ver)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
@Override
public void onError(Throwable error) {
// Don't care - just do our best.
}
});
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}

/**
* Clones the app's contracts.
* @param oldVersion
* @param contracts
*/
private void cloneContracts(String oldVersion, List<ContractSummaryBean> contracts) {
totalContracts = contracts.size();
contractCounter = 0;
for (ContractSummaryBean csb : contracts) {
cloneContract(oldVersion, csb);
}
}

/**
* @param oldVersion
* @param csb
*/
private void cloneContract(String oldVersion, ContractSummaryBean contractSummaryBean) {
final String ver = version.getValue();
NewContractBean contract = new NewContractBean();
contract.setPlanId(contractSummaryBean.getPlanId());
contract.setServiceId(contractSummaryBean.getServiceId());
contract.setServiceOrgId(contractSummaryBean.getServiceOrganizationId());
contract.setServiceVersion(contractSummaryBean.getServiceVersion());
rest.createContract(org, app, ver, contract, new IRestInvokerCallback<ContractBean>() {
@Override
public void onSuccess(ContractBean response) {
contractCounter++;
if (contractCounter == totalContracts && policyCounter == totalPolicies) {
toApp.go(MultimapUtil.fromMultiple("org", org, "app", app, "version", ver)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
@Override
public void onError(Throwable error) {
// Don't care!
}
});
}

/**
* Creates a new empty version of the app.
*/
private void create() {
createButton.onActionStarted();
ApplicationVersionBean newVersion = new ApplicationVersionBean();
final String ver = version.getValue();
newVersion.setVersion(ver);
Expand Down
Expand Up @@ -16,10 +16,16 @@
package io.apiman.manager.ui.client.local.pages;

import io.apiman.manager.api.beans.plans.PlanVersionBean;
import io.apiman.manager.api.beans.policies.PolicyBean;
import io.apiman.manager.api.beans.policies.PolicyType;
import io.apiman.manager.api.beans.summary.PolicySummaryBean;
import io.apiman.manager.ui.client.local.AppMessages;
import io.apiman.manager.ui.client.local.services.ContextKeys;
import io.apiman.manager.ui.client.local.services.rest.IRestInvokerCallback;
import io.apiman.manager.ui.client.local.util.MultimapUtil;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
Expand All @@ -36,6 +42,7 @@
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.ui.SimpleCheckBox;
import com.google.gwt.user.client.ui.TextBox;


Expand All @@ -59,9 +66,15 @@ public class NewPlanVersionPage extends AbstractPage {

@Inject @DataField
TextBox version;
@Inject @DataField
SimpleCheckBox cloneCB;

@Inject @DataField
AsyncActionButton createButton;

private int totalPolicies;
private int policyCounter;

/**
* Constructor.
*/
Expand All @@ -77,6 +90,13 @@ public void onKeyUp(KeyUpEvent event) {
}
};
version.addKeyUpHandler(kph);
PlanVersionBean oldPlan = (PlanVersionBean) currentContext.getAttribute(ContextKeys.CURRENT_PLAN_VERSION);
if (oldPlan != null) {
cloneCB.setValue(true);
} else {
cloneCB.setValue(false);
cloneCB.setEnabled(false);
}
}

/**
Expand All @@ -96,6 +116,89 @@ protected void onPageShown() {
@EventHandler("createButton")
public void onCreate(ClickEvent event) {
createButton.onActionStarted();

if (cloneCB.getValue()) {
createAndClone();
} else {
create();
}
}

/**
* Create a new version of the plan and clone the previous version.
*/
private void createAndClone() {
PlanVersionBean newVersion = new PlanVersionBean();
final String ver = version.getValue();

PlanVersionBean oldPlan = (PlanVersionBean) currentContext.getAttribute(ContextKeys.CURRENT_PLAN_VERSION);
final String oldVer = oldPlan.getVersion();
newVersion.setVersion(ver);
rest.createPlanVersion(org, plan, newVersion, new IRestInvokerCallback<PlanVersionBean>() {
@Override
public void onSuccess(PlanVersionBean response) {
rest.getPlanPolicies(org, plan, oldVer, new IRestInvokerCallback<List<PolicySummaryBean>>() {
@Override
public void onSuccess(List<PolicySummaryBean> response) {
totalPolicies = response.size();
for (PolicySummaryBean policySummaryBean : response) {
clonePolicy(oldVer, policySummaryBean);
}
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}

/**
* Called to clone a single policy. This fetches the policy and makes a copy of it
* in the newly created plan.
* @param oldVersion
* @param policySummaryBean
*/
protected void clonePolicy(String oldVersion, PolicySummaryBean policySummaryBean) {
final String ver = version.getValue();
rest.getPolicy(PolicyType.Plan, org, plan, oldVersion, policySummaryBean.getId(), new IRestInvokerCallback<PolicyBean>() {
@Override
public void onSuccess(PolicyBean response) {
PolicyBean clonedPolicy = new PolicyBean();
clonedPolicy.setConfiguration(response.getConfiguration());
clonedPolicy.setDefinition(response.getDefinition());
clonedPolicy.setName(response.getName());
clonedPolicy.setOrderIndex(response.getOrderIndex());
rest.createPolicy(PolicyType.Plan, org, plan, ver, clonedPolicy, new IRestInvokerCallback<PolicyBean>() {
@Override
public void onSuccess(PolicyBean response) {
policyCounter++;
if (totalPolicies == policyCounter) {
toPlan.go(MultimapUtil.fromMultiple("org", org, "plan", plan, "version", ver)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}
@Override
public void onError(Throwable error) {
dataPacketError(error);
}
});
}

/**
* Create a new version of the plan without cloning anything.
*/
private void create() {
PlanVersionBean newVersion = new PlanVersionBean();
final String ver = version.getValue();
newVersion.setVersion(ver);
Expand Down

0 comments on commit 1b23fba

Please sign in to comment.