@Override
 public OWLLiteral getOWLLiteral(String lexicalValue, OWLDatatype datatype) {
   OWLLiteral literal;
   if (datatype.isRDFPlainLiteral()) {
     int sep = lexicalValue.lastIndexOf('@');
     if (sep != -1) {
       String lex = lexicalValue.substring(0, sep);
       String lang = lexicalValue.substring(sep + 1);
       literal = getBasicLiteral(lex, lang, getRDFPlainLiteral());
     } else {
       literal = getBasicLiteral(lexicalValue, datatype);
     }
   } else {
     // check the four special cases
     try {
       if (datatype.isBoolean()) {
         literal = getOWLLiteral(isBooleanTrueValue(lexicalValue.trim()));
       } else if (datatype.isFloat()) {
         if (lexicalValue.trim().equals("-0.0")) {
           // according to some W3C test, this needs to be
           // different from 0.0; Java floats disagree
           if (negativeFloatZero == null) {
             negativeFloatZero = getBasicLiteral("-0.0", XSD_FLOAT);
           }
           literal = negativeFloatZero;
         } else {
           try {
             float f = Float.parseFloat(lexicalValue);
             literal = getOWLLiteral(f);
           } catch (NumberFormatException e) {
             literal = getBasicLiteral(lexicalValue, datatype);
           }
         }
       } else if (datatype.isDouble()) {
         literal = getOWLLiteral(Double.parseDouble(lexicalValue));
       } else if (datatype.isInteger()) {
         // again, some W3C tests require padding zeroes to make
         // literals different
         if (lexicalValue.trim().charAt(0) == '0') {
           literal = getBasicLiteral(lexicalValue, getIntegerOWLDatatype());
         } else {
           try {
             // this is fine for values that can be parsed as
             // ints - not all values are
             literal = getOWLLiteral(Integer.parseInt(lexicalValue));
           } catch (NumberFormatException ex) {
             // try as a big decimal
             literal = getBasicLiteral(lexicalValue, datatype);
           }
         }
       } else {
         literal = getBasicLiteral(lexicalValue, datatype);
       }
     } catch (NumberFormatException e) {
       // some literal is malformed, i.e., wrong format
       literal = getBasicLiteral(lexicalValue, datatype);
     }
   }
   return literal;
 }