Package org.apache.olingo.odata2.jpa.processor.core.access.model

Source Code of org.apache.olingo.odata2.jpa.processor.core.access.model.JPATypeConvertor

/*******************************************************************************
* 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(Date.class)) || (jpaType.equals(Calendar.class)) ||
        jpaType.equals(Timestamp.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;
    }
    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;

  }
}
TOP

Related Classes of org.apache.olingo.odata2.jpa.processor.core.access.model.JPATypeConvertor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.