/**
* 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.apache.camel.component.jclouds;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.xml.transform.stream.StreamSource;
import com.google.common.io.ByteSource;
import com.google.common.io.ByteStreams;
import com.google.common.io.Files;
import com.google.common.io.InputSupplier;
import org.apache.camel.Converter;
import org.apache.camel.Exchange;
import org.apache.camel.FallbackConverter;
import org.apache.camel.TypeConverter;
import org.apache.camel.component.file.GenericFile;
import org.apache.camel.converter.stream.StreamSourceCache;
import org.apache.camel.spi.TypeConverterRegistry;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.ObjectHelper;
import org.jclouds.io.Payload;
import org.jclouds.io.payloads.ByteSourcePayload;
import org.jclouds.io.payloads.InputStreamPayload;
@Converter
public final class JcloudsPayloadConverter {
private JcloudsPayloadConverter() {
//Utility Class
}
@Converter
public static Payload toPayload(byte[] bytes) {
return new ByteSourcePayload(ByteSource.wrap(bytes));
}
@Converter
public static Payload toPayload(String str, Exchange ex) throws UnsupportedEncodingException {
return toPayload(str.getBytes(IOHelper.getCharsetName(ex)));
}
public static Payload toPayload(String str) throws UnsupportedEncodingException {
return toPayload(str, null);
}
@Converter
public static Payload toPayload(File file) {
return new ByteSourcePayload(Files.asByteSource(file));
}
protected static Payload setContentMetadata(Payload payload, Exchange exchange) {
// Just add an NPE check on the payload
if (exchange == null) {
return payload;
}
String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class);
String contentEncoding = exchange.getIn().getHeader(Exchange.CONTENT_ENCODING, String.class);
String contentDisposition = exchange.getIn().getHeader(JcloudsConstants.CONTENT_DISPOSITION, String.class);
String contentLanguage = exchange.getIn().getHeader(JcloudsConstants.CONTENT_LANGUAGE, String.class);
Date payloadExpires = exchange.getIn().getHeader(JcloudsConstants.PAYLOAD_EXPIRES, Date.class);
if (ObjectHelper.isNotEmpty(contentType)) {
payload.getContentMetadata().setContentType(contentType);
}
if (ObjectHelper.isNotEmpty(contentEncoding)) {
payload.getContentMetadata().setContentEncoding(contentEncoding);
}
if (ObjectHelper.isNotEmpty(contentDisposition)) {
payload.getContentMetadata().setContentDisposition(contentDisposition);
}
if (ObjectHelper.isNotEmpty(contentLanguage)) {
payload.getContentMetadata().setContentLanguage(contentLanguage);
}
if (ObjectHelper.isNotEmpty(payloadExpires)) {
payload.getContentMetadata().setExpires(payloadExpires);
}
return payload;
}
@Converter
public static Payload toPayload(final InputStream is, Exchange exchange) throws IOException {
InputStreamPayload payload = new InputStreamPayload(is);
// only set the contentlength if possible
if (is.markSupported()) {
long contentLength = ByteStreams.length(new InputSupplier<InputStream>() {
@Override
public InputStream getInput() throws IOException {
return is;
}
});
is.reset();
payload.getContentMetadata().setContentLength(contentLength);
}
return payload;
}
@Converter
public static Payload toPayload(StreamSource source, Exchange exchange) throws IOException {
return toPayload(new StreamSourceCache(source, exchange), exchange);
}
@Converter
public static Payload toPayload(final StreamSourceCache cache, Exchange exchange) throws IOException {
long contentLength = ByteStreams.length(new InputSupplier<InputStream>() {
@Override
public InputStream getInput() throws IOException {
return cache.getInputStream();
}
});
cache.reset();
InputStreamPayload payload = new InputStreamPayload(cache.getInputStream());
payload.getContentMetadata().setContentLength(contentLength);
setContentMetadata(payload, exchange);
return payload;
}
@FallbackConverter
@SuppressWarnings("unchecked")
public static <T extends Payload> T convertTo(Class<T> type, Exchange exchange, Object value, TypeConverterRegistry registry) throws IOException {
Class<?> sourceType = value.getClass();
if (GenericFile.class.isAssignableFrom(sourceType)) {
GenericFile<?> genericFile = (GenericFile<?>) value;
if (genericFile.getFile() != null) {
Class<?> genericFileType = genericFile.getFile().getClass();
TypeConverter converter = registry.lookup(Payload.class, genericFileType);
if (converter != null) {
return (T) converter.convertTo(Payload.class, genericFile.getFile());
}
}
}
return null;
}
}