diff --git a/common/aws/src/main/java/org/jclouds/aws/binders/BindMapToIndexedFormParams.java b/common/aws/src/main/java/org/jclouds/aws/binders/BindMapToIndexedFormParams.java new file mode 100644 index 0000000000..4d390797fc --- /dev/null +++ b/common/aws/src/main/java/org/jclouds/aws/binders/BindMapToIndexedFormParams.java @@ -0,0 +1,78 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.aws.binders; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.lang.String.format; + +import java.util.Map; +import java.util.Map.Entry; + +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.Binder; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; + +/** + * @author Adrian Cole + */ +public class BindMapToIndexedFormParams implements Binder { + + private final String keyPattern; + private final String valuePattern; + + protected BindMapToIndexedFormParams(String keyPattern, String valuePattern) { + this.keyPattern = keyPattern; + this.valuePattern = valuePattern; + } + + @SuppressWarnings("unchecked") + @Override + public R bindToRequest(R request, Object input) { + if (checkNotNull(input, "input") instanceof Iterable) + input = Maps.uniqueIndex((Iterable) input, new Function() { + int index = 1; + + @Override + public String apply(String input) { + return index++ + ""; + } + }); + checkArgument(checkNotNull(input, "input") instanceof Map, "this binder is only valid for Map"); + Map mapping = (Map) input; + + ImmutableMap.Builder builder = ImmutableMap.builder(); + int amazonOneBasedIndex = 1; // according to docs, counters must start + // with 1 + for (Entry entry : mapping.entrySet()) { + // not null by contract + builder.put(format(keyPattern, amazonOneBasedIndex), entry.getKey()); + builder.put(format(valuePattern, amazonOneBasedIndex), entry.getValue()); + amazonOneBasedIndex++; + } + Multimap forms = Multimaps.forMap(builder.build()); + return forms.size() == 0 ? request : (R) request.toBuilder().replaceFormParams(forms).build(); + } + +} diff --git a/common/aws/src/main/java/org/jclouds/aws/binders/BindTableToIndexedFormParams.java b/common/aws/src/main/java/org/jclouds/aws/binders/BindTableToIndexedFormParams.java new file mode 100644 index 0000000000..3d0d91d6d7 --- /dev/null +++ b/common/aws/src/main/java/org/jclouds/aws/binders/BindTableToIndexedFormParams.java @@ -0,0 +1,81 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.aws.binders; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.lang.String.format; + +import java.util.Map; + +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.Binder; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.ImmutableTable.Builder; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Table; +import com.google.common.collect.Table.Cell; + +/** + * @author Adrian Cole + */ +public class BindTableToIndexedFormParams implements Binder { + + private final String rowPattern; + private final String columnPattern; + private final String valuePattern; + + protected BindTableToIndexedFormParams(String rowPattern, String columnPattern, String valuePattern) { + this.rowPattern = rowPattern; + this.columnPattern = columnPattern; + this.valuePattern = valuePattern; + } + + @SuppressWarnings("unchecked") + @Override + public R bindToRequest(R request, Object input) { + if (checkNotNull(input, "input") instanceof Map) { + Builder builder = ImmutableTable.builder(); + int index = 1; + for (Map.Entry entry : ((Map) input).entrySet()) + builder.put(index++, entry.getKey(), entry.getValue()); + input = builder.build(); + } + checkArgument(checkNotNull(input, "input") instanceof Table, "this binder is only valid for Table"); + Table table = Table.class.cast(input); + + ImmutableMap.Builder builder = ImmutableMap.builder(); + int amazonOneBasedIndex = 1; // according to docs, counters must start + // with 1 + for (Cell cell : table.cellSet()) { + // not null by contract + builder.put(format(rowPattern, amazonOneBasedIndex), cell.getRowKey().toString()); + builder.put(format(columnPattern, amazonOneBasedIndex), cell.getColumnKey().toString()); + builder.put(format(valuePattern, amazonOneBasedIndex), cell.getValue().toString()); + + amazonOneBasedIndex++; + } + Multimap forms = Multimaps.forMap(builder.build()); + return forms.size() == 0 ? request : (R) request.toBuilder().replaceFormParams(forms).build(); + } + +}