blob: 08474abf009bb6d4988558fa55423b123beda5a3 [file] [log] [blame]
/*
* 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.zest.valueserialization.jackson;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.zest.spi.value.Entry;
import org.apache.zest.spi.value.ObjectField;
import org.apache.zest.spi.value.ParserLocation;
import org.apache.zest.spi.value.VDA;
public class JacksonDeserializer extends VDA<JsonParser>
{
private final JsonFactory jsonFactory = new JsonFactory();
@Override
protected JsonParser adaptInput( InputStream input )
throws Exception
{
return jsonFactory.createParser( input );
}
@Override
protected <T> T readPlainValue( Class<T> type, JsonParser jsonParser )
throws Exception
{
JsonToken currentToken = jsonParser.nextValue();
if( type.equals( Boolean.class ) || type.equals( Boolean.TYPE ) )
{
if( currentToken == JsonToken.VALUE_TRUE )
{
return (T) Boolean.TRUE;
}
if( currentToken == JsonToken.VALUE_FALSE )
{
return (T) Boolean.FALSE;
}
return (T) Boolean.valueOf( (String) jsonParser.getCurrentValue() );
}
if( type.equals( Byte.class ) || type.equals( Byte.TYPE ) )
{
if( currentToken == JsonToken.VALUE_NUMBER_INT ||
currentToken == JsonToken.VALUE_NUMBER_FLOAT )
{
return (T) Byte.valueOf( (Byte) jsonParser.getCurrentValue() );
}
return (T) Byte.valueOf( (String) jsonParser.getCurrentValue() );
}
if( type.equals( Character.class ) || type.equals( Character.TYPE ) )
{
return (T) Character.valueOf( ( (String) jsonParser.getCurrentValue() ).charAt( 0 ) );
}
if( type.equals( Short.class ) || type.equals( Short.TYPE ) )
{
if( currentToken == JsonToken.VALUE_NUMBER_INT ||
currentToken == JsonToken.VALUE_NUMBER_FLOAT )
{
return (T) Short.valueOf( (Byte) jsonParser.getCurrentValue() );
}
return (T) Short.valueOf( (String) jsonParser.getCurrentValue() );
}
if( type.equals( Integer.class ) || type.equals( Integer.TYPE ) )
{
if( currentToken == JsonToken.VALUE_NUMBER_INT ||
currentToken == JsonToken.VALUE_NUMBER_FLOAT )
{
return (T) Integer.valueOf( (Byte) jsonParser.getCurrentValue() );
}
return (T) Integer.valueOf( (String) jsonParser.getCurrentValue() );
}
if( type.equals( Long.class ) || type.equals( Long.TYPE ) )
{
if( currentToken == JsonToken.VALUE_NUMBER_INT ||
currentToken == JsonToken.VALUE_NUMBER_FLOAT )
{
return (T) Long.valueOf( (Byte) jsonParser.getCurrentValue() );
}
return (T) Long.valueOf( (String) jsonParser.getCurrentValue() );
}
if( type.equals( Float.class ) || type.equals( Float.TYPE ) )
{
if( currentToken == JsonToken.VALUE_NUMBER_INT ||
currentToken == JsonToken.VALUE_NUMBER_FLOAT )
{
return (T) Float.valueOf( (Byte) jsonParser.getCurrentValue() );
}
return (T) Float.valueOf( (String) jsonParser.getCurrentValue() );
}
if( type.equals( Double.class ) || type.equals( Double.TYPE ) )
{
if( currentToken == JsonToken.VALUE_NUMBER_INT ||
currentToken == JsonToken.VALUE_NUMBER_FLOAT )
{
return (T) Double.valueOf( (Byte) jsonParser.getCurrentValue() );
}
return (T) Double.valueOf( (String) jsonParser.getCurrentValue() );
}
throw new InternalError( "Please contact dev@zest.apache.org." );
}
protected <T> T readObjectValue( Type tType, JsonParser jsonParser )
throws Exception
{
JsonToken currentToken = jsonParser.nextToken();
Map<Object, Object> entries = new HashMap<>();
if( currentToken == JsonToken.START_OBJECT )
{
while( currentToken != JsonToken.END_OBJECT )
{
String fieldName = jsonParser.nextFieldName();
Class<?> fieldType = fieldTypeOf( tType, fieldName );
Object fieldValue = readObject( fieldType, jsonParser );
entries.put( fieldName, fieldValue );
currentToken = jsonParser.nextToken();
}
return createObject( tType, entries );
}
return null;
}
@Override
protected <T> T readArrayValue( Class<T> type, JsonParser jsonParser )
throws Exception
{
JsonToken currentToken = jsonParser.nextToken();
List<Object> entries = new ArrayList<>();
if( currentToken == JsonToken.START_ARRAY )
{
while( currentToken != JsonToken.END_ARRAY )
{
Object fieldValue = readObject( type.getComponentType(), jsonParser );
entries.add( fieldValue );
currentToken = jsonParser.nextToken();
}
return createArray( type, entries );
}
return null;
}
@Override
protected <K, V> Map<K, V> readMapValue( Type mapType, JsonParser jsonParser )
throws Exception
{
Type keyType;
Type valueType;
if( mapType instanceof ParameterizedType )
{
keyType = ( (ParameterizedType) mapType ).getActualTypeArguments()[ 0 ];
valueType = ( (ParameterizedType) mapType ).getActualTypeArguments()[ 1 ];
}
else
{
keyType = Object.class;
valueType = Object.class;
}
JsonToken currentToken = jsonParser.nextToken();
Map<Object, Object> entries = new HashMap<>();
if( currentToken == JsonToken.START_OBJECT )
{
while( currentToken != JsonToken.END_OBJECT )
{
Object fieldKey = readObject( keyType, jsonParser );
Object fieldValue = readObject( valueType, jsonParser );
entries.put( fieldKey, fieldValue );
currentToken = jsonParser.nextToken();
}
return createObject(mapType, entries);
}
return null;
}
@Override
protected <T> T readListValue( Type listType, JsonParser jsonParser )
throws Exception
{
return null;
}
@Override
protected <T> T readEnumValue( Class<T> type, JsonParser jsonParser )
throws Exception
{
return null;
}
@Override
protected ObjectField nextField( JsonParser jsonParser )
throws Exception
{
return null;
}
@Override
protected Entry nextEntry( JsonParser jsonParser )
throws Exception
{
return null;
}
@Override
protected Object nextValue( JsonParser jsonParser )
throws Exception
{
return null;
}
@Override
public ParserLocation location( JsonParser jsonParser )
{
return null;
}
}