package com.temenos.interaction.example.hateoas.banking;
/*
* #%L
* interaction-example-hateoas-banking
* %%
* Copyright (C) 2012 - 2013 Temenos Holdings N.V.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.temenos.interaction.core.hypermedia.Action;
import com.temenos.interaction.core.hypermedia.CollectionResourceState;
import com.temenos.interaction.core.hypermedia.ResourceState;
import com.temenos.interaction.core.hypermedia.ResourceStateMachine;
import com.temenos.interaction.core.hypermedia.Transition;
public class Behaviour {
public ResourceState getInteractionModel() {
// this will be the service root
ResourceState initialState = new ResourceState("home", "initial", createActionList(new Action("NoopGET", Action.TYPE.VIEW), null), "/");
ResourceState preferences = new ResourceState("Preferences", "preferences", createActionList(new Action("GETPreferences", Action.TYPE.VIEW), null), "/preferences");
initialState.addTransition(new Transition.Builder().method("GET").target(preferences).build());
ResourceStateMachine fundsTransferModel = getFundsTransferInteractionModel();
initialState.addTransition("GET", fundsTransferModel);
ResourceStateMachine customerModel = getCustomerInteractionModel();
initialState.addTransition("GET", customerModel);
// create a 'ServiceDocument' and add our entity sets to make OData4j metadata available
ResourceState serviceDocumentState = new ResourceState("home", "ServiceDocument", createActionList(new Action("NoopGET", Action.TYPE.VIEW), null), "/Banking.svc");
serviceDocumentState.addTransition("GET", fundsTransferModel);
serviceDocumentState.addTransition("GET", customerModel);
initialState.addTransition(new Transition.Builder().method("GET").target(serviceDocumentState).build());
return initialState;
}
public ResourceStateMachine getFundsTransferInteractionModel() {
CollectionResourceState fundstransfers = new CollectionResourceState("FundsTransfer", "fundstransfers", createActionList(new Action("GETFundTransfers", Action.TYPE.VIEW), null), "/fundtransfers");
ResourceState newFtState = new ResourceState(fundstransfers, "new", createActionList(new Action("NoopGET", Action.TYPE.VIEW), new Action("NEWFundTransfer", Action.TYPE.ENTRY)), "/new");
ResourceState fundstransfer = new ResourceState("FundsTransfer", "fundstransfer", createActionList(new Action("GETFundTransfer", Action.TYPE.VIEW), new Action("PUTFundTransfer", Action.TYPE.ENTRY)), "/fundtransfers/{id}", "id", "self".split(" "));
ResourceState finalState = new ResourceState(fundstransfer, "end", createActionList(new Action("NoopGET", Action.TYPE.VIEW), null));
Map<String, String> uriLinkageMap = new HashMap<String, String>();
fundstransfers.addTransition(new Transition.Builder().method("POST").target(newFtState).build());
uriLinkageMap.clear();
newFtState.addTransition(new Transition.Builder().method("PUT").target(fundstransfer).uriParameters(uriLinkageMap).build());
//newFtState.addTransition("GET", exists, uriLinkageMap);
uriLinkageMap.clear();
fundstransfers.addTransition(new Transition.Builder()
.method("GET").target(fundstransfer)
.uriParameters(uriLinkageMap)
.flags(Transition.FOR_EACH)
.build());
fundstransfer.addTransition(new Transition.Builder().method("PUT").target(fundstransfer).uriParameters(uriLinkageMap).build());
fundstransfer.addTransition(new Transition.Builder().method("DELETE").target(finalState).uriParameters(uriLinkageMap).build());
return new ResourceStateMachine(fundstransfers);
}
public ResourceStateMachine getCustomerInteractionModel() {
CollectionResourceState customers = new CollectionResourceState("Customer", "customers", createActionList(new Action("GETCustomers", Action.TYPE.VIEW), null), "/customers");
ResourceState customer = new ResourceState("Customer", "customer", createActionList(new Action("GETCustomer", Action.TYPE.VIEW), new Action("PUTCustomer", Action.TYPE.ENTRY)), "/customers/{id}");
ResourceState deleted = new ResourceState(customer, "deleted", createActionList(null, new Action("NoopDELETE", Action.TYPE.ENTRY)));
Map<String, String> uriLinkageMap = new HashMap<String, String>();
uriLinkageMap.clear();
uriLinkageMap.put("id", "name");
customers.addTransition(new Transition.Builder()
.method("GET")
.target(customer)
.uriParameters(uriLinkageMap)
.build());
customer.addTransition(new Transition.Builder().method("PUT").target(customer).uriParameters(uriLinkageMap).build());
customer.addTransition(new Transition.Builder().method("DELETE").target(deleted).uriParameters(uriLinkageMap).build());
return new ResourceStateMachine(customers);
}
private List<Action> createActionList(Action view, Action entry) {
List<Action> actions = new ArrayList<Action>();
if (view != null)
actions.add(view);
if (entry != null)
actions.add(entry);
return actions;
}
}