/******************************************************************************* * 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.olingo.odata2.jpa.processor.core.access.model; import java.lang.reflect.AnnotatedElement; import java.math.BigDecimal; import java.sql.Blob; import java.sql.Clob; import java.sql.Date; import java.sql.Timestamp; import java.util.Calendar; import java.util.UUID; import javax.persistence.Lob; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.metamodel.Attribute; import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind; import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException; /** * This class holds utility methods for Type conversions between JPA and OData Types. * * * */ public class JPATypeConvertor { /** * This utility method converts a given jpa Type to equivalent * EdmSimpleTypeKind for maintaining compatibility between Java and OData * Types. * * @param jpaType * The JPA Type input. * @return The corresponding EdmSimpleTypeKind. * @throws ODataJPAModelException * @throws org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException * * @see EdmSimpleTypeKind */ public static EdmSimpleTypeKind convertToEdmSimpleType(final Class<?> jpaType, final Attribute<?, ?> currentAttribute) throws ODataJPAModelException { if (jpaType.equals(String.class) || jpaType.equals(Character.class) || jpaType.equals(char.class) || jpaType.equals(char[].class) || jpaType.equals(Character[].class)) { return EdmSimpleTypeKind.String; } else if (jpaType.equals(Long.class) || jpaType.equals(long.class)) { return EdmSimpleTypeKind.Int64; } else if (jpaType.equals(Short.class) || jpaType.equals(short.class)) { return EdmSimpleTypeKind.Int16; } else if (jpaType.equals(Integer.class) || jpaType.equals(int.class)) { return EdmSimpleTypeKind.Int32; } else if (jpaType.equals(Double.class) || jpaType.equals(double.class)) { return EdmSimpleTypeKind.Double; } else if (jpaType.equals(Float.class) || jpaType.equals(float.class)) { return EdmSimpleTypeKind.Single; } else if (jpaType.equals(BigDecimal.class)) { return EdmSimpleTypeKind.Decimal; } else if (jpaType.equals(byte[].class)) { return EdmSimpleTypeKind.Binary; } else if (jpaType.equals(Byte.class) || jpaType.equals(byte.class)) { return EdmSimpleTypeKind.Byte; } else if (jpaType.equals(Boolean.class) || jpaType.equals(boolean.class)) { return EdmSimpleTypeKind.Boolean; } else if (jpaType.equals(java.sql.Time.class)) { return EdmSimpleTypeKind.Time; } else if (jpaType.equals(Date.class) || jpaType.equals(Calendar.class) || jpaType.equals(Timestamp.class) || jpaType.equals(java.util.Date.class)) { try { if ((currentAttribute != null) && (determineTemporalType(currentAttribute) == TemporalType.TIME)) { return EdmSimpleTypeKind.Time; } else { return EdmSimpleTypeKind.DateTime; } } catch (SecurityException e) { throw ODataJPAModelException.throwException(ODataJPAModelException.GENERAL.addContent(e.getMessage()), e); } } else if (jpaType.equals(UUID.class)) { return EdmSimpleTypeKind.Guid; } else if (jpaType.equals(Byte[].class)) { return EdmSimpleTypeKind.Binary; } else if (jpaType.equals(Blob.class) && isBlob(currentAttribute)) { return EdmSimpleTypeKind.Binary; } else if (jpaType.equals(Clob.class) && isBlob(currentAttribute)) { return EdmSimpleTypeKind.String; } else if (jpaType.isEnum()) { return EdmSimpleTypeKind.String; } throw ODataJPAModelException.throwException(ODataJPAModelException.TYPE_NOT_SUPPORTED .addContent(jpaType.toString()), null); } private static boolean isBlob(final Attribute<?, ?> currentAttribute) { if (currentAttribute != null) { AnnotatedElement annotatedElement = (AnnotatedElement) currentAttribute.getJavaMember(); if (annotatedElement != null && annotatedElement.getAnnotation(Lob.class) != null) { return true; } } return false; } private static TemporalType determineTemporalType(final Attribute<?, ?> currentAttribute) throws ODataJPAModelException { if (currentAttribute != null) { AnnotatedElement annotatedElement = (AnnotatedElement) currentAttribute.getJavaMember(); if (annotatedElement != null && annotatedElement.getAnnotation(Temporal.class) != null) { return annotatedElement.getAnnotation(Temporal.class).value(); } } return null; } }