/** | |
* 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.boon; | |
import java.io.BufferedReader; | |
import java.io.BufferedWriter; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.OutputStream; | |
import java.io.OutputStreamWriter; | |
import java.util.List; | |
import org.apache.camel.Exchange; | |
import org.apache.camel.NonManagedService; | |
import org.apache.camel.spi.DataFormat; | |
import org.apache.camel.spi.DataFormatName; | |
import org.apache.camel.support.ServiceSupport; | |
import org.apache.camel.util.IOHelper; | |
import org.boon.json.JsonFactory; | |
import org.boon.json.ObjectMapper; | |
/** | |
* A <a href="http://camel.apache.org/data-format.html">data format</a> ( | |
* {@link DataFormat}) using <a | |
* href="http://richardhightower.github.io/site/Boon/">Boon</a> to marshal to | |
* and from JSON. | |
*/ | |
public class BoonDataFormat extends ServiceSupport implements DataFormat, DataFormatName, NonManagedService { | |
private final ObjectMapper objectMapper; | |
private Class<?> unmarshalType; | |
private boolean useList; | |
public BoonDataFormat() { | |
this(null); | |
} | |
/** | |
* Use the default Boon {@link ObjectMapper} and with a custom unmarshal | |
* type | |
* | |
* @param unmarshalType the custom unmarshal type | |
*/ | |
public BoonDataFormat(Class<?> unmarshalType) { | |
this(unmarshalType, JsonFactory.create()); | |
} | |
/** | |
* Use a custom unmarshal type and Boon mapper | |
* | |
* @param mapper the custom mapper | |
* @param unmarshalType the custom unmarshal type | |
*/ | |
public BoonDataFormat(Class<?> unmarshalType, ObjectMapper mapper) { | |
this.unmarshalType = unmarshalType; | |
this.objectMapper = mapper; | |
} | |
@Override | |
public String getDataFormatName() { | |
return "boon"; | |
} | |
@Override | |
public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception { | |
BufferedWriter writer = IOHelper.buffered(new OutputStreamWriter(stream, IOHelper.getCharsetName(exchange))); | |
objectMapper.toJson(graph, writer); | |
writer.close(); | |
} | |
@Override | |
public Object unmarshal(Exchange exchange, InputStream stream) throws Exception { | |
BufferedReader reader = IOHelper.buffered(new InputStreamReader(stream, IOHelper.getCharsetName(exchange))); | |
Object result; | |
try { | |
if (unmarshalType != null) { | |
result = objectMapper.fromJson(reader, unmarshalType); | |
} else { | |
result = objectMapper.fromJson(reader); | |
} | |
} finally { | |
IOHelper.close(reader); | |
} | |
return result; | |
} | |
@Override | |
protected void doStart() throws Exception { | |
if (useList) { | |
useList(); | |
} | |
} | |
@Override | |
protected void doStop() throws Exception { | |
// noop | |
} | |
// Properties | |
// ------------------------------------------------------------------------- | |
public Class<?> getUnmarshalType() { | |
return this.unmarshalType; | |
} | |
public void setUnmarshalType(Class<?> unmarshalType) { | |
this.unmarshalType = unmarshalType; | |
} | |
public ObjectMapper getObjectMapper() { | |
return this.objectMapper; | |
} | |
public Boolean getUseList() { | |
return useList; | |
} | |
public void setUseList(Boolean useList) { | |
this.useList = useList; | |
} | |
/** | |
* Uses {@link java.util.List} when unmarshalling. | |
*/ | |
public void useList() { | |
setUnmarshalType(List.class); | |
} | |
} |