Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.jclouds.softlayer.binders; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Set; import javax.inject.Inject; import org.jclouds.http.HttpRequest; import org.jclouds.json.Json; import org.jclouds.rest.Binder; import org.jclouds.softlayer.domain.ProductItemPrice; import org.jclouds.softlayer.domain.ProductOrder; import org.jclouds.softlayer.domain.VirtualGuest; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** * Converts a ProductOrder into a json string valid for placing an order via the softlayer api The * String is set into the payload of the HttpRequest * * @author Jason King */ public class ProductOrderToJson implements Binder { private Json json; @Inject public ProductOrderToJson(Json json) { this.json = json; } @Override public <R extends HttpRequest> R bindToRequest(R request, Object input) { checkNotNull(input, "order"); ProductOrder order = ProductOrder.class.cast(input); request.setPayload(buildJson(order)); return request; } /** * Builds a Json string suitable for sending to the softlayer api * * @param order * @return */ String buildJson(ProductOrder order) { Iterable<Price> prices = Iterables.transform(order.getPrices(), new Function<ProductItemPrice, Price>() { @Override public Price apply(ProductItemPrice productItemPrice) { return new Price(productItemPrice.getId()); } }); Iterable<HostnameAndDomain> hosts = Iterables.transform(order.getVirtualGuests(), new Function<VirtualGuest, HostnameAndDomain>() { @Override public HostnameAndDomain apply(VirtualGuest virtualGuest) { return new HostnameAndDomain(virtualGuest.getHostname(), virtualGuest.getDomain()); } }); OrderData data = new OrderData(order.getPackageId(), order.getLocation(), Sets.newLinkedHashSet(prices), Sets.newLinkedHashSet(hosts), order.getQuantity(), order.getUseHourlyPricing()); return json.toJson(ImmutableMap.of("parameters", ImmutableList.<OrderData>of(data))); } @SuppressWarnings("unused") private static class OrderData { private String complexType = "SoftLayer_Container_Product_Order_Virtual_Guest"; private long packageId = -1; private String location; private Set<Price> prices; private Set<HostnameAndDomain> virtualGuests; private long quantity; private boolean useHourlyPricing; public OrderData(long packageId, String location, Set<Price> prices, Set<HostnameAndDomain> virtualGuests, long quantity, boolean useHourlyPricing) { this.packageId = packageId; this.location = location; this.prices = prices; this.virtualGuests = virtualGuests; this.quantity = quantity; this.useHourlyPricing = useHourlyPricing; } } @SuppressWarnings("unused") private static class HostnameAndDomain { private String hostname; private String domain; public HostnameAndDomain(String hostname, String domain) { this.hostname = hostname; this.domain = domain; } } @SuppressWarnings("unused") private static class Price { private long id; public Price(long id) { this.id = id; } } }