/* * JBoss, Home of Professional Open Source * Copyright 2014, Red Hat, Inc. and/or its affiliates, and individual * contributors by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.switchyard.quickstarts.demos.library; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.namespace.QName; import org.junit.Assert; import org.switchyard.component.test.mixins.http.HTTPMixIn; import org.switchyard.config.Configuration; import org.switchyard.config.ConfigurationPuller; import org.switchyard.quickstarts.demos.library.types.Book; import org.switchyard.quickstarts.demos.library.types.Loan; import org.switchyard.quickstarts.demos.library.types.LoanRequest; import org.switchyard.quickstarts.demos.library.types.LoanResponse; import org.switchyard.quickstarts.demos.library.types.ReturnRequest; import org.switchyard.quickstarts.demos.library.types.ReturnResponse; import org.switchyard.quickstarts.demos.library.types.Suggestion; import org.switchyard.quickstarts.demos.library.types.SuggestionRequest; import org.switchyard.quickstarts.demos.library.types.SuggestionResponse; public final class LibraryClient { private static final String SOAP_REQUEST_PREFIX = "<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'><SOAP-ENV:Header>PID</SOAP-ENV:Header><SOAP-ENV:Body>"; private static final String SOAP_REQUEST_SUFFIX = "</SOAP-ENV:Body></SOAP-ENV:Envelope>"; private static final QName _SuggestionRequest_QNAME = new QName("urn:switchyard-quickstart-demo:library:1.0", "suggestionRequest"); private static final QName _LoanRequest_QNAME = new QName("urn:switchyard-quickstart-demo:library:1.0", "loanRequest"); private static final QName _ReturnRequest_QNAME = new QName("urn:switchyard-quickstart-demo:library:1.0", "returnRequest"); private final HTTPMixIn _httpMixIn; private final String _port; public LibraryClient(HTTPMixIn httpMixIn, String port) { _httpMixIn = httpMixIn; _port = port; } public void testLibraryServices() throws Exception { System.out.println(); // get 1st suggestion Suggestion suggestion1_Zombie = getSuggestion("Zombie"); Book book1_WorldWarZ = suggestion1_Zombie.getBook(); System.out.println("Received suggestion for book: " + book1_WorldWarZ.getTitle() + " (isbn: " + book1_WorldWarZ.getIsbn() + ")"); Assert.assertEquals("World War Z", book1_WorldWarZ.getTitle()); // take out 1st loan System.out.println("Attempting 1st loan for isbn: " + book1_WorldWarZ.getIsbn()); Loan loan1_WorldWarZ = attemptLoan(book1_WorldWarZ.getIsbn()); System.out.println("1st loan approved? " + loan1_WorldWarZ.isApproved()); Assert.assertTrue(loan1_WorldWarZ.isApproved()); // 2nd loan should not be approved since 1st loan hasn't been returned System.out.println("Attempting 2nd loan for isbn: " + book1_WorldWarZ.getIsbn()); Loan loan2_WorldWarZ = attemptLoan(book1_WorldWarZ.getIsbn()); System.out.println("2nd loan approved? " + loan2_WorldWarZ.isApproved()); Assert.assertFalse(loan2_WorldWarZ.isApproved()); // return 1st loan System.out.println("Returning 1st loan for isbn: " + loan1_WorldWarZ.getBook().getIsbn()); boolean return1_ack = returnLoan(loan1_WorldWarZ); System.out.println("1st loan return acknowledged? " + return1_ack); Assert.assertTrue(return1_ack); // try 2nd loan again; this time it should work System.out.println("Re-attempting 2nd loan for isbn: " + book1_WorldWarZ.getIsbn()); loan2_WorldWarZ = attemptLoan(book1_WorldWarZ.getIsbn()); System.out.println("Re-attempt of 2nd loan approved? " + loan2_WorldWarZ.isApproved()); Assert.assertTrue(loan2_WorldWarZ.isApproved()); // get 2nd suggestion, and since 1st book not available (again), 2nd match will return Suggestion suggestion2_TheZombieSurvivalGuide = getSuggestion("Zombie"); Book book2_TheZombieSurvivalGuide = suggestion2_TheZombieSurvivalGuide.getBook(); System.out.println("Received suggestion for book: " + book2_TheZombieSurvivalGuide.getTitle() + " (isbn: " + book2_TheZombieSurvivalGuide.getIsbn() + ")"); Assert.assertEquals("The Zombie Survival Guide", book2_TheZombieSurvivalGuide.getTitle()); // take out 3rd loan System.out.println("Attempting 3rd loan for isbn: " + book2_TheZombieSurvivalGuide.getIsbn()); Loan loan3_TheZombieSurvivalGuide = attemptLoan(book2_TheZombieSurvivalGuide.getIsbn()); System.out.println("3rd loan approved? " + loan3_TheZombieSurvivalGuide.isApproved()); Assert.assertTrue(loan3_TheZombieSurvivalGuide.isApproved()); // return 2nd loan System.out.println("Returning 2nd loan for isbn: " + loan2_WorldWarZ.getBook().getIsbn()); boolean return2_ack = returnLoan(loan2_WorldWarZ); System.out.println("2nd loan return acknowledged? " + return2_ack); Assert.assertTrue(return2_ack); // return 3rd loan System.out.println("Returning 3rd loan for isbn: " + loan3_TheZombieSurvivalGuide.getBook().getIsbn()); boolean return3_ack = returnLoan(loan3_TheZombieSurvivalGuide); System.out.println("3rd loan return acknowledged? " + return3_ack); Assert.assertTrue(return3_ack); System.out.println(); } private Suggestion getSuggestion(String keyword) throws Exception { SuggestionRequest suggestionRequest = new SuggestionRequest(); suggestionRequest.setKeyword(keyword); String soapRequest = wrapRequest(_SuggestionRequest_QNAME, SuggestionRequest.class, suggestionRequest, null); String soapResponse = _httpMixIn.postString("http://localhost:" + _port + "/suggestion/SuggestionService", soapRequest); SuggestionResponse suggestionResponse = unwrapResponse(SuggestionResponse.class, soapResponse); return suggestionResponse.getSuggestion(); } private Loan attemptLoan(String isbn) throws Exception { LoanRequest loanRequest = new LoanRequest(); loanRequest.setIsbn(isbn); String soapRequest = wrapRequest(_LoanRequest_QNAME, LoanRequest.class, loanRequest, null); String soapResponse = _httpMixIn.postString("http://localhost:" + _port + "/loan/LoanService", soapRequest); LoanResponse loanResponse = unwrapResponse(LoanResponse.class, soapResponse); return loanResponse.getLoan(); } private boolean returnLoan(Loan loan) throws Exception { ReturnRequest returnRequest = new ReturnRequest(); returnRequest.setLoan(loan); String soapRequest = wrapRequest(_ReturnRequest_QNAME, ReturnRequest.class, returnRequest, loan.getId()); String soapResponse = _httpMixIn.postString("http://localhost:" + _port + "/loan/LoanService", soapRequest); ReturnResponse returnResponse = unwrapResponse(ReturnResponse.class, soapResponse); return returnResponse.isAcknowledged(); } private <T> String wrapRequest(QName name, Class<T> declaredType, T value, String pid) throws Exception { JAXBElement<T> e = new JAXBElement<T>(name, declaredType, null, value); JAXBContext ctx = JAXBContext.newInstance("org.switchyard.quickstarts.demos.library.types"); Marshaller m = ctx.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); StringWriter sw = new StringWriter(); String processInstanceId = pid != null ? "<bpm:processInstanceId xmlns:bpm='urn:switchyard-component-bpm:bpm:1.0'>" + pid + "</bpm:processInstanceId>" : ""; sw.write(SOAP_REQUEST_PREFIX.replaceFirst("PID", processInstanceId)); m.marshal(e, sw); sw.write(SOAP_REQUEST_SUFFIX); return sw.toString(); } @SuppressWarnings("unchecked") private <T> T unwrapResponse(Class<T> declaredType, String envelope) throws Exception { // TODO: replace with generic DOM code vs. using config helper code Configuration body = new ConfigurationPuller().pull(new StringReader(envelope)).getFirstChild("Body").getChildren().iterator().next(); String content = body.toString(); if (body.getName().equals("Fault")) { throw new Exception("Fault returned: " + content); } else { JAXBContext ctx = JAXBContext.newInstance("org.switchyard.quickstarts.demos.library.types"); Unmarshaller u = ctx.createUnmarshaller(); Object o = u.unmarshal(new StringReader(content)); if (o instanceof JAXBElement) { o = ((JAXBElement<T>)o).getValue(); } return declaredType.cast(o); } } public static void main(String... args) throws Exception { HTTPMixIn httpMixIn = new HTTPMixIn(); httpMixIn.initialize(); try { String port = System.getProperty("org.switchyard.component.soap.client.port", "8080"); LibraryClient client = new LibraryClient(httpMixIn, port); client.testLibraryServices(); } finally { httpMixIn.uninitialize(); } } }