Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright 2013 SAP AG Licensed 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 com.sap.core.odata.core.edm;
 
 import java.util.Date;
 
Implementation of the EDM simple type DateTime

Author(s):
SAP AG
 
 public class EdmDateTime extends AbstractSimpleType {
 
   private static final Pattern PATTERN = Pattern.compile(
       "(\\p{Digit}{1,4})-(\\p{Digit}{1,2})-(\\p{Digit}{1,2})"
           + "T(\\p{Digit}{1,2}):(\\p{Digit}{1,2})(?::(\\p{Digit}{1,2})(\\.\\p{Digit}{1,7})?)?");
   private static final Pattern JSON_PATTERN = Pattern.compile("/Date\\((-?\\p{Digit}+)\\)/");
   private static final EdmDateTime instance = new EdmDateTime();
   private static final SimpleDateFormat DATE_FORMAT;
   static {
      = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
     .setTimeZone(TimeZone.getTimeZone("GMT"));
   }
 
   public static EdmDateTime getInstance() {
     return ;
   }
 
   @Override
   public Class<?> getDefaultType() {
     return Calendar.class;
   }
 
   @Override
   protected <T> T internalValueOfString(final String valuefinal EdmLiteralKind literalKindfinal EdmFacets facetsfinal Class<T> returnTypethrows EdmSimpleTypeException {
     // In JSON, we allow also the XML literal form, so there is on purpose
     // no exception if the JSON pattern does not match.
     if (literalKind == .) {
       final Matcher matcher = .matcher(value);
       if (matcher.matches()) {
         long millis;
         try {
           millis = Long.parseLong(matcher.group(1));
         } catch (final NumberFormatException e) {
         }
         if (returnType.isAssignableFrom(Long.class)) {
           return returnType.cast(millis);
         } else if (returnType.isAssignableFrom(Date.class)) {
           return returnType.cast(new Date(millis));
         } else if (!returnType.isAssignableFrom(Calendar.class)) {
         }
 
         Calendar dateTimeValue = Calendar.getInstance();
         dateTimeValue.clear();
         dateTimeValue.setTimeZone(TimeZone.getTimeZone("GMT"));
         dateTimeValue.setTimeInMillis(millis);
         return returnType.cast(dateTimeValue);
       }
     }
 
     Calendar calendarValue;
     if (literalKind == .) {
       if (value.length() > 10 && value.startsWith("datetime'") && value.endsWith("'")) {
         calendarValue = parseLiteral(value.substring(9, value.length() - 1), facets);
       } else {
       }
     } else {
       calendarValue = parseLiteral(valuefacets);
     }
 
     if (returnType.isAssignableFrom(Calendar.class)) {
       return returnType.cast(calendarValue);
     } else if (returnType.isAssignableFrom(Long.class)) {
       return returnType.cast(calendarValue.getTimeInMillis());
     } else if (returnType.isAssignableFrom(Date.class)) {
      return returnType.cast(calendarValue.getTime());
    } else {
    }
  }
  private Calendar parseLiteral(final String valuefinal EdmFacets facetsthrows EdmSimpleTypeException {
    Calendar dateTimeValue = Calendar.getInstance();
    dateTimeValue.clear();
    dateTimeValue.setTimeZone(TimeZone.getTimeZone("GMT"));
    final Matcher matcher = .matcher(value);
    if (!matcher.matches()) {
    }
    dateTimeValue.set(
        Short.parseShort(matcher.group(1)),
        Byte.parseByte(matcher.group(2)) - 1, // month is zero-based
        Byte.parseByte(matcher.group(3)),
        Byte.parseByte(matcher.group(4)),
        Byte.parseByte(matcher.group(5)));
    if (matcher.group(6) != null) {
      dateTimeValue.set(., Byte.parseByte(matcher.group(6)));
    }
    if (matcher.group(7) != null) {
      String milliSeconds = matcher.group(7).substring(1);
      while (milliSeconds.endsWith("0")) {
        milliSeconds = milliSeconds.substring(0, milliSeconds.length() - 1);
      }
      if (milliSeconds.length() > 3) {
      }
      if (facets != null && facets.getPrecision() != null && facets.getPrecision() < milliSeconds.length()) {
      }
      while (milliSeconds.length() < 3) {
        milliSeconds += "0";
      }
      dateTimeValue.set(., Short.parseShort(milliSeconds));
    }
    // The Calendar class does not check any values until a get method is called,
    // so we do just that to validate the fields set above, not because we want
    // to return something else.  For strict checks, the lenient mode is switched
    // off temporarily.
    dateTimeValue.setLenient(false);
    try {
      dateTimeValue.getTimeInMillis();
    } catch (final IllegalArgumentException e) {
    }
    dateTimeValue.setLenient(true);
    return dateTimeValue;
  }
  protected <T> String internalValueToString(final T valuefinal EdmLiteralKind literalKindfinal EdmFacets facetsthrows EdmSimpleTypeException {
    long timeInMillis;
    if (value instanceof Date) {
      timeInMillis = ((Datevalue).getTime();
    } else if (value instanceof Calendar) {
      timeInMillis = ((Calendarvalue).getTimeInMillis();
    } else if (value instanceof Long) {
      timeInMillis = ((Longvalue).longValue();
    } else {
    }
    if (literalKind == .) {
      return "/Date(" + timeInMillis + ")/";
    }
    String result = .format(timeInMillis);
    if (facets == null || facets.getPrecision() == null) {
      while (result.endsWith("0")) {
        result = result.substring(0, result.length() - 1);
      }
    } else if (facets.getPrecision() <= 3) {
      if (result.endsWith("000".substring(0, 3 - facets.getPrecision()))) {
        result = result.substring(0, result.length() - (3 - facets.getPrecision()));
      } else {
      }
    } else {
      for (int i = 4; i <= facets.getPrecision(); i++) {
        result += "0";
      }
    }
    if (result.endsWith(".")) {
      result = result.substring(0, result.length() - 1);
    }
    return result;
  }
  public String toUriLiteral(final String literalthrows EdmSimpleTypeException {
    return "datetime'" + literal + "'";
  }
New to GrepCode? Check out our FAQ X