37.3.3. placeWidgetOrder 작업
37.3.3.1. 개요
placeWidgetOrder
는 대체 그룹을 포함하는 두 가지 복잡한 유형을 사용합니다. 이 작업은 Java 구현에서 이러한 구조를 사용하는 방법을 보여줍니다. 소비자와 서비스 둘 다 대체 그룹의 멤버를 가져오고 설정해야 합니다.
37.3.3.2. 소비자 구현
placeWidgetOrder()
를 호출하려면 소비자가 위젯 대체 그룹의 하나의 요소가 포함된 위젯 순서를 구성해야 합니다. 주문에 위젯을 추가할 때 소비자는 대체 그룹의 각 요소에 대해 생성된 개체 팩토리 메서드를 사용해야 합니다. 이렇게 하면 런타임 및 서비스가 순서를 올바르게 처리할 수 있습니다. 예를 들어, 플라스틱 위젯에 대한 순서가 배치되는 경우 ObjectFactory.createPlasticWidget()
메서드는 순서에 추가하기 전에 요소를 만드는 데 사용됩니다.
예 37.16. “하위 그룹 멤버 설정” 위젯 OrderInfo 개체의 위젯 속성
표시합니다.
을 설정하기 위
한 소비자 코드를
예 37.16. 하위 그룹 멤버 설정
ObjectFactory of = new ObjectFactory(); WidgetOrderInfo order = new of.createWidgetOrderInfo(); ... System.out.println(); System.out.println("What color widgets do you want to order?"); String color = reader.readLine(); System.out.println(); System.out.println("What shape widgets do you want to order?"); String shape = reader.readLine(); System.out.println(); System.out.println("What type of widgets do you want to order?"); System.out.println("1 - Normal"); System.out.println("2 - Wood"); System.out.println("3 - Plastic"); System.out.println("Selection [1-3]"); String selection = reader.readLine(); String trimmed = selection.trim(); char widgetType = trimmed.charAt(0); switch (widgetType) { case '1': { WidgetType widget = of.createWidgetType(); widget.setColor(color); widget.setShape(shape); JAXB<WidgetType> widgetElement = of.createWidget(widget); order.setWidget(widgetElement); break; } case '2': { WoodWidgetType woodWidget = of.createWoodWidgetType(); woodWidget.setColor(color); woodWidget.setShape(shape); System.out.println(); System.out.println("What type of wood are your widgets?"); String wood = reader.readLine(); woodWidget.setWoodType(wood); JAXB<WoodWidgetType> widgetElement = of.createWoodWidget(woodWidget); order.setWoodWidget(widgetElement); break; } case '3': { PlasticWidgetType plasticWidget = of.createPlasticWidgetType(); plasticWidget.setColor(color); plasticWidget.setShape(shape); System.out.println(); System.out.println("What type of mold to use for your widgets?"); String mold = reader.readLine(); plasticWidget.setMoldProcess(mold); JAXB<WidgetType> widgetElement = of.createPlasticWidget(plasticWidget); order.setPlasticWidget(widgetElement); break; } default : System.out.println("Invaid Widget Selection!!"); }
37.3.3.3. 서비스 구현
placeWidgetOrder()
메서드는 WidgetOrderInfo
개체 형태로 주문을 수신하고, 주문을 처리하며, 위젯 OrderBillInfo
개체 형태로 소비자에게 청구서를 반환합니다. 주문은 일반 위젯, 플라스틱 위젯 또는 목재 위젯일 수 있습니다. 주문한 위젯 유형은
오브젝트의 위젯 속성에 저장되는 오브젝트 유형에 따라 결정됩니다. 위젯 속성은 대체 그룹이며 위젯 요소, widget
OrderFormwoodWid
요소 또는 get
plasticWidget
요소를 포함할 수 있습니다.
구현은 순서에 따라 가능한 요소 중 어느 것이 저장되는지 결정해야합니다. 이 작업은 JAXBElement<? 확장 T
> 개체의 getName()
메서드를 사용하여 요소의 QName을 결정합니다. 그런 다음 QName을 사용하여 대체 그룹의 요소를 순서대로 결정할 수 있습니다. 청구서에 포함된 요소가 알려지면 해당 값을 적절한 유형의 개체로 추출할 수 있습니다.
예 37.17. “placeWidgetOrder()
구현” 가능한 구현을 보여줍니다.
예 37.17. placeWidgetOrder()
구현
public com.widgetvendor.types.widgettypes.WidgetOrderBillInfo placeWidgetOrder(WidgetOrderInfo widgetOrderForm) { ObjectFactory of = new ObjectFactory(); WidgetOrderBillInfo bill = new WidgetOrderBillInfo() // Copy the shipping address and the number of widgets // ordered from widgetOrderForm to bill ... int numOrdered = widgetOrderForm.getAmount(); String elementName = widgetOrderForm.getWidget().getName().getLocalPart(); if (elementName.equals("woodWidget") { WoodWidgetType widget=order.getWidget().getValue(); buildWoodWidget(widget, numOrdered); // Add the widget info to bill JAXBElement<WoodWidgetType> widgetElement = of.createWoodWidget(widget); bill.setWidget(widgetElement); float amtDue = numOrdered * 0.75; bill.setAmountDue(amtDue); } else if (elementName.equals("plasticWidget") { PlasticWidgetType widget=order.getWidget().getValue(); buildPlasticWidget(widget, numOrdered); // Add the widget info to bill JAXBElement<PlasticWidgetType> widgetElement = of.createPlasticWidget(widget); bill.setWidget(widgetElement); float amtDue = numOrdered * 0.90; bill.setAmountDue(amtDue); } else { WidgetType widget=order.getWidget().getValue(); buildWidget(widget, numOrdered); // Add the widget info to bill JAXBElement<WidgetType> widgetElement = of.createWidget(widget); bill.setWidget(widgetElement); float amtDue = numOrdered * 0.30; bill.setAmountDue(amtDue); } return(bill); }
예 37.17. “placeWidgetOrder()
구현” 의 코드는 다음을 수행합니다.
요소를 만들기 위해 개체 팩토리를 인스턴스화합니다.Sertss an object factory to create elements.
위젯 OrderBillInfo
개체를 인스턴스화하여 청구서를 보유합니다.
정렬된 위젯 수를 가져옵니다.Gets the number of widgets ordered.
순서에 저장된 요소의 로컬 이름을 가져옵니다.Gets the local name of the element stored in the order.
요소가 woodWidget
요소인지 확인합니다.
요소의 값을 순서에서 적절한 유형의 개체로 추출합니다.
bill에 있는 JAXBElement<T
> 개체를 만듭니다.
bill 개체의 위젯 속성 을
설정합니다.
bill 개체의 amountDue
속성을 설정합니다.